/**
* 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.core.events;
import java.util.Set;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableSet;
import com.google.gson.Gson;
/**
* The {@link AbstractEventFactory} defines an abstract implementation of the {@link EventFactory} interface. Subclasses
* must implement the abstract method {@link #createEventByType(String, String, String, String)} in order to create
* event
* instances based on the event type.
*
* @author Stefan Bußweiler - Initial contribution
*/
public abstract class AbstractEventFactory implements EventFactory {
private final Set<String> supportedEventTypes;
private final static Gson jsonConverter = new Gson();
/**
* Must be called in subclass constructor to define the supported event types.
*
* @param supportedEventTypes the supported event types
*/
public AbstractEventFactory(Set<String> supportedEventTypes) {
this.supportedEventTypes = ImmutableSet.copyOf(supportedEventTypes);
}
@Override
public Event createEvent(String eventType, String topic, String payload, String source) throws Exception {
assertValidArguments(eventType, topic, payload);
if (!getSupportedEventTypes().contains(eventType)) {
throw new IllegalArgumentException("The event type '" + eventType + "' is not supported by this factory.");
} else {
return createEventByType(eventType, topic, payload, source);
}
}
@Override
public Set<String> getSupportedEventTypes() {
return supportedEventTypes;
}
private void assertValidArguments(String eventType, String topic, String payload) {
Preconditions.checkArgument(eventType != null && !eventType.isEmpty(),
"The argument 'eventType' must not be null or empty.");
Preconditions.checkArgument(topic != null && !topic.isEmpty(),
"The argument 'topic' must not be null or empty.");
Preconditions.checkArgument(payload != null && !payload.isEmpty(),
"The argument 'payload' must not be null or empty.");
}
/**
* Create a new event instance based on the event type.
*
* @param eventType the event type
* @param topic the topic
* @param payload the payload
* @param source the source, can be null
*
* @return the created event instance
*
* @throws Exception if the creation of the event fails
*/
protected abstract Event createEventByType(String eventType, String topic, String payload, String source)
throws Exception;
/**
* Serializes the payload object into its equivalent Json representation.
*
* @param payloadObject the payload object to serialize
*
* @return a serialized Json representation
*/
protected static String serializePayload(Object payloadObject) {
return jsonConverter.toJson(payloadObject);
}
/**
* Deserializes the Json-payload into an object of the specified class.
*
* @param payload the payload from which the object is to be deserialized
* @param classOfPayload the class T of the payload object
* @param <T> the type of the returned object
* @return an object of type T from the payload
*/
protected static <T> T deserializePayload(String payload, Class<T> classOfPayload) {
return jsonConverter.fromJson(payload, classOfPayload);
}
/**
* Gets the elements of the topic (splitted by '/').
*
* @param topic the topic
*
* @return the topic elements
*/
protected String[] getTopicElements(String topic) {
return topic.split("/");
}
}