From 1ab5e5610d29e7b4fd5d16bf5c45b747377f4074 Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Wed, 29 Aug 2012 19:05:11 +0200 Subject: [PATCH] fix wrong initializing order --- .../sonia/scm/store/JAXBStoreFactory.java | 9 +- .../java/sonia/scm/ScmContextListener.java | 36 +---- .../java/sonia/scm/ScmInitializerModule.java | 148 ++++++++++++++++++ 3 files changed, 159 insertions(+), 34 deletions(-) create mode 100644 scm-webapp/src/main/java/sonia/scm/ScmInitializerModule.java diff --git a/scm-dao-xml/src/main/java/sonia/scm/store/JAXBStoreFactory.java b/scm-dao-xml/src/main/java/sonia/scm/store/JAXBStoreFactory.java index 4fd7ead87b..3291be4806 100644 --- a/scm-dao-xml/src/main/java/sonia/scm/store/JAXBStoreFactory.java +++ b/scm-dao-xml/src/main/java/sonia/scm/store/JAXBStoreFactory.java @@ -91,7 +91,7 @@ public class JAXBStoreFactory implements ListenableStoreFactory public void init(SCMContextProvider context) { configDirectory = new File(context.getBaseDirectory(), - CONFIGDIRECTORY_NAME); + CONFIGDIRECTORY_NAME); IOUtil.mkdirs(configDirectory); } @@ -110,12 +110,17 @@ public class JAXBStoreFactory implements ListenableStoreFactory @Override public JAXBStore getStore(Class type, String name) { + if (configDirectory == null) + { + throw new IllegalStateException("store factory is not initialized"); + } + File configFile = new File(configDirectory, name.concat(FILE_EXTENSION)); if (logger.isDebugEnabled()) { logger.debug("create store for {} at {}", type.getName(), - configFile.getPath()); + configFile.getPath()); } return new JAXBStore(type, configFile); diff --git a/scm-webapp/src/main/java/sonia/scm/ScmContextListener.java b/scm-webapp/src/main/java/sonia/scm/ScmContextListener.java index 59145a40f8..fae0aa9f7f 100644 --- a/scm-webapp/src/main/java/sonia/scm/ScmContextListener.java +++ b/scm-webapp/src/main/java/sonia/scm/ScmContextListener.java @@ -41,6 +41,8 @@ import com.google.inject.Injector; import com.google.inject.Module; import com.google.inject.servlet.GuiceServletContextListener; +import org.apache.shiro.guice.web.ShiroWebModule; + import sonia.scm.cache.CacheManager; import sonia.scm.group.GroupManager; import sonia.scm.plugin.DefaultPluginLoader; @@ -58,7 +60,6 @@ import java.util.List; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; -import org.apache.shiro.guice.web.ShiroWebModule; /** * @@ -186,43 +187,14 @@ public class ScmContextListener extends GuiceServletContextListener bindExtProcessor, overrides); List moduleList = Lists.newArrayList(); + moduleList.add(new ScmInitializerModule()); moduleList.add(ShiroWebModule.guiceFilterModule()); moduleList.add(main); moduleList.add(new ScmSecurityModule(servletContext)); moduleList.addAll(bindExtProcessor.getModuleSet()); moduleList.addAll(overrides.getModules()); - - Injector injector = Guice.createInjector(moduleList); - SCMContextProvider context = SCMContext.getContext(); - - // init StoreFactory - injector.getInstance(StoreFactory.class).init(context); - - // init RepositoryManager - RepositoryManager repositoryManager = - injector.getInstance(RepositoryManager.class); - - repositoryManager.addHooks(bindExtProcessor.getHooks()); - repositoryManager.init(context); - - // init UserManager - UserManager userManager = injector.getInstance(UserManager.class); - - userManager.init(context); - - // init GroupManager - GroupManager groupManager = injector.getInstance(GroupManager.class); - - groupManager.init(context); - - // init Authenticator - AuthenticationManager authenticationManager = - injector.getInstance(AuthenticationManager.class); - - authenticationManager.init(context); - - return injector; + return Guice.createInjector(moduleList); } /** diff --git a/scm-webapp/src/main/java/sonia/scm/ScmInitializerModule.java b/scm-webapp/src/main/java/sonia/scm/ScmInitializerModule.java new file mode 100644 index 0000000000..ad111dd22a --- /dev/null +++ b/scm-webapp/src/main/java/sonia/scm/ScmInitializerModule.java @@ -0,0 +1,148 @@ +/** + * Copyright (c) 2010, Sebastian Sdorra All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. 2. Redistributions in + * binary form must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. 3. Neither the name of SCM-Manager; + * nor the names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * http://bitbucket.org/sdorra/scm-manager + * + */ + + + +package sonia.scm; + +//~--- non-JDK imports -------------------------------------------------------- + +import com.google.inject.AbstractModule; +import com.google.inject.TypeLiteral; +import com.google.inject.matcher.AbstractMatcher; +import com.google.inject.matcher.Matcher; +import com.google.inject.spi.InjectionListener; +import com.google.inject.spi.TypeEncounter; +import com.google.inject.spi.TypeListener; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * + * @author Sebastian Sdorra + */ +public class ScmInitializerModule extends AbstractModule +{ + + /** + * the logger for ScmInitializerModule + */ + private static final Logger logger = + LoggerFactory.getLogger(ScmInitializerModule.class); + + //~--- methods -------------------------------------------------------------- + + /** + * Method description + * + */ + @Override + protected void configure() + { + bindListener(isSubtypeOf(Initable.class), new TypeListener() + { + + @Override + public void hear(TypeLiteral type, TypeEncounter encounter) + { + encounter.register(new InjectionListener() + { + @Override + public void afterInjection(Object i) + { + if (logger.isTraceEnabled()) + { + logger.trace("initialize initable {}", i.getClass()); + } + + Initable initable = (Initable) i; + + initable.init(SCMContext.getContext()); + } + }); + } + }); + } + + /** + * Method description + * + * + * @param subtype + * @param supertype + * + * @return + */ + private boolean typeIsSubtypeOf(TypeLiteral subtype, + TypeLiteral supertype) + { + + // First check that raw types are compatible + // Then check that generic types are compatible! HOW???? + return (subtype.equals(supertype) + || (supertype.getRawType().isAssignableFrom(subtype.getRawType()) + && supertype.equals(subtype.getSupertype(supertype.getRawType())))); + } + + //~--- get methods ---------------------------------------------------------- + + /** + * Method description + * + * + * @param supertype + * + * @return + */ + private Matcher> isSubtypeOf(final Class supertype) + { + return isSubtypeOf(TypeLiteral.get(supertype)); + } + + /** + * Method description + * + * + * @param supertype + * + * @return + */ + private Matcher> isSubtypeOf(final TypeLiteral supertype) + { + return new AbstractMatcher>() + { + @Override + public boolean matches(TypeLiteral type) + { + return typeIsSubtypeOf(type, supertype); + } + }; + } +}