diff --git a/scm-core/src/main/java/sonia/scm/repository/spi/ScmProviderHttpServletDecorator.java b/scm-core/src/main/java/sonia/scm/repository/spi/ScmProviderHttpServletDecorator.java new file mode 100644 index 0000000000..c5dd55d277 --- /dev/null +++ b/scm-core/src/main/java/sonia/scm/repository/spi/ScmProviderHttpServletDecorator.java @@ -0,0 +1,28 @@ +package sonia.scm.repository.spi; + +import sonia.scm.repository.Repository; + +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +public class ScmProviderHttpServletDecorator implements ScmProviderHttpServlet { + + private final ScmProviderHttpServlet object; + + public ScmProviderHttpServletDecorator(ScmProviderHttpServlet object) { + this.object = object; + } + + @Override + public void service(HttpServletRequest request, HttpServletResponse response, Repository repository) throws ServletException, IOException { + object.service(request, response, repository); + } + + @Override + public void init(ServletConfig config) throws ServletException { + object.init(config); + } +} diff --git a/scm-core/src/main/java/sonia/scm/repository/spi/ScmProviderHttpServletDecoratorFactory.java b/scm-core/src/main/java/sonia/scm/repository/spi/ScmProviderHttpServletDecoratorFactory.java new file mode 100644 index 0000000000..531a25e91d --- /dev/null +++ b/scm-core/src/main/java/sonia/scm/repository/spi/ScmProviderHttpServletDecoratorFactory.java @@ -0,0 +1,15 @@ +package sonia.scm.repository.spi; + +import sonia.scm.DecoratorFactory; +import sonia.scm.plugin.ExtensionPoint; + +@ExtensionPoint +public interface ScmProviderHttpServletDecoratorFactory extends DecoratorFactory { + /** + * Has to return true if this factory provides a decorator for the given scm type (eg. "git", "hg" or + * "svn"). + * @param type The current scm type this factory can provide a decorator for. + * @return true when the provided decorator should be used for the given scm type. + */ + boolean handlesScmType(String type); +} diff --git a/scm-core/src/main/java/sonia/scm/repository/spi/ScmProviderHttpServletFactory.java b/scm-core/src/main/java/sonia/scm/repository/spi/ScmProviderHttpServletFactory.java deleted file mode 100644 index 1f49dec4ba..0000000000 --- a/scm-core/src/main/java/sonia/scm/repository/spi/ScmProviderHttpServletFactory.java +++ /dev/null @@ -1,7 +0,0 @@ -package sonia.scm.repository.spi; - -import sonia.scm.DecoratorFactory; -import sonia.scm.plugin.ExtensionPoint; - -@ExtensionPoint -public interface ScmProviderHttpServletFactory extends DecoratorFactory {} diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/ScmGitServletProvider.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/ScmGitServletProvider.java index 2c7c8b19f9..b8eb38de6d 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/ScmGitServletProvider.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/ScmGitServletProvider.java @@ -1,22 +1,16 @@ package sonia.scm.web; import com.google.inject.Inject; -import sonia.scm.repository.spi.ScmProviderHttpServlet; -import sonia.scm.repository.spi.ScmProviderHttpServletFactory; -import sonia.scm.util.Decorators; import javax.inject.Provider; -import java.util.Set; -public class ScmGitServletProvider implements Provider { +public class ScmGitServletProvider extends ScmProviderHttpServletProvider { @Inject private Provider scmGitServlet; - @Inject(optional = true) - private Set decoratorFactories; @Override - public ScmProviderHttpServlet get() { - return Decorators.decorate(scmGitServlet.get(), decoratorFactories); + protected ScmGitServlet getRootServlet() { + return scmGitServlet.get(); } } diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/ScmProviderHttpServletProvider.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/ScmProviderHttpServletProvider.java new file mode 100644 index 0000000000..a9369d8f4e --- /dev/null +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/ScmProviderHttpServletProvider.java @@ -0,0 +1,24 @@ +package sonia.scm.web; + +import com.google.inject.Inject; +import sonia.scm.repository.spi.ScmProviderHttpServlet; +import sonia.scm.repository.spi.ScmProviderHttpServletDecoratorFactory; +import sonia.scm.util.Decorators; + +import javax.inject.Provider; +import java.util.Set; + +import static java.util.stream.Collectors.toList; + +public abstract class ScmProviderHttpServletProvider implements Provider { + + @Inject(optional = true) + private Set decoratorFactories; + + @Override + public ScmProviderHttpServlet get() { + return Decorators.decorate(getRootServlet(), decoratorFactories.stream().filter(d -> d.handlesScmType("git")).collect(toList())); + } + + protected abstract ScmProviderHttpServlet getRootServlet(); +}