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();