Skip to content
This repository has been archived by the owner on May 7, 2020. It is now read-only.

Commit

Permalink
[automation] refactor OSGi DS to annotation, change to lazy activation (
Browse files Browse the repository at this point in the history
#6284)

Fixes #6149.

Signed-off-by: Henning Treu <henning.treu@telekom.de>
  • Loading branch information
htreu authored and kaikreuzer committed Sep 27, 2018
1 parent 61fca59 commit 8b96a4b
Show file tree
Hide file tree
Showing 13 changed files with 78 additions and 127 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
* @author Kai Kreuzer - Initial contribution
*
*/
@Component(immediate = true)
@Component
public class MediaScriptScopeProvider implements ScriptExtensionProvider {
Map<String, Object> elements = new HashMap<>();

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
*.xml

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {

/**
Expand All @@ -35,6 +39,7 @@ public interface ScriptEngineManager {
* @param scriptIdentifier
* @return
*/
@Nullable
ScriptEngineContainer createScriptEngine(String fileExtension, String scriptIdentifier);

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,15 @@
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;

/**
*
* @author Simon Merschjohann - Initial contribution
*/
@Component(service = ScriptEngineFactory.class)
public class NashornScriptEngineFactory implements ScriptEngineFactory {
private final Logger logger = LoggerFactory.getLogger(this.getClass());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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<ScriptEngineFactory> scriptEngineFactories = new HashSet<>();
private HashMap<String, ScriptEngineContainer> loadedScriptEngineInstances = new HashMap<>();
private HashMap<String, ScriptEngineFactory> supportedLanguages = new HashMap<>();
private HashMap<String, @Nullable ScriptEngineContainer> loadedScriptEngineInstances = new HashMap<>();
private HashMap<String, @Nullable ScriptEngineFactory> 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);

Expand All @@ -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);

Expand All @@ -82,11 +96,12 @@ public ScriptEngineContainer createScriptEngine(String fileExtension, String scr
ScriptEngine engine = engineProvider.createScriptEngine(fileExtension);
HashMap<String, Object> 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) {
Expand Down Expand Up @@ -149,21 +164,21 @@ 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) {
return engineProvider;
}

for (ScriptEngineFactory provider : supportedLanguages.values()) {
if (provider.isSupported(fileExtension)) {
if (provider != null && provider.isSupported(fileExtension)) {
return provider;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,20 +22,22 @@

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
*
* @author Simon Merschjohann
*
*/
@Component(service = ScriptExtensionManager.class)
public class ScriptExtensionManager {
private static Set<ScriptExtensionProvider> scriptExtensionProviders = new CopyOnWriteArraySet<ScriptExtensionProvider>();

public static Set<ScriptExtensionProvider> getScriptExtensionProviders() {
return scriptExtensionProviders;
}
private Set<ScriptExtensionProvider> scriptExtensionProviders = new CopyOnWriteArraySet<ScriptExtensionProvider>();

@Reference(cardinality = ReferenceCardinality.MULTIPLE, policy = ReferencePolicy.DYNAMIC)
public void addScriptExtensionProvider(ScriptExtensionProvider provider) {
scriptExtensionProviders.add(provider);
}
Expand All @@ -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<String> getTypes() {
public List<String> getTypes() {
ArrayList<String> types = new ArrayList<>();

for (ScriptExtensionProvider provider : scriptExtensionProviders) {
Expand All @@ -62,7 +64,7 @@ public static List<String> getTypes() {
return types;
}

public static List<String> getPresets() {
public List<String> getPresets() {
ArrayList<String> presets = new ArrayList<>();

for (ScriptExtensionProvider provider : scriptExtensionProviders) {
Expand All @@ -72,7 +74,7 @@ public static List<String> 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);
Expand All @@ -82,7 +84,7 @@ public static Object get(String type, String scriptIdentifier) {
return null;
}

public static List<String> getDefaultPresets() {
public List<String> getDefaultPresets() {
ArrayList<String> defaultPresets = new ArrayList<>();

for (ScriptExtensionProvider provider : scriptExtensionProviders) {
Expand All @@ -92,14 +94,14 @@ public static List<String> 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)) {
Expand All @@ -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);
}
Expand Down
Loading

0 comments on commit 8b96a4b

Please sign in to comment.