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 a340277ee0..6c4e419fe5 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 org.slf4j.Logger;
@@ -48,6 +47,7 @@ import sonia.scm.repository.HgHookManager;
import sonia.scm.repository.HgRepositoryHandler;
import sonia.scm.repository.Repository;
import sonia.scm.repository.RepositoryRequestListenerUtil;
+import sonia.scm.repository.RepositoryProvider;
import sonia.scm.util.AssertUtil;
import sonia.scm.web.cgi.CGIExecutor;
import sonia.scm.web.cgi.CGIExecutorFactory;
@@ -112,7 +112,7 @@ public class HgCGIServlet extends HttpServlet
@Inject
public HgCGIServlet(CGIExecutorFactory cgiExecutorFactory,
ScmConfiguration configuration,
- Provider repositoryProvider,
+ RepositoryProvider repositoryProvider,
HgRepositoryHandler handler, HgHookManager hookManager,
RepositoryRequestListenerUtil requestListenerUtil)
{
@@ -292,7 +292,7 @@ public class HgCGIServlet extends HttpServlet
private HgHookManager hookManager;
/** Field description */
- private Provider repositoryProvider;
+ private RepositoryProvider repositoryProvider;
/** Field description */
private RepositoryRequestListenerUtil requestListenerUtil;
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 3fe9d89d62..9e1d028e47 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,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 org.slf4j.Logger;
@@ -47,6 +46,7 @@ import org.tmatesoft.svn.core.internal.server.dav.DAVServlet;
import sonia.scm.repository.Repository;
import sonia.scm.repository.RepositoryRequestListenerUtil;
+import sonia.scm.repository.RepositoryProvider;
import sonia.scm.repository.SvnRepositoryHandler;
import sonia.scm.util.AssertUtil;
import sonia.scm.util.HttpUtil;
@@ -88,7 +88,7 @@ public class SvnDAVServlet extends DAVServlet
@Inject
public SvnDAVServlet(
SvnRepositoryHandler handler,
- Provider repositoryProvider,
+ RepositoryProvider repositoryProvider,
RepositoryRequestListenerUtil repositoryRequestListenerUtil)
{
this.handler = handler;
@@ -169,7 +169,7 @@ public class SvnDAVServlet extends DAVServlet
* @param repositoryProvider
*/
public SvnHttpServletRequestWrapper(HttpServletRequest request,
- Provider repositoryProvider)
+ RepositoryProvider repositoryProvider)
{
super(request);
this.repositoryProvider = repositoryProvider;
@@ -233,7 +233,7 @@ public class SvnDAVServlet extends DAVServlet
//~--- fields -------------------------------------------------------------
/** Field description */
- private Provider repositoryProvider;
+ private RepositoryProvider repositoryProvider;
}
@@ -243,7 +243,7 @@ public class SvnDAVServlet extends DAVServlet
private SvnRepositoryHandler handler;
/** Field description */
- private Provider repositoryProvider;
+ private RepositoryProvider repositoryProvider;
/** Field description */
private RepositoryRequestListenerUtil repositoryRequestListenerUtil;
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/pom.xml b/scm-webapp/pom.xml
index d04dd7e2a9..eac5c53be6 100644
--- a/scm-webapp/pom.xml
+++ b/scm-webapp/pom.xml
@@ -33,6 +33,8 @@
provided
+
+
sonia.scm
scm-core
@@ -57,6 +59,8 @@
1.10-SNAPSHOT
+
+
com.sun.jersey
jersey-server
@@ -96,12 +100,16 @@
+
+
com.google.inject.extensions
guice-multibindings
${guice.version}
+
+
ch.qos.logback
@@ -114,12 +122,16 @@
log4j-over-slf4j
${slf4j.version}
+
+
net.sf.ehcache
ehcache-core
${ehcache.version}
+
+
com.google.collections
@@ -140,6 +152,14 @@
commons-collections
3.2.1
+
+
+ asm
+ asm
+ 3.3.1
+
+
+
org.freemarker
@@ -147,12 +167,6 @@
${freemarker.version}
-
- asm
- asm
- 3.3.1
-
-
@@ -225,6 +239,8 @@
+
+
org.codehaus.enunciate
enunciate-jersey-rt
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 5f6619935d..1134ee7e48 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
@@ -672,10 +672,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;
}