James Moger
2014-05-16 aa1361d04cfe09f90e7d8bece90c00dd6e4185bb
Replace Dagger with Guice 4.0 beta and update Guava to 16.0.1
1 files added
1 files renamed
9 files modified
3 files deleted
646 ■■■■ changed files
.classpath 7 ●●●●● patch | view | raw | blame | history
build.moxie 5 ●●●●● patch | view | raw | blame | history
gitblit.iml 29 ●●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/GitBlit.java 138 ●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/dagger/DaggerFilter.java 47 ●●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/dagger/DaggerModule.java 189 ●●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/dagger/DaggerServlet.java 44 ●●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/guice/GuiceContext.java 37 ●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/guice/GuiceModule.java 100 ●●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/servlet/GitblitContext.java 30 ●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/tickets/BranchTicketService.java 5 ●●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/tickets/FileTicketService.java 5 ●●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/tickets/NullTicketService.java 5 ●●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/tickets/RedisTicketService.java 5 ●●●●● patch | view | raw | blame | history
.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,