package org.goko.core.common.event;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.e4.core.services.events.IEventBroker;
import org.goko.core.common.exception.GkException;
import org.goko.core.common.exception.GkTechnicalException;
import org.osgi.service.event.EventAdmin;
import org.osgi.service.event.EventHandler;
public class EventBrokerUtils {
public static <T> void subscribe(IEventBroker broker, EventHandler eventHandler) throws GkException{
broker.unsubscribe(eventHandler);
}
public static <T> void subscribe(IEventBroker broker, GkTopic<T> topic, EventHandler eventHandler) throws GkException{
broker.subscribe(topic.getTopic(), eventHandler);
}
public static <T> void subscribe(IEventBroker broker, GkTopic<T> topic, String filter, EventHandler eventHandler, boolean headless) throws GkException{
broker.subscribe(topic.getTopic(), filter, eventHandler, headless);
}
public static <T> void post(IEventBroker broker, GkTopic<T> topic, T data) throws GkException{
broker.post(topic.getTopic(), data);
}
public static <T> void post(EventAdmin broker, GkTopic<T> topic, T data) throws GkException{
Map<String, Object> properties = new HashMap<String, Object>();
properties.put(IEventBroker.DATA, data);
org.osgi.service.event.Event e = new org.osgi.service.event.Event(topic.getTopic(), properties);
broker.postEvent(e);
}
public static <T> void send(IEventBroker broker, GkTopic<T> topic, T data) throws GkException{
broker.send(topic.getTopic(), data);
}
public static <T> void send(EventAdmin broker, GkTopic<T> topic, T data) throws GkException{
Map<String, Object> properties = new HashMap<String, Object>();
properties.put(IEventBroker.DATA, data);
org.osgi.service.event.Event e = new org.osgi.service.event.Event(topic.getTopic(), properties);
broker.sendEvent(e);
}
public static <T> T getData(org.osgi.service.event.Event event, GkTopic<T> topic) throws GkException{
if( ! topic.getTopic().equals(event.getTopic())){
throw new GkTechnicalException("Topic doesn't match");
}
Object obj = event.getProperty(IEventBroker.DATA);
if(obj != null){
if(topic.getDataClass().isAssignableFrom(obj.getClass())){
return (T) obj;
}else{
throw new GkTechnicalException("Object is not expected type. Expected '"+topic.getDataClass()+"', got '"+obj.getClass()+"'");
}
}
return null;
}
}