Merge branch 'master' into lttng-kepler
[deliverable/tracecompass.git] / org.eclipse.linuxtools.tmf.core / src / org / eclipse / linuxtools / internal / tmf / core / trace / TmfExperimentContext.java
1 /*******************************************************************************
2 * Copyright (c) 2009, 2010, 2012 Ericsson
3 *
4 * All rights reserved. This program and the accompanying materials are
5 * made 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
8 *
9 * Contributors:
10 * Francois Chouinard - Initial API and implementation
11 * Francois Chouinard - Put in shape for 1.0
12 *******************************************************************************/
13
14 package org.eclipse.linuxtools.internal.tmf.core.trace;
15
16 import org.eclipse.linuxtools.tmf.core.event.ITmfEvent;
17 import org.eclipse.linuxtools.tmf.core.trace.ITmfContext;
18 import org.eclipse.linuxtools.tmf.core.trace.ITmfLocation;
19 import org.eclipse.linuxtools.tmf.core.trace.TmfContext;
20
21 /**
22 * The experiment context in TMF.
23 * <p>
24 * The experiment keeps track of the next event from each of its traces so it
25 * can pick the next one in chronological order.
26 * <p>
27 * This implies that the "next" event from each trace has already been
28 * read and that we at least know its timestamp. This doesn't imply that a
29 * full parse of the event content was performed (read: the legacy LTTng works
30 * like this...).
31 * <p>
32 * The last trace refers to the trace from which the last event was "consumed"
33 * at the experiment level.
34 */
35 public class TmfExperimentContext extends TmfContext {
36
37 // ------------------------------------------------------------------------
38 // Constants
39 // ------------------------------------------------------------------------
40
41 /**
42 * No last trace read indicator
43 */
44 public static final int NO_TRACE = -1;
45
46 // ------------------------------------------------------------------------
47 // Attributes
48 // ------------------------------------------------------------------------
49
50 private ITmfContext[] fContexts;
51 private ITmfEvent[] fEvents;
52 private int fLastTraceRead;
53
54 // ------------------------------------------------------------------------
55 // Constructors
56 // ------------------------------------------------------------------------
57
58 /**
59 * Standard constructor
60 *
61 * @param contexts
62 * The matching context for each trace in the experiment
63 */
64 public TmfExperimentContext(final ITmfContext[] contexts) {
65 super();
66 fContexts = contexts;
67 fEvents = new ITmfEvent[fContexts.length];
68 final ITmfLocation[] locations = new ITmfLocation[fContexts.length];
69
70 setLocation(new TmfExperimentLocation(new TmfLocationArray(locations.clone())));
71
72 final long[] ranks = new long[fContexts.length];
73 long rank = 0;
74 for (int i = 0; i < fContexts.length; i++) {
75 if (contexts[i] != null) {
76 locations[i] = contexts[i].getLocation();
77 ranks[i] = contexts[i].getRank();
78 rank += contexts[i].getRank();
79 }
80 }
81
82 // setLocation(new TmfExperimentLocation(new TmfLocationArray(locations)));
83 setRank(rank);
84 fLastTraceRead = NO_TRACE;
85 }
86
87 /**
88 * Copy constructor
89 *
90 * @param other
91 * The experiment context to copy
92 */
93 public TmfExperimentContext(final TmfExperimentContext other) {
94 this(other.cloneContexts());
95 fEvents = other.fEvents;
96 if (other.getLocation() != null) {
97 setLocation(other.getLocation());
98 }
99 setRank(other.getRank());
100 setLastTrace(other.fLastTraceRead);
101 }
102
103 /* (non-Javadoc)
104 * @see org.eclipse.linuxtools.tmf.core.trace.TmfContext#dispose()
105 */
106 @Override
107 public void dispose() {
108 for (ITmfContext context : fContexts) {
109 context.dispose();
110 }
111 super.dispose();
112 }
113
114 /* (non-Javadoc)
115 * @see org.eclipse.linuxtools.tmf.core.trace.TmfContext#clone()
116 */
117 @Override
118 public TmfExperimentContext clone() {
119 TmfExperimentContext clone = null;
120 clone = (TmfExperimentContext) super.clone();
121 clone.fContexts = cloneContexts();
122 clone.fEvents = cloneEvents();
123 clone.fLastTraceRead = fLastTraceRead;
124 return clone;
125 }
126
127 private ITmfContext[] cloneContexts() {
128 final ITmfContext[] contexts = new ITmfContext[fContexts.length];
129 for (int i = 0; i < fContexts.length; i++) {
130 contexts[i] = (fContexts[i] != null) ? fContexts[i].clone() : null;
131 }
132 return contexts;
133 }
134
135 private ITmfEvent[] cloneEvents() {
136 final ITmfEvent[] events = new ITmfEvent[fEvents.length];
137 for (int i = 0; i < fEvents.length; i++) {
138 events[i] = (fEvents[i] != null) ? fEvents[i].clone() : null;
139 }
140 return events;
141 }
142
143 // ------------------------------------------------------------------------
144 // Accessors
145 // ------------------------------------------------------------------------
146
147 /**
148 * Get the trace contexts composing this experiment context.
149 *
150 * @return The array of trace contexts
151 */
152 public ITmfContext[] getContexts() {
153 return fContexts;
154 }
155
156 /**
157 * Get the trace events located at this experiment context's location.
158 *
159 * @return The array of trace events
160 */
161 public ITmfEvent[] getEvents() {
162 return fEvents;
163 }
164
165 /**
166 * Get the index of the trace that was last read (so the trace whose
167 * current context will match this experiment's).
168 *
169 * @return The index of the trace
170 */
171 public int getLastTrace() {
172 return fLastTraceRead;
173 }
174
175 /**
176 * Set the last trace read index
177 *
178 * @param newIndex
179 * The new value to assign
180 */
181 public void setLastTrace(final int newIndex) {
182 fLastTraceRead = newIndex;
183 }
184
185 // ------------------------------------------------------------------------
186 // Object
187 // ------------------------------------------------------------------------
188
189 @Override
190 public int hashCode() {
191 int result = 17;
192 for (int i = 0; i < fContexts.length; i++) {
193 result = 37 * result + fContexts[i].hashCode();
194 }
195 return result;
196 }
197
198 @Override
199 public boolean equals(final Object other) {
200 if (this == other) {
201 return true;
202 }
203 if (!super.equals(other)) {
204 return false;
205 }
206 if (!(other instanceof TmfExperimentContext)) {
207 return false;
208 }
209 final TmfExperimentContext o = (TmfExperimentContext) other;
210 boolean isEqual = true;
211 int i = 0;
212 while (isEqual && (i < fContexts.length)) {
213 isEqual &= fContexts[i].equals(o.fContexts[i]);
214 i++;
215 }
216 return isEqual;
217 }
218
219 @Override
220 @SuppressWarnings("nls")
221 public String toString() {
222 StringBuilder sb = new StringBuilder("TmfExperimentContext [\n");
223 sb.append("\tfLocation=" + getLocation() + ", fRank=" + getRank() + "\n");
224 sb.append("\tfContexts=[");
225 for (int i = 0; i < fContexts.length; i++) {
226 sb.append("(" + fContexts[i].getLocation() + "," + fContexts[i].getRank() + ((i < fContexts.length - 1) ? ")," : ")]\n"));
227 }
228 sb.append("\tfEvents=[");
229 for (int i = 0; i < fEvents.length; i++) {
230 ITmfEvent event = fEvents[i];
231 sb.append(((event != null) ? fEvents[i].getTimestamp() : "(null)") + ((i < fEvents.length - 1) ? "," : "]\n"));
232 }
233 sb.append("\tfLastTraceRead=" + fLastTraceRead + "\n");
234 sb.append("]");
235 return sb.toString();
236 }
237
238 }
This page took 0.036672 seconds and 5 git commands to generate.