diff --git a/scm-core/pom.xml b/scm-core/pom.xml
index 0f397b9de0..e570eaff8a 100644
--- a/scm-core/pom.xml
+++ b/scm-core/pom.xml
@@ -15,6 +15,8 @@
scm-core
+
+
javax.servlet
@@ -22,12 +24,16 @@
${servlet.version}
provided
+
+
slf4j-api
org.slf4j
${slf4j.version}
+
+
com.google.inject
@@ -46,6 +52,14 @@
guice-servlet
${guice.version}
+
+
+ com.google.inject.extensions
+ guice-throwingproviders
+ ${guice.version}
+
+
+
com.sun.jersey
diff --git a/scm-core/src/main/java/sonia/scm/repository/RepositoryProvider.java b/scm-core/src/main/java/sonia/scm/repository/RepositoryProvider.java
new file mode 100644
index 0000000000..1a5300ad21
--- /dev/null
+++ b/scm-core/src/main/java/sonia/scm/repository/RepositoryProvider.java
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2010, Sebastian Sdorra
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of SCM-Manager; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://bitbucket.org/sdorra/scm-manager
+ *
+ */
+
+
+
+package sonia.scm.repository;
+
+//~--- non-JDK imports --------------------------------------------------------
+
+import com.google.inject.throwingproviders.CheckedProvider;
+
+import sonia.scm.security.ScmSecurityException;
+
+/**
+ *
+ * @author Sebastian Sdorra
+ * @since 1.10
+ */
+public interface RepositoryProvider extends CheckedProvider
+{
+
+ /**
+ * Method description
+ *
+ *
+ * @return
+ *
+ * @throws ScmSecurityException
+ */
+ @Override
+ public Repository get() throws ScmSecurityException;
+}
diff --git a/scm-core/src/main/java/sonia/scm/web/filter/ProviderPermissionFilter.java b/scm-core/src/main/java/sonia/scm/web/filter/ProviderPermissionFilter.java
index 2263d8a20d..3b728da799 100644
--- a/scm-core/src/main/java/sonia/scm/web/filter/ProviderPermissionFilter.java
+++ b/scm-core/src/main/java/sonia/scm/web/filter/ProviderPermissionFilter.java
@@ -38,6 +38,7 @@ package sonia.scm.web.filter;
import com.google.inject.Provider;
import sonia.scm.repository.Repository;
+import sonia.scm.repository.RepositoryProvider;
import sonia.scm.web.security.WebSecurityContext;
//~--- JDK imports ------------------------------------------------------------
@@ -61,7 +62,7 @@ public abstract class ProviderPermissionFilter extends PermissionFilter
*/
public ProviderPermissionFilter(
Provider securityContextProvider,
- Provider repositoryProvider)
+ RepositoryProvider repositoryProvider)
{
super(securityContextProvider);
this.repositoryProvider = repositoryProvider;
@@ -86,5 +87,5 @@ public abstract class ProviderPermissionFilter extends PermissionFilter
//~--- fields ---------------------------------------------------------------
/** Field description */
- private Provider repositoryProvider;
+ private RepositoryProvider repositoryProvider;
}
diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitPermissionFilter.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitPermissionFilter.java
index d9c24a59bf..6986848a5f 100644
--- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitPermissionFilter.java
+++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitPermissionFilter.java
@@ -39,7 +39,7 @@ import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.Singleton;
-import sonia.scm.repository.Repository;
+import sonia.scm.repository.RepositoryProvider;
import sonia.scm.web.filter.ProviderPermissionFilter;
import sonia.scm.web.security.WebSecurityContext;
@@ -80,7 +80,7 @@ public class GitPermissionFilter extends ProviderPermissionFilter
@Inject
public GitPermissionFilter(
Provider securityContextProvider,
- Provider repositoryProvider)
+ RepositoryProvider repositoryProvider)
{
super(securityContextProvider, repositoryProvider);
}
diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgCGIServlet.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgCGIServlet.java
index b74d46612c..28ae8b8a62 100644
--- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgCGIServlet.java
+++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgCGIServlet.java
@@ -36,7 +36,6 @@ package sonia.scm.web;
//~--- non-JDK imports --------------------------------------------------------
import com.google.inject.Inject;
-import com.google.inject.Provider;
import com.google.inject.Singleton;
import sonia.scm.config.ScmConfiguration;
@@ -44,7 +43,7 @@ import sonia.scm.repository.HgConfig;
import sonia.scm.repository.HgHookManager;
import sonia.scm.repository.HgRepositoryHandler;
import sonia.scm.repository.Repository;
-import sonia.scm.repository.RepositoryManager;
+import sonia.scm.repository.RepositoryProvider;
import sonia.scm.util.AssertUtil;
import sonia.scm.web.cgi.CGIExecutor;
import sonia.scm.web.cgi.CGIExecutorFactory;
@@ -109,7 +108,7 @@ public class HgCGIServlet extends HttpServlet
@Inject
public HgCGIServlet(CGIExecutorFactory cgiExecutorFactory,
ScmConfiguration configuration,
- Provider repositoryProvider,
+ RepositoryProvider repositoryProvider,
HgRepositoryHandler handler, HgHookManager hookManager)
{
this.cgiExecutorFactory = cgiExecutorFactory;
@@ -262,5 +261,5 @@ public class HgCGIServlet extends HttpServlet
private HgHookManager hookManager;
/** Field description */
- private Provider repositoryProvider;
+ private RepositoryProvider repositoryProvider;
}
diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgPermissionFilter.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgPermissionFilter.java
index 865513e8c8..b759c29e99 100644
--- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgPermissionFilter.java
+++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgPermissionFilter.java
@@ -39,7 +39,7 @@ import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.Singleton;
-import sonia.scm.repository.Repository;
+import sonia.scm.repository.RepositoryProvider;
import sonia.scm.web.filter.ProviderPermissionFilter;
import sonia.scm.web.security.WebSecurityContext;
@@ -65,7 +65,7 @@ public class HgPermissionFilter extends ProviderPermissionFilter
@Inject
public HgPermissionFilter(
Provider securityContextProvider,
- Provider repositoryProvider)
+ RepositoryProvider repositoryProvider)
{
super(securityContextProvider, repositoryProvider);
}
diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/web/SvnDAVConfig.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/web/SvnDAVConfig.java
index 6145f79609..64bd23eff7 100644
--- a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/web/SvnDAVConfig.java
+++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/web/SvnDAVConfig.java
@@ -35,12 +35,11 @@ package sonia.scm.web;
//~--- non-JDK imports --------------------------------------------------------
-import com.google.inject.Provider;
-
import org.tmatesoft.svn.core.internal.server.dav.DAVConfig;
import org.tmatesoft.svn.core.internal.server.dav.SVNPathBasedAccess;
import sonia.scm.repository.Repository;
+import sonia.scm.repository.RepositoryProvider;
import sonia.scm.repository.SvnRepositoryHandler;
//~--- JDK imports ------------------------------------------------------------
@@ -63,7 +62,7 @@ public class SvnDAVConfig extends DAVConfig
* @param repositoryProvider
*/
public SvnDAVConfig(DAVConfig davConfig, SvnRepositoryHandler handler,
- Provider repositoryProvider)
+ RepositoryProvider repositoryProvider)
{
this.davConfig = davConfig;
this.handler = handler;
@@ -292,5 +291,5 @@ public class SvnDAVConfig extends DAVConfig
private SvnRepositoryHandler handler;
/** Field description */
- private Provider repositoryProvider;
+ private RepositoryProvider repositoryProvider;
}
diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/web/SvnDAVServlet.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/web/SvnDAVServlet.java
index 7e7723aa60..e07e93e683 100644
--- a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/web/SvnDAVServlet.java
+++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/web/SvnDAVServlet.java
@@ -36,17 +36,16 @@ package sonia.scm.web;
//~--- non-JDK imports --------------------------------------------------------
import com.google.inject.Inject;
-import com.google.inject.Provider;
import com.google.inject.Singleton;
import org.tmatesoft.svn.core.internal.server.dav.DAVConfig;
import org.tmatesoft.svn.core.internal.server.dav.DAVServlet;
import sonia.scm.repository.Repository;
+import sonia.scm.repository.RepositoryProvider;
import sonia.scm.repository.SvnRepositoryHandler;
import sonia.scm.util.AssertUtil;
import sonia.scm.util.HttpUtil;
-import sonia.scm.util.IOUtil;
//~--- JDK imports ------------------------------------------------------------
@@ -79,7 +78,7 @@ public class SvnDAVServlet extends DAVServlet
*/
@Inject
public SvnDAVServlet(SvnRepositoryHandler handler,
- Provider repositoryProvider)
+ RepositoryProvider repositoryProvider)
{
this.handler = handler;
this.repositoryProvider = repositoryProvider;
@@ -140,7 +139,7 @@ public class SvnDAVServlet extends DAVServlet
* @param repositoryProvider
*/
public SvnHttpServletRequestWrapper(HttpServletRequest request,
- Provider repositoryProvider)
+ RepositoryProvider repositoryProvider)
{
super(request);
this.repositoryProvider = repositoryProvider;
@@ -204,7 +203,7 @@ public class SvnDAVServlet extends DAVServlet
//~--- fields -------------------------------------------------------------
/** Field description */
- private Provider repositoryProvider;
+ private RepositoryProvider repositoryProvider;
}
@@ -214,5 +213,5 @@ public class SvnDAVServlet extends DAVServlet
private SvnRepositoryHandler handler;
/** Field description */
- private Provider repositoryProvider;
+ private RepositoryProvider repositoryProvider;
}
diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/web/SvnPermissionFilter.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/web/SvnPermissionFilter.java
index 24e556f274..99cba65c93 100644
--- a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/web/SvnPermissionFilter.java
+++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/web/SvnPermissionFilter.java
@@ -39,7 +39,7 @@ import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.Singleton;
-import sonia.scm.repository.Repository;
+import sonia.scm.repository.RepositoryProvider;
import sonia.scm.web.filter.ProviderPermissionFilter;
import sonia.scm.web.security.WebSecurityContext;
@@ -78,7 +78,7 @@ public class SvnPermissionFilter extends ProviderPermissionFilter
@Inject
public SvnPermissionFilter(
Provider securityContextProvider,
- Provider repository)
+ RepositoryProvider repository)
{
super(securityContextProvider, repository);
}
diff --git a/scm-webapp/src/main/java/sonia/scm/ScmServletModule.java b/scm-webapp/src/main/java/sonia/scm/ScmServletModule.java
index 324d0c6306..d7dcc33367 100644
--- a/scm-webapp/src/main/java/sonia/scm/ScmServletModule.java
+++ b/scm-webapp/src/main/java/sonia/scm/ScmServletModule.java
@@ -36,7 +36,9 @@ package sonia.scm;
//~--- non-JDK imports --------------------------------------------------------
import com.google.inject.name.Names;
+import com.google.inject.servlet.RequestScoped;
import com.google.inject.servlet.ServletModule;
+import com.google.inject.throwingproviders.ThrowingProviderBinder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -61,6 +63,7 @@ import sonia.scm.plugin.PluginLoader;
import sonia.scm.plugin.PluginManager;
import sonia.scm.plugin.ScriptResourceServlet;
import sonia.scm.repository.ChangesetViewerUtil;
+import sonia.scm.repository.DefaultRepositoryProvider;
import sonia.scm.repository.Repository;
import sonia.scm.repository.RepositoryBrowserUtil;
import sonia.scm.repository.RepositoryManager;
@@ -198,6 +201,8 @@ public class ScmServletModule extends ServletModule
@Override
protected void configureServlets()
{
+ install(ThrowingProviderBinder.forModule(this));
+
SCMContextProvider context = SCMContext.getContext();
bind(SCMContextProvider.class).toInstance(context);
@@ -205,7 +210,12 @@ public class ScmServletModule extends ServletModule
ScmConfiguration config = getScmConfiguration(context);
CipherUtil cu = CipherUtil.getInstance();
- bind(Repository.class).toProvider(RepositoryProvider.class);
+ // bind repository provider
+ ThrowingProviderBinder.create(binder()).bind(
+ RepositoryProvider.class, Repository.class).to(
+ DefaultRepositoryProvider.class).in(RequestScoped.class);
+
+ // bind core
bind(StoreFactory.class).to(JAXBStoreFactory.class);
bind(ScmConfiguration.class).toInstance(config);
bind(PluginLoader.class).toInstance(pluginLoader);
diff --git a/scm-webapp/src/main/java/sonia/scm/repository/RepositoryProvider.java b/scm-webapp/src/main/java/sonia/scm/repository/DefaultRepositoryProvider.java
similarity index 90%
rename from scm-webapp/src/main/java/sonia/scm/repository/RepositoryProvider.java
rename to scm-webapp/src/main/java/sonia/scm/repository/DefaultRepositoryProvider.java
index dbd9275cc7..24784b88a1 100644
--- a/scm-webapp/src/main/java/sonia/scm/repository/RepositoryProvider.java
+++ b/scm-webapp/src/main/java/sonia/scm/repository/DefaultRepositoryProvider.java
@@ -39,6 +39,8 @@ import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.servlet.RequestScoped;
+import sonia.scm.security.ScmSecurityException;
+
//~--- JDK imports ------------------------------------------------------------
import javax.servlet.http.HttpServletRequest;
@@ -48,7 +50,7 @@ import javax.servlet.http.HttpServletRequest;
* @author Sebastian Sdorra
*/
@RequestScoped
-public class RepositoryProvider implements Provider
+public class DefaultRepositoryProvider implements RepositoryProvider
{
/** Field description */
@@ -64,8 +66,9 @@ public class RepositoryProvider implements Provider
* @param manager
*/
@Inject
- public RepositoryProvider(Provider requestProvider,
- RepositoryManager manager)
+ public DefaultRepositoryProvider(
+ Provider requestProvider,
+ RepositoryManager manager)
{
this.requestProvider = requestProvider;
this.manager = manager;
@@ -78,9 +81,11 @@ public class RepositoryProvider implements Provider
*
*
* @return
+ *
+ * @throws ScmSecurityException
*/
@Override
- public Repository get()
+ public Repository get() throws ScmSecurityException
{
Repository repository = null;
HttpServletRequest request = requestProvider.get();
diff --git a/scm-webapp/src/main/java/sonia/scm/repository/xml/XmlRepositoryManager.java b/scm-webapp/src/main/java/sonia/scm/repository/xml/XmlRepositoryManager.java
index b535716719..ffaa8a177d 100644
--- a/scm-webapp/src/main/java/sonia/scm/repository/xml/XmlRepositoryManager.java
+++ b/scm-webapp/src/main/java/sonia/scm/repository/xml/XmlRepositoryManager.java
@@ -669,10 +669,8 @@ public class XmlRepositoryManager extends AbstractRepositoryManager
{
if (type.equals(r.getType()) && isNameMatching(r, uri))
{
- if (isReader(r))
- {
- repository = r.clone();
- }
+ assertIsReader(r);
+ repository = r.clone();
break;
}