diff --git a/scm-core/src/main/java/sonia/scm/plugin/PluginConstants.java b/scm-core/src/main/java/sonia/scm/plugin/PluginConstants.java index 47beb1db2f..347c9ede42 100644 --- a/scm-core/src/main/java/sonia/scm/plugin/PluginConstants.java +++ b/scm-core/src/main/java/sonia/scm/plugin/PluginConstants.java @@ -38,9 +38,6 @@ package sonia.scm.plugin; */ public interface PluginConstants { - - /** Field description */ - public static final String ID_DELIMITER = ":"; /** checksum file */ public static final String FILE_CHECKSUM = "checksum"; @@ -49,8 +46,10 @@ public interface PluginConstants public static final String FILE_CORE = "core"; /** Field description */ - public static final String PATH_DESCRIPTOR = - "/WEB-INF/classes/META-INF/scm/plugin.xml"; + public static final String ID_DELIMITER = ":"; + + /** Field description */ + public static final String PATH_DESCRIPTOR = "/META-INF/scm/plugin.xml"; /** Field description */ public static final String FILE_DESCRIPTOR = PATH_DESCRIPTOR.substring(1); diff --git a/scm-webapp/src/main/java/sonia/scm/plugin/EmptyWebResourceLoader.java b/scm-webapp/src/main/java/sonia/scm/plugin/EmptyWebResourceLoader.java new file mode 100644 index 0000000000..a768445877 --- /dev/null +++ b/scm-webapp/src/main/java/sonia/scm/plugin/EmptyWebResourceLoader.java @@ -0,0 +1,61 @@ +/** + * Copyright (c) 2014, 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.plugin; + +//~--- JDK imports ------------------------------------------------------------ + +import java.net.URL; + +/** + * This {@link WebResourceLoader} is used, if the plugin does not contain a + * webapp directory. + * + * @author Sebastian Sdorra + * @since 2.0.0 + */ +public class EmptyWebResourceLoader implements WebResourceLoader +{ + + /** + * Returns always {@code null}. + * + * + * @param path resource path + * + * @return {@code null} + */ + @Override + public URL getResource(String path) + { + return null; + } +} diff --git a/scm-webapp/src/main/java/sonia/scm/plugin/PluginProcessor.java b/scm-webapp/src/main/java/sonia/scm/plugin/PluginProcessor.java index 2694998e02..7acf7b0546 100644 --- a/scm-webapp/src/main/java/sonia/scm/plugin/PluginProcessor.java +++ b/scm-webapp/src/main/java/sonia/scm/plugin/PluginProcessor.java @@ -86,14 +86,11 @@ public final class PluginProcessor /** Field description */ private static final String DIRECTORY_INSTALLED = ".installed"; - /** Field description */ - private static final String DIRECTORY_LINK = ".link"; - /** Field description */ private static final String DIRECTORY_METAINF = "META-INF"; /** Field description */ - private static final String DIRECTORY_WEBINF = "WEB-INF"; + private static final String DIRECTORY_WEBAPP = "webapp"; /** Field description */ private static final String EXTENSION_PLUGIN = ".smp"; @@ -350,32 +347,29 @@ public final class PluginProcessor { List urls = new ArrayList<>(); - Path metaDir = smp.getPath().resolve(DIRECTORY_METAINF); + Path directory = smp.getPath(); + + Path metaDir = directory.resolve(DIRECTORY_METAINF); if (!Files.exists(metaDir)) { throw new FileNotFoundException("could not find META-INF directory"); } - Path webinfDir = smp.getPath().resolve(DIRECTORY_WEBINF); + Path classesDir = directory.resolve(DIRECTORY_CLASSES); - if (Files.exists(webinfDir)) + if (Files.exists(classesDir)) { - Path classesDir = webinfDir.resolve(DIRECTORY_CLASSES); + urls.add(classesDir.toUri().toURL()); + } - if (Files.exists(classesDir)) + Path libDir = directory.resolve(DIRECTORY_DEPENDENCIES); + + if (Files.exists(libDir)) + { + for (Path f : Files.newDirectoryStream(libDir, GLOB_JAR)) { - urls.add(classesDir.toUri().toURL()); - } - - Path libDir = webinfDir.resolve(DIRECTORY_DEPENDENCIES); - - if (Files.exists(libDir)) - { - for (Path f : Files.newDirectoryStream(libDir, GLOB_JAR)) - { - urls.add(f.toUri().toURL()); - } + urls.add(f.toUri().toURL()); } } @@ -500,8 +494,9 @@ public final class PluginProcessor Plugin plugin = createPlugin(cl, descriptor); - wrapper = new PluginWrapper(plugin, cl, - new PathWebResourceLoader(directory), directory); + WebResourceLoader resourceLoader = createWebResourceLoader(directory); + + wrapper = new PluginWrapper(plugin, cl, resourceLoader, directory); } else { @@ -535,6 +530,33 @@ public final class PluginProcessor return plugins; } + /** + * Method description + * + * + * @param directory + * + * @return + */ + private WebResourceLoader createWebResourceLoader(Path directory) + { + WebResourceLoader resourceLoader; + Path webapp = directory.resolve(DIRECTORY_WEBAPP); + + if (Files.exists(webapp)) + { + logger.debug("create WebResourceLoader for path {}", webapp); + resourceLoader = new PathWebResourceLoader(webapp); + } + else + { + logger.debug("create empty WebResourceLoader"); + resourceLoader = new EmptyWebResourceLoader(); + } + + return resourceLoader; + } + /** * Method description *