.classpath
@@ -5,11 +5,10 @@ <classpathentry kind="src" path="src/test/java" output="bin/test-classes" /> <classpathentry kind="src" path="src/test/bugtraq" output="bin/test-classes" /> <classpathentry kind="src" path="src/main/resources" /> <classpathentry kind="lib" path="ext/dagger-1.2.1.jar" sourcepath="ext/src/dagger-1.2.1.jar" /> <classpathentry kind="lib" path="ext/guice-4.0-beta4.jar" sourcepath="ext/src/guice-4.0-beta4.jar" /> <classpathentry kind="lib" path="ext/javax.inject-1.jar" sourcepath="ext/src/javax.inject-1.jar" /> <classpathentry kind="lib" path="ext/dagger-compiler-1.2.1.jar" sourcepath="ext/src/dagger-compiler-1.2.1.jar" /> <classpathentry kind="lib" path="ext/javawriter-2.3.0.jar" sourcepath="ext/src/javawriter-2.3.0.jar" /> <classpathentry kind="lib" path="ext/guava-15.0.jar" sourcepath="ext/src/guava-15.0.jar" /> <classpathentry kind="lib" path="ext/aopalliance-1.0.jar" sourcepath="ext/src/aopalliance-1.0.jar" /> <classpathentry kind="lib" path="ext/guava-16.0.1.jar" sourcepath="ext/src/guava-16.0.1.jar" /> <classpathentry kind="lib" path="ext/annotations-12.0.jar" sourcepath="ext/src/annotations-12.0.jar" /> <classpathentry kind="lib" path="ext/log4j-1.2.17.jar" sourcepath="ext/src/log4j-1.2.17.jar" /> <classpathentry kind="lib" path="ext/slf4j-api-1.7.7.jar" sourcepath="ext/src/slf4j-api-1.7.7.jar" /> build.moxie
@@ -127,9 +127,8 @@ dependencies: # Dagger dependency injection library (annotation processor) - compile 'com.squareup.dagger:dagger:1.2.1' :war apt - compile 'com.squareup.dagger:dagger-compiler:1.2.1' :war optional apt - compile 'com.google.guava:guava:15.0' :war - compile 'com.google.inject:guice:4.0-beta4' :war - compile 'com.google.guava:guava:16.0.1' :war # Standard dependencies - compile 'com.intellij:annotations:12.0' :war - compile 'log4j:log4j:1.2.17' :war :fedclient :authority gitblit.iml
@@ -14,13 +14,13 @@ </content> <orderEntry type="sourceFolder" forTests="false" /> <orderEntry type="module-library"> <library name="dagger-1.2.1.jar"> <library name="guice-4.0-beta4.jar"> <CLASSES> <root url="jar://$MODULE_DIR$/ext/dagger-1.2.1.jar!/" /> <root url="jar://$MODULE_DIR$/ext/guice-4.0-beta4.jar!/" /> </CLASSES> <JAVADOC /> <SOURCES> <root url="jar://$MODULE_DIR$/ext/src/dagger-1.2.1.jar!/" /> <root url="jar://$MODULE_DIR$/ext/src/guice-4.0-beta4.jar!/" /> </SOURCES> </library> </orderEntry> @@ -36,35 +36,24 @@ </library> </orderEntry> <orderEntry type="module-library"> <library name="dagger-compiler-1.2.1.jar"> <library name="aopalliance-1.0.jar"> <CLASSES> <root url="jar://$MODULE_DIR$/ext/dagger-compiler-1.2.1.jar!/" /> <root url="jar://$MODULE_DIR$/ext/aopalliance-1.0.jar!/" /> </CLASSES> <JAVADOC /> <SOURCES> <root url="jar://$MODULE_DIR$/ext/src/dagger-compiler-1.2.1.jar!/" /> <root url="jar://$MODULE_DIR$/ext/src/aopalliance-1.0.jar!/" /> </SOURCES> </library> </orderEntry> <orderEntry type="module-library"> <library name="javawriter-2.3.0.jar"> <library name="guava-16.0.1.jar"> <CLASSES> <root url="jar://$MODULE_DIR$/ext/javawriter-2.3.0.jar!/" /> <root url="jar://$MODULE_DIR$/ext/guava-16.0.1.jar!/" /> </CLASSES> <JAVADOC /> <SOURCES> <root url="jar://$MODULE_DIR$/ext/src/javawriter-2.3.0.jar!/" /> </SOURCES> </library> </orderEntry> <orderEntry type="module-library"> <library name="guava-15.0.jar"> <CLASSES> <root url="jar://$MODULE_DIR$/ext/guava-15.0.jar!/" /> </CLASSES> <JAVADOC /> <SOURCES> <root url="jar://$MODULE_DIR$/ext/src/guava-15.0.jar!/" /> <root url="jar://$MODULE_DIR$/ext/src/guava-16.0.1.jar!/" /> </SOURCES> </library> </orderEntry> src/main/java/com/gitblit/GitBlit.java
@@ -25,7 +25,6 @@ import java.util.Set; import javax.inject.Inject; import javax.inject.Singleton; import javax.servlet.http.HttpServletRequest; import com.gitblit.Constants.AccessPermission; @@ -44,17 +43,13 @@ import com.gitblit.models.RepositoryModel; import com.gitblit.models.RepositoryUrl; import com.gitblit.models.UserModel; import com.gitblit.tickets.BranchTicketService; import com.gitblit.tickets.FileTicketService; import com.gitblit.tickets.ITicketService; import com.gitblit.tickets.NullTicketService; import com.gitblit.tickets.RedisTicketService; import com.gitblit.transport.ssh.IPublicKeyManager; import com.gitblit.utils.StringUtils; import dagger.Module; import dagger.ObjectGraph; import dagger.Provides; import com.google.inject.AbstractModule; import com.google.inject.Guice; import com.google.inject.Injector; /** * GitBlit is the aggregate manager for the Gitblit webapp. It provides all @@ -65,7 +60,7 @@ */ public class GitBlit extends GitblitManager { private final ObjectGraph injector; private final Injector injector; private final ServicesManager servicesManager; @@ -93,7 +88,7 @@ projectManager, federationManager); this.injector = ObjectGraph.create(getModules()); this.injector = Guice.createInjector(getModules()); this.servicesManager = new ServicesManager(this); } @@ -135,8 +130,8 @@ return servicesManager.isServingSSH(); } protected Object [] getModules() { return new Object [] { new GitBlitModule()}; protected AbstractModule [] getModules() { return new AbstractModule [] { new GitBlitModule()}; } protected boolean acceptPush(Transport byTransport) { @@ -360,7 +355,7 @@ } try { Class<? extends ITicketService> serviceClass = (Class<? extends ITicketService>) Class.forName(clazz); ticketService = injector.get(serviceClass).start(); ticketService = injector.getInstance(serviceClass).start(); if (ticketService instanceof NullTicketService) { logger.warn("No ticket service configured."); } else if (ticketService.isReady()) { @@ -370,118 +365,31 @@ } } catch (Exception e) { logger.error("failed to create ticket service " + clazz, e); ticketService = injector.get(NullTicketService.class).start(); ticketService = injector.getInstance(NullTicketService.class).start(); } } /** * A nested Dagger graph is used for constructor dependency injection of * A nested Guice Module is used for constructor dependency injection of * complex classes. * * @author James Moger * */ @Module( library = true, injects = { IStoredSettings.class, class GitBlitModule extends AbstractModule { // core managers IRuntimeManager.class, IPluginManager.class, INotificationManager.class, IUserManager.class, IAuthenticationManager.class, IRepositoryManager.class, IProjectManager.class, IFederationManager.class, // the monolithic manager IGitblit.class, // ticket services NullTicketService.class, FileTicketService.class, BranchTicketService.class, RedisTicketService.class } ) class GitBlitModule { @Provides @Singleton IStoredSettings provideSettings() { return settings; } @Provides @Singleton IRuntimeManager provideRuntimeManager() { return runtimeManager; } @Provides @Singleton IPluginManager providePluginManager() { return pluginManager; } @Provides @Singleton INotificationManager provideNotificationManager() { return notificationManager; } @Provides @Singleton IUserManager provideUserManager() { return userManager; } @Provides @Singleton IAuthenticationManager provideAuthenticationManager() { return authenticationManager; } @Provides @Singleton IRepositoryManager provideRepositoryManager() { return repositoryManager; } @Provides @Singleton IProjectManager provideProjectManager() { return projectManager; } @Provides @Singleton IFederationManager provideFederationManager() { return federationManager; } @Provides @Singleton IGitblit provideGitblit() { return GitBlit.this; } @Provides @Singleton NullTicketService provideNullTicketService() { return new NullTicketService( runtimeManager, pluginManager, notificationManager, userManager, repositoryManager); } @Provides @Singleton FileTicketService provideFileTicketService() { return new FileTicketService( runtimeManager, pluginManager, notificationManager, userManager, repositoryManager); } @Provides @Singleton BranchTicketService provideBranchTicketService() { return new BranchTicketService( runtimeManager, pluginManager, notificationManager, userManager, repositoryManager); } @Provides @Singleton RedisTicketService provideRedisTicketService() { return new RedisTicketService( runtimeManager, pluginManager, notificationManager, userManager, repositoryManager); @Override protected void configure() { bind(IStoredSettings.class).toInstance(settings); bind(IRuntimeManager.class).toInstance(runtimeManager); bind(IPluginManager.class).toInstance(pluginManager); bind(INotificationManager.class).toInstance(notificationManager); bind(IUserManager.class).toInstance(userManager); bind(IAuthenticationManager.class).toInstance(authenticationManager); bind(IRepositoryManager.class).toInstance(repositoryManager); bind(IProjectManager.class).toInstance(projectManager); bind(IFederationManager.class).toInstance(federationManager); bind(IGitblit.class).toInstance(GitBlit.this); } } } src/main/java/com/gitblit/dagger/DaggerFilter.java
File was deleted src/main/java/com/gitblit/dagger/DaggerModule.java
File was deleted src/main/java/com/gitblit/dagger/DaggerServlet.java
File was deleted src/main/java/com/gitblit/guice/GuiceContext.java
File was renamed from src/main/java/com/gitblit/dagger/DaggerContext.java @@ -1,5 +1,5 @@ /* * Copyright 2013 gitblit.com. * Copyright 2014 gitblit.com. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ package com.gitblit.dagger; package com.gitblit.guice; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; @@ -22,41 +22,42 @@ import org.slf4j.LoggerFactory; import com.gitblit.servlet.InjectionContextListener; import dagger.ObjectGraph; import com.google.inject.AbstractModule; import com.google.inject.Guice; import com.google.inject.Injector; /** * Dagger servlet context listener is a context listener that uses Dagger to * Guice servlet context listener is a context listener that uses Guice to * instantiate and inject servlets, filters, and anything else you might want. * * @author James Moger * */ public abstract class DaggerContext extends InjectionContextListener { public abstract class GuiceContext extends InjectionContextListener { public static final String INJECTOR_NAME = ObjectGraph.class.getName(); public static final String INJECTOR_NAME = Injector.class.getName(); protected final Logger logger = LoggerFactory.getLogger(getClass()); protected abstract Object [] getModules(); protected abstract AbstractModule [] getModules(); protected abstract void destroyContext(ServletContext context); protected ObjectGraph getInjector(ServletContext context) { protected Injector getInjector(ServletContext context) { Object o = context.getAttribute(INJECTOR_NAME); if (o == null) { logger.debug("instantiating Dagger modules"); Object [] modules = getModules(); logger.debug("getting Dagger injector"); logger.debug("instantiating Guice modules"); AbstractModule [] modules = getModules(); logger.debug("getting Guice injector"); try { o = ObjectGraph.create(modules); logger.debug("setting Dagger injector into {} attribute", INJECTOR_NAME); o = Guice.createInjector(modules); logger.debug("setting Guice injector into {} attribute", INJECTOR_NAME); context.setAttribute(INJECTOR_NAME, o); } catch (Throwable t) { logger.error("an error occurred creating the Dagger injector", t); logger.error("an error occurred creating the Guice injector", t); } } return (ObjectGraph) o; return (Injector) o; } /** @@ -68,8 +69,8 @@ @Override protected <X> X instantiate(ServletContext context, Class<X> clazz) { try { ObjectGraph injector = getInjector(context); return injector.get(clazz); Injector injector = getInjector(context); return injector.getInstance(clazz); } catch (Throwable t) { logger.error(null, t); } src/main/java/com/gitblit/guice/GuiceModule.java
New file @@ -0,0 +1,100 @@ /* * Copyright 2014 gitblit.com. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.gitblit.guice; import javax.inject.Singleton; import com.gitblit.FileSettings; import com.gitblit.GitBlit; import com.gitblit.IStoredSettings; import com.gitblit.Keys; import com.gitblit.manager.AuthenticationManager; import com.gitblit.manager.FederationManager; import com.gitblit.manager.IAuthenticationManager; import com.gitblit.manager.IFederationManager; import com.gitblit.manager.IGitblit; import com.gitblit.manager.INotificationManager; import com.gitblit.manager.IPluginManager; import com.gitblit.manager.IProjectManager; import com.gitblit.manager.IRepositoryManager; import com.gitblit.manager.IRuntimeManager; import com.gitblit.manager.IUserManager; import com.gitblit.manager.NotificationManager; import com.gitblit.manager.PluginManager; import com.gitblit.manager.ProjectManager; import com.gitblit.manager.RepositoryManager; import com.gitblit.manager.RuntimeManager; import com.gitblit.manager.UserManager; import com.gitblit.transport.ssh.FileKeyManager; import com.gitblit.transport.ssh.IPublicKeyManager; import com.gitblit.transport.ssh.MemoryKeyManager; import com.gitblit.transport.ssh.NullKeyManager; import com.gitblit.utils.StringUtils; import com.google.inject.AbstractModule; import com.google.inject.Provides; /** * GuiceModule references all injectable objects. * * @author James Moger * */ public class GuiceModule extends AbstractModule { @Override protected void configure() { bind(IStoredSettings.class).toInstance(new FileSettings()); // core managers bind(IRuntimeManager.class).to(RuntimeManager.class).in(Singleton.class); bind(IPluginManager.class).to(PluginManager.class).in(Singleton.class); bind(INotificationManager.class).to(NotificationManager.class).in(Singleton.class); bind(IUserManager.class).to(UserManager.class).in(Singleton.class); bind(IAuthenticationManager.class).to(AuthenticationManager.class).in(Singleton.class); bind(IRepositoryManager.class).to(RepositoryManager.class).in(Singleton.class); bind(IProjectManager.class).to(ProjectManager.class).in(Singleton.class); bind(IFederationManager.class).to(FederationManager.class).in(Singleton.class); // the monolithic manager bind(IGitblit.class).to(GitBlit.class).in(Singleton.class); } @Provides @Singleton IPublicKeyManager providePublicKeyManager(IStoredSettings settings, IRuntimeManager runtimeManager) { String clazz = settings.getString(Keys.git.sshKeysManager, FileKeyManager.class.getName()); if (StringUtils.isEmpty(clazz)) { clazz = FileKeyManager.class.getName(); } if (FileKeyManager.class.getName().equals(clazz)) { return new FileKeyManager(runtimeManager); } else if (NullKeyManager.class.getName().equals(clazz)) { return new NullKeyManager(); } else if (MemoryKeyManager.class.getName().equals(clazz)) { return new MemoryKeyManager(); } else { try { Class<?> mgrClass = Class.forName(clazz); return (IPublicKeyManager) mgrClass.newInstance(); } catch (Exception e) { } return null; } } } src/main/java/com/gitblit/servlet/GitblitContext.java
@@ -38,9 +38,9 @@ import com.gitblit.IStoredSettings; import com.gitblit.Keys; import com.gitblit.WebXmlSettings; import com.gitblit.dagger.DaggerContext; import com.gitblit.dagger.DaggerModule; import com.gitblit.extensions.LifeCycleListener; import com.gitblit.guice.GuiceContext; import com.gitblit.guice.GuiceModule; import com.gitblit.manager.IAuthenticationManager; import com.gitblit.manager.IFederationManager; import com.gitblit.manager.IGitblit; @@ -55,8 +55,8 @@ import com.gitblit.utils.ContainerUtils; import com.gitblit.utils.StringUtils; import com.gitblit.wicket.GitblitWicketFilter; import dagger.ObjectGraph; import com.google.inject.AbstractModule; import com.google.inject.Injector; /** * This class is the main entry point for the entire webapp. It is a singleton @@ -70,7 +70,7 @@ * */ @WebListener public class GitblitContext extends DaggerContext { public class GitblitContext extends GuiceContext { private static GitblitContext gitblit; @@ -116,11 +116,11 @@ } /** * Returns Gitblit's Dagger injection modules. * Returns Gitblit's Guice injection modules. */ @Override protected Object [] getModules() { return new Object [] { new DaggerModule() }; protected AbstractModule [] getModules() { return new AbstractModule [] { new GuiceModule() }; } /** @@ -128,10 +128,10 @@ */ @Override protected void beforeServletInjection(ServletContext context) { ObjectGraph injector = getInjector(context); Injector injector = getInjector(context); // create the runtime settings object IStoredSettings runtimeSettings = injector.get(IStoredSettings.class); IStoredSettings runtimeSettings = injector.getInstance(IStoredSettings.class); final File baseFolder; if (goSettings != null) { @@ -161,7 +161,7 @@ // Manually configure IRuntimeManager logManager(IRuntimeManager.class); IRuntimeManager runtime = injector.get(IRuntimeManager.class); IRuntimeManager runtime = injector.getInstance(IRuntimeManager.class); runtime.setBaseFolder(baseFolder); runtime.getStatus().isGO = goSettings != null; runtime.getStatus().servletContainer = context.getServerInfo(); @@ -189,7 +189,7 @@ logger.info("All managers started."); logger.info(""); IPluginManager pluginManager = injector.get(IPluginManager.class); IPluginManager pluginManager = injector.getInstance(IPluginManager.class); for (LifeCycleListener listener : pluginManager.getExtensions(LifeCycleListener.class)) { try { listener.onStartup(); @@ -211,12 +211,12 @@ return null; } protected <X extends IManager> X loadManager(ObjectGraph injector, Class<X> clazz) { X x = injector.get(clazz); protected <X extends IManager> X loadManager(Injector injector, Class<X> clazz) { X x = injector.getInstance(clazz); return x; } protected <X extends IManager> X startManager(ObjectGraph injector, Class<X> clazz) { protected <X extends IManager> X startManager(Injector injector, Class<X> clazz) { X x = loadManager(injector, clazz); logManager(clazz); x.start(); src/main/java/com/gitblit/tickets/BranchTicketService.java
@@ -30,6 +30,9 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicLong; import javax.inject.Inject; import javax.inject.Singleton; import org.eclipse.jgit.api.errors.ConcurrentRefUpdateException; import org.eclipse.jgit.api.errors.JGitInternalException; import org.eclipse.jgit.dircache.DirCache; @@ -81,6 +84,7 @@ * @author James Moger * */ @Singleton public class BranchTicketService extends ITicketService implements RefsChangedListener { public static final String BRANCH = "refs/meta/gitblit/tickets"; @@ -91,6 +95,7 @@ private final Map<String, AtomicLong> lastAssignedId; @Inject public BranchTicketService( IRuntimeManager runtimeManager, IPluginManager pluginManager, src/main/java/com/gitblit/tickets/FileTicketService.java
@@ -27,6 +27,9 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicLong; import javax.inject.Inject; import javax.inject.Singleton; import org.eclipse.jgit.lib.Repository; import com.gitblit.Constants; @@ -51,6 +54,7 @@ * @author James Moger * */ @Singleton public class FileTicketService extends ITicketService { private static final String JOURNAL = "journal.json"; @@ -59,6 +63,7 @@ private final Map<String, AtomicLong> lastAssignedId; @Inject public FileTicketService( IRuntimeManager runtimeManager, IPluginManager pluginManager, src/main/java/com/gitblit/tickets/NullTicketService.java
@@ -19,6 +19,9 @@ import java.util.List; import java.util.Set; import javax.inject.Inject; import javax.inject.Singleton; import com.gitblit.manager.INotificationManager; import com.gitblit.manager.IPluginManager; import com.gitblit.manager.IRepositoryManager; @@ -35,8 +38,10 @@ * @author James Moger * */ @Singleton public class NullTicketService extends ITicketService { @Inject public NullTicketService( IRuntimeManager runtimeManager, IPluginManager pluginManager, src/main/java/com/gitblit/tickets/RedisTicketService.java
@@ -22,6 +22,9 @@ import java.util.Set; import java.util.TreeSet; import javax.inject.Inject; import javax.inject.Singleton; import org.apache.commons.pool2.impl.GenericObjectPoolConfig; import redis.clients.jedis.Client; @@ -53,6 +56,7 @@ * @author James Moger * */ @Singleton public class RedisTicketService extends ITicketService { private final JedisPool pool; @@ -61,6 +65,7 @@ journal, ticket, counter } @Inject public RedisTicketService( IRuntimeManager runtimeManager, IPluginManager pluginManager,