From cacf8bff097fbb66a7be1bfe267b5da2605145f8 Mon Sep 17 00:00:00 2001 From: James Moger <james.moger@gitblit.com> Date: Fri, 29 Nov 2013 11:05:46 -0500 Subject: [PATCH] Use Dagger to inject managers into all filters and servlets --- src/main/java/com/gitblit/SyndicationServlet.java | 24 src/main/java/com/gitblit/RpcFilter.java | 20 .gitignore | 2 src/main/java/com/gitblit/GCExecutor.java | 10 src/main/java/com/gitblit/LuceneExecutor.java | 10 .classpath | 155 +++--- src/main/java/com/gitblit/GitFilter.java | 21 src/main/java/com/gitblit/AuthenticationFilter.java | 7 src/main/java/com/gitblit/AccessRestrictionFilter.java | 17 src/main/java/com/gitblit/MirrorExecutor.java | 10 src/main/java/com/gitblit/wicket/GitBlitWebApp.java | 69 ++ src/main/java/com/gitblit/BranchGraphServlet.java | 19 src/main/java/com/gitblit/git/GitServlet.java | 34 + src/main/java/com/gitblit/git/GitblitUploadPackFactory.java | 8 src/main/java/com/gitblit/EnforceAuthenticationFilter.java | 19 src/main/java/com/gitblit/git/RepositoryResolver.java | 17 src/main/java/com/gitblit/PagesServlet.java | 18 src/main/java/com/gitblit/git/GitblitReceivePackFactory.java | 28 + src/main/.gitignore | 1 src/main/java/com/gitblit/SparkleShareInviteServlet.java | 28 + src/main/java/com/gitblit/LogoServlet.java | 11 src/main/java/com/gitblit/DownloadZipServlet.java | 17 src/main/java/com/gitblit/git/GitDaemon.java | 58 +- src/test/java/com/gitblit/tests/mock/MemorySettings.java | 9 src/main/java/com/gitblit/DownloadZipFilter.java | 15 src/main/java/com/gitblit/git/GitblitReceivePack.java | 22 src/main/java/com/gitblit/PagesFilter.java | 14 src/main/java/com/gitblit/GitBlit.java | 19 src/main/java/com/gitblit/wicket/GitblitWicketFilter.java | 43 + src/main/java/com/gitblit/RpcServlet.java | 38 + src/main/java/com/gitblit/dagger/DaggerWicketFilter.java | 54 ++ src/main/java/com/gitblit/RobotsTxtServlet.java | 10 src/test/java/com/gitblit/tests/LuceneExecutorTest.java | 11 /dev/null | 32 - src/main/java/com/gitblit/SyndicationFilter.java | 24 src/main/java/com/gitblit/DaggerModule.java | 136 ++++++ src/main/java/com/gitblit/dagger/DaggerContextListener.java | 80 +++ build.xml | 58 -- build.moxie | 4 gitblit.iml | 45 ++ src/main/java/com/gitblit/FederationServlet.java | 28 + 41 files changed, 892 insertions(+), 353 deletions(-) diff --git a/.classpath b/.classpath index d1b04da..9d6a6d2 100644 --- a/.classpath +++ b/.classpath @@ -1,78 +1,87 @@ <?xml version="1.0" encoding="UTF-8"?> <classpath> - <classpathentry kind="src" path="src/main/java"/> - <classpathentry kind="src" output="bin/test-classes" path="src/test/java"/> - <classpathentry kind="src" path="src/main/resources"/> - <classpathentry kind="lib" path="ext/jcommander-1.17.jar" sourcepath="ext/src/jcommander-1.17.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.6.6.jar" sourcepath="ext/src/slf4j-api-1.6.6.jar"/> - <classpathentry kind="lib" path="ext/slf4j-log4j12-1.6.6.jar" sourcepath="ext/src/slf4j-log4j12-1.6.6.jar"/> - <classpathentry kind="lib" path="ext/mail-1.4.3.jar" sourcepath="ext/src/mail-1.4.3.jar"/> - <classpathentry kind="lib" path="ext/javax.servlet-api-3.0.1.jar" sourcepath="ext/src/javax.servlet-api-3.0.1.jar"/> - <classpathentry kind="lib" path="ext/jetty-webapp-8.1.13.v20130916.jar" sourcepath="ext/src/jetty-webapp-8.1.13.v20130916.jar"/> - <classpathentry kind="lib" path="ext/jetty-ajp-8.1.13.v20130916.jar" sourcepath="ext/src/jetty-ajp-8.1.13.v20130916.jar"/> - <classpathentry kind="lib" path="ext/wicket-1.4.21.jar" sourcepath="ext/src/wicket-1.4.21.jar"/> - <classpathentry kind="lib" path="ext/wicket-auth-roles-1.4.21.jar" sourcepath="ext/src/wicket-auth-roles-1.4.21.jar"/> - <classpathentry kind="lib" path="ext/wicket-extensions-1.4.21.jar" sourcepath="ext/src/wicket-extensions-1.4.21.jar"/> - <classpathentry kind="lib" path="ext/googlecharts-1.4.21.jar" sourcepath="ext/src/googlecharts-1.4.21.jar"/> - <classpathentry kind="lib" path="ext/lucene-core-3.6.1.jar" sourcepath="ext/src/lucene-core-3.6.1.jar"/> - <classpathentry kind="lib" path="ext/lucene-highlighter-3.6.1.jar" sourcepath="ext/src/lucene-highlighter-3.6.1.jar"/> - <classpathentry kind="lib" path="ext/lucene-memory-3.6.1.jar" sourcepath="ext/src/lucene-memory-3.6.1.jar"/> - <classpathentry kind="lib" path="ext/lucene-queries-3.6.1.jar" sourcepath="ext/src/lucene-queries-3.6.1.jar"/> - <classpathentry kind="lib" path="ext/jakarta-regexp-1.4.jar"/> - <classpathentry kind="lib" path="ext/pegdown-1.4.1.jar" sourcepath="ext/src/pegdown-1.4.1.jar"/> - <classpathentry kind="lib" path="ext/parboiled-java-1.1.5.jar" sourcepath="ext/src/parboiled-java-1.1.5.jar"/> - <classpathentry kind="lib" path="ext/parboiled-core-1.1.5.jar" sourcepath="ext/src/parboiled-core-1.1.5.jar"/> - <classpathentry kind="lib" path="ext/asm-4.1.jar" sourcepath="ext/src/asm-4.1.jar"/> - <classpathentry kind="lib" path="ext/asm-tree-4.1.jar" sourcepath="ext/src/asm-tree-4.1.jar"/> - <classpathentry kind="lib" path="ext/asm-analysis-4.1.jar" sourcepath="ext/src/asm-analysis-4.1.jar"/> - <classpathentry kind="lib" path="ext/asm-util-4.1.jar" sourcepath="ext/src/asm-util-4.1.jar"/> - <classpathentry kind="lib" path="ext/wikitext-core-1.4.jar" sourcepath="ext/src/wikitext-core-1.4.jar"/> - <classpathentry kind="lib" path="ext/twiki-core-1.4.jar" sourcepath="ext/src/twiki-core-1.4.jar"/> - <classpathentry kind="lib" path="ext/textile-core-1.4.jar" sourcepath="ext/src/textile-core-1.4.jar"/> - <classpathentry kind="lib" path="ext/tracwiki-core-1.4.jar" sourcepath="ext/src/tracwiki-core-1.4.jar"/> - <classpathentry kind="lib" path="ext/mediawiki-core-1.4.jar" sourcepath="ext/src/mediawiki-core-1.4.jar"/> - <classpathentry kind="lib" path="ext/confluence-core-1.4.jar" sourcepath="ext/src/confluence-core-1.4.jar"/> - <classpathentry kind="lib" path="ext/org.eclipse.jgit-3.1.0.201310021548-r.jar" sourcepath="ext/src/org.eclipse.jgit-3.1.0.201310021548-r.jar"/> - <classpathentry kind="lib" path="ext/jsch-0.1.46.jar" sourcepath="ext/src/jsch-0.1.46.jar"/> - <classpathentry kind="lib" path="ext/JavaEWAH-0.5.6.jar" sourcepath="ext/src/JavaEWAH-0.5.6.jar"/> - <classpathentry kind="lib" path="ext/org.eclipse.jgit.http.server-3.1.0.201310021548-r.jar" sourcepath="ext/src/org.eclipse.jgit.http.server-3.1.0.201310021548-r.jar"/> - <classpathentry kind="lib" path="ext/bcprov-jdk15on-1.47.jar" sourcepath="ext/src/bcprov-jdk15on-1.47.jar"/> - <classpathentry kind="lib" path="ext/bcmail-jdk15on-1.47.jar" sourcepath="ext/src/bcmail-jdk15on-1.47.jar"/> - <classpathentry kind="lib" path="ext/bcpkix-jdk15on-1.47.jar" sourcepath="ext/src/bcpkix-jdk15on-1.47.jar"/> - <classpathentry kind="lib" path="ext/rome-0.9.jar" sourcepath="ext/src/rome-0.9.jar"/> - <classpathentry kind="lib" path="ext/jdom-1.0.jar" sourcepath="ext/src/jdom-1.0.jar"/> - <classpathentry kind="lib" path="ext/gson-1.7.2.jar" sourcepath="ext/src/gson-1.7.2.jar"/> - <classpathentry kind="lib" path="ext/groovy-all-1.8.8.jar" sourcepath="ext/src/groovy-all-1.8.8.jar"/> - <classpathentry kind="lib" path="ext/unboundid-ldapsdk-2.3.0.jar" sourcepath="ext/src/unboundid-ldapsdk-2.3.0.jar"/> - <classpathentry kind="lib" path="ext/ivy-2.2.0.jar" sourcepath="ext/src/ivy-2.2.0.jar"/> - <classpathentry kind="lib" path="ext/jcalendar-1.3.2.jar"/> - <classpathentry kind="lib" path="ext/commons-compress-1.4.1.jar" sourcepath="ext/src/commons-compress-1.4.1.jar"/> - <classpathentry kind="lib" path="ext/xz-1.0.jar" sourcepath="ext/src/xz-1.0.jar"/> - <classpathentry kind="lib" path="ext/commons-io-2.2.jar" sourcepath="ext/src/commons-io-2.2.jar"/> - <classpathentry kind="lib" path="ext/force-partner-api-24.0.0.jar" sourcepath="ext/src/force-partner-api-24.0.0.jar"/> - <classpathentry kind="lib" path="ext/force-wsc-24.0.0.jar" sourcepath="ext/src/force-wsc-24.0.0.jar"/> - <classpathentry kind="lib" path="ext/js-1.7R2.jar" sourcepath="ext/src/js-1.7R2.jar"/> - <classpathentry kind="lib" path="ext/freemarker-2.3.19.jar" sourcepath="ext/src/freemarker-2.3.19.jar"/> - <classpathentry kind="lib" path="ext/waffle-jna-1.5.jar" sourcepath="ext/src/waffle-jna-1.5.jar"/> - <classpathentry kind="lib" path="ext/platform-3.5.0.jar" sourcepath="ext/src/platform-3.5.0.jar"/> - <classpathentry kind="lib" path="ext/jna-3.5.0.jar" sourcepath="ext/src/jna-3.5.0.jar"/> - <classpathentry kind="lib" path="ext/guava-13.0.1.jar" sourcepath="ext/src/guava-13.0.1.jar"/> - <classpathentry kind="lib" path="ext/libpam4j-1.7.jar" sourcepath="ext/src/libpam4j-1.7.jar"/> - <classpathentry kind="lib" path="ext/commons-codec-1.7.jar" sourcepath="ext/src/commons-codec-1.7.jar"/> - <classpathentry kind="lib" path="ext/junit-4.11.jar" sourcepath="ext/src/junit-4.11.jar"/> - <classpathentry kind="lib" path="ext/hamcrest-core-1.3.jar" sourcepath="ext/src/hamcrest-core-1.3.jar"/> - <classpathentry kind="lib" path="ext/selenium-java-2.28.0.jar" sourcepath="ext/src/selenium-java-2.28.0.jar"/> - <classpathentry kind="lib" path="ext/selenium-support-2.28.0.jar" sourcepath="ext/src/selenium-support-2.28.0.jar"/> - <classpathentry kind="lib" path="ext/selenium-firefox-driver-2.28.0.jar" sourcepath="ext/src/selenium-firefox-driver-2.28.0.jar"/> - <classpathentry kind="lib" path="ext/selenium-remote-driver-2.28.0.jar" sourcepath="ext/src/selenium-remote-driver-2.28.0.jar"/> - <classpathentry kind="lib" path="ext/cglib-nodep-2.1_3.jar" sourcepath="ext/src/cglib-nodep-2.1_3.jar"/> - <classpathentry kind="lib" path="ext/json-20080701.jar" sourcepath="ext/src/json-20080701.jar"/> - <classpathentry kind="lib" path="ext/selenium-api-2.28.0.jar" sourcepath="ext/src/selenium-api-2.28.0.jar"/> - <classpathentry kind="lib" path="ext/httpclient-4.2.1.jar" sourcepath="ext/src/httpclient-4.2.1.jar"/> - <classpathentry kind="lib" path="ext/httpcore-4.2.1.jar" sourcepath="ext/src/httpcore-4.2.1.jar"/> - <classpathentry kind="lib" path="ext/commons-logging-1.1.1.jar" sourcepath="ext/src/commons-logging-1.1.1.jar"/> - <classpathentry kind="lib" path="ext/commons-exec-1.1.jar" sourcepath="ext/src/commons-exec-1.1.jar"/> + <classpathentry kind="src" path="src/main/java" /> + <classpathentry kind="src" path="src/test/java" output="bin/test-classes" /> + <classpathentry kind="src" path="src/main/resources" /> + <classpathentry kind="lib" path="ext/dagger-1.1.0.jar" sourcepath="ext/src/dagger-1.1.0.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.1.0.jar" sourcepath="ext/src/dagger-compiler-1.1.0.jar" /> + <classpathentry kind="lib" path="ext/javawriter-2.1.1.jar" sourcepath="ext/src/javawriter-2.1.1.jar" /> + <classpathentry kind="lib" path="ext/jcommander-1.17.jar" sourcepath="ext/src/jcommander-1.17.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.6.6.jar" sourcepath="ext/src/slf4j-api-1.6.6.jar" /> + <classpathentry kind="lib" path="ext/slf4j-log4j12-1.6.6.jar" sourcepath="ext/src/slf4j-log4j12-1.6.6.jar" /> + <classpathentry kind="lib" path="ext/mail-1.4.3.jar" sourcepath="ext/src/mail-1.4.3.jar" /> + <classpathentry kind="lib" path="ext/javax.servlet-api-3.0.1.jar" sourcepath="ext/src/javax.servlet-api-3.0.1.jar" /> + <classpathentry kind="lib" path="ext/jetty-webapp-8.1.13.v20130916.jar" sourcepath="ext/src/jetty-webapp-8.1.13.v20130916.jar" /> + <classpathentry kind="lib" path="ext/jetty-ajp-8.1.13.v20130916.jar" sourcepath="ext/src/jetty-ajp-8.1.13.v20130916.jar" /> + <classpathentry kind="lib" path="ext/wicket-1.4.21.jar" sourcepath="ext/src/wicket-1.4.21.jar" /> + <classpathentry kind="lib" path="ext/wicket-auth-roles-1.4.21.jar" sourcepath="ext/src/wicket-auth-roles-1.4.21.jar" /> + <classpathentry kind="lib" path="ext/wicket-extensions-1.4.21.jar" sourcepath="ext/src/wicket-extensions-1.4.21.jar" /> + <classpathentry kind="lib" path="ext/googlecharts-1.4.21.jar" sourcepath="ext/src/googlecharts-1.4.21.jar" /> + <classpathentry kind="lib" path="ext/lucene-core-3.6.1.jar" sourcepath="ext/src/lucene-core-3.6.1.jar" /> + <classpathentry kind="lib" path="ext/lucene-highlighter-3.6.1.jar" sourcepath="ext/src/lucene-highlighter-3.6.1.jar" /> + <classpathentry kind="lib" path="ext/lucene-memory-3.6.1.jar" sourcepath="ext/src/lucene-memory-3.6.1.jar" /> + <classpathentry kind="lib" path="ext/lucene-queries-3.6.1.jar" sourcepath="ext/src/lucene-queries-3.6.1.jar" /> + <classpathentry kind="lib" path="ext/jakarta-regexp-1.4.jar" /> + <classpathentry kind="lib" path="ext/pegdown-1.4.1.jar" sourcepath="ext/src/pegdown-1.4.1.jar" /> + <classpathentry kind="lib" path="ext/parboiled-java-1.1.5.jar" sourcepath="ext/src/parboiled-java-1.1.5.jar" /> + <classpathentry kind="lib" path="ext/parboiled-core-1.1.5.jar" sourcepath="ext/src/parboiled-core-1.1.5.jar" /> + <classpathentry kind="lib" path="ext/asm-4.1.jar" sourcepath="ext/src/asm-4.1.jar" /> + <classpathentry kind="lib" path="ext/asm-tree-4.1.jar" sourcepath="ext/src/asm-tree-4.1.jar" /> + <classpathentry kind="lib" path="ext/asm-analysis-4.1.jar" sourcepath="ext/src/asm-analysis-4.1.jar" /> + <classpathentry kind="lib" path="ext/asm-util-4.1.jar" sourcepath="ext/src/asm-util-4.1.jar" /> + <classpathentry kind="lib" path="ext/wikitext-core-1.4.jar" sourcepath="ext/src/wikitext-core-1.4.jar" /> + <classpathentry kind="lib" path="ext/twiki-core-1.4.jar" sourcepath="ext/src/twiki-core-1.4.jar" /> + <classpathentry kind="lib" path="ext/textile-core-1.4.jar" sourcepath="ext/src/textile-core-1.4.jar" /> + <classpathentry kind="lib" path="ext/tracwiki-core-1.4.jar" sourcepath="ext/src/tracwiki-core-1.4.jar" /> + <classpathentry kind="lib" path="ext/mediawiki-core-1.4.jar" sourcepath="ext/src/mediawiki-core-1.4.jar" /> + <classpathentry kind="lib" path="ext/confluence-core-1.4.jar" sourcepath="ext/src/confluence-core-1.4.jar" /> + <classpathentry kind="lib" path="ext/org.eclipse.jgit-3.1.0.201310021548-r.jar" sourcepath="ext/src/org.eclipse.jgit-3.1.0.201310021548-r.jar" /> + <classpathentry kind="lib" path="ext/jsch-0.1.46.jar" sourcepath="ext/src/jsch-0.1.46.jar" /> + <classpathentry kind="lib" path="ext/JavaEWAH-0.5.6.jar" sourcepath="ext/src/JavaEWAH-0.5.6.jar" /> + <classpathentry kind="lib" path="ext/org.eclipse.jgit.http.server-3.1.0.201310021548-r.jar" sourcepath="ext/src/org.eclipse.jgit.http.server-3.1.0.201310021548-r.jar" /> + <classpathentry kind="lib" path="ext/bcprov-jdk15on-1.47.jar" sourcepath="ext/src/bcprov-jdk15on-1.47.jar" /> + <classpathentry kind="lib" path="ext/bcmail-jdk15on-1.47.jar" sourcepath="ext/src/bcmail-jdk15on-1.47.jar" /> + <classpathentry kind="lib" path="ext/bcpkix-jdk15on-1.47.jar" sourcepath="ext/src/bcpkix-jdk15on-1.47.jar" /> + <classpathentry kind="lib" path="ext/rome-0.9.jar" sourcepath="ext/src/rome-0.9.jar" /> + <classpathentry kind="lib" path="ext/jdom-1.0.jar" sourcepath="ext/src/jdom-1.0.jar" /> + <classpathentry kind="lib" path="ext/gson-1.7.2.jar" sourcepath="ext/src/gson-1.7.2.jar" /> + <classpathentry kind="lib" path="ext/groovy-all-1.8.8.jar" sourcepath="ext/src/groovy-all-1.8.8.jar" /> + <classpathentry kind="lib" path="ext/unboundid-ldapsdk-2.3.0.jar" sourcepath="ext/src/unboundid-ldapsdk-2.3.0.jar" /> + <classpathentry kind="lib" path="ext/ivy-2.2.0.jar" sourcepath="ext/src/ivy-2.2.0.jar" /> + <classpathentry kind="lib" path="ext/jcalendar-1.3.2.jar" /> + <classpathentry kind="lib" path="ext/commons-compress-1.4.1.jar" sourcepath="ext/src/commons-compress-1.4.1.jar" /> + <classpathentry kind="lib" path="ext/xz-1.0.jar" sourcepath="ext/src/xz-1.0.jar" /> + <classpathentry kind="lib" path="ext/commons-io-2.2.jar" sourcepath="ext/src/commons-io-2.2.jar" /> + <classpathentry kind="lib" path="ext/force-partner-api-24.0.0.jar" sourcepath="ext/src/force-partner-api-24.0.0.jar" /> + <classpathentry kind="lib" path="ext/force-wsc-24.0.0.jar" sourcepath="ext/src/force-wsc-24.0.0.jar" /> + <classpathentry kind="lib" path="ext/js-1.7R2.jar" sourcepath="ext/src/js-1.7R2.jar" /> + <classpathentry kind="lib" path="ext/freemarker-2.3.19.jar" sourcepath="ext/src/freemarker-2.3.19.jar" /> + <classpathentry kind="lib" path="ext/waffle-jna-1.5.jar" sourcepath="ext/src/waffle-jna-1.5.jar" /> + <classpathentry kind="lib" path="ext/platform-3.5.0.jar" sourcepath="ext/src/platform-3.5.0.jar" /> + <classpathentry kind="lib" path="ext/jna-3.5.0.jar" sourcepath="ext/src/jna-3.5.0.jar" /> + <classpathentry kind="lib" path="ext/guava-13.0.1.jar" sourcepath="ext/src/guava-13.0.1.jar" /> + <classpathentry kind="lib" path="ext/libpam4j-1.7.jar" sourcepath="ext/src/libpam4j-1.7.jar" /> + <classpathentry kind="lib" path="ext/commons-codec-1.7.jar" sourcepath="ext/src/commons-codec-1.7.jar" /> + <classpathentry kind="lib" path="ext/junit-4.11.jar" sourcepath="ext/src/junit-4.11.jar" /> + <classpathentry kind="lib" path="ext/hamcrest-core-1.3.jar" sourcepath="ext/src/hamcrest-core-1.3.jar" /> + <classpathentry kind="lib" path="ext/selenium-java-2.28.0.jar" sourcepath="ext/src/selenium-java-2.28.0.jar" /> + <classpathentry kind="lib" path="ext/selenium-support-2.28.0.jar" sourcepath="ext/src/selenium-support-2.28.0.jar" /> + <classpathentry kind="lib" path="ext/selenium-firefox-driver-2.28.0.jar" sourcepath="ext/src/selenium-firefox-driver-2.28.0.jar" /> + <classpathentry kind="lib" path="ext/selenium-remote-driver-2.28.0.jar" sourcepath="ext/src/selenium-remote-driver-2.28.0.jar" /> + <classpathentry kind="lib" path="ext/cglib-nodep-2.1_3.jar" sourcepath="ext/src/cglib-nodep-2.1_3.jar" /> + <classpathentry kind="lib" path="ext/json-20080701.jar" sourcepath="ext/src/json-20080701.jar" /> + <classpathentry kind="lib" path="ext/selenium-api-2.28.0.jar" sourcepath="ext/src/selenium-api-2.28.0.jar" /> + <classpathentry kind="lib" path="ext/httpclient-4.2.1.jar" sourcepath="ext/src/httpclient-4.2.1.jar" /> + <classpathentry kind="lib" path="ext/httpcore-4.2.1.jar" sourcepath="ext/src/httpcore-4.2.1.jar" /> + <classpathentry kind="lib" path="ext/commons-logging-1.1.1.jar" sourcepath="ext/src/commons-logging-1.1.1.jar" /> + <classpathentry kind="lib" path="ext/commons-exec-1.1.jar" sourcepath="ext/src/commons-exec-1.1.jar" /> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER" /> + <classpathentry kind="src" path="src/main/dagger"> + <attributes> + <attribute name="optional" value="true"/> + </attributes> + </classpathentry> <classpathentry kind="output" path="bin/classes" /> </classpath> diff --git a/.gitignore b/.gitignore index f77b6ff..078de7e 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,5 @@ /build-next.xml /*.ps1 /*.sh +/*.factorypath +/src/main/dagger diff --git a/build.moxie b/build.moxie index 7816c92..acc1afb 100644 --- a/build.moxie +++ b/build.moxie @@ -57,6 +57,7 @@ # a scope to each directory. sourceDirectories: - compile 'src/main/java' +- compile 'src/main/dagger' apt - test 'src/test/java' # Moxie supports one site-scoped directory for mx:doc - site 'src/site' @@ -120,6 +121,9 @@ # dependencies: +# Dagger dependency injection library (annotation processor) +- compile 'com.squareup.dagger:dagger:1.1.0' :war apt +- compile 'com.squareup.dagger:dagger-compiler:1.1.0' :war optional apt # Standard dependencies - compile 'com.beust:jcommander:1.17' :fedclient :authority - compile 'log4j:log4j:1.2.17' :war :fedclient :authority diff --git a/build.xml b/build.xml index 860eca9..ab6699b 100644 --- a/build.xml +++ b/build.xml @@ -247,34 +247,7 @@ </mx:webxml> <!-- Gitblit jar --> - <mx:genjar destfile="${webinf}/lib/gitblit.jar" includeresources="false" excludeclasspathjars="true"> - <!-- Specify all web.xml servlets and filters --> - <class name="com.gitblit.GitBlit" /> - <class name="com.gitblit.Keys" /> - <class name="com.gitblit.DownloadZipFilter" /> - <class name="com.gitblit.DownloadZipServlet" /> - <class name="com.gitblit.EnforceAuthenticationFilter" /> - <class name="com.gitblit.FederationServlet" /> - <class name="com.gitblit.GitFilter" /> - <class name="com.gitblit.git.GitServlet" /> - <class name="com.gitblit.LogoServlet" /> - <class name="com.gitblit.PagesFilter" /> - <class name="com.gitblit.PagesServlet" /> - <class name="com.gitblit.RobotsTxtServlet" /> - <class name="com.gitblit.RpcFilter" /> - <class name="com.gitblit.RpcServlet" /> - <class name="com.gitblit.SyndicationFilter" /> - <class name="com.gitblit.SyndicationServlet" /> - <class name="com.gitblit.SparkleShareInviteServlet" /> - <class name="com.gitblit.wicket.GitblitWicketFilter" /> - <class name="com.gitblit.wicket.GitBlitWebApp" /> - <!-- Manually include alternative User Services --> - <class name="com.gitblit.LdapUserService" /> - <class name="com.gitblit.RedmineUserService" /> - <class name="com.gitblit.SalesforceUserService" /> - <class name="com.gitblit.WindowsUserService" /> - <class name="com.gitblit.PAMUserService" /> - </mx:genjar> + <mx:jar destfile="${webinf}/lib/gitblit.jar" includeresources="false" /> <!-- Build the WAR file --> <mx:zip basedir="${war.dir}" destfile="${project.targetDirectory}/${distribution.warfile}" compress="true" > @@ -368,34 +341,7 @@ </mx:webxml> <!-- Gitblit classes --> - <mx:genjar destfile="${webinf}/lib/gitblit.jar" includeresources="false" excludeclasspathjars="true"> - <!-- Specify all web.xml servlets and filters --> - <class name="com.gitblit.GitBlit" /> - <class name="com.gitblit.Keys" /> - <class name="com.gitblit.DownloadZipFilter" /> - <class name="com.gitblit.DownloadZipServlet" /> - <class name="com.gitblit.EnforceAuthenticationFilter" /> - <class name="com.gitblit.FederationServlet" /> - <class name="com.gitblit.GitFilter" /> - <class name="com.gitblit.git.GitServlet" /> - <class name="com.gitblit.LogoServlet" /> - <class name="com.gitblit.PagesFilter" /> - <class name="com.gitblit.PagesServlet" /> - <class name="com.gitblit.RobotsTxtServlet" /> - <class name="com.gitblit.RpcFilter" /> - <class name="com.gitblit.RpcServlet" /> - <class name="com.gitblit.SyndicationFilter" /> - <class name="com.gitblit.SyndicationServlet" /> - <class name="com.gitblit.SparkleShareInviteServlet" /> - <class name="com.gitblit.wicket.GitblitWicketFilter" /> - <class name="com.gitblit.wicket.GitBlitWebApp" /> - <!-- Manually include alternative User Services --> - <class name="com.gitblit.LdapUserService" /> - <class name="com.gitblit.RedmineUserService" /> - <class name="com.gitblit.SalesforceUserService" /> - <class name="com.gitblit.WindowsUserService" /> - <class name="com.gitblit.PAMUserService" /> - </mx:genjar> + <mx:jar destfile="${webinf}/lib/gitblit.jar" includeresources="false" /> <!-- Build Express Zip file --> <mx:zip basedir="${express.dir}" destfile="${project.targetDirectory}/${express.zipfile}"> diff --git a/gitblit.iml b/gitblit.iml index 67638df..74b1e85 100644 --- a/gitblit.iml +++ b/gitblit.iml @@ -6,11 +6,56 @@ <exclude-output /> <content url="file://$MODULE_DIR$"> <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" /> + <sourceFolder url="file://$MODULE_DIR$/src/main/dagger" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" /> <sourceFolder url="file://$MODULE_DIR$/src/main/resources" isTestSource="false" /> </content> <orderEntry type="sourceFolder" forTests="false" /> <orderEntry type="module-library"> + <library name="dagger-1.1.0.jar"> + <CLASSES> + <root url="jar://$MODULE_DIR$/ext/dagger-1.1.0.jar!/" /> + </CLASSES> + <JAVADOC /> + <SOURCES> + <root url="jar://$MODULE_DIR$/ext/src/dagger-1.1.0.jar!/" /> + </SOURCES> + </library> + </orderEntry> + <orderEntry type="module-library"> + <library name="javax.inject-1.jar"> + <CLASSES> + <root url="jar://$MODULE_DIR$/ext/javax.inject-1.jar!/" /> + </CLASSES> + <JAVADOC /> + <SOURCES> + <root url="jar://$MODULE_DIR$/ext/src/javax.inject-1.jar!/" /> + </SOURCES> + </library> + </orderEntry> + <orderEntry type="module-library"> + <library name="dagger-compiler-1.1.0.jar"> + <CLASSES> + <root url="jar://$MODULE_DIR$/ext/dagger-compiler-1.1.0.jar!/" /> + </CLASSES> + <JAVADOC /> + <SOURCES> + <root url="jar://$MODULE_DIR$/ext/src/dagger-compiler-1.1.0.jar!/" /> + </SOURCES> + </library> + </orderEntry> + <orderEntry type="module-library"> + <library name="javawriter-2.1.1.jar"> + <CLASSES> + <root url="jar://$MODULE_DIR$/ext/javawriter-2.1.1.jar!/" /> + </CLASSES> + <JAVADOC /> + <SOURCES> + <root url="jar://$MODULE_DIR$/ext/src/javawriter-2.1.1.jar!/" /> + </SOURCES> + </library> + </orderEntry> + <orderEntry type="module-library"> <library name="jcommander-1.17.jar"> <CLASSES> <root url="jar://$MODULE_DIR$/ext/jcommander-1.17.jar!/" /> diff --git a/src/main/.gitignore b/src/main/.gitignore new file mode 100644 index 0000000..01c48ab --- /dev/null +++ b/src/main/.gitignore @@ -0,0 +1 @@ +/dagger diff --git a/src/main/java/com/gitblit/AccessRestrictionFilter.java b/src/main/java/com/gitblit/AccessRestrictionFilter.java index ac97ba2..5f0baed 100644 --- a/src/main/java/com/gitblit/AccessRestrictionFilter.java +++ b/src/main/java/com/gitblit/AccessRestrictionFilter.java @@ -27,6 +27,7 @@ import com.gitblit.manager.IRepositoryManager; import com.gitblit.manager.IRuntimeManager; +import com.gitblit.manager.ISessionManager; import com.gitblit.models.RepositoryModel; import com.gitblit.models.UserModel; import com.gitblit.utils.StringUtils; @@ -46,6 +47,19 @@ * */ public abstract class AccessRestrictionFilter extends AuthenticationFilter { + + protected final IRuntimeManager runtimeManager; + + protected final IRepositoryManager repositoryManager; + + protected AccessRestrictionFilter( + IRuntimeManager runtimeManager, + ISessionManager sessionManager, + IRepositoryManager repositoryManager) { + super(sessionManager); + this.runtimeManager = runtimeManager; + this.repositoryManager = repositoryManager; + } /** * Extract the repository name from the url. @@ -127,9 +141,6 @@ String fullUrl = getFullUrl(httpRequest); String repository = extractRepositoryName(fullUrl); - - IRuntimeManager runtimeManager = GitBlit.getManager(IRuntimeManager.class); - IRepositoryManager repositoryManager = GitBlit.getManager(IRepositoryManager.class); if (repositoryManager.isCollectingGarbage(repository)) { logger.info(MessageFormat.format("ARF: Rejecting request for {0}, busy collecting garbage!", repository)); diff --git a/src/main/java/com/gitblit/AuthenticationFilter.java b/src/main/java/com/gitblit/AuthenticationFilter.java index 9aeb89f..96d880f 100644 --- a/src/main/java/com/gitblit/AuthenticationFilter.java +++ b/src/main/java/com/gitblit/AuthenticationFilter.java @@ -57,6 +57,12 @@ protected transient Logger logger = LoggerFactory.getLogger(getClass()); + protected final ISessionManager sessionManager; + + protected AuthenticationFilter(ISessionManager sessionManager) { + this.sessionManager = sessionManager; + } + /** * doFilter does the actual work of preprocessing the request to ensure that * the user may proceed. @@ -101,7 +107,6 @@ * @return user */ protected UserModel getUser(HttpServletRequest httpRequest) { - ISessionManager sessionManager = GitBlit.getManager(ISessionManager.class); UserModel user = sessionManager.authenticate(httpRequest, requiresClientCertificate()); return user; } diff --git a/src/main/java/com/gitblit/BranchGraphServlet.java b/src/main/java/com/gitblit/BranchGraphServlet.java index 986560c..58a5778 100644 --- a/src/main/java/com/gitblit/BranchGraphServlet.java +++ b/src/main/java/com/gitblit/BranchGraphServlet.java @@ -36,6 +36,8 @@ import java.util.TreeSet; import javax.imageio.ImageIO; +import javax.inject.Inject; +import javax.inject.Singleton; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; @@ -61,6 +63,7 @@ * @author James Moger * */ +@Singleton public class BranchGraphServlet extends HttpServlet { private static final long serialVersionUID = 1L; @@ -74,8 +77,18 @@ private final Stroke[] strokeCache; - public BranchGraphServlet() { + private final IStoredSettings settings; + + private final IRepositoryManager repositoryManager; + + @Inject + public BranchGraphServlet( + IRuntimeManager runtimeManager, + IRepositoryManager repositoryManager) { + super(); + this.settings = runtimeManager.getSettings(); + this.repositoryManager = repositoryManager; strokeCache = new Stroke[4]; for (int i = 1; i < strokeCache.length; i++) @@ -104,7 +117,6 @@ protected long getLastModified(HttpServletRequest req) { String repository = req.getParameter("r"); String objectId = req.getParameter("h"); - IRepositoryManager repositoryManager = GitBlit.getManager(IRepositoryManager.class); Repository r = null; try { r = repositoryManager.getRepository(repository); @@ -130,9 +142,6 @@ String repository = request.getParameter("r"); String objectId = request.getParameter("h"); String length = request.getParameter("l"); - - IStoredSettings settings = GitBlit.getManager(IRuntimeManager.class).getSettings(); - IRepositoryManager repositoryManager = GitBlit.getManager(IRepositoryManager.class); r = repositoryManager.getRepository(repository); diff --git a/src/main/java/com/gitblit/DaggerModule.java b/src/main/java/com/gitblit/DaggerModule.java new file mode 100644 index 0000000..7ee8ecd --- /dev/null +++ b/src/main/java/com/gitblit/DaggerModule.java @@ -0,0 +1,136 @@ +/* + * Copyright 2013 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; + +import javax.inject.Singleton; + +import org.apache.wicket.protocol.http.WebApplication; + +import com.gitblit.git.GitServlet; +import com.gitblit.manager.IFederationManager; +import com.gitblit.manager.IGitblitManager; +import com.gitblit.manager.INotificationManager; +import com.gitblit.manager.IProjectManager; +import com.gitblit.manager.IRepositoryManager; +import com.gitblit.manager.IRuntimeManager; +import com.gitblit.manager.ISessionManager; +import com.gitblit.manager.IUserManager; +import com.gitblit.wicket.GitBlitWebApp; +import com.gitblit.wicket.GitblitWicketFilter; + +import dagger.Module; +import dagger.Provides; + +/** + * DaggerModule references all injectable objects. + * + * @author James Moger + * + */ +@Module( + injects = { + // core managers + IRuntimeManager.class, + INotificationManager.class, + IUserManager.class, + ISessionManager.class, + IRepositoryManager.class, + IProjectManager.class, + IGitblitManager.class, + IFederationManager.class, + + // filters & servlets + GitServlet.class, + GitFilter.class, + PagesServlet.class, + PagesFilter.class, + RpcServlet.class, + RpcFilter.class, + DownloadZipServlet.class, + DownloadZipFilter.class, + SyndicationServlet.class, + SyndicationFilter.class, + FederationServlet.class, + SparkleShareInviteServlet.class, + BranchGraphServlet.class, + RobotsTxtServlet.class, + LogoServlet.class, + EnforceAuthenticationFilter.class, + GitblitWicketFilter.class + } +) +public class DaggerModule { + + final GitBlit gitblit; + + // HACK but necessary for now + public DaggerModule(GitBlit gitblit) { + this.gitblit = gitblit; + } + + @Provides @Singleton IRuntimeManager provideRuntimeManager() { + return gitblit; + } + + @Provides @Singleton INotificationManager provideNotificationManager() { + return gitblit; + } + + @Provides @Singleton IUserManager provideUserManager() { + return gitblit; + } + + @Provides @Singleton ISessionManager provideSessionManager() { + return gitblit; + } + + @Provides @Singleton IRepositoryManager provideRepositoryManager() { + return gitblit; + } + + @Provides @Singleton IProjectManager provideProjectManager() { + return gitblit; + } + + @Provides @Singleton IGitblitManager provideGitblitManager() { + return gitblit; + } + + @Provides @Singleton IFederationManager provideFederationManager() { + return gitblit; + } + + @Provides @Singleton WebApplication provideWebApplication( + IRuntimeManager runtimeManager, + INotificationManager notificationManager, + IUserManager userManager, + ISessionManager sessionManager, + IRepositoryManager repositoryManager, + IProjectManager projectManager, + IGitblitManager gitblitManager, + IFederationManager federationManager) { + + return new GitBlitWebApp( + runtimeManager, + notificationManager, + userManager, + sessionManager, + repositoryManager, + projectManager, + gitblitManager, + federationManager); + } +} \ No newline at end of file diff --git a/src/main/java/com/gitblit/DownloadZipFilter.java b/src/main/java/com/gitblit/DownloadZipFilter.java index e52d9d7..914d89e 100644 --- a/src/main/java/com/gitblit/DownloadZipFilter.java +++ b/src/main/java/com/gitblit/DownloadZipFilter.java @@ -15,7 +15,13 @@ */ package com.gitblit; +import javax.inject.Inject; +import javax.inject.Singleton; + import com.gitblit.Constants.AccessRestrictionType; +import com.gitblit.manager.IRepositoryManager; +import com.gitblit.manager.IRuntimeManager; +import com.gitblit.manager.ISessionManager; import com.gitblit.models.RepositoryModel; import com.gitblit.models.UserModel; @@ -27,9 +33,16 @@ * @author James Moger * */ +@Singleton public class DownloadZipFilter extends AccessRestrictionFilter { - public DownloadZipFilter() { + @Inject + public DownloadZipFilter( + IRuntimeManager runtimeManager, + ISessionManager sessionManager, + IRepositoryManager repositoryManager) { + + super(runtimeManager, sessionManager, repositoryManager); } /** diff --git a/src/main/java/com/gitblit/DownloadZipServlet.java b/src/main/java/com/gitblit/DownloadZipServlet.java index 82846da..d629dcf 100644 --- a/src/main/java/com/gitblit/DownloadZipServlet.java +++ b/src/main/java/com/gitblit/DownloadZipServlet.java @@ -20,6 +20,8 @@ import java.text.ParseException; import java.util.Date; +import javax.inject.Inject; +import javax.inject.Singleton; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletResponse; @@ -43,11 +45,16 @@ * @author James Moger * */ +@Singleton public class DownloadZipServlet extends HttpServlet { private static final long serialVersionUID = 1L; private transient Logger logger = LoggerFactory.getLogger(DownloadZipServlet.class); + + private final IStoredSettings settings; + + private final IRepositoryManager repositoryManager; public static enum Format { zip(".zip"), tar(".tar"), gz(".tar.gz"), xz(".tar.xz"), bzip2(".tar.bzip2"); @@ -68,8 +75,14 @@ } } - public DownloadZipServlet() { + @Inject + public DownloadZipServlet( + IRuntimeManager runtimeManager, + IRepositoryManager repositoryManager) { + super(); + this.settings = runtimeManager.getSettings(); + this.repositoryManager = repositoryManager; } /** @@ -103,7 +116,6 @@ private void processRequest(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException { - IStoredSettings settings = GitBlit.getManager(IRuntimeManager.class).getSettings(); if (!settings.getBoolean(Keys.web.allowZipDownloads, true)) { logger.warn("Zip downloads are disabled"); response.sendError(HttpServletResponse.SC_FORBIDDEN); @@ -133,7 +145,6 @@ name += "-" + objectId; } - IRepositoryManager repositoryManager = GitBlit.getManager(IRepositoryManager.class); Repository r = repositoryManager.getRepository(repository); if (r == null) { if (repositoryManager.isCollectingGarbage(repository)) { diff --git a/src/main/java/com/gitblit/EnforceAuthenticationFilter.java b/src/main/java/com/gitblit/EnforceAuthenticationFilter.java index 12b0759..48fc005 100644 --- a/src/main/java/com/gitblit/EnforceAuthenticationFilter.java +++ b/src/main/java/com/gitblit/EnforceAuthenticationFilter.java @@ -18,6 +18,8 @@ import java.io.IOException; import java.text.MessageFormat; +import javax.inject.Inject; +import javax.inject.Singleton; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; @@ -42,11 +44,23 @@ * @author Laurens Vrijnsen * */ +@Singleton public class EnforceAuthenticationFilter implements Filter { protected transient Logger logger = LoggerFactory.getLogger(getClass()); - public EnforceAuthenticationFilter() { + private final IStoredSettings settings; + + private final ISessionManager sessionManager; + + @Inject + public EnforceAuthenticationFilter( + IRuntimeManager runtimeManager, + ISessionManager sessionManager) { + + super(); + this.settings = runtimeManager.getSettings(); + this.sessionManager = sessionManager; } /* @@ -56,7 +70,6 @@ public void init(FilterConfig filterConfig) throws ServletException { } - /* * This does the actual filtering: is the user authenticated? If not, enforce HTTP authentication (401) * @@ -65,8 +78,6 @@ @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { - IStoredSettings settings = GitBlit.getManager(IRuntimeManager.class).getSettings(); - ISessionManager sessionManager = GitBlit.getManager(ISessionManager.class); Boolean mustForceAuth = settings.getBoolean(Keys.web.authenticateViewPages, false) && settings.getBoolean(Keys.web.enforceHttpBasicAuthentication, false); diff --git a/src/main/java/com/gitblit/FederationServlet.java b/src/main/java/com/gitblit/FederationServlet.java index 0d83b4f..31e3c0e 100644 --- a/src/main/java/com/gitblit/FederationServlet.java +++ b/src/main/java/com/gitblit/FederationServlet.java @@ -25,6 +25,8 @@ import java.util.Map; import java.util.Set; +import javax.inject.Inject; +import javax.inject.Singleton; import javax.servlet.http.HttpServletResponse; import com.gitblit.Constants.FederationRequest; @@ -48,12 +50,31 @@ * @author James Moger * */ +@Singleton public class FederationServlet extends JsonServlet { private static final long serialVersionUID = 1L; - public FederationServlet() { + private final IStoredSettings settings; + + private final IUserManager userManager; + + private final IRepositoryManager repositoryManager; + + private final IFederationManager federationManager; + + @Inject + public FederationServlet( + IRuntimeManager runtimeManager, + IUserManager userManager, + IRepositoryManager repositoryManager, + IFederationManager federationManager) { + super(); + this.settings = runtimeManager.getSettings(); + this.userManager = userManager; + this.repositoryManager = repositoryManager; + this.federationManager = federationManager; } /** @@ -69,11 +90,6 @@ protected void processRequest(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException { - - IStoredSettings settings = GitBlit.getManager(IRuntimeManager.class).getSettings(); - IUserManager userManager = GitBlit.getManager(IUserManager.class); - IRepositoryManager repositoryManager = GitBlit.getManager(IRepositoryManager.class); - IFederationManager federationManager = GitBlit.getManager(IFederationManager.class); FederationRequest reqType = FederationRequest.fromName(request.getParameter("req")); logger.info(MessageFormat.format("Federation {0} request from {1}", reqType, diff --git a/src/main/java/com/gitblit/GCExecutor.java b/src/main/java/com/gitblit/GCExecutor.java index 837741f..3ab9895 100644 --- a/src/main/java/com/gitblit/GCExecutor.java +++ b/src/main/java/com/gitblit/GCExecutor.java @@ -54,14 +54,20 @@ private final IStoredSettings settings; + private final IRepositoryManager repositoryManager; + private AtomicBoolean running = new AtomicBoolean(false); private AtomicBoolean forceClose = new AtomicBoolean(false); private final Map<String, GCStatus> gcCache = new ConcurrentHashMap<String, GCStatus>(); - public GCExecutor(IStoredSettings settings) { + public GCExecutor( + IStoredSettings settings, + IRepositoryManager repositoryManager) { + this.settings = settings; + this.repositoryManager = repositoryManager; } /** @@ -131,8 +137,6 @@ running.set(true); Date now = new Date(); - - IRepositoryManager repositoryManager = GitBlit.getManager(IRepositoryManager.class); for (String repositoryName : repositoryManager.getRepositoryList()) { if (forceClose.get()) { diff --git a/src/main/java/com/gitblit/GitBlit.java b/src/main/java/com/gitblit/GitBlit.java index 31dedf1..8be50fb 100644 --- a/src/main/java/com/gitblit/GitBlit.java +++ b/src/main/java/com/gitblit/GitBlit.java @@ -65,7 +65,6 @@ import javax.naming.InitialContext; import javax.naming.NamingException; import javax.servlet.ServletContext; -import javax.servlet.ServletContextEvent; import javax.servlet.annotation.WebListener; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; @@ -95,6 +94,7 @@ import com.gitblit.Constants.FederationToken; import com.gitblit.Constants.PermissionType; import com.gitblit.Constants.RegistrantType; +import com.gitblit.dagger.DaggerContextListener; import com.gitblit.fanout.FanoutNioService; import com.gitblit.fanout.FanoutService; import com.gitblit.fanout.FanoutSocketService; @@ -164,7 +164,7 @@ * */ @WebListener -public class GitBlit extends InjectionContextListener +public class GitBlit extends DaggerContextListener implements IRuntimeManager, INotificationManager, IUserManager, @@ -3479,9 +3479,9 @@ // prepare service executors mailExecutor = new MailExecutor(settings); - luceneExecutor = new LuceneExecutor(settings, repositoriesFolder); - gcExecutor = new GCExecutor(settings); - mirrorExecutor = new MirrorExecutor(settings); + luceneExecutor = new LuceneExecutor(settings, getManager(IRepositoryManager.class)); + gcExecutor = new GCExecutor(settings, getManager(IRepositoryManager.class)); + mirrorExecutor = new MirrorExecutor(settings, getManager(IRepositoryManager.class)); // initialize utilities String prefix = settings.getString(Keys.git.userRepositoryPrefix, "~"); @@ -3641,7 +3641,7 @@ String bindInterface = settings.getString(Keys.git.daemonBindInterface, "localhost"); if (port > 0) { try { - gitDaemon = new GitDaemon(bindInterface, port, getRepositoriesFolder()); + gitDaemon = new GitDaemon(this, this, this, this); gitDaemon.start(); } catch (IOException e) { gitDaemon = null; @@ -3854,7 +3854,7 @@ * shutting down or because the servlet container is re-deploying Gitblit. */ @Override - public void contextDestroyed(ServletContextEvent contextEvent) { + protected void destroyContext(ServletContext context) { logger.info("Gitblit context destroyed by servlet container."); scheduledExecutor.shutdownNow(); luceneExecutor.close(); @@ -4052,6 +4052,11 @@ userService.logout(user); } + @Override + protected Object [] getModules() { + return new Object [] { new DaggerModule(this) }; + } + /** * Instantiate and inject all filters and servlets into the container using * the servlet 3 specification. diff --git a/src/main/java/com/gitblit/GitFilter.java b/src/main/java/com/gitblit/GitFilter.java index a06c7e5..ba8443d 100644 --- a/src/main/java/com/gitblit/GitFilter.java +++ b/src/main/java/com/gitblit/GitFilter.java @@ -17,10 +17,14 @@ import java.text.MessageFormat; +import javax.inject.Inject; +import javax.inject.Singleton; + import com.gitblit.Constants.AccessRestrictionType; import com.gitblit.Constants.AuthorizationControl; import com.gitblit.manager.IRepositoryManager; import com.gitblit.manager.IRuntimeManager; +import com.gitblit.manager.ISessionManager; import com.gitblit.models.RepositoryModel; import com.gitblit.models.UserModel; import com.gitblit.utils.StringUtils; @@ -33,6 +37,7 @@ * @author James Moger * */ +@Singleton public class GitFilter extends AccessRestrictionFilter { protected static final String gitReceivePack = "/git-receive-pack"; @@ -42,7 +47,16 @@ protected static final String[] suffixes = { gitReceivePack, gitUploadPack, "/info/refs", "/HEAD", "/objects" }; - public GitFilter() { + private final IStoredSettings settings; + + @Inject + public GitFilter( + IRuntimeManager runtimeManager, + ISessionManager sessionManager, + IRepositoryManager repositoryManager) { + + super(runtimeManager, sessionManager, repositoryManager); + this.settings = runtimeManager.getSettings(); } /** @@ -105,7 +119,6 @@ */ @Override protected boolean isCreationAllowed() { - IStoredSettings settings = GitBlit.getManager(IRuntimeManager.class).getSettings(); return settings.getBoolean(Keys.git.allowCreateOnPush, true); } @@ -125,7 +138,6 @@ @Override protected boolean requiresClientCertificate() { - IStoredSettings settings = GitBlit.getManager(IRuntimeManager.class).getSettings(); return settings.getBoolean(Keys.git.requiresClientCertificate, false); } @@ -159,7 +171,6 @@ */ @Override protected boolean canAccess(RepositoryModel repository, UserModel user, String action) { - IStoredSettings settings = GitBlit.getManager(IRuntimeManager.class).getSettings(); if (!settings.getBoolean(Keys.git.enableGitServlet, true)) { // Git Servlet disabled return false; @@ -231,14 +242,12 @@ model.accessRestriction = AccessRestrictionType.VIEW; } else { // common repository, user default server settings - IStoredSettings settings = GitBlit.getManager(IRuntimeManager.class).getSettings(); model.authorizationControl = AuthorizationControl.fromName(settings.getString(Keys.git.defaultAuthorizationControl, "")); model.accessRestriction = AccessRestrictionType.fromName(settings.getString(Keys.git.defaultAccessRestriction, "PUSH")); } // create the repository try { - IRepositoryManager repositoryManager = GitBlit.getManager(IRepositoryManager.class); repositoryManager.updateRepositoryModel(model.name, model, true); logger.info(MessageFormat.format("{0} created {1} ON-PUSH", user.username, model.name)); return repositoryManager.getRepositoryModel(model.name); diff --git a/src/main/java/com/gitblit/LogoServlet.java b/src/main/java/com/gitblit/LogoServlet.java index 4222f8f..17b05cf 100644 --- a/src/main/java/com/gitblit/LogoServlet.java +++ b/src/main/java/com/gitblit/LogoServlet.java @@ -21,6 +21,8 @@ import java.io.InputStream; import java.io.OutputStream; +import javax.inject.Inject; +import javax.inject.Singleton; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; @@ -35,19 +37,23 @@ * @author James Moger * */ +@Singleton public class LogoServlet extends HttpServlet { private static final long serialVersionUID = 1L; private static final long lastModified = System.currentTimeMillis(); - public LogoServlet() { + private final IRuntimeManager runtimeManager; + + @Inject + public LogoServlet(IRuntimeManager runtimeManager) { super(); + this.runtimeManager = runtimeManager; } @Override protected long getLastModified(HttpServletRequest req) { - IRuntimeManager runtimeManager = GitBlit.getManager(IRuntimeManager.class); File file = runtimeManager.getFileOrFolder(Keys.web.headerLogo, "${baseFolder}/logo.png"); if (file.exists()) { return Math.max(lastModified, file.lastModified()); @@ -62,7 +68,6 @@ InputStream is = null; try { String contentType = null; - IRuntimeManager runtimeManager = GitBlit.getManager(IRuntimeManager.class); File file = runtimeManager.getFileOrFolder(Keys.web.headerLogo, "${baseFolder}/logo.png"); if (file.exists()) { // custom logo diff --git a/src/main/java/com/gitblit/LuceneExecutor.java b/src/main/java/com/gitblit/LuceneExecutor.java index 19395b3..b7b71c5 100644 --- a/src/main/java/com/gitblit/LuceneExecutor.java +++ b/src/main/java/com/gitblit/LuceneExecutor.java @@ -128,6 +128,7 @@ private final Logger logger = LoggerFactory.getLogger(LuceneExecutor.class); private final IStoredSettings storedSettings; + private final IRepositoryManager repositoryManager; private final File repositoriesFolder; private final Map<String, IndexSearcher> searchers = new ConcurrentHashMap<String, IndexSearcher>(); @@ -136,9 +137,13 @@ private final String luceneIgnoreExtensions = "7z arc arj bin bmp dll doc docx exe gif gz jar jpg lib lzh odg odf odt pdf ppt png so swf xcf xls xlsx zip"; private Set<String> excludedExtensions; - public LuceneExecutor(IStoredSettings settings, File repositoriesFolder) { + public LuceneExecutor( + IStoredSettings settings, + IRepositoryManager repositoryManager) { + this.storedSettings = settings; - this.repositoriesFolder = repositoriesFolder; + this.repositoryManager = repositoryManager; + this.repositoriesFolder = repositoryManager.getRepositoriesFolder(); String exts = luceneIgnoreExtensions; if (settings != null) { exts = settings.getString(Keys.web.luceneIgnoreExtensions, exts); @@ -161,7 +166,6 @@ String exts = storedSettings.getString(Keys.web.luceneIgnoreExtensions, luceneIgnoreExtensions); excludedExtensions = new TreeSet<String>(StringUtils.getStringsFromValue(exts)); - IRepositoryManager repositoryManager = GitBlit.getManager(IRepositoryManager.class); if (repositoryManager.isCollectingGarbage()) { // busy collecting garbage, try again later return; diff --git a/src/main/java/com/gitblit/MirrorExecutor.java b/src/main/java/com/gitblit/MirrorExecutor.java index a96c955..6c951b9 100644 --- a/src/main/java/com/gitblit/MirrorExecutor.java +++ b/src/main/java/com/gitblit/MirrorExecutor.java @@ -52,14 +52,20 @@ private final IStoredSettings settings; + private final IRepositoryManager repositoryManager; + private AtomicBoolean running = new AtomicBoolean(false); private AtomicBoolean forceClose = new AtomicBoolean(false); private final UserModel gitblitUser; - public MirrorExecutor(IStoredSettings settings) { + public MirrorExecutor( + IStoredSettings settings, + IRepositoryManager repositoryManager) { + this.settings = settings; + this.repositoryManager = repositoryManager; this.gitblitUser = new UserModel("gitblit"); this.gitblitUser.displayName = "Gitblit"; } @@ -83,8 +89,6 @@ } running.set(true); - - IRepositoryManager repositoryManager = GitBlit.getManager(IRepositoryManager.class); for (String repositoryName : repositoryManager.getRepositoryList()) { if (forceClose.get()) { diff --git a/src/main/java/com/gitblit/PagesFilter.java b/src/main/java/com/gitblit/PagesFilter.java index 4c9568d..a322af2 100644 --- a/src/main/java/com/gitblit/PagesFilter.java +++ b/src/main/java/com/gitblit/PagesFilter.java @@ -15,10 +15,15 @@ */ package com.gitblit; +import javax.inject.Inject; +import javax.inject.Singleton; + import org.eclipse.jgit.lib.Repository; import com.gitblit.Constants.AccessRestrictionType; import com.gitblit.manager.IRepositoryManager; +import com.gitblit.manager.IRuntimeManager; +import com.gitblit.manager.ISessionManager; import com.gitblit.models.RepositoryModel; import com.gitblit.models.UserModel; @@ -29,9 +34,15 @@ * @author James Moger * */ +@Singleton public class PagesFilter extends AccessRestrictionFilter { - public PagesFilter() { + @Inject + public PagesFilter(IRuntimeManager runtimeManager, + ISessionManager sessionManager, + IRepositoryManager repositoryManager) { + + super(runtimeManager, sessionManager, repositoryManager); } /** @@ -53,7 +64,6 @@ } else { repository = url.substring(0, slash); } - IRepositoryManager repositoryManager = GitBlit.getManager(IRepositoryManager.class); r = repositoryManager.getRepository(repository, false); if (r == null) { // try again diff --git a/src/main/java/com/gitblit/PagesServlet.java b/src/main/java/com/gitblit/PagesServlet.java index 5569ab3..ba919e0 100644 --- a/src/main/java/com/gitblit/PagesServlet.java +++ b/src/main/java/com/gitblit/PagesServlet.java @@ -23,6 +23,8 @@ import java.util.Set; import java.util.TreeSet; +import javax.inject.Inject; +import javax.inject.Singleton; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; @@ -53,14 +55,25 @@ * @author James Moger * */ +@Singleton public class PagesServlet extends HttpServlet { private static final long serialVersionUID = 1L; private transient Logger logger = LoggerFactory.getLogger(PagesServlet.class); - public PagesServlet() { + private final IStoredSettings settings; + + private final IRepositoryManager repositoryManager; + + @Inject + public PagesServlet( + IRuntimeManager runtimeManager, + IRepositoryManager repositoryManager) { + super(); + this.settings = runtimeManager.getSettings(); + this.repositoryManager = repositoryManager; } /** @@ -100,9 +113,6 @@ // strip leading / path = path.substring(1); } - - IStoredSettings settings = GitBlit.getManager(IRuntimeManager.class).getSettings(); - IRepositoryManager repositoryManager = GitBlit.getManager(IRepositoryManager.class); // determine repository and resource from url String repository = ""; diff --git a/src/main/java/com/gitblit/RobotsTxtServlet.java b/src/main/java/com/gitblit/RobotsTxtServlet.java index 6a7c02d..c07aa1d 100644 --- a/src/main/java/com/gitblit/RobotsTxtServlet.java +++ b/src/main/java/com/gitblit/RobotsTxtServlet.java @@ -18,6 +18,8 @@ import java.io.File; import java.io.IOException; +import javax.inject.Inject; +import javax.inject.Singleton; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; @@ -32,12 +34,17 @@ * @author James Moger * */ +@Singleton public class RobotsTxtServlet extends HttpServlet { private static final long serialVersionUID = 1L; - public RobotsTxtServlet() { + private final IRuntimeManager runtimeManager; + + @Inject + public RobotsTxtServlet(IRuntimeManager runtimeManager) { super(); + this.runtimeManager = runtimeManager; } @Override @@ -55,7 +62,6 @@ protected void processRequest(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException { - IRuntimeManager runtimeManager = GitBlit.getManager(IRuntimeManager.class); File file = runtimeManager.getFileOrFolder(Keys.web.robots.txt, null); String content = ""; if (file.exists()) { diff --git a/src/main/java/com/gitblit/RpcFilter.java b/src/main/java/com/gitblit/RpcFilter.java index b1384ad..c4b6451 100644 --- a/src/main/java/com/gitblit/RpcFilter.java +++ b/src/main/java/com/gitblit/RpcFilter.java @@ -18,6 +18,8 @@ import java.io.IOException; import java.text.MessageFormat; +import javax.inject.Inject; +import javax.inject.Singleton; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.ServletRequest; @@ -27,6 +29,7 @@ import com.gitblit.Constants.RpcRequest; import com.gitblit.manager.IRuntimeManager; +import com.gitblit.manager.ISessionManager; import com.gitblit.models.UserModel; /** @@ -42,9 +45,21 @@ * @author James Moger * */ +@Singleton public class RpcFilter extends AuthenticationFilter { - public RpcFilter() { + private final IStoredSettings settings; + + private final IRuntimeManager runtimeManager; + + @Inject + public RpcFilter( + IRuntimeManager runtimeManager, + ISessionManager sessionManager) { + + super(sessionManager); + this.settings = runtimeManager.getSettings(); + this.runtimeManager = runtimeManager; } /** @@ -67,9 +82,6 @@ httpResponse.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED); return; } - - IRuntimeManager runtimeManager = GitBlit.getManager(IRuntimeManager.class); - IStoredSettings settings = runtimeManager.getSettings(); boolean adminRequest = requestType.exceeds(RpcRequest.LIST_SETTINGS); diff --git a/src/main/java/com/gitblit/RpcServlet.java b/src/main/java/com/gitblit/RpcServlet.java index a8fa6f8..a3629b9 100644 --- a/src/main/java/com/gitblit/RpcServlet.java +++ b/src/main/java/com/gitblit/RpcServlet.java @@ -23,6 +23,8 @@ import java.util.List; import java.util.Map; +import javax.inject.Inject; +import javax.inject.Singleton; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -53,14 +55,41 @@ * @author James Moger * */ +@Singleton public class RpcServlet extends JsonServlet { private static final long serialVersionUID = 1L; public static final int PROTOCOL_VERSION = 6; - public RpcServlet() { + private final IStoredSettings settings; + + private final IRuntimeManager runtimeManager; + + private final IUserManager userManager; + + private final IRepositoryManager repositoryManager; + + private final IFederationManager federationManager; + + private final IGitblitManager gitblitManager; + + @Inject + public RpcServlet( + IRuntimeManager runtimeManager, + IUserManager userManager, + IRepositoryManager repositoryManager, + IFederationManager federationManager, + IGitblitManager gitblitManager) { + super(); + + this.settings = runtimeManager.getSettings(); + this.runtimeManager = runtimeManager; + this.userManager = userManager; + this.repositoryManager = repositoryManager; + this.federationManager = federationManager; + this.gitblitManager = gitblitManager; } /** @@ -78,13 +107,6 @@ String objectName = request.getParameter("name"); logger.info(MessageFormat.format("Rpc {0} request from {1}", reqType, request.getRemoteAddr())); - - IRuntimeManager runtimeManager = GitBlit.getManager(IRuntimeManager.class); - IUserManager userManager = GitBlit.getManager(IUserManager.class); - IRepositoryManager repositoryManager = GitBlit.getManager(IRepositoryManager.class); - IGitblitManager gitblitManager = GitBlit.getManager(IGitblitManager.class); - IFederationManager federationManager = GitBlit.getManager(IFederationManager.class); - IStoredSettings settings = runtimeManager.getSettings(); UserModel user = (UserModel) request.getUserPrincipal(); diff --git a/src/main/java/com/gitblit/SparkleShareInviteServlet.java b/src/main/java/com/gitblit/SparkleShareInviteServlet.java index 9f6618b..1cd997d 100644 --- a/src/main/java/com/gitblit/SparkleShareInviteServlet.java +++ b/src/main/java/com/gitblit/SparkleShareInviteServlet.java @@ -18,6 +18,8 @@ import java.io.IOException; import java.text.MessageFormat; +import javax.inject.Inject; +import javax.inject.Singleton; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; @@ -37,12 +39,31 @@ * @author James Moger * */ +@Singleton public class SparkleShareInviteServlet extends HttpServlet { private static final long serialVersionUID = 1L; - public SparkleShareInviteServlet() { + private final IStoredSettings settings; + + private final IUserManager userManager; + + private final ISessionManager sessionManager; + + private final IRepositoryManager repositoryManager; + + @Inject + public SparkleShareInviteServlet( + IRuntimeManager runtimeManager, + IUserManager userManager, + ISessionManager sessionManager, + IRepositoryManager repositoryManager) { + super(); + this.settings = runtimeManager.getSettings(); + this.userManager = userManager; + this.sessionManager = sessionManager; + this.repositoryManager = repositoryManager; } @Override @@ -60,11 +81,6 @@ protected void processRequest(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException { - - IStoredSettings settings = GitBlit.getManager(IRuntimeManager.class).getSettings(); - IUserManager userManager = GitBlit.getManager(IUserManager.class); - ISessionManager sessionManager = GitBlit.getManager(ISessionManager.class); - IRepositoryManager repositoryManager = GitBlit.getManager(IRepositoryManager.class); // extract repo name from request String repoUrl = request.getPathInfo().substring(1); diff --git a/src/main/java/com/gitblit/SyndicationFilter.java b/src/main/java/com/gitblit/SyndicationFilter.java index ad908fa..10b8810 100644 --- a/src/main/java/com/gitblit/SyndicationFilter.java +++ b/src/main/java/com/gitblit/SyndicationFilter.java @@ -18,6 +18,8 @@ import java.io.IOException; import java.text.MessageFormat; +import javax.inject.Inject; +import javax.inject.Singleton; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.ServletRequest; @@ -29,6 +31,7 @@ import com.gitblit.manager.IProjectManager; import com.gitblit.manager.IRepositoryManager; import com.gitblit.manager.IRuntimeManager; +import com.gitblit.manager.ISessionManager; import com.gitblit.models.ProjectModel; import com.gitblit.models.RepositoryModel; import com.gitblit.models.UserModel; @@ -41,9 +44,24 @@ * @author James Moger * */ +@Singleton public class SyndicationFilter extends AuthenticationFilter { - public SyndicationFilter() { + private final IRuntimeManager runtimeManager; + private final IRepositoryManager repositoryManager; + private final IProjectManager projectManager; + + @Inject + public SyndicationFilter( + IRuntimeManager runtimeManager, + ISessionManager sessionManager, + IRepositoryManager repositoryManager, + IProjectManager projectManager) { + + super(sessionManager); + this.runtimeManager = runtimeManager; + this.repositoryManager = repositoryManager; + this.projectManager = projectManager; } /** @@ -75,10 +93,6 @@ String fullUrl = getFullUrl(httpRequest); String name = extractRequestedName(fullUrl); - - IRuntimeManager runtimeManager = GitBlit.getManager(IRuntimeManager.class); - IRepositoryManager repositoryManager = GitBlit.getManager(IRepositoryManager.class); - IProjectManager projectManager = GitBlit.getManager(IProjectManager.class); ProjectModel project = projectManager.getProjectModel(name); RepositoryModel model = null; diff --git a/src/main/java/com/gitblit/SyndicationServlet.java b/src/main/java/com/gitblit/SyndicationServlet.java index 11089ee..397545f 100644 --- a/src/main/java/com/gitblit/SyndicationServlet.java +++ b/src/main/java/com/gitblit/SyndicationServlet.java @@ -22,6 +22,8 @@ import java.util.List; import java.util.Map; +import javax.inject.Inject; +import javax.inject.Singleton; import javax.servlet.http.HttpServlet; import org.eclipse.jgit.lib.ObjectId; @@ -53,13 +55,29 @@ * @author James Moger * */ +@Singleton public class SyndicationServlet extends HttpServlet { private static final long serialVersionUID = 1L; private transient Logger logger = LoggerFactory.getLogger(SyndicationServlet.class); - public SyndicationServlet() { + private final IStoredSettings settings; + + private final IRepositoryManager repositoryManager; + + private final IProjectManager projectManager; + + @Inject + public SyndicationServlet( + IRuntimeManager runtimeManager, + IRepositoryManager repositoryManager, + IProjectManager projectManager) { + + super(); + this.settings = runtimeManager.getSettings(); + this.repositoryManager = repositoryManager; + this.projectManager = projectManager; } /** @@ -132,10 +150,6 @@ private void processRequest(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException { - - IStoredSettings settings = GitBlit.getManager(IRuntimeManager.class).getSettings(); - IRepositoryManager repositoryManager = GitBlit.getManager(IRepositoryManager.class); - IProjectManager projectManager = GitBlit.getManager(IProjectManager.class); String servletUrl = request.getContextPath() + request.getServletPath(); String url = request.getRequestURI().substring(servletUrl.length()); diff --git a/src/main/java/com/gitblit/dagger/DaggerContextListener.java b/src/main/java/com/gitblit/dagger/DaggerContextListener.java new file mode 100644 index 0000000..3c26886 --- /dev/null +++ b/src/main/java/com/gitblit/dagger/DaggerContextListener.java @@ -0,0 +1,80 @@ +/* + * Copyright 2013 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.dagger; + +import javax.servlet.ServletContext; +import javax.servlet.ServletContextEvent; + +import com.gitblit.InjectionContextListener; + +import dagger.ObjectGraph; + +/** + * Dagger servlet context listener is a context listener that uses Dagger to + * instantiate and inject servlets, filters, and anything else you might want. + * + * @author James Moger + * + */ +public abstract class DaggerContextListener extends InjectionContextListener { + + protected static final String INJECTOR_NAME = ObjectGraph.class.getName(); + + protected abstract Object [] getModules(); + + protected abstract void destroyContext(ServletContext context); + + protected ObjectGraph 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"); + try { + o = ObjectGraph.create(modules); + logger.debug("setting Dagger injector into {} attribute", INJECTOR_NAME); + context.setAttribute(INJECTOR_NAME, o); + } catch (Throwable t) { + logger.error("an error occurred creating the Dagger injector", t); + } + } + return (ObjectGraph) o; + } + + /** + * Instantiates an object. + * + * @param clazz + * @return the object + */ + @Override + protected <X> X instantiate(ServletContext context, Class<X> clazz) { + try { + ObjectGraph injector = getInjector(context); + return injector.get(clazz); + } catch (Throwable t) { + logger.error(null, t); + } + return null; + } + + @Override + public final void contextDestroyed(ServletContextEvent contextEvent) { + ServletContext context = contextEvent.getServletContext(); + context.setAttribute(INJECTOR_NAME, null); + destroyContext(context); + } +} diff --git a/src/main/java/com/gitblit/dagger/DaggerWicketFilter.java b/src/main/java/com/gitblit/dagger/DaggerWicketFilter.java new file mode 100644 index 0000000..b778f1f --- /dev/null +++ b/src/main/java/com/gitblit/dagger/DaggerWicketFilter.java @@ -0,0 +1,54 @@ +/* + * Copyright 2013 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.dagger; + +import groovy.lang.Singleton; + +import javax.inject.Inject; +import javax.inject.Provider; + +import org.apache.wicket.protocol.http.IWebApplicationFactory; +import org.apache.wicket.protocol.http.WebApplication; +import org.apache.wicket.protocol.http.WicketFilter; + +/** + * + * A Wicket filter that supports Dagger injection. + * + * @author James Moger + * + */ +@Singleton +public class DaggerWicketFilter extends WicketFilter { + + @Inject + Provider<WebApplication> webApplicationProvider; + + @Inject + public DaggerWicketFilter() { + super(); + } + + @Override + protected IWebApplicationFactory getApplicationFactory() { + return new IWebApplicationFactory() { + @Override + public WebApplication createApplication(WicketFilter filter) { + return webApplicationProvider.get(); + } + }; + } +} diff --git a/src/main/java/com/gitblit/git/GitDaemon.java b/src/main/java/com/gitblit/git/GitDaemon.java index bb578ef..40cbe70 100644 --- a/src/main/java/com/gitblit/git/GitDaemon.java +++ b/src/main/java/com/gitblit/git/GitDaemon.java @@ -43,7 +43,6 @@ */ package com.gitblit.git; -import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.InterruptedIOException; @@ -68,6 +67,12 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.gitblit.IStoredSettings; +import com.gitblit.Keys; +import com.gitblit.manager.IRepositoryManager; +import com.gitblit.manager.IRuntimeManager; +import com.gitblit.manager.ISessionManager; +import com.gitblit.manager.IUserManager; import com.gitblit.utils.StringUtils; /** @@ -106,45 +111,28 @@ private ReceivePackFactory<GitDaemonClient> receivePackFactory; - /** Configure a daemon to listen on any available network port. */ - public GitDaemon() { - this(null); - } + public GitDaemon( + IRuntimeManager runtimeManager, + IUserManager userManager, + ISessionManager sessionManager, + IRepositoryManager repositoryManager) { - /** - * Construct the Gitblit Git daemon. - * - * @param bindInterface - * the ip address of the interface to bind - * @param port - * the port to serve on - * @param folder - * the folder to serve from - */ - public GitDaemon(String bindInterface, int port, File folder) { - this(StringUtils.isEmpty(bindInterface) ? new InetSocketAddress(port) - : new InetSocketAddress(bindInterface, port)); + IStoredSettings settings = runtimeManager.getSettings(); + int port = settings.getInteger(Keys.git.daemonPort, 0); + String bindInterface = settings.getString(Keys.git.daemonBindInterface, "localhost"); - // set the repository resolver and pack factories - repositoryResolver = new RepositoryResolver<GitDaemonClient>(folder); - } + if (StringUtils.isEmpty(bindInterface)) { + myAddress = new InetSocketAddress(port); + } else { + myAddress = new InetSocketAddress(bindInterface, port); + } - /** - * Configure a new daemon for the specified network address. - * - * @param addr - * address to listen for connections on. If null, any available - * port will be chosen on all network interfaces. - */ - public GitDaemon(final InetSocketAddress addr) { - myAddress = addr; - processors = new ThreadGroup("Git-Daemon"); + repositoryResolver = new RepositoryResolver<GitDaemonClient>(sessionManager, repositoryManager); + uploadPackFactory = new GitblitUploadPackFactory<GitDaemonClient>(sessionManager); + receivePackFactory = new GitblitReceivePackFactory<GitDaemonClient>(runtimeManager, userManager, repositoryManager); run = new AtomicBoolean(false); - repositoryResolver = null; - uploadPackFactory = new GitblitUploadPackFactory<GitDaemonClient>(); - receivePackFactory = new GitblitReceivePackFactory<GitDaemonClient>(); - + processors = new ThreadGroup("Git-Daemon"); services = new GitDaemonService[] { new GitDaemonService("upload-pack", "uploadpack") { { setEnabled(true); diff --git a/src/main/java/com/gitblit/git/GitServlet.java b/src/main/java/com/gitblit/git/GitServlet.java index 23ea343..e4719d9 100644 --- a/src/main/java/com/gitblit/git/GitServlet.java +++ b/src/main/java/com/gitblit/git/GitServlet.java @@ -15,12 +15,16 @@ */ package com.gitblit.git; +import javax.inject.Inject; +import javax.inject.Singleton; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; -import com.gitblit.GitBlit; import com.gitblit.manager.IRepositoryManager; +import com.gitblit.manager.IRuntimeManager; +import com.gitblit.manager.ISessionManager; +import com.gitblit.manager.IUserManager; /** * The GitServlet provides http/https access to Git repositories. @@ -29,19 +33,37 @@ * @author James Moger * */ +@Singleton public class GitServlet extends org.eclipse.jgit.http.server.GitServlet { private static final long serialVersionUID = 1L; - public GitServlet() { + private final IRuntimeManager runtimeManager; + + private final IUserManager userManager; + + private final ISessionManager sessionManager; + + private final IRepositoryManager repositoryManager; + + @Inject + public GitServlet( + IRuntimeManager runtimeManager, + IUserManager userManager, + ISessionManager sessionManager, + IRepositoryManager repositoryManager) { + super(); + this.runtimeManager = runtimeManager; + this.userManager = userManager; + this.sessionManager = sessionManager; + this.repositoryManager = repositoryManager; } @Override public void init(ServletConfig config) throws ServletException { - IRepositoryManager repositoryManager = GitBlit.getManager(IRepositoryManager.class); - setRepositoryResolver(new RepositoryResolver<HttpServletRequest>(repositoryManager.getRepositoriesFolder())); - setUploadPackFactory(new GitblitUploadPackFactory<HttpServletRequest>()); - setReceivePackFactory(new GitblitReceivePackFactory<HttpServletRequest>()); + setRepositoryResolver(new RepositoryResolver<HttpServletRequest>(sessionManager, repositoryManager)); + setUploadPackFactory(new GitblitUploadPackFactory<HttpServletRequest>(sessionManager)); + setReceivePackFactory(new GitblitReceivePackFactory<HttpServletRequest>(runtimeManager, userManager, repositoryManager)); super.init(config); } } diff --git a/src/main/java/com/gitblit/git/GitblitReceivePack.java b/src/main/java/com/gitblit/git/GitblitReceivePack.java index 8da603a..44e2bef 100644 --- a/src/main/java/com/gitblit/git/GitblitReceivePack.java +++ b/src/main/java/com/gitblit/git/GitblitReceivePack.java @@ -91,11 +91,20 @@ protected GroovyScriptEngine gse; - public GitblitReceivePack(Repository db, RepositoryModel repository, UserModel user) { + private final IStoredSettings settings; + + private final IRepositoryManager repositoryManager; + + public GitblitReceivePack( + IRuntimeManager runtimeManager, + IRepositoryManager repositoryManager, + Repository db, + RepositoryModel repository, + UserModel user) { + super(db); - - IRepositoryManager repositoryManager = GitBlit.getManager(IRepositoryManager.class); - + this.settings = runtimeManager.getSettings(); + this.repositoryManager = repositoryManager; this.repository = repository; this.user = user == null ? UserModel.ANONYMOUS : user; this.groovyDir = repositoryManager.getHooksFolder(); @@ -239,7 +248,6 @@ } } - IRepositoryManager repositoryManager = GitBlit.getManager(IRepositoryManager.class); Set<String> scripts = new LinkedHashSet<String>(); scripts.addAll(repositoryManager.getPreReceiveScriptsInherited(repository)); if (!ArrayUtils.isEmpty(repository.preReceiveScripts)) { @@ -265,8 +273,6 @@ LOGGER.debug("skipping post-receive hooks, no refs created, updated, or removed"); return; } - - IStoredSettings settings = GitBlit.getManager(IRuntimeManager.class).getSettings(); // log ref changes for (ReceiveCommand cmd : commands) { @@ -335,8 +341,6 @@ } catch (Exception e) { LOGGER.error(MessageFormat.format("Failed to update {0} pushlog", repository.name), e); } - - IRepositoryManager repositoryManager = GitBlit.getManager(IRepositoryManager.class); // run Groovy hook scripts Set<String> scripts = new LinkedHashSet<String>(); diff --git a/src/main/java/com/gitblit/git/GitblitReceivePackFactory.java b/src/main/java/com/gitblit/git/GitblitReceivePackFactory.java index a90c36b..2cdb985 100644 --- a/src/main/java/com/gitblit/git/GitblitReceivePackFactory.java +++ b/src/main/java/com/gitblit/git/GitblitReceivePackFactory.java @@ -26,7 +26,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.gitblit.GitBlit; import com.gitblit.IStoredSettings; import com.gitblit.Keys; import com.gitblit.manager.IRepositoryManager; @@ -48,13 +47,30 @@ protected final Logger logger = LoggerFactory.getLogger(GitblitReceivePackFactory.class); + private final IStoredSettings settings; + + private final IRuntimeManager runtimeManager; + + private final IUserManager userManager; + + private final IRepositoryManager repositoryManager; + + public GitblitReceivePackFactory( + IRuntimeManager runtimeManager, + IUserManager userManager, + IRepositoryManager repositoryManager) { + + super(); + this.settings = runtimeManager.getSettings(); + this.runtimeManager = runtimeManager; + this.userManager = userManager; + this.repositoryManager = repositoryManager; + + } + @Override public ReceivePack create(X req, Repository db) throws ServiceNotEnabledException, ServiceNotAuthorizedException { - - IStoredSettings settings = GitBlit.getManager(IRuntimeManager.class).getSettings(); - IUserManager userManager = GitBlit.getManager(IUserManager.class); - IRepositoryManager repositoryManager = GitBlit.getManager(IRepositoryManager.class); UserModel user = UserModel.ANONYMOUS; String repositoryName = ""; @@ -97,7 +113,7 @@ final RepositoryModel repository = repositoryManager.getRepositoryModel(repositoryName); - final GitblitReceivePack rp = new GitblitReceivePack(db, repository, user); + final GitblitReceivePack rp = new GitblitReceivePack(runtimeManager, repositoryManager, db, repository, user); rp.setGitblitUrl(gitblitUrl); rp.setRepositoryUrl(repositoryUrl); rp.setRefLogIdent(new PersonIdent(user.username, user.username + "@" + origin)); diff --git a/src/main/java/com/gitblit/git/GitblitUploadPackFactory.java b/src/main/java/com/gitblit/git/GitblitUploadPackFactory.java index 180e8b5..2afdde1 100644 --- a/src/main/java/com/gitblit/git/GitblitUploadPackFactory.java +++ b/src/main/java/com/gitblit/git/GitblitUploadPackFactory.java @@ -23,7 +23,6 @@ import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException; import org.eclipse.jgit.transport.resolver.UploadPackFactory; -import com.gitblit.GitBlit; import com.gitblit.manager.ISessionManager; import com.gitblit.models.UserModel; @@ -37,11 +36,16 @@ */ public class GitblitUploadPackFactory<X> implements UploadPackFactory<X> { + private final ISessionManager sessionManager; + + public GitblitUploadPackFactory(ISessionManager sessionManager) { + this.sessionManager = sessionManager; + } + @Override public UploadPack create(X req, Repository db) throws ServiceNotEnabledException, ServiceNotAuthorizedException { - ISessionManager sessionManager = GitBlit.getManager(ISessionManager.class); UserModel user = UserModel.ANONYMOUS; int timeout = 0; diff --git a/src/main/java/com/gitblit/git/RepositoryResolver.java b/src/main/java/com/gitblit/git/RepositoryResolver.java index 5441596..87795c0 100644 --- a/src/main/java/com/gitblit/git/RepositoryResolver.java +++ b/src/main/java/com/gitblit/git/RepositoryResolver.java @@ -15,7 +15,6 @@ */ package com.gitblit.git; -import java.io.File; import java.io.IOException; import java.text.MessageFormat; @@ -28,7 +27,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.gitblit.GitBlit; import com.gitblit.manager.IRepositoryManager; import com.gitblit.manager.ISessionManager; import com.gitblit.models.RepositoryModel; @@ -44,8 +42,17 @@ private final Logger logger = LoggerFactory.getLogger(RepositoryResolver.class); - public RepositoryResolver(File repositoriesFolder) { - super(repositoriesFolder, true); + private final ISessionManager sessionManager; + + private final IRepositoryManager repositoryManager; + + public RepositoryResolver( + ISessionManager sessionManager, + IRepositoryManager repositoryManager) { + + super(repositoryManager.getRepositoriesFolder(), true); + this.sessionManager = sessionManager; + this.repositoryManager = repositoryManager; } /** @@ -76,8 +83,6 @@ */ @Override protected boolean isExportOk(X req, String repositoryName, Repository db) throws IOException { - IRepositoryManager repositoryManager = GitBlit.getManager(IRepositoryManager.class); - ISessionManager sessionManager = GitBlit.getManager(ISessionManager.class); RepositoryModel model = repositoryManager.getRepositoryModel(repositoryName); String scheme = null; diff --git a/src/main/java/com/gitblit/wicket/GitBlitWebApp.java b/src/main/java/com/gitblit/wicket/GitBlitWebApp.java index 46a3b06..ad13a04 100644 --- a/src/main/java/com/gitblit/wicket/GitBlitWebApp.java +++ b/src/main/java/com/gitblit/wicket/GitBlitWebApp.java @@ -28,7 +28,6 @@ import org.apache.wicket.markup.html.WebPage; import org.apache.wicket.protocol.http.WebApplication; -import com.gitblit.GitBlit; import com.gitblit.IStoredSettings; import com.gitblit.Keys; import com.gitblit.manager.IFederationManager; @@ -82,13 +81,49 @@ private final Map<String, CacheControl> cacheablePages = new HashMap<String, CacheControl>(); - private IStoredSettings settings; + private final IStoredSettings settings; + + private final IRuntimeManager runtimeManager; + + private final INotificationManager notificationManager; + + private final IUserManager userManager; + + private final ISessionManager sessionManager; + + private final IRepositoryManager repositoryManager; + + private final IProjectManager projectManager; + + private final IGitblitManager gitblitManager; + + private final IFederationManager federationManager; + + public GitBlitWebApp( + IRuntimeManager runtimeManager, + INotificationManager notificationManager, + IUserManager userManager, + ISessionManager sessionManager, + IRepositoryManager repositoryManager, + IProjectManager projectManager, + IGitblitManager gitblitManager, + IFederationManager federationManager) { + + super(); + this.settings = runtimeManager.getSettings(); + this.runtimeManager = runtimeManager; + this.notificationManager = notificationManager; + this.userManager = userManager; + this.sessionManager = sessionManager; + this.repositoryManager = repositoryManager; + this.projectManager = projectManager; + this.gitblitManager = gitblitManager; + this.federationManager = federationManager; + } @Override public void init() { super.init(); - - settings = runtime().getSettings(); // Setup page authorization mechanism boolean useAuthentication = settings.getBoolean(Keys.web.authenticateViewPages, false) @@ -205,7 +240,7 @@ * @return true if Gitblit is running in debug mode */ public boolean isDebugMode() { - return runtime().isDebugMode(); + return runtimeManager.isDebugMode(); } /* @@ -213,52 +248,52 @@ * step towards modularization across multiple commits. */ public Date getBootDate() { - return runtime().getBootDate(); + return runtimeManager.getBootDate(); } public Date getLastActivityDate() { - return repositories().getLastActivityDate(); + return repositoryManager.getLastActivityDate(); } public IRuntimeManager runtime() { - return GitBlit.getManager(IRuntimeManager.class); + return runtimeManager; } public INotificationManager notifier() { - return GitBlit.getManager(INotificationManager.class); + return notificationManager; } public IUserManager users() { - return GitBlit.getManager(IUserManager.class); + return userManager; } public ISessionManager session() { - return GitBlit.getManager(ISessionManager.class); + return sessionManager; } public IRepositoryManager repositories() { - return GitBlit.getManager(IRepositoryManager.class); + return repositoryManager; } public IProjectManager projects() { - return GitBlit.getManager(IProjectManager.class); + return projectManager; } public IFederationManager federation() { - return GitBlit.getManager(IFederationManager.class); + return federationManager; } public IGitblitManager gitblit() { - return GitBlit.getManager(IGitblitManager.class); + return gitblitManager; } public TimeZone getTimezone() { - return runtime().getTimezone(); + return runtimeManager.getTimezone(); } @Override public final String getConfigurationType() { - if (isDebugMode()) { + if (runtimeManager.isDebugMode()) { return Application.DEVELOPMENT; } return Application.DEPLOYMENT; diff --git a/src/main/java/com/gitblit/wicket/GitblitWicketFilter.java b/src/main/java/com/gitblit/wicket/GitblitWicketFilter.java index bc65d77..87b0a08 100644 --- a/src/main/java/com/gitblit/wicket/GitblitWicketFilter.java +++ b/src/main/java/com/gitblit/wicket/GitblitWicketFilter.java @@ -17,18 +17,17 @@ import java.util.Date; +import javax.inject.Inject; +import javax.inject.Singleton; import javax.servlet.http.HttpServletRequest; -import org.apache.wicket.protocol.http.IWebApplicationFactory; -import org.apache.wicket.protocol.http.WebApplication; -import org.apache.wicket.protocol.http.WicketFilter; import org.apache.wicket.util.string.Strings; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; -import com.gitblit.GitBlit; import com.gitblit.IStoredSettings; import com.gitblit.Keys; +import com.gitblit.dagger.DaggerWicketFilter; import com.gitblit.manager.IProjectManager; import com.gitblit.manager.IRepositoryManager; import com.gitblit.manager.IRuntimeManager; @@ -45,19 +44,28 @@ * @author James Moger * */ -public class GitblitWicketFilter extends WicketFilter { +@Singleton +public class GitblitWicketFilter extends DaggerWicketFilter { - public GitblitWicketFilter() { - } + private final IStoredSettings settings; - @Override - protected IWebApplicationFactory getApplicationFactory() { - return new IWebApplicationFactory() { - @Override - public WebApplication createApplication(WicketFilter filter) { - return new GitBlitWebApp(); - } - }; + private final IRuntimeManager runtimeManager; + + private final IRepositoryManager repositoryManager; + + private final IProjectManager projectManager; + + @Inject + public GitblitWicketFilter( + IRuntimeManager runtimeManager, + IRepositoryManager repositoryManager, + IProjectManager projectManager) { + + super(); + this.settings = runtimeManager.getSettings(); + this.runtimeManager = runtimeManager; + this.repositoryManager = repositoryManager; + this.projectManager = projectManager; } /** @@ -96,11 +104,6 @@ if (!StringUtils.isEmpty(servletRequest.getParameter("h"))) { commitId = servletRequest.getParameter("h"); } - - IRuntimeManager runtimeManager = GitBlit.getManager(IRuntimeManager.class); - IStoredSettings settings = runtimeManager.getSettings(); - IRepositoryManager repositoryManager = GitBlit.getManager(IRepositoryManager.class); - IProjectManager projectManager = GitBlit.getManager(IProjectManager.class); repo = repo.replace("%2f", "/").replace("%2F", "/").replace(settings.getChar(Keys.web.forwardSlashCharacter, '/'), '/'); diff --git a/src/test/java/com/gitblit/tests/GitDaemonStopTest.java b/src/test/java/com/gitblit/tests/GitDaemonStopTest.java deleted file mode 100644 index 6e940cb..0000000 --- a/src/test/java/com/gitblit/tests/GitDaemonStopTest.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2013 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.tests; - -import org.junit.Test; - -import com.gitblit.git.GitDaemon; - -public class GitDaemonStopTest extends GitblitUnitTest { - - @Test - public void testGitDaemonStop() throws Exception { - GitDaemon daemon = new GitDaemon("localhost", GitDaemon.DEFAULT_PORT + 1, GitBlitSuite.REPOSITORIES); - daemon.setTimeout(5); - daemon.start(); - Thread.sleep(5000); - daemon.stop(); - } -} diff --git a/src/test/java/com/gitblit/tests/LuceneExecutorTest.java b/src/test/java/com/gitblit/tests/LuceneExecutorTest.java index 0f7e55c..0e1aee1 100644 --- a/src/test/java/com/gitblit/tests/LuceneExecutorTest.java +++ b/src/test/java/com/gitblit/tests/LuceneExecutorTest.java @@ -16,15 +16,15 @@ package com.gitblit.tests; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; import org.eclipse.jgit.lib.Repository; import org.junit.After; import org.junit.Before; import org.junit.Test; +import com.gitblit.GitBlit; +import com.gitblit.Keys; import com.gitblit.LuceneExecutor; import com.gitblit.models.RefModel; import com.gitblit.models.RepositoryModel; @@ -44,9 +44,10 @@ LuceneExecutor lucene; private LuceneExecutor newLuceneExecutor() { - Map<String, Object> map = new HashMap<String, Object>(); - MemorySettings settings = new MemorySettings(map); - return new LuceneExecutor(settings, GitBlitSuite.REPOSITORIES); + MemorySettings settings = new MemorySettings(); + settings.put(Keys.git.repositoriesFolder, GitBlitSuite.REPOSITORIES); + GitBlit gitblit = new GitBlit(settings, GitBlitSuite.REPOSITORIES); + return new LuceneExecutor(settings, gitblit); } private RepositoryModel newRepositoryModel(Repository repository) { diff --git a/src/test/java/com/gitblit/tests/mock/MemorySettings.java b/src/test/java/com/gitblit/tests/mock/MemorySettings.java index 5b8e60a..e3f971f 100644 --- a/src/test/java/com/gitblit/tests/mock/MemorySettings.java +++ b/src/test/java/com/gitblit/tests/mock/MemorySettings.java @@ -16,6 +16,7 @@ */ package com.gitblit.tests.mock; +import java.util.HashMap; import java.util.Map; import java.util.Properties; @@ -24,6 +25,10 @@ public class MemorySettings extends IStoredSettings { private Map<String, Object> backingMap; + + public MemorySettings() { + this(new HashMap<String, Object>()); + } public MemorySettings(Map<String, Object> backingMap) { super(MemorySettings.class); @@ -38,8 +43,8 @@ return props; } - public void put(Object key, Object value) { - backingMap.put(key.toString(), value); + public void put(String key, Object value) { + backingMap.put(key, value); } @Override -- Gitblit v1.9.1