/**************************************************************************** * Copyright (c) 2004, 2009 Composent, Inc. 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 * * Contributors: * Composent, Inc. - initial API and implementation *****************************************************************************/ package org.eclipse.ecf.remoteservice.eventadmin; import java.io.NotSerializableException; import java.io.Serializable; import java.util.Hashtable; import java.util.Iterator; import java.util.Map; import java.util.Set; import org.eclipse.ecf.internal.remoteservice.eventadmin.DefaultSerializationHandler; import org.eclipse.ecf.remoteservice.eventadmin.serialization.SerializationHandler; import org.osgi.service.event.Event; /** * @since 1.1 */ public class EventMessage implements Serializable { private static final long serialVersionUID = 2743430591605178391L; private String topic; private Map properties; private transient SerializationHandler sh = new DefaultSerializationHandler(); private transient Event localEvent; public EventMessage(Event event) throws NotSerializableException { this.topic = event.getTopic(); this.properties = createPropertiesFromEvent(event); } /** * @param event event * @param serializationHandler serialization handler * @throws NotSerializableException if event can't be serialized * @since 1.2 */ public EventMessage(Event event, SerializationHandler serializationHandler) throws NotSerializableException { this.sh = serializationHandler; this.topic = event.getTopic(); this.properties = createPropertiesFromEvent(event); } public EventMessage(String topic, Map properties) { this.topic = topic; this.properties = properties; } protected Map createPropertiesFromEvent(Event event) throws NotSerializableException { String[] propertyNames = event.getPropertyNames(); Hashtable ht = (propertyNames == null) ? new Hashtable(1) : new Hashtable(propertyNames.length); for (int i = 0; i < propertyNames.length; i++) { Object val = event.getProperty(propertyNames[i]); ht.put(propertyNames[i], sh.serialize(val)); } return ht; } protected String getTopic() { return topic; } protected Map getProperties() { final Set keySet = properties.keySet(); for (final Iterator itr = keySet.iterator(); itr.hasNext();) { final Object key = (Object) itr.next(); final Object val = properties.get(key); properties.put(key, sh.deserialize(val)); } return properties; } protected Event createLocalEvent() { return new Event(getTopic(), getProperties()); } public synchronized Event getEvent() { if (localEvent == null) { localEvent = createLocalEvent(); } return localEvent; } public String toString() { StringBuffer buffer = new StringBuffer(); buffer.append("EventMessage[topic="); buffer.append(topic); buffer.append(", properties="); buffer.append(properties); buffer.append("]"); return buffer.toString(); } /** * @param serializationHandler serialization handler * @since 1.2 */ public void setSerializationHandler( SerializationHandler serializationHandler) { this.sh = serializationHandler; } }