/**
* Copyright (c) 2015-2017 Simon Merschjohann and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.eclipse.smarthome.automation.module.script.rulesupport.internal;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Locale;
import org.eclipse.smarthome.automation.type.ModuleType;
import org.eclipse.smarthome.automation.type.ModuleTypeProvider;
import org.eclipse.smarthome.core.common.registry.ProviderChangeListener;
/**
* The {@link ScriptedCustomModuleTypeProvider} is used in combination with the
* {@link ScriptedCustomModuleHandlerFactory} to allow scripts to define custom types in the RuleEngine. These
* registered types can then be used publicly from any Rule-Editor.
*
* @author Simon Merschjohann - initial contribution
*
*/
public class ScriptedCustomModuleTypeProvider implements ModuleTypeProvider {
private HashMap<String, ModuleType> modulesTypes = new HashMap<>();
private HashSet<ProviderChangeListener<ModuleType>> listeners = new HashSet<>();
@Override
public Collection<ModuleType> getAll() {
return modulesTypes.values();
}
@Override
public void addProviderChangeListener(ProviderChangeListener<ModuleType> listener) {
this.listeners.add(listener);
}
@Override
public void removeProviderChangeListener(ProviderChangeListener<ModuleType> listener) {
this.listeners.remove(listener);
}
@SuppressWarnings("unchecked")
@Override
public <T extends ModuleType> T getModuleType(String UID, Locale locale) {
ModuleType handler = modulesTypes.get(UID);
return (T) handler;
}
@SuppressWarnings("unchecked")
@Override
public <T extends ModuleType> Collection<T> getModuleTypes(Locale locale) {
return (Collection<T>) modulesTypes.values();
}
public void addModuleType(ModuleType moduleType) {
modulesTypes.put(moduleType.getUID(), moduleType);
for (ProviderChangeListener<ModuleType> listener : listeners) {
listener.added(this, moduleType);
}
}
public void removeModuleType(ModuleType moduleType) {
removeModuleType(moduleType.getUID());
}
public void removeModuleType(String moduleTypeUID) {
ModuleType element = modulesTypes.remove(moduleTypeUID);
for (ProviderChangeListener<ModuleType> listener : listeners) {
listener.removed(this, element);
}
}
public void updateModuleHandler(String uid) {
ModuleType modType = modulesTypes.get(uid);
if (modType != null) {
for (ProviderChangeListener<ModuleType> listener : listeners) {
listener.updated(this, null, modType);
}
}
}
}