source: trunk/autoquest-core-events/src/main/java/de/ugoe/cs/autoquest/eventcore/Event.java @ 927

Last change on this file since 927 was 927, checked in by sherbold, 12 years ago
  • added copyright under the Apache License, Version 2.0
File size: 7.1 KB
Line 
1//   Copyright 2012 Georg-August-Universität Göttingen, Germany
2//
3//   Licensed under the Apache License, Version 2.0 (the "License");
4//   you may not use this file except in compliance with the License.
5//   You may obtain a copy of the License at
6//
7//       http://www.apache.org/licenses/LICENSE-2.0
8//
9//   Unless required by applicable law or agreed to in writing, software
10//   distributed under the License is distributed on an "AS IS" BASIS,
11//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12//   See the License for the specific language governing permissions and
13//   limitations under the License.
14
15package de.ugoe.cs.autoquest.eventcore;
16
17import java.io.Serializable;
18import java.util.LinkedList;
19import java.util.List;
20
21/**
22 * <p>
23 * Base class for all events. An event is described by its {@link #type} and its {@link #target}.
24 * </p>
25 *
26 * @author Steffen Herbold
27 * @version 1.0
28 *
29 * @param <T>
30 *            Can be used to declare that events belong to a specific platform without subclassing.
31 */
32public class Event implements Serializable {
33
34    /**
35     * <p>
36     * Id for object serialization.
37     * </p>
38     */
39    private static final long serialVersionUID = 1L;
40
41    /**
42     * <p>
43     * Global start event that can be used to indicate the start of a sequence.
44     * </p>
45     */
46    public static final Event STARTEVENT = new Event(new StringEventType("START"));
47
48    /**
49     * <p>
50     * Global end event that can be used to indicate the end of a sequence.
51     */
52    public static final Event ENDEVENT = new Event(new StringEventType("END"));
53
54    /**
55     * <p>
56     * Type of the event.
57     * </p>
58     */
59    protected IEventType type;
60
61    /**
62     * </p> Target of the event.
63     */
64    protected IEventTarget target = null;
65
66    /**
67     * <p>
68     * List of {@link IReplayable}s of type T that describes the replay of an event. The
69     * {@link IReplayable}s can be interpreted as <it>sub-events</it> on the platform level that
70     * make up the abstract event.
71     * </p>
72     */
73    protected List<IReplayable> replay = new LinkedList<IReplayable>();
74
75    /**
76     * <p>
77     * Constructor. Creates a new Event with a given type. The type must not be null.
78     * </p>
79     *
80     * @param type
81     *            type of the event
82     */
83    public Event(IEventType type) {
84        if (type == null) {
85            throw new IllegalArgumentException("Event type must not be null");
86        }
87        this.type = type;
88    }
89
90    /**
91     * <p>
92     * Constructor. Creates a new Event with a given type and target. The type must not be null.
93     * </p>
94     *
95     * @param type
96     *            type of the event
97     * @param target
98     *            target of the event
99     */
100    public Event(IEventType type, IEventTarget target) {
101        this(type);
102        this.target = target;
103    }
104
105    /**
106     * <p>
107     * Two events are equal, if their {@link #type} and {@link #target} are equal.
108     * </p>
109     * <p>
110     * See {@link Object#equals(Object)} for further information.
111     * </p>
112     *
113     * @param other
114     *            Event that is compared to this
115     * @return true, if events are equal, false otherwise
116     */
117    @Override
118    public boolean equals(Object other) {
119        if (this == other) {
120            return true;
121        }
122        if (other instanceof Event) {
123            Event otherEvent = (Event) other;
124            if (target != null) {
125                return type.equals(otherEvent.type) && target.equals(otherEvent.target);
126            }
127            else {
128                return type.equals(otherEvent.type) && otherEvent.target == null;
129            }
130        }
131        return false;
132    }
133
134    /**
135     * <p>
136     * Returns {@link #getId()} as String representation of the event.
137     * </p>
138     *
139     * @return String representation of the event
140     */
141    @Override
142    public String toString() {
143        return getId();
144    }
145
146    /**
147     * <p>
148     * Returns the {@link #target} of the event.
149     * </p>
150     *
151     * @return {@link #target} of the event
152     */
153    public IEventTarget getTarget() {
154        return target;
155    }
156
157    /**
158     * <p>
159     * Returns the {@link #type} of the event.
160     * </p>
161     *
162     * @return {@link #type} of the event
163     */
164    public IEventType getType() {
165        return type;
166    }
167   
168    /**
169     * <p>
170     * Returns the combination of {@link #type} and {@link #target} as id.
171     * </p>
172     *
173     * @return string of the form (type,target)
174     */
175    public String getId() {
176        String id = type.toString();
177        if( target!=null ) {
178            id += "." + target.getStringIdentifier();
179        }
180        return id;
181    }
182
183    /*
184     * (non-Javadoc)
185     *
186     * @see java.lang.Object#hashCode()
187     */
188    @Override
189    public int hashCode() {
190        int multiplier = 17;
191        int hash = 42;
192        if (type != null) {
193            hash = multiplier * hash + type.hashCode();
194        }
195        if (target != null) {
196            hash = multiplier * hash + target.hashCode();
197        }
198        return hash;
199    }
200
201    /**
202     * <p>
203     * Sets the target of the event. Once set, the target cannot be changed.
204     * </p>
205     *
206     * @param target
207     *            target of the event
208     * @return true, if target was changed, false otherwise
209     */
210    public boolean setTarget(IEventTarget target) {
211        if (this.target != null) {
212            return false;
213        }
214        this.target = target;
215        return true;
216    }
217
218    /**
219     * <p>
220     * Adds a new {@link IReplayable} of type T to the replay sequence.
221     * </p>
222     *
223     * @param replayable
224     *            element that is added to the sequence
225     * @throws IllegalArgumentException
226     *             thrown is replayable is null
227     */
228    public void addReplayable(IReplayable replayable) {
229        if (replayable == null) {
230            throw new IllegalArgumentException("replayble must not be null");
231        }
232        replay.add(replayable);
233    }
234
235    /**
236     * <p>
237     * Adds a {@link List}ist of {@link IReplayable} to the replay sequence.
238     * </p>
239     *
240     * @param generatedReplaySeq
241     *            {@link List} that is added to the sequence
242     * @throws IllegalArgumentException
243     *             thrown if generatedReplaySeq is null
244     */
245    public void addReplayableSequence(List<? extends IReplayable> generatedReplaySeq) {
246        if (generatedReplaySeq == null) {
247            throw new IllegalArgumentException("generatedReplaySeq must not be null");
248        }
249        replay.addAll(generatedReplaySeq);
250    }
251
252    /**
253     * <p>
254     * Returns a the list of replay events.
255     * </p>
256     * <p>
257     * The return value is a copy of the list used internally!
258     * </p>
259     *
260     * @return list of replay events.
261     */
262    public List<IReplayable> getReplayables() {
263        return new LinkedList<IReplayable>(replay);
264    }
265}
Note: See TracBrowser for help on using the repository browser.