diff --git a/plugins/scm-hg-plugin/src/main/java/sonia/scm/HgPlugin.java b/plugins/scm-hg-plugin/src/main/java/sonia/scm/HgPlugin.java deleted file mode 100644 index 555b38161b..0000000000 --- a/plugins/scm-hg-plugin/src/main/java/sonia/scm/HgPlugin.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ - - - -package sonia.scm; - -//~--- JDK imports ------------------------------------------------------------ - -import java.io.InputStream; - -/** - * - * @author Sebastian Sdorra - */ -public class HgPlugin extends ScmWebPluginAdapter -{ - - /** Field description */ - public static final String SCRIPT = "/sonia/scm/hg.config.js"; - - //~--- get methods ---------------------------------------------------------- - - /** - * Method description - * - * - * @return - */ - @Override - public InputStream getScript() - { - return HgPlugin.class.getResourceAsStream(SCRIPT); - } -} diff --git a/plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgWebPlugin.java b/plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgWebPlugin.java new file mode 100644 index 0000000000..e2ae03cba4 --- /dev/null +++ b/plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgWebPlugin.java @@ -0,0 +1,50 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + + + +package sonia.scm.web; + +//~--- JDK imports ------------------------------------------------------------ + +import java.io.InputStream; + +/** + * + * @author Sebastian Sdorra + */ +public class HgWebPlugin implements ScmWebPlugin +{ + + /** Field description */ + public static final String SCRIPT = "/sonia/scm/hg.config.js"; + + //~--- methods -------------------------------------------------------------- + + /** + * Method description + * + * + * @param context + */ + @Override + public void contextDestroyed(ScmWebPluginContext context) + { + + // do nothing + } + + /** + * Method description + * + * + * @param context + */ + @Override + public void contextInitialized(ScmWebPluginContext context) + { + context.addScriptResource(new ClasspathWebResource(SCRIPT)); + } +} diff --git a/plugins/scm-hg-plugin/src/main/resources/META-INF/services/sonia.scm.ScmWebPlugin b/plugins/scm-hg-plugin/src/main/resources/META-INF/services/sonia.scm.ScmWebPlugin deleted file mode 100644 index 3797a95535..0000000000 --- a/plugins/scm-hg-plugin/src/main/resources/META-INF/services/sonia.scm.ScmWebPlugin +++ /dev/null @@ -1 +0,0 @@ -sonia.scm.HgPlugin \ No newline at end of file diff --git a/plugins/scm-hg-plugin/src/main/resources/META-INF/services/sonia.scm.web.ScmWebPlugin b/plugins/scm-hg-plugin/src/main/resources/META-INF/services/sonia.scm.web.ScmWebPlugin new file mode 100644 index 0000000000..e2544ce4a0 --- /dev/null +++ b/plugins/scm-hg-plugin/src/main/resources/META-INF/services/sonia.scm.web.ScmWebPlugin @@ -0,0 +1 @@ +sonia.scm.web.HgWebPlugin \ No newline at end of file diff --git a/scm-web-api/src/main/java/sonia/scm/ScmWebPluginAdapter.java b/scm-web-api/src/main/java/sonia/scm/ScmWebPluginAdapter.java deleted file mode 100644 index 58ec32aedf..0000000000 --- a/scm-web-api/src/main/java/sonia/scm/ScmWebPluginAdapter.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ - -package sonia.scm; - -import com.google.inject.Module; -import java.io.InputStream; - -/** - * - * @author Sebastian Sdorra - */ -public class ScmWebPluginAdapter implements ScmWebPlugin { - - @Override - public Module[] getModules() - { - return new Module[0]; - } - - @Override - public InputStream getScript() - { - return null; - } - -} diff --git a/scm-web-api/src/main/java/sonia/scm/ScmWebPluginContext.java b/scm-web-api/src/main/java/sonia/scm/web/ClasspathWebResource.java similarity index 58% rename from scm-web-api/src/main/java/sonia/scm/ScmWebPluginContext.java rename to scm-web-api/src/main/java/sonia/scm/web/ClasspathWebResource.java index f63579a01f..d97d37c17a 100644 --- a/scm-web-api/src/main/java/sonia/scm/ScmWebPluginContext.java +++ b/scm-web-api/src/main/java/sonia/scm/web/ClasspathWebResource.java @@ -5,30 +5,28 @@ -package sonia.scm; - -//~--- non-JDK imports -------------------------------------------------------- - -import sonia.scm.util.ServiceUtil; +package sonia.scm.web; //~--- JDK imports ------------------------------------------------------------ -import java.util.List; +import java.io.InputStream; /** * * @author Sebastian Sdorra */ -public class ScmWebPluginContext +public class ClasspathWebResource implements WebResource { /** * Constructs ... * + * + * @param contentPath */ - public ScmWebPluginContext() + public ClasspathWebResource(String contentPath) { - plugins = ServiceUtil.getServices(ScmWebPlugin.class); + this.contentPath = contentPath; } //~--- get methods ---------------------------------------------------------- @@ -39,13 +37,14 @@ public class ScmWebPluginContext * * @return */ - public List getPlugins() + @Override + public InputStream getContent() { - return plugins; + return ClasspathWebResource.class.getResourceAsStream(contentPath); } //~--- fields --------------------------------------------------------------- /** Field description */ - private List plugins; + private String contentPath; } diff --git a/scm-web-api/src/main/java/sonia/scm/ScmWebPlugin.java b/scm-web-api/src/main/java/sonia/scm/web/ScmWebPlugin.java similarity index 66% rename from scm-web-api/src/main/java/sonia/scm/ScmWebPlugin.java rename to scm-web-api/src/main/java/sonia/scm/web/ScmWebPlugin.java index 245bdacb1c..61107d81c9 100644 --- a/scm-web-api/src/main/java/sonia/scm/ScmWebPlugin.java +++ b/scm-web-api/src/main/java/sonia/scm/web/ScmWebPlugin.java @@ -5,7 +5,7 @@ -package sonia.scm; +package sonia.scm.web; //~--- non-JDK imports -------------------------------------------------------- @@ -22,19 +22,7 @@ import java.io.InputStream; public interface ScmWebPlugin { - /** - * Method description - * - * - * @return - */ - public Module[] getModules(); +public void contextInitialized( ScmWebPluginContext context ); - /** - * Method description - * - * - * @return - */ - public InputStream getScript(); +public void contextDestroyed( ScmWebPluginContext context ); } diff --git a/scm-web-api/src/main/java/sonia/scm/web/ScmWebPluginContext.java b/scm-web-api/src/main/java/sonia/scm/web/ScmWebPluginContext.java new file mode 100644 index 0000000000..d09ebe8a8d --- /dev/null +++ b/scm-web-api/src/main/java/sonia/scm/web/ScmWebPluginContext.java @@ -0,0 +1,102 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + + + +package sonia.scm.web; + +//~--- non-JDK imports -------------------------------------------------------- + +import com.google.inject.Module; + +//~--- JDK imports ------------------------------------------------------------ + +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; + +/** + * + * @author Sebastian Sdorra + */ +public class ScmWebPluginContext +{ + + /** + * Method description + * + * + * @param module + */ + public void addInjectModule(Module module) + { + injectModules.add(module); + } + + /** + * Method description + * + * + * @param resource + */ + public void addScriptResource(WebResource resource) + { + scriptResources.add(resource); + } + + /** + * Method description + * + * + * @param module + */ + public void removeInjectModule(Module module) + { + injectModules.remove(module); + } + + /** + * Method description + * + * + * @param resource + */ + public void removeScriptResource(WebResource resource) + { + scriptResources.remove(resource); + } + + //~--- get methods ---------------------------------------------------------- + + /** + * Method description + * + * + * @return + */ + public Collection getInjectModules() + { + return injectModules; + } + + /** + * Method description + * + * + * @return + */ + public Collection getScriptResources() + { + return scriptResources; + } + + //~--- fields --------------------------------------------------------------- + + /** Field description */ + private Set scriptResources = new HashSet(); + + /** Field description */ + private Set injectModules = new HashSet(); +} diff --git a/scm-web-api/src/main/java/sonia/scm/web/WebResource.java b/scm-web-api/src/main/java/sonia/scm/web/WebResource.java new file mode 100644 index 0000000000..6abfbc1774 --- /dev/null +++ b/scm-web-api/src/main/java/sonia/scm/web/WebResource.java @@ -0,0 +1,31 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + + + +package sonia.scm.web; + +//~--- JDK imports ------------------------------------------------------------ + +import java.io.IOException; +import java.io.InputStream; + +/** + * + * @author Sebastian Sdorra + */ +public interface WebResource +{ + + /** + * Method description + * + * + * @return + * + * @throws IOException + */ + public InputStream getContent() throws IOException; +} diff --git a/scm-webapp/src/main/java/sonia/scm/ContextListener.java b/scm-webapp/src/main/java/sonia/scm/ContextListener.java index 3532b787f0..5c39f078ee 100644 --- a/scm-webapp/src/main/java/sonia/scm/ContextListener.java +++ b/scm-webapp/src/main/java/sonia/scm/ContextListener.java @@ -14,14 +14,19 @@ import com.google.inject.Injector; import com.google.inject.Module; import com.google.inject.servlet.GuiceServletContextListener; +import sonia.scm.util.ServiceUtil; import sonia.scm.util.Util; +import sonia.scm.web.ScmWebPlugin; +import sonia.scm.web.ScmWebPluginContext; //~--- JDK imports ------------------------------------------------------------ import java.util.ArrayList; -import java.util.Arrays; +import java.util.Collection; import java.util.List; +import javax.servlet.ServletContextEvent; + /** * * @author Sebastian Sdorra @@ -29,18 +34,47 @@ import java.util.List; public class ContextListener extends GuiceServletContextListener { - /* - * @Override - * public void contextInitialized(ServletContextEvent servletContextEvent) - * { - * Logger logger = Logger.getLogger(""); - * logger.setLevel(Level.ALL); - * ConsoleHandler handler = new ConsoleHandler(); - * handler.setLevel(Level.ALL); - * logger.addHandler( handler ); - * super.contextInitialized(servletContextEvent); - * } + /** + * Method description + * + * + * @param servletContextEvent */ + @Override + public void contextDestroyed(ServletContextEvent servletContextEvent) + { + List plugins = ServiceUtil.getServices(ScmWebPlugin.class); + + for (ScmWebPlugin plugin : plugins) + { + plugin.contextDestroyed(webPluginContext); + } + + super.contextDestroyed(servletContextEvent); + } + + /** + * Method description + * + * + * @param servletContextEvent + */ + @Override + public void contextInitialized(ServletContextEvent servletContextEvent) + { + webPluginContext = new ScmWebPluginContext(); + + List plugins = ServiceUtil.getServices(ScmWebPlugin.class); + + for (ScmWebPlugin plugin : plugins) + { + plugin.contextInitialized(webPluginContext); + } + + super.contextInitialized(servletContextEvent); + } + + //~--- get methods ---------------------------------------------------------- /** * Method description @@ -51,25 +85,22 @@ public class ContextListener extends GuiceServletContextListener @Override protected Injector getInjector() { - ScmWebPluginContext webPluginContext = new ScmWebPluginContext(); - List plugins = webPluginContext.getPlugins(); List modules = new ArrayList(); modules.add(new ScmServletModule(webPluginContext)); - if (Util.isNotEmpty(plugins)) - { - for (ScmWebPlugin plugin : plugins) - { - Module[] moduleArray = plugin.getModules(); + Collection pluginModules = webPluginContext.getInjectModules(); - if (Util.isNotEmpty(moduleArray)) - { - modules.addAll(Arrays.asList(moduleArray)); - } - } + if (Util.isNotEmpty(pluginModules)) + { + modules.addAll(pluginModules); } return Guice.createInjector(modules); } + + //~--- fields --------------------------------------------------------------- + + /** Field description */ + private ScmWebPluginContext webPluginContext; } diff --git a/scm-webapp/src/main/java/sonia/scm/ScmServletModule.java b/scm-webapp/src/main/java/sonia/scm/ScmServletModule.java index c8789904b8..da29c54a56 100644 --- a/scm-webapp/src/main/java/sonia/scm/ScmServletModule.java +++ b/scm-webapp/src/main/java/sonia/scm/ScmServletModule.java @@ -19,6 +19,7 @@ import sonia.scm.plugin.ScriptResourceServlet; import sonia.scm.repository.RepositoryManager; import sonia.scm.security.Authenticator; import sonia.scm.security.DemoAuthenticator; +import sonia.scm.web.ScmWebPluginContext; //~--- JDK imports ------------------------------------------------------------ diff --git a/scm-webapp/src/main/java/sonia/scm/plugin/ScriptResourceServlet.java b/scm-webapp/src/main/java/sonia/scm/plugin/ScriptResourceServlet.java index b344048026..0ec653afc8 100644 --- a/scm-webapp/src/main/java/sonia/scm/plugin/ScriptResourceServlet.java +++ b/scm-webapp/src/main/java/sonia/scm/plugin/ScriptResourceServlet.java @@ -12,9 +12,10 @@ package sonia.scm.plugin; import com.google.inject.Inject; import com.google.inject.Singleton; -import sonia.scm.ScmWebPlugin; -import sonia.scm.ScmWebPluginContext; import sonia.scm.util.Util; +import sonia.scm.web.ScmWebPlugin; +import sonia.scm.web.ScmWebPluginContext; +import sonia.scm.web.WebResource; //~--- JDK imports ------------------------------------------------------------ @@ -23,6 +24,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.util.Collection; import java.util.List; import javax.servlet.ServletException; @@ -60,13 +62,14 @@ public class ScriptResourceServlet extends AbstractResourceServlet "function sayPluginHello(){ alert('Plugin Hello !'); }".concat( System.getProperty("line.separator")).getBytes()); - List plugins = webPluginContext.getPlugins(); + Collection scriptResources = + webPluginContext.getScriptResources(); - if (Util.isNotEmpty(plugins)) + if (Util.isNotEmpty(scriptResources)) { - for (ScmWebPlugin plugin : plugins) + for (WebResource scriptResource : scriptResources) { - appendResource(stream, plugin); + appendResource(stream, scriptResource); } } } @@ -92,15 +95,15 @@ public class ScriptResourceServlet extends AbstractResourceServlet * * * @param stream - * @param plugin + * @param script * * @throws IOException * @throws ServletException */ - private void appendResource(OutputStream stream, ScmWebPlugin plugin) + private void appendResource(OutputStream stream, WebResource script) throws ServletException, IOException { - InputStream input = plugin.getScript(); + InputStream input = script.getContent(); if (input != null) {