diff --git a/datastore_server/.classpath b/datastore_server/.classpath index 82978ae4cab9ee4d59dba983d965d06bcd1426f6..54d8bcc27cea14aa2614ca1652b7e3aafb1a5f1b 100644 --- a/datastore_server/.classpath +++ b/datastore_server/.classpath @@ -88,5 +88,6 @@ <classpathentry kind="lib" path="/libraries/jetty8/lib/server/jetty-servlet.jar" sourcepath="/libraries/jetty8/src/jetty_src.zip"/> <classpathentry kind="lib" path="/libraries/jetty8/lib/server/servlet-api-3.0.jar" sourcepath="/libraries/jetty8/src/jetty_src.zip"/> <classpathentry kind="lib" path="/libraries/jetty8/lib/server/jetty-continuation.jar"/> + <classpathentry kind="lib" path="/libraries/cisd-hotdeploy/cisd-hotdeploy.jar" sourcepath="/libraries/cisd-hotdeploy/cisd-hotdeploy-src.zip"/> <classpathentry kind="output" path="targets/classes"/> </classpath> diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/IJavaDataSetRegistrationDropboxV2.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/IJavaDataSetRegistrationDropboxV2.java index 853f24b5e18c93e29a6ededa99c4bfb9fa35f354..aa33e387b904ce5786be408383a13c5c7c576530 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/IJavaDataSetRegistrationDropboxV2.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/IJavaDataSetRegistrationDropboxV2.java @@ -16,6 +16,7 @@ package ch.systemsx.cisd.etlserver.registrator.api.v2; +import ch.ethz.cisd.hotdeploy.Plugin; import ch.systemsx.cisd.common.exceptions.NotImplementedException; import ch.systemsx.cisd.etlserver.registrator.DataSetRegistrationContext; @@ -26,7 +27,7 @@ import ch.systemsx.cisd.etlserver.registrator.DataSetRegistrationContext; * * @author Pawel Glyzewski */ -public interface IJavaDataSetRegistrationDropboxV2 +public interface IJavaDataSetRegistrationDropboxV2 extends Plugin { /** diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/JavaTopLevelDataSetHandlerV2.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/JavaTopLevelDataSetHandlerV2.java index 8e2489419d6dfd306c6c81703a39c617b1cc7f5a..87d9da8e753cddd545eb4f7bcaa119da5a27560e 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/JavaTopLevelDataSetHandlerV2.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/JavaTopLevelDataSetHandlerV2.java @@ -18,6 +18,7 @@ package ch.systemsx.cisd.etlserver.registrator.api.v2; import java.io.File; +import ch.ethz.cisd.hotdeploy.PluginContainer; import ch.systemsx.cisd.base.exceptions.CheckedExceptionTunnel; import ch.systemsx.cisd.common.action.IDelegatedActionWithResult; import ch.systemsx.cisd.common.exceptions.ConfigurationFailureException; @@ -52,14 +53,28 @@ public class JavaTopLevelDataSetHandlerV2<T extends DataSetInformation> extends String className = PropertyUtils.getMandatoryProperty(globalState.getThreadParameters() .getThreadProperties(), PROGRAM_CLASS_KEY); - try + + PluginContainer container = + PluginContainer.tryGetInstance(globalState.getThreadParameters().getThreadName()); + + if (container != null) { - programClass = - (Class<? extends IJavaDataSetRegistrationDropboxV2>) Class.forName(className); - } catch (ClassNotFoundException ex) + programClass = (Class<? extends IJavaDataSetRegistrationDropboxV2>) container + .tryGetPluginClassByClassname(className); + } + + if (programClass == null) { - throw ConfigurationFailureException.fromTemplate("Class '%s' does not exist!", - className); + try + { + programClass = + (Class<? extends IJavaDataSetRegistrationDropboxV2>) Class + .forName(className); + } catch (ClassNotFoundException ex) + { + throw ConfigurationFailureException.fromTemplate("Class '%s' does not exist!", + className); + } } DssRegistrationHealthMonitor.getInstance(globalState.getOpenBisService(), diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/DssPropertyParametersUtil.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/DssPropertyParametersUtil.java index 3b8e3f30b5de17a1b263b1e03cd7844b3ba4f020..131cfd06f7c73a74cd41caacf01495f742e046ca 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/DssPropertyParametersUtil.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/DssPropertyParametersUtil.java @@ -17,10 +17,12 @@ package ch.systemsx.cisd.openbis.dss.generic.shared.utils; import java.io.File; +import java.util.Map; import java.util.Map.Entry; import java.util.Properties; import java.util.Set; +import ch.ethz.cisd.hotdeploy.PluginContainer; import ch.rinn.restrictions.Private; import ch.systemsx.cisd.common.exceptions.ConfigurationFailureException; import ch.systemsx.cisd.common.filesystem.FileOperations; @@ -97,7 +99,21 @@ public class DssPropertyParametersUtil ExtendedProperties serviceProperties = extendProperties(properties); CorePluginsInjector injector = new CorePluginsInjector(ScannerType.DSS, DssPluginType.values()); - injector.injectCorePlugins(serviceProperties); + Map<String, File> pluginFolders = + injector.injectCorePlugins(serviceProperties); + + if (PluginContainer.tryGetInstance() == null) + { + PluginContainer.initHotDeployment(); + + for (String name : pluginFolders.keySet()) + { + PluginContainer pluginContainer = PluginContainer.initHotDeployment(name); + pluginContainer.addPluginDirectory(pluginFolders.get(name)); + pluginContainer.refresh(true); + } + } + return serviceProperties; } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/coreplugin/CorePluginsInjector.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/coreplugin/CorePluginsInjector.java index dafeb30571e9a5174c76117bf238e9e468a04441..ccb59f411a4c20500000e784a49eaca03e620852 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/coreplugin/CorePluginsInjector.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/coreplugin/CorePluginsInjector.java @@ -21,6 +21,7 @@ import java.io.FileInputStream; import java.io.FilenameFilter; import java.io.IOException; import java.util.Arrays; +import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; @@ -94,14 +95,15 @@ public class CorePluginsInjector } } - public void injectCorePlugins(Properties properties) + public Map<String, File> injectCorePlugins(Properties properties) { String corePluginsFolderPath = CorePluginsUtils.getCorePluginsFolder(properties, scannerType); - injectCorePlugins(properties, corePluginsFolderPath); + return injectCorePlugins(properties, corePluginsFolderPath); } - public void injectCorePlugins(Properties properties, String corePluginsFolderPath) + public Map<String, File> injectCorePlugins(Properties properties, + String corePluginsFolderPath) { ModuleEnabledChecker moduleEnabledChecker = new ModuleEnabledChecker(properties); List<String> disabledPlugins = PropertyUtils.getList(properties, DISABLED_CORE_PLUGINS_KEY); @@ -155,6 +157,17 @@ public class CorePluginsInjector } } pluginKeyBundles.addOrReplaceKeyBundleIn(properties); + + Map<String, File> pluginFolders = new HashMap<String, File>(); + for (Map<String, NamedCorePluginFolder> map : plugins.values()) + { + for (String name : map.keySet()) + { + pluginFolders.put(name, map.get(name).getDefiningFolder()); + } + } + return pluginFolders; + } private void injectProperty(Properties properties, String key, String value)