From ea085d395d44cad3d669d8dbb92c128b8f2ad67c Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Sun, 11 Dec 2011 17:12:09 +0100 Subject: [PATCH] use checkedprovider for repository injection --- scm-core/pom.xml | 14 +++++ .../scm/repository/RepositoryProvider.java | 60 +++++++++++++++++++ .../web/filter/ProviderPermissionFilter.java | 5 +- .../sonia/scm/web/GitPermissionFilter.java | 4 +- .../main/java/sonia/scm/web/HgCGIServlet.java | 7 +-- .../sonia/scm/web/HgPermissionFilter.java | 4 +- .../main/java/sonia/scm/web/SvnDAVConfig.java | 7 +-- .../java/sonia/scm/web/SvnDAVServlet.java | 11 ++-- .../sonia/scm/web/SvnPermissionFilter.java | 4 +- .../main/java/sonia/scm/ScmServletModule.java | 12 +++- ...er.java => DefaultRepositoryProvider.java} | 13 ++-- .../repository/xml/XmlRepositoryManager.java | 6 +- 12 files changed, 116 insertions(+), 31 deletions(-) create mode 100644 scm-core/src/main/java/sonia/scm/repository/RepositoryProvider.java rename scm-webapp/src/main/java/sonia/scm/repository/{RepositoryProvider.java => DefaultRepositoryProvider.java} (90%) 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; }