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

[automation] refactor OSGi DS to annotation, change to lazy activation #6284

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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