1 /*******************************************************************************
2 * Copyright (c) 2009, 2013 Ericsson
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
10 * Francois Chouinard - Initial API and implementation
11 *******************************************************************************/
13 package org
.eclipse
.linuxtools
.internal
.tmf
.core
.request
;
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
;
24 * The TMF coalesced event request
27 * @author Francois Chouinard
29 public class TmfCoalescedEventRequest
extends TmfCoalescedDataRequest
implements ITmfEventRequest
{
31 // ------------------------------------------------------------------------
33 // ------------------------------------------------------------------------
35 private TmfTimeRange fRange
; // The requested events time range
37 // ------------------------------------------------------------------------
39 // ------------------------------------------------------------------------
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.
46 * The requested data type
48 * The range of the request. You can use
49 * {@link TmfTimeRange#ETERNITY} to request all events.
51 * The index of the first event to retrieve. Use '0' to start at
54 * The number of events requested. You can use
55 * {@link TmfDataRequest#ALL_DATA} to request all events.
57 * The number of events per block. You can use
58 * {@link TmfDataRequest#DEFAULT_BLOCK_SIZE} to use a default
61 * The requested execution priority
63 public TmfCoalescedEventRequest(Class
<?
extends ITmfEvent
> dataType
,
68 ExecutionType priority
) {
69 super(ITmfEvent
.class, index
, nbRequested
, blockSize
, priority
);
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
);
85 // ------------------------------------------------------------------------
87 // ------------------------------------------------------------------------
90 public void addRequest(ITmfDataRequest request
) {
91 super.addRequest(request
);
92 if (request
instanceof ITmfEventRequest
) {
93 merge((ITmfEventRequest
) request
);
98 public boolean isCompatible(ITmfDataRequest request
) {
99 if (request
instanceof ITmfEventRequest
) {
100 if (super.isCompatible(request
)) {
101 return overlaps((ITmfEventRequest
) request
);
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);
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());
119 if (!fRange
.contains(endTime
) && fRange
.getEndTime().compareTo(endTime
) < 0) {
120 fRange
= new TmfTimeRange(fRange
.getStartTime(), endTime
);
124 // ------------------------------------------------------------------------
126 // ------------------------------------------------------------------------
129 public void handleData(ITmfEvent data
) {
130 super.handleData(data
);
131 long index
= getIndex() + getNbRead() - 1;
132 for (ITmfDataRequest request
: fRequests
) {
134 request
.handleData(null);
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
);
150 TmfDataRequest req
= (TmfDataRequest
) request
;
151 if (!req
.isCompleted() && index
>= start
&& index
< end
) {
152 if (req
.getDataType().isInstance(data
)) {
153 req
.handleData(data
);
161 // ------------------------------------------------------------------------
163 // ------------------------------------------------------------------------
166 public TmfTimeRange
getRange() {
171 public void setStartIndex(int index
) {
175 // ------------------------------------------------------------------------
177 // ------------------------------------------------------------------------
180 // All requests have a unique id
181 public int hashCode() {
182 return super.hashCode();
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()));
194 if (other
instanceof TmfCoalescedDataRequest
) {
195 return super.equals(other
);
201 @SuppressWarnings("nls")
202 public String
toString() {
203 return "[TmfCoalescedEventRequest(" + getRequestId() + "," + getDataType().getSimpleName()
204 + "," + getRange() + "," + getIndex() + "," + getNbRequested() + "," + getBlockSize() + ")]";