/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.components.script.common.registry.internal;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import de.rcenvironment.components.script.common.registry.ScriptExecutor;
import de.rcenvironment.components.script.common.registry.ScriptExecutorFactory;
import de.rcenvironment.components.script.common.registry.ScriptExecutorFactoryRegistry;
import de.rcenvironment.core.utils.scripting.ScriptLanguage;
/**
* Implementation of {@link ScriptExecutorFactoryRegistry}.
*
* @author Sascha Zur
*/
public class ScriptExecutorFactoryRegistryImpl implements ScriptExecutorFactoryRegistry {
private static final Log LOGGER = LogFactory.getLog(ScriptExecutorFactoryRegistryImpl.class);
// synchronized methods to avoid removing a factory while other read it. Since this won't happen
// often, synchronizing the methods is enough
private final List<ScriptExecutorFactory> executorFactories =
Collections.synchronizedList(new LinkedList<ScriptExecutorFactory>());
@Override
public synchronized void addScriptExecutorFactory(ScriptExecutorFactory factory) {
if (factory != null && !executorFactories.contains(factory)) {
executorFactories.add(factory);
} else {
LOGGER.warn("Could not register ScriptExecutorFactory.");
}
}
@Override
public synchronized void removeScriptExecutorFactory(ScriptExecutorFactory factory) {
if (factory != null && executorFactories.contains(factory)) {
executorFactories.remove(factory);
} else {
LOGGER.warn("Could not register ScriptExecutorFactor.");
}
}
@Override
public synchronized List<ScriptLanguage> getCurrentRegisteredExecutorLanguages() {
List<ScriptLanguage> result = new LinkedList<ScriptLanguage>();
for (ScriptExecutorFactory factory : executorFactories) {
result.add(factory.getSupportingScriptLanguage());
}
return result;
}
@Override
public synchronized ScriptExecutor requestScriptExecutor(ScriptLanguage language) {
ScriptExecutor result = null;
for (ScriptExecutorFactory currentFactory : executorFactories) {
if (currentFactory.getSupportingScriptLanguage().getName().equalsIgnoreCase(language.getName())) {
result = currentFactory.createScriptExecutor();
}
}
return result;
}
}