From 63061a5ef97e27bdf9ea2a6ec9e78710ceca6816 Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Wed, 1 Dec 2010 15:15:09 +0100 Subject: [PATCH] improve jersey configuration --- .../main/resources/META-INF/scm/plugin.xml | 2 +- .../src/main/java/sonia/scm/SCMContext.java | 5 + .../scm/plugin/DefaultPluginManager.java | 6 +- .../main/java/sonia/scm/ScmServletModule.java | 100 +++++++++++++++++- 4 files changed, 107 insertions(+), 6 deletions(-) diff --git a/plugins/scm-hg-plugin/src/main/resources/META-INF/scm/plugin.xml b/plugins/scm-hg-plugin/src/main/resources/META-INF/scm/plugin.xml index 51e3cd5ddf..d4144969c2 100644 --- a/plugins/scm-hg-plugin/src/main/resources/META-INF/scm/plugin.xml +++ b/plugins/scm-hg-plugin/src/main/resources/META-INF/scm/plugin.xml @@ -53,5 +53,5 @@ - + diff --git a/scm-core/src/main/java/sonia/scm/SCMContext.java b/scm-core/src/main/java/sonia/scm/SCMContext.java index 3753922124..48afba0bc8 100644 --- a/scm-core/src/main/java/sonia/scm/SCMContext.java +++ b/scm-core/src/main/java/sonia/scm/SCMContext.java @@ -29,6 +29,8 @@ * */ + + package sonia.scm; //~--- non-JDK imports -------------------------------------------------------- @@ -42,6 +44,9 @@ import sonia.scm.util.ServiceUtil; public class SCMContext { + /** Field description */ + public static final String DEFAULT_PACKAGE = "sonia.scm"; + /** Field description */ private static volatile SCMContextProvider provider; diff --git a/scm-core/src/main/java/sonia/scm/plugin/DefaultPluginManager.java b/scm-core/src/main/java/sonia/scm/plugin/DefaultPluginManager.java index 1fe0eb0b1d..e145afec51 100644 --- a/scm-core/src/main/java/sonia/scm/plugin/DefaultPluginManager.java +++ b/scm-core/src/main/java/sonia/scm/plugin/DefaultPluginManager.java @@ -38,6 +38,7 @@ package sonia.scm.plugin; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import sonia.scm.SCMContext; import sonia.scm.plugin.ext.ExtensionObject; import sonia.scm.plugin.ext.ExtensionProcessor; import sonia.scm.plugin.ext.JARExtensionScanner; @@ -65,9 +66,6 @@ import javax.xml.bind.JAXB; public class DefaultPluginManager implements PluginManager { - /** Field description */ - public static final String DEFAULT_PACKAGE = "sonia.scm"; - /** Field description */ public static final String PATH_PLUGINCONFIG = "META-INF/scm/plugin.xml"; @@ -123,7 +121,7 @@ public class DefaultPluginManager implements PluginManager packageSet = new HashSet(); } - packageSet.add(DEFAULT_PACKAGE); + packageSet.add(SCMContext.DEFAULT_PACKAGE); input = new FileInputStream(plugin.getPath()); scanner.processExtensions(classLoader, extensions, input, packageSet); } diff --git a/scm-webapp/src/main/java/sonia/scm/ScmServletModule.java b/scm-webapp/src/main/java/sonia/scm/ScmServletModule.java index a66b0a84e1..7b425d6038 100644 --- a/scm-webapp/src/main/java/sonia/scm/ScmServletModule.java +++ b/scm-webapp/src/main/java/sonia/scm/ScmServletModule.java @@ -45,6 +45,7 @@ import sonia.scm.cache.CacheManager; import sonia.scm.cache.EhCacheManager; import sonia.scm.config.ScmConfiguration; import sonia.scm.filter.SecurityFilter; +import sonia.scm.plugin.Plugin; import sonia.scm.plugin.PluginManager; import sonia.scm.plugin.ScriptResourceServlet; import sonia.scm.repository.RepositoryManager; @@ -69,8 +70,12 @@ import com.sun.jersey.spi.container.servlet.ServletContainer; import java.io.File; +import java.util.Collection; import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; import java.util.Map; +import java.util.Set; import javax.xml.bind.JAXB; @@ -191,12 +196,105 @@ public class ScmServletModule extends ServletModule params.put(ResourceConfig.FEATURE_REDIRECT, Boolean.TRUE.toString()); params.put(ServletContainer.RESOURCE_CONFIG_CLASS, UriExtensionsConfig.class.getName()); - params.put(PackagesResourceConfig.PROPERTY_PACKAGES, REST_PACKAGE); + + String restPath = getRestPackages(); + + if (logger.isInfoEnabled()) + { + logger.info("configure jersey with package path: {}", restPath); + } + + params.put(PackagesResourceConfig.PROPERTY_PACKAGES, restPath); serve(PATTERN_RESTAPI).with(GuiceContainer.class, params); } + /** + * Method description + * + * + * @param packageSet + * @param plugin + */ + private void appendPluginPackages(Set packageSet, Plugin plugin) + { + Set pluginPackageSet = plugin.getPackageSet(); + + if (pluginPackageSet != null) + { + for (String pluginPkg : pluginPackageSet) + { + boolean append = true; + + for (String pkg : packageSet) + { + if (pluginPkg.startsWith(pkg)) + { + append = false; + + break; + } + } + + if (append) + { + if (logger.isDebugEnabled()) + { + String name = "unknown"; + + if (plugin.getInformation() != null) + { + name = plugin.getInformation().getName(); + } + + logger.debug("plugin {} added rest path {}", name, pluginPkg); + } + + packageSet.add(pluginPkg); + } + } + } + } + //~--- get methods ---------------------------------------------------------- + /** + * Method description + * + * + * @return + */ + private String getRestPackages() + { + Set packageSet = new HashSet(); + + packageSet.add(SCMContext.DEFAULT_PACKAGE); + + Collection plugins = pluginManager.getPlugins(); + + if (plugins != null) + { + for (Plugin plugin : plugins) + { + appendPluginPackages(packageSet, plugin); + } + } + + StringBuilder buffer = new StringBuilder(); + Iterator pkgIterator = packageSet.iterator(); + + while (pkgIterator.hasNext()) + { + buffer.append(pkgIterator.next()); + + if (pkgIterator.hasNext()) + { + buffer.append(";"); + } + } + + return buffer.toString(); + } + /** * Method description *