/**
* Copyright (c) 2014-2017 by the respective copyright holders.
* 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.model.script;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import org.eclipse.smarthome.core.events.EventPublisher;
import org.eclipse.smarthome.core.items.ItemRegistry;
import org.eclipse.smarthome.core.thing.ThingRegistry;
import org.eclipse.smarthome.model.core.ModelRepository;
import org.eclipse.smarthome.model.script.engine.ScriptEngine;
import org.eclipse.smarthome.model.script.engine.action.ActionService;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import org.osgi.util.tracker.ServiceTracker;
import org.osgi.util.tracker.ServiceTrackerCustomizer;
/**
* Utility class for providing easy access to script services.
*
* @author Davy Vanherbergen - Initial contribution
* @author Kai Kreuzer - renamed and removed interface
*/
public class ScriptServiceUtil {
private static ScriptServiceUtil instance;
private ItemRegistry itemRegistry;
private ThingRegistry thingRegistry;
private EventPublisher eventPublisher;
private ModelRepository modelRepository;
private ScriptEngine scriptEngine;
@SuppressWarnings("rawtypes")
private ServiceTracker scriptEngineTracker;
public List<ActionService> actionServices = new CopyOnWriteArrayList<ActionService>();
@SuppressWarnings({ "rawtypes", "unchecked" })
public void activate(final BundleContext bc) {
if (instance != null) {
throw new IllegalStateException("ScriptServiceUtil should only be activated once!");
}
instance = this;
scriptEngineTracker = new ServiceTracker(bc, ScriptEngine.class.getName(), new ServiceTrackerCustomizer() {
@Override
public Object addingService(ServiceReference reference) {
Object service = bc.getService(reference);
if (service instanceof ScriptEngine) {
instance.scriptEngine = (ScriptEngine) service;
}
return null;
}
@Override
public void modifiedService(ServiceReference reference, Object service) {
}
@Override
public void removedService(ServiceReference reference, Object service) {
if (service instanceof ScriptEngine) {
instance.scriptEngine = null;
}
}
});
scriptEngineTracker.open();
}
public void deactivate() {
scriptEngineTracker.close();
instance = null;
}
private static ScriptServiceUtil getInstance() {
if (instance == null) {
throw new IllegalStateException("ScriptServiceUtil not initialized yet!");
}
return instance;
}
public static ItemRegistry getItemRegistry() {
return getInstance().itemRegistry;
}
public static ThingRegistry getThingRegistry() {
return getInstance().thingRegistry;
}
public static EventPublisher getEventPublisher() {
return getInstance().eventPublisher;
}
public static ModelRepository getModelRepository() {
return getInstance().modelRepository;
}
public static ScriptEngine getScriptEngine() {
return getInstance().scriptEngine;
}
public static List<ActionService> getActionServices() {
return getInstance().actionServices;
}
public void addActionService(ActionService actionService) {
this.actionServices.add(actionService);
}
public void removeActionService(ActionService actionService) {
this.actionServices.remove(actionService);
}
public void setItemRegistry(ItemRegistry itemRegistry) {
this.itemRegistry = itemRegistry;
}
public void unsetItemRegistry(ItemRegistry itemRegistry) {
this.itemRegistry = null;
}
public void setThingRegistry(ThingRegistry thingRegistry) {
this.thingRegistry = thingRegistry;
}
public void unsetThingRegistry(ThingRegistry thingRegistry) {
this.thingRegistry = null;
}
public void setEventPublisher(EventPublisher eventPublisher) {
this.eventPublisher = eventPublisher;
}
public void unsetEventPublisher(EventPublisher eventPublisher) {
this.eventPublisher = null;
}
public void setModelRepository(ModelRepository modelRepository) {
this.modelRepository = modelRepository;
}
public void unsetModelRepository(ModelRepository modelRepository) {
this.modelRepository = null;
}
}