From 8b96a4b0282f06a1adcd896fb27fca7a95163f6f Mon Sep 17 00:00:00 2001 From: Henning Treu Date: Thu, 27 Sep 2018 17:02:34 +0200 Subject: [PATCH] [automation] refactor OSGi DS to annotation, change to lazy activation (#6284) Fixes #6149. Signed-off-by: Henning Treu --- .../internal/MediaScriptScopeProvider.java | 2 +- .../OSGI-INF/.gitignore | 1 + .../OSGI-INF/NashornScriptEngineFactory.xml | 21 ---------- .../OSGI-INF/ScriptEngineManager.xml | 23 ----------- .../OSGI-INF/ScriptExtensionManager.xml | 22 ----------- .../OSGI-INF/ScriptModuleHandlerFactory.xml | 23 ----------- .../module/script/ScriptEngineContainer.java | 3 ++ .../module/script/ScriptEngineManager.java | 5 +++ .../internal/NashornScriptEngineFactory.java | 2 + .../internal/ScriptEngineManagerImpl.java | 39 +++++++++++++------ .../internal/ScriptExtensionManager.java | 30 +++++++------- .../ScriptExtensionManagerWrapper.java | 21 +++++----- .../factory/ScriptModuleHandlerFactory.java | 13 ++++++- 13 files changed, 78 insertions(+), 127 deletions(-) create mode 100644 bundles/automation/org.eclipse.smarthome.automation.module.script/OSGI-INF/.gitignore delete mode 100644 bundles/automation/org.eclipse.smarthome.automation.module.script/OSGI-INF/NashornScriptEngineFactory.xml delete mode 100644 bundles/automation/org.eclipse.smarthome.automation.module.script/OSGI-INF/ScriptEngineManager.xml delete mode 100644 bundles/automation/org.eclipse.smarthome.automation.module.script/OSGI-INF/ScriptExtensionManager.xml delete mode 100644 bundles/automation/org.eclipse.smarthome.automation.module.script/OSGI-INF/ScriptModuleHandlerFactory.xml diff --git a/bundles/automation/org.eclipse.smarthome.automation.module.media/src/main/java/org/eclipse/smarthome/automation/module/media/internal/MediaScriptScopeProvider.java b/bundles/automation/org.eclipse.smarthome.automation.module.media/src/main/java/org/eclipse/smarthome/automation/module/media/internal/MediaScriptScopeProvider.java index c1cb2241628..0af72e51800 100644 --- a/bundles/automation/org.eclipse.smarthome.automation.module.media/src/main/java/org/eclipse/smarthome/automation/module/media/internal/MediaScriptScopeProvider.java +++ b/bundles/automation/org.eclipse.smarthome.automation.module.media/src/main/java/org/eclipse/smarthome/automation/module/media/internal/MediaScriptScopeProvider.java @@ -29,7 +29,7 @@ * @author Kai Kreuzer - Initial contribution * */ -@Component(immediate = true) +@Component public class MediaScriptScopeProvider implements ScriptExtensionProvider { Map elements = new HashMap<>(); diff --git a/bundles/automation/org.eclipse.smarthome.automation.module.script/OSGI-INF/.gitignore b/bundles/automation/org.eclipse.smarthome.automation.module.script/OSGI-INF/.gitignore new file mode 100644 index 00000000000..6722cd96e78 --- /dev/null +++ b/bundles/automation/org.eclipse.smarthome.automation.module.script/OSGI-INF/.gitignore @@ -0,0 +1 @@ +*.xml diff --git a/bundles/automation/org.eclipse.smarthome.automation.module.script/OSGI-INF/NashornScriptEngineFactory.xml b/bundles/automation/org.eclipse.smarthome.automation.module.script/OSGI-INF/NashornScriptEngineFactory.xml deleted file mode 100644 index 62efde19fc9..00000000000 --- a/bundles/automation/org.eclipse.smarthome.automation.module.script/OSGI-INF/NashornScriptEngineFactory.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - diff --git a/bundles/automation/org.eclipse.smarthome.automation.module.script/OSGI-INF/ScriptEngineManager.xml b/bundles/automation/org.eclipse.smarthome.automation.module.script/OSGI-INF/ScriptEngineManager.xml deleted file mode 100644 index 6d684082c81..00000000000 --- a/bundles/automation/org.eclipse.smarthome.automation.module.script/OSGI-INF/ScriptEngineManager.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - diff --git a/bundles/automation/org.eclipse.smarthome.automation.module.script/OSGI-INF/ScriptExtensionManager.xml b/bundles/automation/org.eclipse.smarthome.automation.module.script/OSGI-INF/ScriptExtensionManager.xml deleted file mode 100644 index edffcfea8ad..00000000000 --- a/bundles/automation/org.eclipse.smarthome.automation.module.script/OSGI-INF/ScriptExtensionManager.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - diff --git a/bundles/automation/org.eclipse.smarthome.automation.module.script/OSGI-INF/ScriptModuleHandlerFactory.xml b/bundles/automation/org.eclipse.smarthome.automation.module.script/OSGI-INF/ScriptModuleHandlerFactory.xml deleted file mode 100644 index 144607ed1af..00000000000 --- a/bundles/automation/org.eclipse.smarthome.automation.module.script/OSGI-INF/ScriptModuleHandlerFactory.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - diff --git a/bundles/automation/org.eclipse.smarthome.automation.module.script/src/main/java/org/eclipse/smarthome/automation/module/script/ScriptEngineContainer.java b/bundles/automation/org.eclipse.smarthome.automation.module.script/src/main/java/org/eclipse/smarthome/automation/module/script/ScriptEngineContainer.java index 2305902e6bc..2fcac27e121 100644 --- a/bundles/automation/org.eclipse.smarthome.automation.module.script/src/main/java/org/eclipse/smarthome/automation/module/script/ScriptEngineContainer.java +++ b/bundles/automation/org.eclipse.smarthome.automation.module.script/src/main/java/org/eclipse/smarthome/automation/module/script/ScriptEngineContainer.java @@ -14,10 +14,13 @@ import javax.script.ScriptEngine; +import org.eclipse.jdt.annotation.NonNullByDefault; + /** * * @author Simon Merschjohann - Initial contribution */ +@NonNullByDefault public class ScriptEngineContainer { private ScriptEngine scriptEngine; private ScriptEngineFactory factory; diff --git a/bundles/automation/org.eclipse.smarthome.automation.module.script/src/main/java/org/eclipse/smarthome/automation/module/script/ScriptEngineManager.java b/bundles/automation/org.eclipse.smarthome.automation.module.script/src/main/java/org/eclipse/smarthome/automation/module/script/ScriptEngineManager.java index 995a76fc245..3e7201e2bbc 100644 --- a/bundles/automation/org.eclipse.smarthome.automation.module.script/src/main/java/org/eclipse/smarthome/automation/module/script/ScriptEngineManager.java +++ b/bundles/automation/org.eclipse.smarthome.automation.module.script/src/main/java/org/eclipse/smarthome/automation/module/script/ScriptEngineManager.java @@ -14,10 +14,14 @@ import java.io.InputStreamReader; +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; + /** * * @author Simon Merschjohann - Initial contribution */ +@NonNullByDefault public interface ScriptEngineManager { /** @@ -35,6 +39,7 @@ public interface ScriptEngineManager { * @param scriptIdentifier * @return */ + @Nullable ScriptEngineContainer createScriptEngine(String fileExtension, String scriptIdentifier); /** diff --git a/bundles/automation/org.eclipse.smarthome.automation.module.script/src/main/java/org/eclipse/smarthome/automation/module/script/internal/NashornScriptEngineFactory.java b/bundles/automation/org.eclipse.smarthome.automation.module.script/src/main/java/org/eclipse/smarthome/automation/module/script/internal/NashornScriptEngineFactory.java index 50b8e8d9043..71332b45b07 100644 --- a/bundles/automation/org.eclipse.smarthome.automation.module.script/src/main/java/org/eclipse/smarthome/automation/module/script/internal/NashornScriptEngineFactory.java +++ b/bundles/automation/org.eclipse.smarthome.automation.module.script/src/main/java/org/eclipse/smarthome/automation/module/script/internal/NashornScriptEngineFactory.java @@ -24,6 +24,7 @@ import javax.script.ScriptException; import org.eclipse.smarthome.automation.module.script.ScriptEngineFactory; +import org.osgi.service.component.annotations.Component; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -31,6 +32,7 @@ * * @author Simon Merschjohann - Initial contribution */ +@Component(service = ScriptEngineFactory.class) public class NashornScriptEngineFactory implements ScriptEngineFactory { private final Logger logger = LoggerFactory.getLogger(this.getClass()); diff --git a/bundles/automation/org.eclipse.smarthome.automation.module.script/src/main/java/org/eclipse/smarthome/automation/module/script/internal/ScriptEngineManagerImpl.java b/bundles/automation/org.eclipse.smarthome.automation.module.script/src/main/java/org/eclipse/smarthome/automation/module/script/internal/ScriptEngineManagerImpl.java index 84f56d91477..22dfc9cffcf 100644 --- a/bundles/automation/org.eclipse.smarthome.automation.module.script/src/main/java/org/eclipse/smarthome/automation/module/script/internal/ScriptEngineManagerImpl.java +++ b/bundles/automation/org.eclipse.smarthome.automation.module.script/src/main/java/org/eclipse/smarthome/automation/module/script/internal/ScriptEngineManagerImpl.java @@ -21,10 +21,15 @@ import javax.script.ScriptEngine; import javax.script.ScriptException; +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; import org.eclipse.smarthome.automation.module.script.ScriptEngineContainer; import org.eclipse.smarthome.automation.module.script.ScriptEngineFactory; import org.eclipse.smarthome.automation.module.script.ScriptEngineManager; -import org.osgi.framework.BundleContext; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; +import org.osgi.service.component.annotations.ReferenceCardinality; +import org.osgi.service.component.annotations.ReferencePolicy; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -34,20 +39,29 @@ * @author Simon Merschjohann * */ +@NonNullByDefault +@Component(service = ScriptEngineManager.class) public class ScriptEngineManagerImpl implements ScriptEngineManager { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + private Set scriptEngineFactories = new HashSet<>(); - private HashMap loadedScriptEngineInstances = new HashMap<>(); - private HashMap supportedLanguages = new HashMap<>(); + private HashMap loadedScriptEngineInstances = new HashMap<>(); + private HashMap supportedLanguages = new HashMap<>(); private GenericScriptEngineFactory genericScriptEngineFactory = new GenericScriptEngineFactory(); - public ScriptEngineManagerImpl() { - logger.debug("ScriptManager loading..."); + private @NonNullByDefault({}) ScriptExtensionManager scriptExtensionManager; + + @Reference + public void setScriptExtensionManager(ScriptExtensionManager scriptExtensionManager) { + this.scriptExtensionManager = scriptExtensionManager; } - public void activate(BundleContext bundleContext) { + public void unsetScriptExtensionManager(ScriptExtensionManager scriptExtensionManager) { + this.scriptExtensionManager = null; } + @Reference(cardinality = ReferenceCardinality.MULTIPLE, policy = ReferencePolicy.DYNAMIC) public void addScriptEngineFactory(ScriptEngineFactory provider) { this.scriptEngineFactories.add(provider); @@ -70,7 +84,7 @@ public boolean isSupported(String fileExtension) { } @Override - public ScriptEngineContainer createScriptEngine(String fileExtension, String scriptIdentifier) { + public @Nullable ScriptEngineContainer createScriptEngine(String fileExtension, String scriptIdentifier) { ScriptEngineContainer result = null; ScriptEngineFactory engineProvider = findEngineFactory(fileExtension); @@ -82,11 +96,12 @@ public ScriptEngineContainer createScriptEngine(String fileExtension, String scr ScriptEngine engine = engineProvider.createScriptEngine(fileExtension); HashMap scriptExManager = new HashMap<>(); result = new ScriptEngineContainer(engine, engineProvider, scriptIdentifier); - ScriptExtensionManagerWrapper wrapper = new ScriptExtensionManagerWrapper(result); + ScriptExtensionManagerWrapper wrapper = new ScriptExtensionManagerWrapper(scriptExtensionManager, + result); scriptExManager.put("scriptExtension", wrapper); scriptExManager.put("se", wrapper); engineProvider.scopeValues(engine, scriptExManager); - ScriptExtensionManager.importDefaultPresets(engineProvider, engine, scriptIdentifier); + scriptExtensionManager.importDefaultPresets(engineProvider, engine, scriptIdentifier); loadedScriptEngineInstances.put(scriptIdentifier, result); } catch (Exception ex) { @@ -149,13 +164,13 @@ public void removeEngine(String scriptIdentifier) { private void removeScriptExtensions(String pathIdentifier) { try { - ScriptExtensionManager.dispose(pathIdentifier); + scriptExtensionManager.dispose(pathIdentifier); } catch (Exception ex) { logger.error("error removing engine", ex); } } - private ScriptEngineFactory findEngineFactory(String fileExtension) { + private @Nullable ScriptEngineFactory findEngineFactory(String fileExtension) { ScriptEngineFactory engineProvider = supportedLanguages.get(fileExtension); if (engineProvider != null) { @@ -163,7 +178,7 @@ private ScriptEngineFactory findEngineFactory(String fileExtension) { } for (ScriptEngineFactory provider : supportedLanguages.values()) { - if (provider.isSupported(fileExtension)) { + if (provider != null && provider.isSupported(fileExtension)) { return provider; } } diff --git a/bundles/automation/org.eclipse.smarthome.automation.module.script/src/main/java/org/eclipse/smarthome/automation/module/script/internal/ScriptExtensionManager.java b/bundles/automation/org.eclipse.smarthome.automation.module.script/src/main/java/org/eclipse/smarthome/automation/module/script/internal/ScriptExtensionManager.java index 191d39a9825..aeb56b979c1 100644 --- a/bundles/automation/org.eclipse.smarthome.automation.module.script/src/main/java/org/eclipse/smarthome/automation/module/script/internal/ScriptExtensionManager.java +++ b/bundles/automation/org.eclipse.smarthome.automation.module.script/src/main/java/org/eclipse/smarthome/automation/module/script/internal/ScriptExtensionManager.java @@ -22,6 +22,10 @@ import org.eclipse.smarthome.automation.module.script.ScriptEngineFactory; import org.eclipse.smarthome.automation.module.script.ScriptExtensionProvider; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; +import org.osgi.service.component.annotations.ReferenceCardinality; +import org.osgi.service.component.annotations.ReferencePolicy; /** * This manager allows a script import extension providers @@ -29,13 +33,11 @@ * @author Simon Merschjohann * */ +@Component(service = ScriptExtensionManager.class) public class ScriptExtensionManager { - private static Set scriptExtensionProviders = new CopyOnWriteArraySet(); - - public static Set getScriptExtensionProviders() { - return scriptExtensionProviders; - } + private Set scriptExtensionProviders = new CopyOnWriteArraySet(); + @Reference(cardinality = ReferenceCardinality.MULTIPLE, policy = ReferencePolicy.DYNAMIC) public void addScriptExtensionProvider(ScriptExtensionProvider provider) { scriptExtensionProviders.add(provider); } @@ -44,15 +46,15 @@ public void removeScriptExtensionProvider(ScriptExtensionProvider provider) { scriptExtensionProviders.remove(provider); } - public static void addExtension(ScriptExtensionProvider provider) { + public void addExtension(ScriptExtensionProvider provider) { scriptExtensionProviders.add(provider); } - public static void removeExtension(ScriptExtensionProvider provider) { + public void removeExtension(ScriptExtensionProvider provider) { scriptExtensionProviders.remove(provider); } - public static List getTypes() { + public List getTypes() { ArrayList types = new ArrayList<>(); for (ScriptExtensionProvider provider : scriptExtensionProviders) { @@ -62,7 +64,7 @@ public static List getTypes() { return types; } - public static List getPresets() { + public List getPresets() { ArrayList presets = new ArrayList<>(); for (ScriptExtensionProvider provider : scriptExtensionProviders) { @@ -72,7 +74,7 @@ public static List getPresets() { return presets; } - public static Object get(String type, String scriptIdentifier) { + public Object get(String type, String scriptIdentifier) { for (ScriptExtensionProvider provider : scriptExtensionProviders) { if (provider.getTypes().contains(type)) { return provider.get(scriptIdentifier, type); @@ -82,7 +84,7 @@ public static Object get(String type, String scriptIdentifier) { return null; } - public static List getDefaultPresets() { + public List getDefaultPresets() { ArrayList defaultPresets = new ArrayList<>(); for (ScriptExtensionProvider provider : scriptExtensionProviders) { @@ -92,14 +94,14 @@ public static List getDefaultPresets() { return defaultPresets; } - public static void importDefaultPresets(ScriptEngineFactory engineProvider, ScriptEngine scriptEngine, + public void importDefaultPresets(ScriptEngineFactory engineProvider, ScriptEngine scriptEngine, String scriptIdentifier) { for (String preset : getDefaultPresets()) { importPreset(preset, engineProvider, scriptEngine, scriptIdentifier); } } - public static void importPreset(String preset, ScriptEngineFactory engineProvider, ScriptEngine scriptEngine, + public void importPreset(String preset, ScriptEngineFactory engineProvider, ScriptEngine scriptEngine, String scriptIdentifier) { for (ScriptExtensionProvider provider : scriptExtensionProviders) { if (provider.getPresets().contains(preset)) { @@ -110,7 +112,7 @@ public static void importPreset(String preset, ScriptEngineFactory engineProvide } } - public static void dispose(String scriptIdentifier) { + public void dispose(String scriptIdentifier) { for (ScriptExtensionProvider provider : scriptExtensionProviders) { provider.unload(scriptIdentifier); } diff --git a/bundles/automation/org.eclipse.smarthome.automation.module.script/src/main/java/org/eclipse/smarthome/automation/module/script/internal/ScriptExtensionManagerWrapper.java b/bundles/automation/org.eclipse.smarthome.automation.module.script/src/main/java/org/eclipse/smarthome/automation/module/script/internal/ScriptExtensionManagerWrapper.java index 5513a03007e..8b5e8ad9476 100644 --- a/bundles/automation/org.eclipse.smarthome.automation.module.script/src/main/java/org/eclipse/smarthome/automation/module/script/internal/ScriptExtensionManagerWrapper.java +++ b/bundles/automation/org.eclipse.smarthome.automation.module.script/src/main/java/org/eclipse/smarthome/automation/module/script/internal/ScriptExtensionManagerWrapper.java @@ -14,6 +14,7 @@ import java.util.List; +import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.smarthome.automation.module.script.ScriptEngineContainer; import org.eclipse.smarthome.automation.module.script.ScriptExtensionProvider; @@ -21,39 +22,41 @@ * * @author Simon Merschjohann - Initial contribution */ +@NonNullByDefault public class ScriptExtensionManagerWrapper { private ScriptEngineContainer container; + private ScriptExtensionManager manager; - public ScriptExtensionManagerWrapper(ScriptEngineContainer container) { + public ScriptExtensionManagerWrapper(ScriptExtensionManager manager, ScriptEngineContainer container) { + this.manager = manager; this.container = container; } public void addScriptExtensionProvider(ScriptExtensionProvider provider) { - ScriptExtensionManager.addExtension(provider); + manager.addExtension(provider); } public void removeScriptExtensionProvider(ScriptExtensionProvider provider) { - ScriptExtensionManager.removeExtension(provider); + manager.removeExtension(provider); } public List getTypes() { - return ScriptExtensionManager.getTypes(); + return manager.getTypes(); } public List getPresets() { - return ScriptExtensionManager.getPresets(); + return manager.getPresets(); } public Object get(String type) { - return ScriptExtensionManager.get(type, container.getIdentifier()); + return manager.get(type, container.getIdentifier()); } public List getDefaultPresets() { - return ScriptExtensionManager.getDefaultPresets(); + return manager.getDefaultPresets(); } public void importPreset(String preset) { - ScriptExtensionManager.importPreset(preset, container.getFactory(), container.getScriptEngine(), - container.getIdentifier()); + manager.importPreset(preset, container.getFactory(), container.getScriptEngine(), container.getIdentifier()); } } diff --git a/bundles/automation/org.eclipse.smarthome.automation.module.script/src/main/java/org/eclipse/smarthome/automation/module/script/internal/factory/ScriptModuleHandlerFactory.java b/bundles/automation/org.eclipse.smarthome.automation.module.script/src/main/java/org/eclipse/smarthome/automation/module/script/internal/factory/ScriptModuleHandlerFactory.java index a5602678af3..92d358d6920 100644 --- a/bundles/automation/org.eclipse.smarthome.automation.module.script/src/main/java/org/eclipse/smarthome/automation/module/script/internal/factory/ScriptModuleHandlerFactory.java +++ b/bundles/automation/org.eclipse.smarthome.automation.module.script/src/main/java/org/eclipse/smarthome/automation/module/script/internal/factory/ScriptModuleHandlerFactory.java @@ -15,15 +15,21 @@ import java.util.Arrays; import java.util.Collection; +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; import org.eclipse.smarthome.automation.Action; import org.eclipse.smarthome.automation.Condition; import org.eclipse.smarthome.automation.Module; import org.eclipse.smarthome.automation.handler.BaseModuleHandlerFactory; import org.eclipse.smarthome.automation.handler.ModuleHandler; +import org.eclipse.smarthome.automation.handler.ModuleHandlerFactory; import org.eclipse.smarthome.automation.module.script.ScriptEngineManager; import org.eclipse.smarthome.automation.module.script.internal.handler.ScriptActionHandler; import org.eclipse.smarthome.automation.module.script.internal.handler.ScriptConditionHandler; +import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Deactivate; +import org.osgi.service.component.annotations.Reference; +import org.osgi.service.component.annotations.ReferencePolicy; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -33,11 +39,13 @@ * @author Kai Kreuzer * */ +@NonNullByDefault +@Component(service = ModuleHandlerFactory.class) public class ScriptModuleHandlerFactory extends BaseModuleHandlerFactory { private final Logger logger = LoggerFactory.getLogger(ScriptModuleHandlerFactory.class); - private ScriptEngineManager scriptEngineManager; + private @NonNullByDefault({}) ScriptEngineManager scriptEngineManager; private static final Collection TYPES = Arrays .asList(new String[] { ScriptActionHandler.SCRIPT_ACTION_ID, ScriptConditionHandler.SCRIPT_CONDITION }); @@ -53,6 +61,7 @@ public Collection getTypes() { return TYPES; } + @Reference(policy = ReferencePolicy.DYNAMIC) public void setScriptEngineManager(ScriptEngineManager scriptEngineManager) { this.scriptEngineManager = scriptEngineManager; } @@ -62,7 +71,7 @@ public void unsetScriptEngineManager(ScriptEngineManager scriptEngineManager) { } @Override - protected ModuleHandler internalCreate(Module module, String ruleUID) { + protected @Nullable ModuleHandler internalCreate(Module module, String ruleUID) { logger.trace("create {} -> {}", module.getId(), module.getTypeUID()); String moduleTypeUID = module.getTypeUID(); if (moduleTypeUID != null) {