fix binding of extensions with eager singleton scope

This commit is contained in:
Sebastian Sdorra
2013-01-23 09:09:48 +01:00
parent daf1e64fbe
commit d1e4b139bd
2 changed files with 46 additions and 10 deletions

View File

@@ -30,10 +30,12 @@
*/ */
package sonia.scm; package sonia.scm;
//~--- non-JDK imports -------------------------------------------------------- //~--- non-JDK imports --------------------------------------------------------
import com.google.common.collect.Sets;
import com.google.inject.AbstractModule; import com.google.inject.AbstractModule;
import com.google.inject.Binding; import com.google.inject.Binding;
import com.google.inject.Inject; import com.google.inject.Inject;
@@ -48,10 +50,15 @@ import com.google.inject.spi.BindingScopingVisitor;
import com.google.inject.spi.TypeEncounter; import com.google.inject.spi.TypeEncounter;
import com.google.inject.spi.TypeListener; import com.google.inject.spi.TypeListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
//~--- JDK imports ------------------------------------------------------------ //~--- JDK imports ------------------------------------------------------------
import java.lang.annotation.Annotation; import java.lang.annotation.Annotation;
import java.util.Set;
/** /**
* *
* @author Sebastian Sdorra * @author Sebastian Sdorra
@@ -63,8 +70,29 @@ public class EagerSingletonScopeModule extends AbstractModule
private static EagerSingletonScope EAGERSINGLETON_SCOPE = private static EagerSingletonScope EAGERSINGLETON_SCOPE =
new EagerSingletonScope(); new EagerSingletonScope();
/**
* the logger for EagerSingletonScopeModule
*/
private static final Logger logger =
LoggerFactory.getLogger(EagerSingletonScopeModule.class);
//~--- methods -------------------------------------------------------------- //~--- methods --------------------------------------------------------------
/**
* Method description
*
*/
void bind()
{
for (Binding<?> b : listener.eagerSingletons)
{
logger.info("initialize eager singleton {}", b.getKey());
b.getProvider().get();
}
listener = null;
}
/** /**
* Method description * Method description
* *
@@ -72,9 +100,10 @@ public class EagerSingletonScopeModule extends AbstractModule
@Override @Override
protected void configure() protected void configure()
{ {
bind(EagerSingletonScopeModule.class).toInstance(this);
bindScope(EagerSingleton.class, EAGERSINGLETON_SCOPE); bindScope(EagerSingleton.class, EAGERSINGLETON_SCOPE);
TypeListener listener = new EagerCreatingListener(); listener = new EagerCreatingListener();
requestInjection(listener); requestInjection(listener);
bindListener(Matchers.any(), listener); bindListener(Matchers.any(), listener);
@@ -105,7 +134,7 @@ public class EagerSingletonScopeModule extends AbstractModule
{ {
if (injector != null) if (injector != null)
{ {
createIfEager(injector.getBinding(Key.get(type))); appendIfEager(injector.getBinding(Key.get(type)));
} }
} }
@@ -122,7 +151,7 @@ public class EagerSingletonScopeModule extends AbstractModule
for (Binding<?> b : injector.getBindings().values()) for (Binding<?> b : injector.getBindings().values())
{ {
createIfEager(b); appendIfEager(b);
} }
} }
@@ -132,7 +161,7 @@ public class EagerSingletonScopeModule extends AbstractModule
* *
* @param b * @param b
*/ */
private void createIfEager(final Binding<?> b) private void appendIfEager(final Binding<?> b)
{ {
b.acceptScopingVisitor(new BindingScopingVisitor<Void>() b.acceptScopingVisitor(new BindingScopingVisitor<Void>()
{ {
@@ -153,7 +182,7 @@ public class EagerSingletonScopeModule extends AbstractModule
{ {
if (scope == EAGERSINGLETON_SCOPE) if (scope == EAGERSINGLETON_SCOPE)
{ {
b.getProvider().get(); eagerSingletons.add(b);
} }
return null; return null;
@@ -170,6 +199,9 @@ public class EagerSingletonScopeModule extends AbstractModule
//~--- fields ------------------------------------------------------------- //~--- fields -------------------------------------------------------------
/** Field description */
private Set<Binding<?>> eagerSingletons = Sets.newHashSet();
/** Field description */ /** Field description */
private Injector injector; private Injector injector;
} }
@@ -201,4 +233,10 @@ public class EagerSingletonScopeModule extends AbstractModule
return Scopes.SINGLETON.scope(key, unscoped); return Scopes.SINGLETON.scope(key, unscoped);
} }
} }
//~--- fields ---------------------------------------------------------------
/** Field description */
private EagerCreatingListener listener;
} }

View File

@@ -46,7 +46,6 @@ import org.apache.shiro.guice.web.ShiroWebModule;
import sonia.scm.cache.CacheManager; import sonia.scm.cache.CacheManager;
import sonia.scm.group.GroupManager; import sonia.scm.group.GroupManager;
import sonia.scm.plugin.DefaultPluginLoader; import sonia.scm.plugin.DefaultPluginLoader;
import sonia.scm.plugin.PluginLoader;
import sonia.scm.repository.RepositoryManager; import sonia.scm.repository.RepositoryManager;
import sonia.scm.store.StoreFactory; import sonia.scm.store.StoreFactory;
import sonia.scm.upgrade.UpgradeManager; import sonia.scm.upgrade.UpgradeManager;
@@ -134,6 +133,9 @@ public class ScmContextListener extends GuiceServletContextListener
// call destroy event // call destroy event
if ((globalInjector != null) &&!startupError) if ((globalInjector != null) &&!startupError)
{ {
// bind eager singletons
globalInjector.getInstance(EagerSingletonScopeModule.class).bind();
globalInjector.getInstance( globalInjector.getInstance(
ServletContextListenerHolder.class).contextInitialized( ServletContextListenerHolder.class).contextInitialized(
servletContextEvent); servletContextEvent);
@@ -174,10 +176,6 @@ public class ScmContextListener extends GuiceServletContextListener
private Injector getDefaultInjector(ServletContext servletContext) private Injector getDefaultInjector(ServletContext servletContext)
{ {
DefaultPluginLoader pluginLoader = new DefaultPluginLoader(servletContext); DefaultPluginLoader pluginLoader = new DefaultPluginLoader(servletContext);
//BindingExtensionProcessor bindExtProcessor =
// new BindingExtensionProcessor();
// pluginLoader.processExtensions(bindExtProcessor);
ClassOverrides overrides = ClassOverrides.findOverrides(); ClassOverrides overrides = ClassOverrides.findOverrides();
ScmServletModule main = new ScmServletModule(pluginLoader, overrides); ScmServletModule main = new ScmServletModule(pluginLoader, overrides);