import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Map.Entry;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.tracecompass.internal.tmf.analysis.xml.core.Activator;
+import org.eclipse.tracecompass.internal.tmf.analysis.xml.core.pattern.stateprovider.XmlPatternStateProvider;
import org.eclipse.tracecompass.statesystem.core.exceptions.AttributeNotFoundException;
import org.eclipse.tracecompass.statesystem.core.exceptions.StateValueTypeException;
import org.eclipse.tracecompass.statesystem.core.statevalue.ITmfStateValue;
* Start time of the pattern segment to generate
* @param end
* End time of the pattern segment to generate
+ * @param scenarioInfo
+ * The active scenario details. Or <code>null</code> if there is
+ * no scenario.
* @return The pattern segment generated
*/
- public TmfXmlPatternSegment generatePatternSegment(ITmfEvent event, ITmfTimestamp start, ITmfTimestamp end) {
+ public TmfXmlPatternSegment generatePatternSegment(ITmfEvent event, ITmfTimestamp start, ITmfTimestamp end, @Nullable TmfXmlScenarioInfo scenarioInfo) {
int scale = event.getTimestamp().getScale();
- long startValue = start.normalize(0, ITmfTimestamp.NANOSECOND_SCALE).getValue();
- long endValue = end.normalize(0, ITmfTimestamp.NANOSECOND_SCALE).getValue();
- String segmentName = getPatternSegmentName(event);
+ long startValue = start.toNanos();
+ long endValue = end.toNanos();
+ String segmentName = getPatternSegmentName(event, scenarioInfo);
Map<String, ITmfStateValue> fields = new HashMap<>();
- setPatternSegmentContent(event, start, end, fields);
- return new TmfXmlPatternSegment(startValue, endValue, scale, segmentName, fields);
+ setPatternSegmentContent(event, start, end, fields, scenarioInfo);
+ TmfXmlPatternSegment segment = new TmfXmlPatternSegment(startValue, endValue, scale, segmentName, fields);
+ if (fContainer instanceof XmlPatternStateProvider) {
+ ((XmlPatternStateProvider) fContainer).getListener().onNewSegment(segment);
+ }
+ return segment;
}
/**
*
* @param event
* The active event
+ * @param scenarioInfo
+ * The active scenario details. Or <code>null</code> if there is
+ * no scenario.
* @return The name of the segment
*/
- private String getPatternSegmentName(ITmfEvent event) {
- return fSegmentType.getName(event);
+ private String getPatternSegmentName(ITmfEvent event, @Nullable TmfXmlScenarioInfo scenarioInfo) {
+ return fSegmentType.getName(event, scenarioInfo);
}
/**
* The end timestamp of this segment
* @param fields
* The map that will contained all the fields
+ * @param scenarioInfo
+ * The active scenario details. Or <code>null</code> if there is
+ * no scenario.
*/
- private void setPatternSegmentContent(ITmfEvent event, ITmfTimestamp start, ITmfTimestamp end, Map<String, ITmfStateValue> fields) {
+ private void setPatternSegmentContent(ITmfEvent event, ITmfTimestamp start, ITmfTimestamp end, Map<String, ITmfStateValue> fields, @Nullable TmfXmlScenarioInfo scenarioInfo) {
for (TmfXmlPatternSegmentField field : fFields) {
- fields.put(field.getName(), field.getValue(event));
+ fields.put(field.getName(), field.getValue(event, scenarioInfo));
+ }
+ if (scenarioInfo != null) {
+ addStoredFieldsContent(event, fields, scenarioInfo);
+ }
+ }
+
+ /**
+ * Query the stored fields path and add them to the content of the pattern
+ * segment. This is specific to pattern analysis.
+ *
+ * @param event
+ * The active event
+ * @param fields
+ * The segment fields
+ * @param info
+ * The active scenario details
+ */
+ protected void addStoredFieldsContent(ITmfEvent event, Map<String, ITmfStateValue> fields, final TmfXmlScenarioInfo info) {
+ if (fContainer instanceof XmlPatternStateProvider) {
+ for (Entry<String, String> entry : ((XmlPatternStateProvider) fContainer).getStoredFields().entrySet()) {
+ ITmfStateValue value = ((XmlPatternStateProvider) fContainer).getHistoryBuilder().getStoredFieldValue(fContainer, entry.getValue(), info, event);
+ if (!value.isNull()) {
+ fields.put(entry.getValue(), value);
+ }
+ }
}
}
}
}
- private static void getNameFromXmlStateValue(ITmfEvent event, StringBuilder builder, ITmfXmlStateValue xmlStateValue) {
+ private static void getNameFromXmlStateValue(ITmfEvent event, StringBuilder builder, ITmfXmlStateValue xmlStateValue, @Nullable TmfXmlScenarioInfo scenarioInfo) {
try {
- ITmfStateValue value = xmlStateValue.getValue(event);
+ ITmfStateValue value = xmlStateValue.getValue(event, scenarioInfo);
switch (value.getType()) {
case DOUBLE:
builder.append(value.unboxDouble());
* The active event
* @return The state value representing the value of the XML pattern
* segment field
+ * @param scenarioInfo
+ * The active scenario details. Or <code>null</code> if there
+ * is no scenario.
*/
- public ITmfStateValue getValue(ITmfEvent event) {
+ public ITmfStateValue getValue(ITmfEvent event, @Nullable TmfXmlScenarioInfo scenarioInfo) {
if (fStateValue != null) {
return fStateValue;
}
try {
- return checkNotNull(fXmlStateValue).getValue(event);
+ return checkNotNull(fXmlStateValue).getValue(event, scenarioInfo);
} catch (AttributeNotFoundException e) {
Activator.logError("Failed to get the state value", e); //$NON-NLS-1$
}
*
* @param event
* The active event
+ * @param scenarioInfo
+ * The active scenario details. Or <code>null</code> if there
+ * is no scenario.
* @return The segment name
*/
- public String getName(ITmfEvent event) {
+ public String getName(ITmfEvent event, @Nullable TmfXmlScenarioInfo scenarioInfo) {
StringBuilder name = new StringBuilder(PATTERN_SEGMENT_NAME_PREFIX);
if (fNameStateValue != null) {
- getNameFromXmlStateValue(event, name, fNameStateValue);
+ getNameFromXmlStateValue(event, name, fNameStateValue, scenarioInfo);
} else {
name.append(fSegmentNameAttribute);
}