// 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.LinkedList; import java.util.List; /** *
* Base class for all events. An event is described by its {@link #type} and its {@link #target}. *
* * @author Steffen Herbold * @version 1.0 * * @param* 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. *
*/ protected IEventType type; /** * Target of the event. */ protected IEventTarget target = null; /** *
* List of {@link IReplayable}s of type T that describes the replay of an event. The
* {@link IReplayable}s can be interpreted as
* 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. *
** 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"); } replay.add(replayable); } /** ** Adds a {@link List}ist 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 extends IReplayable> generatedReplaySeq) { if (generatedReplaySeq == null) { throw new IllegalArgumentException("generatedReplaySeq must not be null"); } replay.addAll(generatedReplaySeq); } /** ** 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