tmf: Consolidate constructors in coalesced requests
[deliverable/tracecompass.git] / org.eclipse.linuxtools.tmf.core / src / org / eclipse / linuxtools / internal / tmf / core / request / TmfCoalescedEventRequest.java
1 /*******************************************************************************
2 * Copyright (c) 2009, 2013 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 *******************************************************************************/
12
13 package org.eclipse.linuxtools.internal.tmf.core.request;
14
15 import org.eclipse.linuxtools.internal.tmf.core.TmfCoreTracer;
16 import org.eclipse.linuxtools.tmf.core.event.ITmfEvent;
17 import org.eclipse.linuxtools.tmf.core.request.ITmfDataRequest;
18 import org.eclipse.linuxtools.tmf.core.request.ITmfEventRequest;
19 import org.eclipse.linuxtools.tmf.core.request.TmfDataRequest;
20 import org.eclipse.linuxtools.tmf.core.timestamp.ITmfTimestamp;
21 import org.eclipse.linuxtools.tmf.core.timestamp.TmfTimeRange;
22
23 /**
24 * The TMF coalesced event request
25 *
26 * @version 1.0
27 * @author Francois Chouinard
28 */
29 public class TmfCoalescedEventRequest extends TmfCoalescedDataRequest implements ITmfEventRequest {
30
31 // ------------------------------------------------------------------------
32 // Attributes
33 // ------------------------------------------------------------------------
34
35 private TmfTimeRange fRange; // The requested events time range
36
37 // ------------------------------------------------------------------------
38 // Constructor
39 // ------------------------------------------------------------------------
40
41 /**
42 * Request 'n' events of a given type for the given time range (given
43 * priority). Events are returned in blocks of the given size.
44 *
45 * @param dataType
46 * The requested data type
47 * @param range
48 * The range of the request. You can use
49 * {@link TmfTimeRange#ETERNITY} to request all events.
50 * @param index
51 * The index of the first event to retrieve. Use '0' to start at
52 * the beginning.
53 * @param nbRequested
54 * The number of events requested. You can use
55 * {@link TmfDataRequest#ALL_DATA} to request all events.
56 * @param blockSize
57 * The number of events per block. You can use
58 * {@link TmfDataRequest#DEFAULT_BLOCK_SIZE} to use a default
59 * value.
60 * @param priority
61 * The requested execution priority
62 */
63 public TmfCoalescedEventRequest(Class<? extends ITmfEvent> dataType,
64 TmfTimeRange range,
65 long index,
66 int nbRequested,
67 int blockSize,
68 ExecutionType priority) {
69 super(ITmfEvent.class, index, nbRequested, blockSize, priority);
70 fRange = range;
71
72 if (TmfCoreTracer.isRequestTraced()) {
73 String type = getClass().getName();
74 type = type.substring(type.lastIndexOf('.') + 1);
75 @SuppressWarnings("nls")
76 String message = "CREATED "
77 + (getExecType() == ITmfDataRequest.ExecutionType.BACKGROUND ? "(BG)" : "(FG)")
78 + " Type=" + type + " Index=" + getIndex() + " NbReq=" + getNbRequested()
79 + " Range=" + getRange()
80 + " DataType=" + getDataType().getSimpleName();
81 TmfCoreTracer.traceRequest(this, message);
82 }
83 }
84
85 // ------------------------------------------------------------------------
86 // Management
87 // ------------------------------------------------------------------------
88
89 @Override
90 public void addRequest(ITmfDataRequest request) {
91 super.addRequest(request);
92 if (request instanceof ITmfEventRequest) {
93 merge((ITmfEventRequest) request);
94 }
95 }
96
97 @Override
98 public boolean isCompatible(ITmfDataRequest request) {
99 if (request instanceof ITmfEventRequest) {
100 if (super.isCompatible(request)) {
101 return overlaps((ITmfEventRequest) request);
102 }
103 }
104 return false;
105 }
106
107 private boolean overlaps(ITmfEventRequest request) {
108 ITmfTimestamp startTime = request.getRange().getStartTime();
109 ITmfTimestamp endTime = request.getRange().getEndTime();
110 return (startTime.compareTo(endTime) <= 0) && (fRange.getStartTime().compareTo(fRange.getEndTime()) <= 0);
111 }
112
113 private void merge(ITmfEventRequest request) {
114 ITmfTimestamp startTime = request.getRange().getStartTime();
115 ITmfTimestamp endTime = request.getRange().getEndTime();
116 if (!fRange.contains(startTime) && fRange.getStartTime().compareTo(startTime) > 0) {
117 fRange = new TmfTimeRange(startTime, fRange.getEndTime());
118 }
119 if (!fRange.contains(endTime) && fRange.getEndTime().compareTo(endTime) < 0) {
120 fRange = new TmfTimeRange(fRange.getStartTime(), endTime);
121 }
122 }
123
124 // ------------------------------------------------------------------------
125 // ITmfDataRequest
126 // ------------------------------------------------------------------------
127
128 @Override
129 public void handleData(ITmfEvent data) {
130 super.handleData(data);
131 long index = getIndex() + getNbRead() - 1;
132 for (ITmfDataRequest request : fRequests) {
133 if (data == null) {
134 request.handleData(null);
135 } else {
136 long start = request.getIndex();
137 long end = start + request.getNbRequested();
138 if (request instanceof ITmfEventRequest) {
139 ITmfEventRequest req = (ITmfEventRequest) request;
140 if (!req.isCompleted() && index >= start && index < end) {
141 ITmfTimestamp ts = data.getTimestamp();
142 if (req.getRange().contains(ts)) {
143 if (req.getDataType().isInstance(data)) {
144 req.handleData(data);
145 }
146 }
147 }
148 }
149 else {
150 TmfDataRequest req = (TmfDataRequest) request;
151 if (!req.isCompleted() && index >= start && index < end) {
152 if (req.getDataType().isInstance(data)) {
153 req.handleData(data);
154 }
155 }
156 }
157 }
158 }
159 }
160
161 // ------------------------------------------------------------------------
162 // ITmfEventRequest
163 // ------------------------------------------------------------------------
164
165 @Override
166 public TmfTimeRange getRange() {
167 return fRange;
168 }
169
170 @Override
171 public void setStartIndex(int index) {
172 setIndex(index);
173 }
174
175 // ------------------------------------------------------------------------
176 // Object
177 // ------------------------------------------------------------------------
178
179 @Override
180 // All requests have a unique id
181 public int hashCode() {
182 return super.hashCode();
183 }
184
185 @Override
186 public boolean equals(Object other) {
187 if (other instanceof TmfCoalescedEventRequest) {
188 TmfCoalescedEventRequest request = (TmfCoalescedEventRequest) other;
189 return (request.getDataType() == getDataType()) &&
190 (request.getIndex() == getIndex()) &&
191 (request.getNbRequested() == getNbRequested()) &&
192 (request.getRange().equals(getRange()));
193 }
194 if (other instanceof TmfCoalescedDataRequest) {
195 return super.equals(other);
196 }
197 return false;
198 }
199
200 @Override
201 @SuppressWarnings("nls")
202 public String toString() {
203 return "[TmfCoalescedEventRequest(" + getRequestId() + "," + getDataType().getSimpleName()
204 + "," + getRange() + "," + getIndex() + "," + getNbRequested() + "," + getBlockSize() + ")]";
205 }
206
207 }
This page took 0.036017 seconds and 5 git commands to generate.