From ce518ad7844ae1eaa7da96d9a70c6b42e2836f6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Mon, 10 Sep 2018 14:00:13 +0200 Subject: [PATCH] Inject repository from service provider --- .../sonia/scm/repository/api/ScmProtocol.java | 4 +- .../spi/DefaultHttpScmProtocol.java | 12 ------ .../scm/repository/spi/HttpScmProtocol.java | 17 +++++--- .../InitializingHttpScmProtocolWrapper.java | 43 ++++++++++++------- .../repository/api/RepositoryServiceTest.java | 8 +++- .../spi/GitRepositoryServiceResolver.java | 8 ++-- .../spi/HgRepositoryServiceProvider.java | 10 ----- .../spi/HgRepositoryServiceResolver.java | 8 ++-- .../main/java/sonia/scm/web/HgCGIServlet.java | 5 +-- .../spi/SvnRepositoryServiceResolver.java | 10 ++--- .../java/sonia/scm/web/SvnDAVServlet.java | 5 +-- .../RepositoryToRepositoryDtoMapper.java | 2 +- .../scm/api/v2/resources/MockScmProtocol.java | 3 +- 13 files changed, 66 insertions(+), 69 deletions(-) delete mode 100644 scm-core/src/main/java/sonia/scm/repository/spi/DefaultHttpScmProtocol.java diff --git a/scm-core/src/main/java/sonia/scm/repository/api/ScmProtocol.java b/scm-core/src/main/java/sonia/scm/repository/api/ScmProtocol.java index 0d9e1ae88e..b865d6e55b 100644 --- a/scm-core/src/main/java/sonia/scm/repository/api/ScmProtocol.java +++ b/scm-core/src/main/java/sonia/scm/repository/api/ScmProtocol.java @@ -1,7 +1,5 @@ package sonia.scm.repository.api; -import sonia.scm.repository.Repository; - import java.net.URI; /** @@ -19,5 +17,5 @@ public interface ScmProtocol { /** * The URL to access the repository providing this protocol. */ - String getUrl(Repository repository, URI baseUri); + String getUrl(URI baseUri); } diff --git a/scm-core/src/main/java/sonia/scm/repository/spi/DefaultHttpScmProtocol.java b/scm-core/src/main/java/sonia/scm/repository/spi/DefaultHttpScmProtocol.java deleted file mode 100644 index 9aaf1dfb4b..0000000000 --- a/scm-core/src/main/java/sonia/scm/repository/spi/DefaultHttpScmProtocol.java +++ /dev/null @@ -1,12 +0,0 @@ -package sonia.scm.repository.spi; - -import sonia.scm.repository.Repository; - -public abstract class DefaultHttpScmProtocol implements HttpScmProtocol { - - private final Repository repository; - - protected DefaultHttpScmProtocol(Repository repository) { - this.repository = repository; - } -} diff --git a/scm-core/src/main/java/sonia/scm/repository/spi/HttpScmProtocol.java b/scm-core/src/main/java/sonia/scm/repository/spi/HttpScmProtocol.java index 69952802fd..310b663d5d 100644 --- a/scm-core/src/main/java/sonia/scm/repository/spi/HttpScmProtocol.java +++ b/scm-core/src/main/java/sonia/scm/repository/spi/HttpScmProtocol.java @@ -10,16 +10,23 @@ import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.net.URI; -public interface HttpScmProtocol extends ScmProtocol { +public abstract class HttpScmProtocol implements ScmProtocol { + + private final Repository repository; + + public HttpScmProtocol(Repository repository) { + this.repository = repository; + } + @Override - default String getType() { + public String getType() { return "http"; } @Override - default String getUrl(Repository repository, URI baseUri) { - return baseUri.resolve(URI.create("/repo" + "/" + repository.getNamespace() + "/" + repository.getName())).toASCIIString(); + public String getUrl(URI baseUri) { + return baseUri.resolve(URI.create("repo" + "/" + repository.getNamespace() + "/" + repository.getName())).toASCIIString(); } - void serve(HttpServletRequest request, HttpServletResponse response, ServletConfig config) throws ServletException, IOException; + public abstract void serve(HttpServletRequest request, HttpServletResponse response, ServletConfig config) throws ServletException, IOException; } diff --git a/scm-core/src/main/java/sonia/scm/repository/spi/InitializingHttpScmProtocolWrapper.java b/scm-core/src/main/java/sonia/scm/repository/spi/InitializingHttpScmProtocolWrapper.java index 9c26c0905a..b83386a380 100644 --- a/scm-core/src/main/java/sonia/scm/repository/spi/InitializingHttpScmProtocolWrapper.java +++ b/scm-core/src/main/java/sonia/scm/repository/spi/InitializingHttpScmProtocolWrapper.java @@ -1,5 +1,7 @@ package sonia.scm.repository.spi; +import sonia.scm.repository.Repository; + import javax.inject.Provider; import javax.servlet.ServletConfig; import javax.servlet.ServletException; @@ -8,7 +10,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; -public abstract class InitializingHttpScmProtocolWrapper implements HttpScmProtocol { +public abstract class InitializingHttpScmProtocolWrapper { private final Provider delegateProvider; @@ -19,21 +21,32 @@ public abstract class InitializingHttpScmProtocolWrapper implements HttpScmProto this.delegateProvider = delegateProvider; } - @Override - public void serve(HttpServletRequest request, HttpServletResponse response, ServletConfig config) throws ServletException, IOException { - if (!isInitialized) { - synchronized (this) { - if (!isInitialized) { - HttpServlet httpServlet = delegateProvider.get(); - initializeServlet(config, httpServlet); - isInitialized = true; - } - } - } - delegateProvider.get().service(request, response); - } - protected void initializeServlet(ServletConfig config, HttpServlet httpServlet) throws ServletException { httpServlet.init(config); } + + public HttpScmProtocol get(Repository repository) { + return new ProtocolWrapper(repository); + } + + private class ProtocolWrapper extends HttpScmProtocol { + + public ProtocolWrapper(Repository repository) { + super(repository); + } + + @Override + public void serve(HttpServletRequest request, HttpServletResponse response, ServletConfig config) throws ServletException, IOException { + if (!isInitialized) { + synchronized (InitializingHttpScmProtocolWrapper.this) { + if (!isInitialized) { + HttpServlet httpServlet = delegateProvider.get(); + initializeServlet(config, httpServlet); + isInitialized = true; + } + } + } + delegateProvider.get().service(request, response); + } + } } diff --git a/scm-core/src/test/java/sonia/scm/repository/api/RepositoryServiceTest.java b/scm-core/src/test/java/sonia/scm/repository/api/RepositoryServiceTest.java index b363516a67..0f7914b4b0 100644 --- a/scm-core/src/test/java/sonia/scm/repository/api/RepositoryServiceTest.java +++ b/scm-core/src/test/java/sonia/scm/repository/api/RepositoryServiceTest.java @@ -24,7 +24,7 @@ public class RepositoryServiceTest { @Test public void shouldReturnProtocolsFromProvider() { - when(provider.getSupportedProtocols()).thenReturn(Collections.singleton(new DummyHttpProtocol())); + when(provider.getSupportedProtocols()).thenReturn(Collections.singleton(new DummyHttpProtocol(repository))); RepositoryService repositoryService = new RepositoryService(null, provider, repository, null); Collection supportedProtocols = repositoryService.getSupportedProtocols(); @@ -43,7 +43,11 @@ public class RepositoryServiceTest { }); } - private static class DummyHttpProtocol implements HttpScmProtocol { + private static class DummyHttpProtocol extends HttpScmProtocol { + public DummyHttpProtocol(Repository repository) { + super(repository); + } + @Override public void serve(HttpServletRequest request, HttpServletResponse response, ServletConfig config) { } diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitRepositoryServiceResolver.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitRepositoryServiceResolver.java index 39ea4f761a..654b586088 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitRepositoryServiceResolver.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitRepositoryServiceResolver.java @@ -54,10 +54,10 @@ public class GitRepositoryServiceResolver implements RepositoryServiceResolver //~--- constructors --------------------------------------------------------- @Inject - public GitRepositoryServiceResolver(GitRepositoryHandler handler, GitScmProtocolProviderWrapper servletProvider) + public GitRepositoryServiceResolver(GitRepositoryHandler handler, GitScmProtocolProviderWrapper providerWrapper) { this.handler = handler; - this.servletProvider = servletProvider; + this.providerWrapper = providerWrapper; } //~--- methods -------------------------------------------------------------- @@ -77,7 +77,7 @@ public class GitRepositoryServiceResolver implements RepositoryServiceResolver if (TYPE.equalsIgnoreCase(repository.getType())) { - provider = new GitRepositoryServiceProvider(handler, repository, servletProvider); + provider = new GitRepositoryServiceProvider(handler, repository, providerWrapper.get(repository)); } return provider; @@ -87,5 +87,5 @@ public class GitRepositoryServiceResolver implements RepositoryServiceResolver /** Field description */ private final GitRepositoryHandler handler; - private final HttpScmProtocol servletProvider; + private final GitScmProtocolProviderWrapper providerWrapper; } diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgRepositoryServiceProvider.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgRepositoryServiceProvider.java index b0499fac9f..1fc837029c 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgRepositoryServiceProvider.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgRepositoryServiceProvider.java @@ -81,16 +81,6 @@ public class HgRepositoryServiceProvider extends RepositoryServiceProvider //~--- constructors --------------------------------------------------------- - /** - * Constructs ... - * - * - * - * @param handler - * @param hookManager - * @param repository - * @param httpScmProtocol - */ HgRepositoryServiceProvider(HgRepositoryHandler handler, HgHookManager hookManager, Repository repository, HttpScmProtocol httpScmProtocol) { diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgRepositoryServiceResolver.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgRepositoryServiceResolver.java index d32d2f862f..08db6d1dbd 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgRepositoryServiceResolver.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgRepositoryServiceResolver.java @@ -65,11 +65,11 @@ public class HgRepositoryServiceResolver implements RepositoryServiceResolver */ @Inject public HgRepositoryServiceResolver(HgRepositoryHandler handler, - HgHookManager hookManager, HgScmProtocolProviderWrapper httpScmProtocol) + HgHookManager hookManager, HgScmProtocolProviderWrapper providerWrapper) { this.handler = handler; this.hookManager = hookManager; - this.httpScmProtocol = httpScmProtocol; + this.providerWrapper = providerWrapper; } //~--- methods -------------------------------------------------------------- @@ -90,7 +90,7 @@ public class HgRepositoryServiceResolver implements RepositoryServiceResolver if (TYPE.equalsIgnoreCase(repository.getType())) { provider = new HgRepositoryServiceProvider(handler, hookManager, - repository, httpScmProtocol); + repository, providerWrapper.get(repository)); } return provider; @@ -104,5 +104,5 @@ public class HgRepositoryServiceResolver implements RepositoryServiceResolver /** Field description */ private HgHookManager hookManager; - private final HttpScmProtocol httpScmProtocol; + private final HgScmProtocolProviderWrapper providerWrapper; } 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 b124c9d3af..f8fabbc040 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 @@ -51,7 +51,6 @@ import sonia.scm.repository.HgRepositoryHandler; import sonia.scm.repository.Repository; import sonia.scm.repository.RepositoryProvider; import sonia.scm.repository.RepositoryRequestListenerUtil; -import sonia.scm.repository.spi.HttpScmProtocol; import sonia.scm.security.CipherUtil; import sonia.scm.util.AssertUtil; import sonia.scm.util.HttpUtil; @@ -77,7 +76,7 @@ import java.util.Enumeration; * @author Sebastian Sdorra */ @Singleton -public class HgCGIServlet extends HttpServlet implements HttpScmProtocol +public class HgCGIServlet extends HttpServlet { /** Field description */ @@ -347,7 +346,7 @@ public class HgCGIServlet extends HttpServlet implements HttpScmProtocol return python; } - @Override +// @Override public void serve(HttpServletRequest request, HttpServletResponse response, ServletConfig config) { service(request, response); } diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnRepositoryServiceResolver.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnRepositoryServiceResolver.java index 48233156c6..eb52ba55f0 100644 --- a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnRepositoryServiceResolver.java +++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnRepositoryServiceResolver.java @@ -58,13 +58,13 @@ public class SvnRepositoryServiceResolver implements RepositoryServiceResolver * * * @param handler - * @param httpScmProtocol + * @param protocolWrapper */ @Inject - public SvnRepositoryServiceResolver(SvnRepositoryHandler handler, SvnScmProtocolProviderWrapper httpScmProtocol) + public SvnRepositoryServiceResolver(SvnRepositoryHandler handler, SvnScmProtocolProviderWrapper protocolWrapper) { this.handler = handler; - this.httpScmProtocol = httpScmProtocol; + this.protocolWrapper = protocolWrapper; } //~--- methods -------------------------------------------------------------- @@ -84,7 +84,7 @@ public class SvnRepositoryServiceResolver implements RepositoryServiceResolver if (TYPE.equalsIgnoreCase(repository.getType())) { - provider = new SvnRepositoryServiceProvider(handler, repository, httpScmProtocol); + provider = new SvnRepositoryServiceProvider(handler, repository, protocolWrapper.get(repository)); } return provider; @@ -95,5 +95,5 @@ public class SvnRepositoryServiceResolver implements RepositoryServiceResolver /** Field description */ private SvnRepositoryHandler handler; - private final HttpScmProtocol httpScmProtocol; + private final InitializingHttpScmProtocolWrapper protocolWrapper; } 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 0dda4306c6..96d0dc82c7 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 @@ -45,7 +45,6 @@ import sonia.scm.repository.Repository; import sonia.scm.repository.RepositoryProvider; import sonia.scm.repository.RepositoryRequestListenerUtil; import sonia.scm.repository.SvnRepositoryHandler; -import sonia.scm.repository.spi.HttpScmProtocol; import sonia.scm.util.AssertUtil; import sonia.scm.util.HttpUtil; @@ -63,7 +62,7 @@ import java.io.IOException; * @author Sebastian Sdorra */ @Singleton -public class SvnDAVServlet extends DAVServlet implements HttpScmProtocol +public class SvnDAVServlet extends DAVServlet { /** Field description */ @@ -285,7 +284,7 @@ public class SvnDAVServlet extends DAVServlet implements HttpScmProtocol private final RepositoryProvider repositoryProvider; } - @Override +// @Override public void serve(HttpServletRequest request, HttpServletResponse response, ServletConfig config) throws ServletException, IOException { service(request, response); } diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryToRepositoryDtoMapper.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryToRepositoryDtoMapper.java index 62d7abedf7..5ca5d13219 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryToRepositoryDtoMapper.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryToRepositoryDtoMapper.java @@ -67,6 +67,6 @@ public abstract class RepositoryToRepositoryDtoMapper extends BaseMapper