Add servlet decorators for hg and svn

This commit is contained in:
René Pfeuffer
2018-09-14 09:36:56 +02:00
parent 6ab5f58fe9
commit 7de9f69061
10 changed files with 98 additions and 9 deletions

View File

@@ -1,8 +1,6 @@
package sonia.scm.web; package sonia.scm.repository.spi;
import com.google.inject.Inject; import com.google.inject.Inject;
import sonia.scm.repository.spi.ScmProviderHttpServlet;
import sonia.scm.repository.spi.ScmProviderHttpServletDecoratorFactory;
import sonia.scm.util.Decorators; import sonia.scm.util.Decorators;
import javax.inject.Provider; import javax.inject.Provider;
@@ -15,9 +13,15 @@ public abstract class ScmProviderHttpServletProvider implements Provider<ScmProv
@Inject(optional = true) @Inject(optional = true)
private Set<ScmProviderHttpServletDecoratorFactory> decoratorFactories; private Set<ScmProviderHttpServletDecoratorFactory> decoratorFactories;
private final String type;
protected ScmProviderHttpServletProvider(String type) {
this.type = type;
}
@Override @Override
public ScmProviderHttpServlet get() { public ScmProviderHttpServlet get() {
return Decorators.decorate(getRootServlet(), decoratorFactories.stream().filter(d -> d.handlesScmType("git")).collect(toList())); return Decorators.decorate(getRootServlet(), decoratorFactories.stream().filter(d -> d.handlesScmType(type)).collect(toList()));
} }
protected abstract ScmProviderHttpServlet getRootServlet(); protected abstract ScmProviderHttpServlet getRootServlet();

View File

@@ -1,16 +1,22 @@
package sonia.scm.web; package sonia.scm.web;
import com.google.inject.Inject; import com.google.inject.Inject;
import sonia.scm.repository.spi.ScmProviderHttpServlet;
import sonia.scm.repository.spi.ScmProviderHttpServletProvider;
import javax.inject.Provider; import javax.inject.Provider;
public class ScmGitServletProvider extends ScmProviderHttpServletProvider { public class ScmGitServletProvider extends ScmProviderHttpServletProvider {
@Inject @Inject
private Provider<ScmGitServlet> scmGitServlet; private Provider<ScmGitServlet> servletProvider;
public ScmGitServletProvider() {
super("git");
}
@Override @Override
protected ScmGitServlet getRootServlet() { protected ScmProviderHttpServlet getRootServlet() {
return scmGitServlet.get(); return servletProvider.get();
} }
} }

View File

@@ -0,0 +1,14 @@
package sonia.scm.web;
import com.google.inject.BindingAnnotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@BindingAnnotation
@Target({ ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER })
@Retention(RetentionPolicy.RUNTIME)
@interface Hg {
}

View File

@@ -0,0 +1,22 @@
package sonia.scm.web;
import com.google.inject.Inject;
import sonia.scm.repository.spi.ScmProviderHttpServlet;
import sonia.scm.repository.spi.ScmProviderHttpServletProvider;
import javax.inject.Provider;
public class HgCGIServletProvider extends ScmProviderHttpServletProvider {
@Inject
private Provider<HgCGIServlet> servletProvider;
public HgCGIServletProvider() {
super("hg");
}
@Override
protected ScmProviderHttpServlet getRootServlet() {
return servletProvider.get();
}
}

View File

@@ -4,6 +4,7 @@ import sonia.scm.api.v2.resources.ScmPathInfoStore;
import sonia.scm.config.ScmConfiguration; import sonia.scm.config.ScmConfiguration;
import sonia.scm.plugin.Extension; import sonia.scm.plugin.Extension;
import sonia.scm.repository.spi.InitializingHttpScmProtocolWrapper; import sonia.scm.repository.spi.InitializingHttpScmProtocolWrapper;
import sonia.scm.repository.spi.ScmProviderHttpServlet;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Provider; import javax.inject.Provider;
@@ -13,7 +14,7 @@ import javax.inject.Singleton;
@Extension @Extension
public class HgScmProtocolProviderWrapper extends InitializingHttpScmProtocolWrapper { public class HgScmProtocolProviderWrapper extends InitializingHttpScmProtocolWrapper {
@Inject @Inject
public HgScmProtocolProviderWrapper(Provider<HgCGIServlet> servletProvider, Provider<HgPermissionFilter> permissionFilter, Provider<ScmPathInfoStore> uriInfoStore, ScmConfiguration scmConfiguration) { public HgScmProtocolProviderWrapper(@Hg Provider<ScmProviderHttpServlet> servletProvider, Provider<HgPermissionFilter> permissionFilter, Provider<ScmPathInfoStore> uriInfoStore, ScmConfiguration scmConfiguration) {
super(servletProvider, permissionFilter, uriInfoStore, scmConfiguration); super(servletProvider, permissionFilter, uriInfoStore, scmConfiguration);
} }

View File

@@ -46,6 +46,7 @@ import sonia.scm.plugin.Extension;
import sonia.scm.repository.HgContext; import sonia.scm.repository.HgContext;
import sonia.scm.repository.HgContextProvider; import sonia.scm.repository.HgContextProvider;
import sonia.scm.repository.HgHookManager; import sonia.scm.repository.HgHookManager;
import sonia.scm.repository.spi.ScmProviderHttpServlet;
/** /**
* *
@@ -79,6 +80,8 @@ public class HgServletModule extends ServletModule
bind(HgConfigPackagesToDtoMapper.class).to(Mappers.getMapper(HgConfigPackagesToDtoMapper.class).getClass()); bind(HgConfigPackagesToDtoMapper.class).to(Mappers.getMapper(HgConfigPackagesToDtoMapper.class).getClass());
bind(HgConfigInstallationsToDtoMapper.class); bind(HgConfigInstallationsToDtoMapper.class);
bind(ScmProviderHttpServlet.class).annotatedWith(Hg.class).toProvider(HgCGIServletProvider.class);
// bind servlets // bind servlets
serve(MAPPING_HOOK).with(HgHookCallbackServlet.class); serve(MAPPING_HOOK).with(HgHookCallbackServlet.class);
} }

View File

@@ -0,0 +1,14 @@
package sonia.scm.web;
import com.google.inject.BindingAnnotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@BindingAnnotation
@Target({ ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER })
@Retention(RetentionPolicy.RUNTIME)
@interface Svn {
}

View File

@@ -0,0 +1,22 @@
package sonia.scm.web;
import com.google.inject.Inject;
import sonia.scm.repository.spi.ScmProviderHttpServlet;
import sonia.scm.repository.spi.ScmProviderHttpServletProvider;
import javax.inject.Provider;
public class SvnDAVServletProvider extends ScmProviderHttpServletProvider {
@Inject
private Provider<SvnDAVServlet> servletProvider;
public SvnDAVServletProvider() {
super("svn");
}
@Override
protected ScmProviderHttpServlet getRootServlet() {
return servletProvider.get();
}
}

View File

@@ -26,7 +26,7 @@ public class SvnScmProtocolProviderWrapper extends InitializingHttpScmProtocolWr
} }
@Inject @Inject
public SvnScmProtocolProviderWrapper(Provider<SvnDAVServlet> servletProvider, Provider<SvnPermissionFilter> permissionFilter, Provider<ScmPathInfoStore> uriInfoStore, ScmConfiguration scmConfiguration) { public SvnScmProtocolProviderWrapper(@Svn Provider<ScmProviderHttpServlet> servletProvider, Provider<SvnPermissionFilter> permissionFilter, Provider<ScmPathInfoStore> uriInfoStore, ScmConfiguration scmConfiguration) {
super(servletProvider, permissionFilter, uriInfoStore, scmConfiguration); super(servletProvider, permissionFilter, uriInfoStore, scmConfiguration);
} }

View File

@@ -38,6 +38,7 @@ import org.mapstruct.factory.Mappers;
import sonia.scm.api.v2.resources.SvnConfigDtoToSvnConfigMapper; import sonia.scm.api.v2.resources.SvnConfigDtoToSvnConfigMapper;
import sonia.scm.api.v2.resources.SvnConfigToSvnConfigDtoMapper; import sonia.scm.api.v2.resources.SvnConfigToSvnConfigDtoMapper;
import sonia.scm.plugin.Extension; import sonia.scm.plugin.Extension;
import sonia.scm.repository.spi.ScmProviderHttpServlet;
/** /**
* *
@@ -50,5 +51,7 @@ public class SvnServletModule extends ServletModule {
protected void configureServlets() { protected void configureServlets() {
bind(SvnConfigDtoToSvnConfigMapper.class).to(Mappers.getMapper(SvnConfigDtoToSvnConfigMapper.class).getClass()); bind(SvnConfigDtoToSvnConfigMapper.class).to(Mappers.getMapper(SvnConfigDtoToSvnConfigMapper.class).getClass());
bind(SvnConfigToSvnConfigDtoMapper.class).to(Mappers.getMapper(SvnConfigToSvnConfigDtoMapper.class).getClass()); bind(SvnConfigToSvnConfigDtoMapper.class).to(Mappers.getMapper(SvnConfigToSvnConfigDtoMapper.class).getClass());
bind(ScmProviderHttpServlet.class).annotatedWith(Svn.class).toProvider(SvnDAVServletProvider.class);
} }
} }