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