// Copyright 2012 Georg-August-Universität Göttingen, Germany // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package de.ugoe.cs.autoquest.eventcore; import java.io.Serializable; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; /** *

* Base class for all events. An event is described by its {@link #type} and its {@link #target}. * An event may be provided with a timestamp and further parameters. *

* * @author Steffen Herbold * @version 1.0 * */ public final class Event implements Serializable { /** *

* Id for object serialization. *

*/ private static final long serialVersionUID = 1L; /** *

* Global start event that can be used to indicate the start of a sequence. *

*/ public static final Event STARTEVENT = new Event(new StringEventType("START")); /** *

* Global end event that can be used to indicate the end of a sequence. */ public static final Event ENDEVENT = new Event(new StringEventType("END")); /** *

* Type of the event. *

*/ private IEventType type; /** *

* Target of the event. *

*/ private IEventTarget target = null; /** *

* Timestamp of when the event took place. *

*/ private long timestamp = Long.MIN_VALUE; /** *

* Map with further parameters of the event, which are not belonging to the type or target. *

*/ private Map parameters; /** *

* List of {@link IReplayable}s of type T that describes the replay of an event. The * {@link IReplayable}s can be interpreted as sub-events on the platform level that * make up the abstract event. *

*/ private List replay; /** *

* Constructor. Creates a new Event with a given type. The type must not be null. *

* * @param type * type of the event */ public Event(IEventType type) { if (type == null) { throw new IllegalArgumentException("Event type must not be null"); } this.type = type; } /** *

* Constructor. Creates a new Event with a given type and target. The type must not be null. *

* * @param type * type of the event * @param target * target of the event */ public Event(IEventType type, IEventTarget target) { this(type); this.target = target; } /** *

* Two events are equal, if their {@link #type} and {@link #target} are equal. The timestamp * and other parameters are ignored. *

*

* See {@link Object#equals(Object)} for further information. *

* * @param other * Event that is compared to this * @return true, if events are equal, false otherwise */ @Override public boolean equals(Object other) { if (this == other) { return true; } if (other instanceof Event) { Event otherEvent = (Event) other; if (target != null) { return type.equals(otherEvent.type) && target.equals(otherEvent.target); } else { return type.equals(otherEvent.type) && otherEvent.target == null; } } return false; } /** *

* Returns {@link #getId()} as String representation of the event. *

* * @return String representation of the event */ @Override public String toString() { return getId(); } /** *

* Returns the {@link #target} of the event. *

* * @return {@link #target} of the event */ public IEventTarget getTarget() { return target; } /** *

* Returns the {@link #type} of the event. *

* * @return {@link #type} of the event */ public IEventType getType() { return type; } /** *

* Returns the combination of {@link #type} and {@link #target} as id. *

* * @return string of the form (type,target) */ public String getId() { String id = type.toString(); if( target!=null ) { id += "." + target.getStringIdentifier(); } return id; } /* * (non-Javadoc) * * @see java.lang.Object#hashCode() */ @Override public int hashCode() { int multiplier = 17; int hash = 42; if (type != null) { hash = multiplier * hash + type.hashCode(); } if (target != null) { hash = multiplier * hash + target.hashCode(); } return hash; } /** *

* Sets the target of the event. Once set, the target cannot be changed. *

* * @param target * target of the event * @return true, if target was changed, false otherwise */ public boolean setTarget(IEventTarget target) { if (this.target != null) { return false; } this.target = target; return true; } /** *

* Adds a new {@link IReplayable} of type T to the replay sequence. *

* * @param replayable * element that is added to the sequence * @throws IllegalArgumentException * thrown is replayable is null */ public void addReplayable(IReplayable replayable) { if (replayable == null) { throw new IllegalArgumentException("replayble must not be null"); } if (replay == null) { replay = new LinkedList(); } replay.add(replayable); } /** *

* Adds a {@link List} of {@link IReplayable} to the replay sequence. *

* * @param generatedReplaySeq * {@link List} that is added to the sequence * @throws IllegalArgumentException * thrown if generatedReplaySeq is null */ public void addReplayableSequence(List generatedReplaySeq) { if (generatedReplaySeq == null) { throw new IllegalArgumentException("generatedReplaySeq must not be null"); } if (replay == null) { replay = new LinkedList(); } replay.addAll(generatedReplaySeq); } /** *

* Adds a parameter to the event or sets it to a new value. The key must not be null. If a * parameter with the specified key already exists, its value is replaced with the new one. * If the value is null, the parameter with the specified key is removed, if it exists. *

* * @param key the key of the parameter * @param value the value of the parameter * * @throws IllegalArgumentException * if the provided key is null */ public void setParameter(String key, String value) { if (key == null) { throw new IllegalArgumentException("key must not be null"); } if (parameters == null) { parameters = new HashMap(); } if (value == null) { parameters.remove(key); } else { parameters.put(key, value); } } /** *

* Returns the event parameter with the specified key if it exists or null if not. The key * must not be null. *

* * @param key the key of the parameter to be returned * * @return the value of the parameter with the specified key or null if there is no parameter * with that key * * @throws IllegalArgumentException * if the provided key is null */ public String getParameter(String key) { if (key == null) { throw new IllegalArgumentException("key must not be null"); } if (parameters != null) { return parameters.get(key); } else { return null; } } /** *

* Sets the timestamp of the event, i.e. when the event occurred. A timestamp for events is * optional. Therefore it is also ignored by the {@link #equals(Object)}-method. A timestamp * with a value smaller 0 means, that now timestamp for the event exists. *

* * @param timestamp the new value for the timestamp */ public void setTimestamp(long timestamp) { this.timestamp = timestamp; } /** *

* Returns the timestamp of the event or a value lower than 0 if no timestamp for the event * exists. *

* * @return the timestamp of the event or a value lower than 0 if no timestamp exists */ public long getTimestamp() { return timestamp; } /** *

* Returns a the list of replay events. *

*

* The return value is a copy of the list used internally! *

* * @return list of replay events. */ public List getReplayables() { if (replay != null) { return new LinkedList(replay); } else { return new LinkedList(); } } }