diff --git a/plugins/pom.xml b/plugins/pom.xml
index 75dca2a86b..203030f550 100644
--- a/plugins/pom.xml
+++ b/plugins/pom.xml
@@ -19,6 +19,7 @@
scm-hg-plugin
scm-svn-plugin
scm-git-plugin
+ scm-graph-plugin
diff --git a/plugins/scm-graph-plugin/pom.xml b/plugins/scm-graph-plugin/pom.xml
new file mode 100644
index 0000000000..28b1779241
--- /dev/null
+++ b/plugins/scm-graph-plugin/pom.xml
@@ -0,0 +1,41 @@
+
+
+
+ 4.0.0
+
+
+ scm-plugins
+ sonia.scm.plugins
+ 1.0-M3-SNAPSHOT
+
+
+ sonia.scm.plugins
+ scm-graph-plugin
+ 1.0-M3-SNAPSHOT
+ scm-graph-plugin
+
+
+
+
+ javax.servlet
+ servlet-api
+ ${servlet.version}
+ provided
+
+
+
+ sonia.scm
+ scm-web-api
+ 1.0-M3-SNAPSHOT
+
+
+
+ com.google.inject.extensions
+ guice-grapher
+ 2.0
+
+
+
+
+
diff --git a/plugins/scm-graph-plugin/src/main/java/sonia/scm/graph/GraphServlet.java b/plugins/scm-graph-plugin/src/main/java/sonia/scm/graph/GraphServlet.java
new file mode 100644
index 0000000000..5477df8b88
--- /dev/null
+++ b/plugins/scm-graph-plugin/src/main/java/sonia/scm/graph/GraphServlet.java
@@ -0,0 +1,183 @@
+/**
+ * Copyright (c) 2010, Sebastian Sdorra
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of SCM-Manager; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://bitbucket.org/sdorra/scm-manager
+ *
+ */
+
+
+
+package sonia.scm.graph;
+
+//~--- non-JDK imports --------------------------------------------------------
+
+import com.google.inject.Guice;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import com.google.inject.grapher.GrapherModule;
+import com.google.inject.grapher.InjectorGrapher;
+import com.google.inject.grapher.graphviz.GraphvizModule;
+import com.google.inject.grapher.graphviz.GraphvizRenderer;
+
+import sonia.scm.util.IOUtil;
+import sonia.scm.util.SecurityUtil;
+import sonia.scm.web.security.WebSecurityContext;
+
+//~--- JDK imports ------------------------------------------------------------
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ *
+ * @author Sebastian Sdorra
+ */
+@Singleton
+public class GraphServlet extends HttpServlet
+{
+
+ /** Field description */
+ public static final String CONTENT_TYPE = "application/octet-stream";
+
+ /** Field description */
+ private static final long serialVersionUID = 2733077353390468391L;
+
+ //~--- constructors ---------------------------------------------------------
+
+ /**
+ * Constructs ...
+ *
+ *
+ *
+ * @param securityContextProvider
+ * @param injector
+ */
+ @Inject
+ public GraphServlet(Provider securityContextProvider,
+ Injector injector)
+ {
+ this.securityContextProvider = securityContextProvider;
+ this.injector = injector;
+ }
+
+ //~--- methods --------------------------------------------------------------
+
+ /**
+ * Method description
+ *
+ *
+ * @param request
+ * @param response
+ *
+ * @throws IOException
+ * @throws ServletException
+ */
+ @Override
+ protected void doGet(HttpServletRequest request, HttpServletResponse response)
+ throws ServletException, IOException
+ {
+ processRequest(response);
+ }
+
+ /**
+ * Method description
+ *
+ *
+ * @param request
+ * @param response
+ *
+ * @throws IOException
+ * @throws ServletException
+ */
+ @Override
+ protected void doPost(HttpServletRequest request,
+ HttpServletResponse response)
+ throws ServletException, IOException
+ {
+ processRequest(response);
+ }
+
+ /**
+ * Method description
+ *
+ *
+ * @param response
+ *
+ * @throws IOException
+ * @throws ServletException
+ */
+ private void processRequest(HttpServletResponse response)
+ throws ServletException, IOException
+ {
+ SecurityUtil.assertIsAdmin(securityContextProvider);
+
+ PrintWriter writer = null;
+ PrintWriter bufferWriter = null;
+
+ try
+ {
+ response.setContentType(CONTENT_TYPE);
+
+ Injector grapherInjector = Guice.createInjector(new GrapherModule(),
+ new GraphvizModule());
+ GraphvizRenderer renderer =
+ grapherInjector.getInstance(GraphvizRenderer.class);
+ StringWriter buffer = new StringWriter();
+
+ bufferWriter = new PrintWriter(buffer);
+ renderer.setOut(bufferWriter).setRankdir("TB");
+ grapherInjector.getInstance(InjectorGrapher.class).of(injector).graph();
+ bufferWriter.flush();
+ writer = response.getWriter();
+
+ String graphString = buffer.toString();
+
+ writer.print(graphString.replaceAll("invis", "solid"));
+ }
+ finally
+ {
+ IOUtil.close(writer);
+ IOUtil.close(bufferWriter);
+ }
+ }
+
+ //~--- fields ---------------------------------------------------------------
+
+ /** Field description */
+ private Injector injector;
+
+ /** Field description */
+ private Provider securityContextProvider;
+}
diff --git a/plugins/scm-graph-plugin/src/main/java/sonia/scm/graph/GraphServletModule.java b/plugins/scm-graph-plugin/src/main/java/sonia/scm/graph/GraphServletModule.java
new file mode 100644
index 0000000000..55ac58a9e5
--- /dev/null
+++ b/plugins/scm-graph-plugin/src/main/java/sonia/scm/graph/GraphServletModule.java
@@ -0,0 +1,64 @@
+/**
+ * Copyright (c) 2010, Sebastian Sdorra
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of SCM-Manager; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://bitbucket.org/sdorra/scm-manager
+ *
+ */
+
+
+
+package sonia.scm.graph;
+
+//~--- non-JDK imports --------------------------------------------------------
+
+import com.google.inject.servlet.ServletModule;
+
+import sonia.scm.plugin.ext.Extension;
+
+/**
+ *
+ * @author Sebastian Sdorra
+ */
+@Extension
+public class GraphServletModule extends ServletModule
+{
+
+ /** Field description */
+ public static final String GRAPHSERVLET_PATTERN = "/graph.dot";
+
+ //~--- methods --------------------------------------------------------------
+
+ /**
+ * Method description
+ *
+ */
+ @Override
+ protected void configureServlets()
+ {
+ serve(GRAPHSERVLET_PATTERN).with(GraphServlet.class);
+ }
+}
diff --git a/plugins/scm-graph-plugin/src/main/resources/META-INF/scm/plugin.xml b/plugins/scm-graph-plugin/src/main/resources/META-INF/scm/plugin.xml
new file mode 100644
index 0000000000..0fec159379
--- /dev/null
+++ b/plugins/scm-graph-plugin/src/main/resources/META-INF/scm/plugin.xml
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+ ${project.name}
+ Sebastian Sdorra
+ ${project.version}
+ ${project.url}
+
+
+
+
+
+
+
diff --git a/plugins/scm-graph-plugin/src/main/resources/sonia/scm/graph/sonia.graph.js b/plugins/scm-graph-plugin/src/main/resources/sonia/scm/graph/sonia.graph.js
new file mode 100644
index 0000000000..657dc33ea2
--- /dev/null
+++ b/plugins/scm-graph-plugin/src/main/resources/sonia/scm/graph/sonia.graph.js
@@ -0,0 +1,43 @@
+/* *
+ * Copyright (c) 2010, Sebastian Sdorra
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of SCM-Manager; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://bitbucket.org/sdorra/scm-manager
+ *
+ */
+loginCallbacks.push(function(){
+ if (admin){
+ Ext.getCmp('navigationPanel').addSection({
+ title: 'Development',
+ items: [{
+ label: 'Injection Graph',
+ fn: function(){
+ window.open('graph.dot');
+ }
+ }]
+ });
+ }
+});
\ No newline at end of file
diff --git a/scm-webapp/pom.xml b/scm-webapp/pom.xml
index cb0ab4af6e..79d0662b8d 100644
--- a/scm-webapp/pom.xml
+++ b/scm-webapp/pom.xml
@@ -139,6 +139,25 @@
scm-webapp
+
+
+
+
+ development
+
+
+
+
+ sonia.scm.plugins
+ scm-graph-plugin
+ 1.0-M3-SNAPSHOT
+
+
+
+
+
+
+
diff --git a/third-party/shared-libs/pom.xml b/third-party/shared-libs/pom.xml
index 0e62e7f17e..b096d8a352 100644
--- a/third-party/shared-libs/pom.xml
+++ b/third-party/shared-libs/pom.xml
@@ -37,6 +37,20 @@
jar
+
+ google-guice-grapher
+
+ install-file
+
+ install
+
+ ${project.basedir}/src/main/lib/guice-grapher-2.0.jar
+ com.google.inject.extensions
+ guice-grapher
+ 2.0
+ jar
+
+
diff --git a/third-party/shared-libs/src/main/lib/guice-grapher-2.0.jar b/third-party/shared-libs/src/main/lib/guice-grapher-2.0.jar
new file mode 100644
index 0000000000..d4cb840be0
Binary files /dev/null and b/third-party/shared-libs/src/main/lib/guice-grapher-2.0.jar differ