diff --git a/scm-annotations/src/main/java/sonia/scm/plugin/ExtensionPoint.java b/scm-annotations/src/main/java/sonia/scm/plugin/ExtensionPoint.java index b936aba76b..5417317627 100644 --- a/scm-annotations/src/main/java/sonia/scm/plugin/ExtensionPoint.java +++ b/scm-annotations/src/main/java/sonia/scm/plugin/ExtensionPoint.java @@ -51,5 +51,6 @@ import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) public @interface ExtensionPoint { - boolean multi() default true; + boolean multi() default true; + boolean autoBind() default true; } diff --git a/scm-core/src/main/java/sonia/scm/plugin/ExtensionPointElement.java b/scm-core/src/main/java/sonia/scm/plugin/ExtensionPointElement.java index 42408d25ca..25b8fe303a 100644 --- a/scm-core/src/main/java/sonia/scm/plugin/ExtensionPointElement.java +++ b/scm-core/src/main/java/sonia/scm/plugin/ExtensionPointElement.java @@ -65,13 +65,15 @@ public final class ExtensionPointElement * @param clazz * @param description * @param multiple + * @param autoBind */ public ExtensionPointElement(Class clazz, String description, - boolean multiple) + boolean multiple, boolean autoBind) { this.clazz = clazz; this.description = description; this.multiple = multiple; + this.autoBind = autoBind; } //~--- methods -------------------------------------------------------------- @@ -101,7 +103,8 @@ public final class ExtensionPointElement return Objects.equal(clazz, other.clazz) && Objects.equal(description, other.description) - && Objects.equal(multiple, other.multiple); + && Objects.equal(multiple, other.multiple) + && Objects.equal(autoBind, other.autoBind); } /** @@ -113,7 +116,7 @@ public final class ExtensionPointElement @Override public int hashCode() { - return Objects.hashCode(clazz, description, multiple); + return Objects.hashCode(clazz, description, multiple, autoBind); } /** @@ -130,6 +133,7 @@ public final class ExtensionPointElement .add("class", clazz) .add("description", description) .add("multiple", multiple) + .add("autoBind", autoBind) .toString(); //J+ } @@ -158,6 +162,17 @@ public final class ExtensionPointElement return description; } + /** + * Method description + * + * + * @return + */ + public boolean isAutoBind() + { + return autoBind; + } + /** * Method description * @@ -181,4 +196,7 @@ public final class ExtensionPointElement /** Field description */ @XmlElement(name = "multi") private boolean multiple = true; + + /** Field description */ + private boolean autoBind = true; } diff --git a/scm-core/src/main/java/sonia/scm/plugin/PluginLoader.java b/scm-core/src/main/java/sonia/scm/plugin/PluginLoader.java index 97f46f0f22..0bf37054a8 100644 --- a/scm-core/src/main/java/sonia/scm/plugin/PluginLoader.java +++ b/scm-core/src/main/java/sonia/scm/plugin/PluginLoader.java @@ -56,14 +56,6 @@ public interface PluginLoader */ public ExtensionProcessor getExtensionProcessor(); - /** - * Method description - * - * - * @return - */ - public Collection getInjectionModules(); - /** * Method description * diff --git a/scm-core/src/main/resources/META-INF/scm/module.xml b/scm-core/src/main/resources/META-INF/scm/module.xml index 85aba486d0..40f3cefc34 100644 --- a/scm-core/src/main/resources/META-INF/scm/module.xml +++ b/scm-core/src/main/resources/META-INF/scm/module.xml @@ -36,4 +36,8 @@ http://bitbucket.org/sdorra/scm-manager javax.servlet.http.HttpSessionListener + + com.google.inject.Module + false + diff --git a/scm-core/src/test/java/sonia/scm/plugin/ScmModuleTest.java b/scm-core/src/test/java/sonia/scm/plugin/ScmModuleTest.java index 1e46e721be..45c490d15e 100644 --- a/scm-core/src/test/java/sonia/scm/plugin/ScmModuleTest.java +++ b/scm-core/src/test/java/sonia/scm/plugin/ScmModuleTest.java @@ -78,9 +78,9 @@ public class ScmModuleTest assertThat( module.getExtensionPoints(), containsInAnyOrder( - new ExtensionPointElement(String.class, "ext01", true), - new ExtensionPointElement(Long.class, "ext02", true), - new ExtensionPointElement(Integer.class, "ext03", false) + new ExtensionPointElement(String.class, "ext01", true, true), + new ExtensionPointElement(Long.class, "ext02", true, true), + new ExtensionPointElement(Integer.class, "ext03", false, true) ) ); assertThat( diff --git a/scm-webapp/src/main/java/sonia/scm/ScmContextListener.java b/scm-webapp/src/main/java/sonia/scm/ScmContextListener.java index f9fe12a09a..0d5b4d71d3 100644 --- a/scm-webapp/src/main/java/sonia/scm/ScmContextListener.java +++ b/scm-webapp/src/main/java/sonia/scm/ScmContextListener.java @@ -36,6 +36,7 @@ package sonia.scm; //~--- non-JDK imports -------------------------------------------------------- import com.google.common.base.Stopwatch; +import com.google.common.base.Throwables; import com.google.common.collect.Lists; import com.google.inject.Guice; import com.google.inject.Injector; @@ -50,6 +51,7 @@ import org.slf4j.LoggerFactory; import sonia.scm.cache.CacheManager; import sonia.scm.group.GroupManager; import sonia.scm.plugin.DefaultPluginLoader; +import sonia.scm.plugin.ExtensionProcessor; import sonia.scm.plugin.PluginWrapper; import sonia.scm.repository.RepositoryManager; import sonia.scm.store.StoreFactory; @@ -204,6 +206,33 @@ public class ScmContextListener extends GuiceServletContextListener return globalInjector; } + //~--- methods -------------------------------------------------------------- + + /** + * Method description + * + * + * @param ep + * @param moduleList + */ + private void appendModules(ExtensionProcessor ep, List moduleList) + { + for (Class module : ep.byExtensionPoint(Module.class)) + { + try + { + logger.info("add module {}", module); + moduleList.add(module.newInstance()); + } + catch (IllegalAccessException | InstantiationException ex) + { + throw Throwables.propagate(ex); + } + } + } + + //~--- get methods ---------------------------------------------------------- + /** * Method description * @@ -228,7 +257,7 @@ public class ScmContextListener extends GuiceServletContextListener moduleList.add(ShiroWebModule.guiceFilterModule()); moduleList.add(new ScmServletModule(servletCtx, pluginLoader, overrides)); moduleList.add(new ScmSecurityModule(servletCtx)); - moduleList.addAll(pluginLoader.getInjectionModules()); + appendModules(pluginLoader.getExtensionProcessor(), moduleList); moduleList.addAll(overrides.getModules()); SCMContextProvider ctx = SCMContext.getContext(); diff --git a/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginLoader.java b/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginLoader.java index 304bab39c9..3f793e3655 100644 --- a/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginLoader.java +++ b/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginLoader.java @@ -123,18 +123,6 @@ public class DefaultPluginLoader implements PluginLoader return extensionProcessor; } - /** - * Method description - * - * - * @return - */ - @Override - public Set getInjectionModules() - { - return ImmutableSet.copyOf(collector.getInjectionModules()); - } - /** * Method description * diff --git a/scm-webapp/src/main/java/sonia/scm/plugin/ExtensionBinder.java b/scm-webapp/src/main/java/sonia/scm/plugin/ExtensionBinder.java index ebef86ec5a..935bcbb3b6 100644 --- a/scm-webapp/src/main/java/sonia/scm/plugin/ExtensionBinder.java +++ b/scm-webapp/src/main/java/sonia/scm/plugin/ExtensionBinder.java @@ -93,6 +93,29 @@ public final class ExtensionBinder logger.info("bind extensions to extension points"); for (ExtensionPointElement epe : collector.getExtensionPointElements()) + { + bindExtensionPoint(collector, epe); + } + + logger.info("bind loose extensions"); + bindLooseExtensions(collector.getLooseExtensions()); + logger.info("bind rest providers"); + bindRestProviders(collector.getRestProviders()); + logger.info("bind rest resources"); + bindRestResource(collector.getRestResources()); + } + + /** + * Method description + * + * + * @param collector + * @param epe + */ + private void bindExtensionPoint(ExtensionCollector collector, + ExtensionPointElement epe) + { + if (epe.isAutoBind()) { if (epe.isMultiple()) { @@ -113,13 +136,10 @@ public final class ExtensionBinder } } } - - logger.info("bind loose extensions"); - bindLooseExtensions(collector.getLooseExtensions()); - logger.info("bind rest providers"); - bindRestProviders(collector.getRestProviders()); - logger.info("bind rest resources"); - bindRestResource(collector.getRestResources()); + else + { + logger.debug("bind type of {} is manual", epe.getClazz()); + } } /** diff --git a/scm-webapp/src/main/java/sonia/scm/plugin/ExtensionCollector.java b/scm-webapp/src/main/java/sonia/scm/plugin/ExtensionCollector.java index 5b0576367f..d374bd3a8d 100644 --- a/scm-webapp/src/main/java/sonia/scm/plugin/ExtensionCollector.java +++ b/scm-webapp/src/main/java/sonia/scm/plugin/ExtensionCollector.java @@ -39,10 +39,6 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Multimap; import com.google.common.collect.Sets; -import com.google.inject.Module; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; //~--- JDK imports ------------------------------------------------------------ @@ -60,14 +56,6 @@ import java.util.Set; public final class ExtensionCollector { - /** - * the logger for ExtensionCollector - */ - private static final Logger logger = - LoggerFactory.getLogger(ExtensionCollector.class); - - //~--- constructors --------------------------------------------------------- - /** * Constructs ... * @@ -100,9 +88,12 @@ public final class ExtensionCollector public Collection byExtensionPoint(ExtensionPointElement epe) { Collection collection = extensions.get(epe); - if ( collection == null ){ + + if (collection == null) + { collection = Collections.EMPTY_SET; } + return collection; } @@ -181,17 +172,6 @@ public final class ExtensionCollector return extensions; } - /** - * Method description - * - * - * @return - */ - public Set getInjectionModules() - { - return injectionModules; - } - /** * Method description * @@ -254,24 +234,6 @@ public final class ExtensionCollector } } - /** - * Method description - * - * - * @param extension - */ - private void appendModule(Class extension) - { - try - { - injectionModules.add((Module) extension.newInstance()); - } - catch (IllegalAccessException | InstantiationException ex) - { - logger.error("could not create instance of module", ex); - } - } - /** * Method description * @@ -282,14 +244,7 @@ public final class ExtensionCollector { for (Class extension : module.getExtensions()) { - if (Module.class.isAssignableFrom(extension)) - { - appendModule(extension); - } - else - { - appendExtension(extension); - } + appendExtension(extension); } } @@ -305,6 +260,7 @@ public final class ExtensionCollector { extensionPointIndex.put(epe.getClazz(), epe); } + restProviders.addAll(Lists.newArrayList(module.getRestProviders())); restResources.addAll(Lists.newArrayList(module.getRestResources())); } @@ -314,9 +270,6 @@ public final class ExtensionCollector /** Field description */ private final Set looseExtensions = Sets.newHashSet(); - /** Field description */ - private final Set injectionModules = Sets.newHashSet(); - /** Field description */ private final Set restProviders = Sets.newHashSet();