1 /*******************************************************************************
2 * Copyright (c) 2012 Ericsson
4 * All rights reserved. This program and the accompanying materials are made
5 * available under the terms of the Eclipse Public License v1.0 which
6 * accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
9 * Contributors: Matthew Khouzam - Initial API and implementation
10 *******************************************************************************/
11 package org
.eclipse
.linuxtools
.tmf
.core
.ctfadaptor
;
13 import org
.eclipse
.linuxtools
.ctf
.core
.trace
.CTFTraceReader
;
14 import org
.eclipse
.linuxtools
.ctf
.core
.trace
.StreamInputReader
;
15 import org
.eclipse
.linuxtools
.tmf
.core
.trace
.ITmfContext
;
16 import org
.eclipse
.linuxtools
.tmf
.core
.trace
.ITmfLocation
;
19 * The CTF trace reader iterator.
21 * It doesn't reserve a file handle, so many iterators can be used without worries
22 * of I/O errors or resource exhaustion.
25 * @author Matthew Khouzam
27 public class CtfIterator
extends CTFTraceReader
implements ITmfContext
,
28 Comparable
<CtfIterator
>, Cloneable
{
30 private final CtfTmfTrace ctfTmfTrace
;
35 final public static CtfLocation NULL_LOCATION
= new CtfLocation(CtfLocation
.INVALID_LOCATION
);
37 private CtfLocation curLocation
;
41 * Create a new CTF trace iterator, which initially points at the first
45 * the trace to iterate over
47 public CtfIterator(final CtfTmfTrace trace
) {
48 super(trace
.getCTFTrace());
49 this.ctfTmfTrace
= trace
;
50 if (this.hasMoreEvents()) {
51 this.curLocation
= new CtfLocation(trace
.getStartTime());
58 private void setUnknownLocation() {
59 this.curLocation
= NULL_LOCATION
;
60 this.curRank
= UNKNOWN_RANK
;
64 * Constructor for CtfIterator.
67 * CtfTmfTrace the trace
68 * @param ctfLocationData
69 * long the timestamp in ns of the trace for positioning
71 * long the index of the trace for positioning
74 public CtfIterator(final CtfTmfTrace trace
,
75 final CtfLocationData ctfLocationData
, final long rank
) {
76 super(trace
.getCTFTrace());
78 this.ctfTmfTrace
= trace
;
79 if (this.hasMoreEvents()) {
80 this.curLocation
= new CtfLocation(ctfLocationData
);
81 if (this.getCurrentEvent().getTimestampValue() != ctfLocationData
.getTimestamp()) {
82 this.seek(ctfLocationData
);
92 * Method getCtfTmfTrace. gets a CtfTmfTrace
95 public CtfTmfTrace
getCtfTmfTrace() {
100 * Method getCurrentEvent. gets the current event
101 * @return CtfTmfEvent
103 public CtfTmfEvent
getCurrentEvent() {
104 final StreamInputReader top
= super.prio
.peek();
106 return new CtfTmfEvent(top
.getCurrentEvent(), top
.getFilename(),
113 * Seek this iterator to a given location.
115 * @param ctfLocationData
116 * The LocationData representing the position to seek to
120 public boolean seek(final CtfLocationData ctfLocationData
) {
123 /* Adjust the timestamp depending on the trace's offset */
124 long currTimestamp
= ctfLocationData
.getTimestamp();
125 final long offsetTimestamp
= currTimestamp
- this.getTrace().getOffset();
126 if (offsetTimestamp
< 0) {
127 ret
= super.seek(0L);
129 ret
= super.seek(offsetTimestamp
);
133 * Check if there is already one or more events for that timestamp, and
134 * assign the location index correctly
136 currTimestamp
= this.getCurrentEvent().getTimestampValue();
138 for (long i
= 0; i
< ctfLocationData
.getIndex(); i
++) {
139 if (currTimestamp
== this.getCurrentEvent().getTimestampValue()) {
147 /* Seek the current location accordingly */
149 curLocation
.setLocation(new CtfLocationData(getCurrentEvent().getTimestampValue(), index
));
151 curLocation
= NULL_LOCATION
;
159 * @see org.eclipse.linuxtools.tmf.core.trace.ITmfContext#getRank()
162 public long getRank() {
169 * @see org.eclipse.linuxtools.tmf.core.trace.ITmfContext#setRank(long)
172 public void setRank(final long rank
) {
179 * @see org.eclipse.linuxtools.tmf.core.trace.TmfContext#clone()
182 public CtfIterator
clone() {
183 CtfIterator clone
= null;
184 clone
= new CtfIterator(ctfTmfTrace
, this.getLocation().getLocation(), curRank
);
190 * @see org.eclipse.linuxtools.tmf.core.trace.ITmfContext#dispose()
193 public void dispose() {
194 // FIXME add dispose() stuff to CTFTrace and call it here...
199 * Method setLocation.
200 * @param location ITmfLocation<?>
203 public void setLocation(final ITmfLocation
<?
> location
) {
204 // FIXME alex: isn't there a cleaner way than a cast here?
205 this.curLocation
= (CtfLocation
) location
;
206 seek(((CtfLocation
) location
).getLocation());
210 * Method getLocation.
211 * @return CtfLocation
212 * @see org.eclipse.linuxtools.tmf.core.trace.ITmfContext#getLocation()
215 public CtfLocation
getLocation() {
220 * Method increaseRank.
221 * @see org.eclipse.linuxtools.tmf.core.trace.ITmfContext#increaseRank()
224 public void increaseRank() {
225 /* Only increase the rank if it's valid */
232 * Method hasValidRank, if the iterator is valid
234 * @see org.eclipse.linuxtools.tmf.core.trace.ITmfContext#hasValidRank()
237 public boolean hasValidRank() {
238 return (getRank() >= 0);
242 * Method advance go to the next event
243 * @return boolean successful or not
246 public boolean advance() {
247 long index
= curLocation
.getLocation().getIndex();
248 long timestamp
= curLocation
.getLocation().getTimestamp();
249 boolean ret
= super.advance();
252 final long timestampValue
= getCurrentEvent().getTimestampValue();
253 if (timestamp
== timestampValue
) {
254 curLocation
.setLocation(timestampValue
, index
+ 1);
256 curLocation
.setLocation(timestampValue
, 0L);
259 curLocation
= NULL_LOCATION
;
266 * @param o CtfIterator
267 * @return int -1, 0, 1
270 public int compareTo(final CtfIterator o
) {
271 if (this.getRank() < o
.getRank()) {
273 } else if (this.getRank() > o
.getRank()) {
280 * @see java.lang.Object#hashCode()
283 public int hashCode() {
284 final int prime
= 31;
285 int result
= super.hashCode();
286 result
= (prime
* result
)
287 + ((ctfTmfTrace
== null) ?
0 : ctfTmfTrace
.hashCode());
288 result
= (prime
* result
)
289 + ((curLocation
== null) ?
0 : curLocation
.hashCode());
290 result
= (prime
* result
) + (int) (curRank ^
(curRank
>>> 32));
295 * @see java.lang.Object#equals(java.lang.Object)
298 public boolean equals(Object obj
) {
302 if (!super.equals(obj
)) {
305 if (!(obj
instanceof CtfIterator
)) {
308 CtfIterator other
= (CtfIterator
) obj
;
309 if (ctfTmfTrace
== null) {
310 if (other
.ctfTmfTrace
!= null) {
313 } else if (!ctfTmfTrace
.equals(other
.ctfTmfTrace
)) {
316 if (curLocation
== null) {
317 if (other
.curLocation
!= null) {
320 } else if (!curLocation
.equals(other
.curLocation
)) {
323 if (curRank
!= other
.curRank
) {