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
*