blob: 48e1806fc67661a2076a3923581f6f7ca89f405f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2013 Boeing.
* 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
*
* Contributors:
* Boeing - initial API and implementation
*******************************************************************************/
package org.eclipse.ote.bytemessage;
import java.util.Dictionary;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;
import java.util.UUID;
import org.eclipse.ote.services.core.ServiceUtility;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceRegistration;
import org.osgi.service.event.Event;
import org.osgi.service.event.EventAdmin;
import org.osgi.service.event.EventHandler;
public class OteByteMessageUtil {
public final static String BYTE_KEY = "oteeventbytes";
public final static String BYTE_KEY_2 = "bytes";
public static void sendEvent(OteByteMessage message) {
EventAdmin eventAdmin = ServiceUtility.getService(EventAdmin.class);
sendEvent(message, eventAdmin);
}
/**
* If reusing a message that has been transmitted previously,
* the TTL must be reset to enable transmission.
*/
public static void sendEventResetTTL(OteByteMessage message) {
message.getHeader().TTL.setNoLog(0);
sendEvent(message);
}
public static void sendEvent(OteByteMessage message, EventAdmin eventAdmin) {
message.getHeader().UUID_HIGH.setNoLog((long) 0x0);
message.getHeader().UUID_LOW.setNoLog((long) 0x0);
Map<String, Object> data = new HashMap<String, Object>();
data.put(BYTE_KEY, message.getData());
Event newevent = new Event(message.getHeader().TOPIC.getValue(), data);
eventAdmin.sendEvent(newevent);
}
public static void postEvent(OteByteMessage message) {
EventAdmin eventAdmin = ServiceUtility.getService(EventAdmin.class);
postEvent(message, eventAdmin);
}
public static void postEvent(OteByteMessage message, EventAdmin eventAdmin) {
message.getHeader().UUID_HIGH.setNoLog((long) 0x0);
message.getHeader().UUID_LOW.setNoLog((long) 0x0);
Map<String, Object> data = new HashMap<String, Object>();
data.put(BYTE_KEY, message.getData());
Event newevent = new Event(message.getHeader().TOPIC.getValue(), data);
eventAdmin.postEvent(newevent);
}
public static UUID getUUID(OteByteMessage msg) {
return new UUID(msg.getHeader().UUID_HIGH.getValue(), msg.getHeader().UUID_LOW.getValue());
}
public static UUID getUUID(byte[] data) {
long low = getLong(data, 74);
long high = getLong(data, 82);
return new UUID(high, low);
}
private static long getLong(byte[] data, int index){
return
(long)(0xff & data[index]) << 56 |
(long)(0xff & data[index+1]) << 48 |
(long)(0xff & data[index+2]) << 40 |
(long)(0xff & data[index+3]) << 32 |
(long)(0xff & data[index+4]) << 24 |
(long)(0xff & data[index+5]) << 16 |
(long)(0xff & data[index+6]) << 8 |
(long)(0xff & data[index+7]) << 0;
}
public static void setUUID(OteByteMessage msg, UUID id) {
msg.getHeader().UUID_HIGH.setValue(id.getMostSignificantBits());
msg.getHeader().UUID_LOW.setValue(id.getLeastSignificantBits());
}
public static OteByteMessage getOteByteMessage(Event event) {
Object obj = event.getProperty(BYTE_KEY);
if (obj != null && obj instanceof byte[]) {
return new OteByteMessage((byte[]) obj);
} else {
obj = event.getProperty(BYTE_KEY_2);
if (obj != null && obj instanceof byte[]) {
return new OteByteMessage((byte[]) obj);
}
}
return null;
}
public static byte[] getBytes(Event event) {
Object obj = event.getProperty(BYTE_KEY);
if (obj != null && obj instanceof byte[]) {
return (byte[]) obj;
} else {
obj = event.getProperty(BYTE_KEY_2);
if (obj != null && obj instanceof byte[]) {
return (byte[]) obj;
}
}
return null;
}
public static void putBytes(Event event, OteByteMessage signal) {
signal.getDefaultMessageData().getMem().setData(getBytes(event));
}
public static ServiceRegistration<EventHandler> subscribe(String topic, EventHandler handler){
Dictionary<String, String> props = new Hashtable<String, String>();
props.put("event.topics", topic);
return ServiceUtility.getContext().registerService(EventHandler.class, handler, props);
}
public static ServiceRegistration<EventHandler> subscribe(OteByteMessage signal, EventHandler eventHandler) {
BundleContext context = ServiceUtility.getContext();
if (context == null) {
return null;
}
Hashtable<String, Object> props = new Hashtable<String, Object>();
props.put("event.topics", signal.getHeader().TOPIC.getValue());
return context.registerService(EventHandler.class, eventHandler, props);
}
public static <T extends OteByteMessage> ServiceRegistration<EventHandler> subscribe(T signal, OteByteMessageListener<T> eventHandler) {
BundleContext context = ServiceUtility.getContext();
if (context == null) {
return null;
}
Hashtable<String, Object> props = new Hashtable<String, Object>();
props.put("event.topics", signal.getHeader().TOPIC.getValue());
return context.registerService(EventHandler.class, new EventHandlerForOteByteMessage<T>(signal, eventHandler), props);
}
private static class EventHandlerForOteByteMessage<T extends OteByteMessage> implements EventHandler {
private final T message;
private OteByteMessageListener<T> listener;
public EventHandlerForOteByteMessage(T message, OteByteMessageListener<T> listener){
this.message = message;
this.listener = listener;
}
@Override
public void handleEvent(Event arg0) {
try{
message.getActiveDataSource().getMem().setData(OteByteMessageUtil.getBytes(arg0));
listener.onDataAvailable(message);
} catch (Throwable th){
th.printStackTrace();
}
}
}
}