blob: 1032a5cdc43e9215ccf28cea938e4441bc301c95 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012, 2014 Ericsson
*
* All rights reserved. This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0 which
* accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Patrick Tasse - Initial API and implementation
* Bernd Hufmann - Added call site and model URI properties
*******************************************************************************/
package org.eclipse.tracecompass.tmf.ui.viewers.events;
import static org.eclipse.tracecompass.common.core.NonNullUtils.nullToEmptyString;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.tracecompass.tmf.core.event.ITmfCustomAttributes;
import org.eclipse.tracecompass.tmf.core.event.ITmfEvent;
import org.eclipse.tracecompass.tmf.core.event.ITmfEventField;
import org.eclipse.tracecompass.tmf.core.event.lookup.ITmfCallsite;
import org.eclipse.tracecompass.tmf.core.event.lookup.ITmfModelLookup;
import org.eclipse.tracecompass.tmf.core.event.lookup.ITmfSourceLookup;
import org.eclipse.tracecompass.tmf.core.timestamp.ITmfTimestamp;
import org.eclipse.tracecompass.tmf.ui.properties.ReadOnlyTextPropertyDescriptor;
import org.eclipse.ui.views.properties.IPropertyDescriptor;
import org.eclipse.ui.views.properties.IPropertySource;
/**
* Property source for events
*/
public class TmfEventPropertySource implements IPropertySource {
private static final String ID_TIMESTAMP = "event_timestamp"; //$NON-NLS-1$
private static final String ID_TYPE = "event_type"; //$NON-NLS-1$
private static final String ID_TRACE = "trace_attribute"; //$NON-NLS-1$
private static final String ID_CONTENT = "event_content"; //$NON-NLS-1$
private static final String ID_SOURCE_LOOKUP = "event_lookup"; //$NON-NLS-1$
private static final String ID_MODEL_URI = "model_uri"; //$NON-NLS-1$
private static final String ID_CUSTOM_ATTRIBUTE = "custom_attribute"; //$NON-NLS-1$
private static final String NAME_TIMESTAMP = "Timestamp"; //$NON-NLS-1$
private static final String NAME_TYPE = "Type"; //$NON-NLS-1$
private static final String NAME_TRACE = "Trace"; //$NON-NLS-1$
private static final String NAME_CONTENT = "Content"; //$NON-NLS-1$
private static final String NAME_SOURCE_LOOKUP = "Source Lookup"; //$NON-NLS-1$
private static final String NAME_MODEL_URI = "Model URI"; //$NON-NLS-1$
private static final String NAME_CUSTOM_ATTRIBUTES = "Custom Attributes"; //$NON-NLS-1$
private static final String EMPTY_STRING = ""; //$NON-NLS-1$
private ITmfEvent fEvent;
private static class TimestampPropertySource implements IPropertySource {
private static final String ID_TIMESTAMP_VALUE = "timestamp_value"; //$NON-NLS-1$
private static final String ID_TIMESTAMP_SCALE = "timestamp_scale"; //$NON-NLS-1$
private static final String NAME_TIMESTAMP_VALUE = "value"; //$NON-NLS-1$
private static final String NAME_TIMESTAMP_SCALE = "scale"; //$NON-NLS-1$
private ITmfTimestamp fTimestamp;
public TimestampPropertySource(ITmfTimestamp timestamp) {
fTimestamp = timestamp;
}
@Override
public Object getEditableValue() {
return fTimestamp.toString();
}
@Override
public IPropertyDescriptor[] getPropertyDescriptors() {
IPropertyDescriptor[] descriptors = new IPropertyDescriptor[2];
descriptors[0] = new ReadOnlyTextPropertyDescriptor(ID_TIMESTAMP_VALUE, NAME_TIMESTAMP_VALUE);
descriptors[1] = new ReadOnlyTextPropertyDescriptor(ID_TIMESTAMP_SCALE, NAME_TIMESTAMP_SCALE);
return descriptors;
}
@Override
public Object getPropertyValue(Object id) {
if (id.equals(ID_TIMESTAMP_VALUE)) {
return Long.toString(fTimestamp.getValue());
} else if (id.equals(ID_TIMESTAMP_SCALE)) {
return Integer.toString(fTimestamp.getScale());
}
return null;
}
@Override
public boolean isPropertySet(Object id) {
return false;
}
@Override
public void resetPropertyValue(Object id) {
// Do nothing
}
@Override
public void setPropertyValue(Object id, Object value) {
// Do nothing
}
}
private static class ContentPropertySource implements IPropertySource {
private ITmfEventField fContent;
public ContentPropertySource(ITmfEventField content) {
fContent = content;
}
@Override
public Object getEditableValue() {
return fContent.toString();
}
@Override
public IPropertyDescriptor[] getPropertyDescriptors() {
List<IPropertyDescriptor> descriptors = new ArrayList<>(fContent.getFields().size());
for (ITmfEventField field : fContent.getFields()) {
if (field != null) {
descriptors.add(new ReadOnlyTextPropertyDescriptor(field, field.getName()));
}
}
return descriptors.toArray(new IPropertyDescriptor[0]);
}
@Override
public Object getPropertyValue(Object id) {
ITmfEventField field = (ITmfEventField) id;
if (!field.getFields().isEmpty()) {
return new ContentPropertySource(field);
}
return field.getFormattedValue();
}
@Override
public boolean isPropertySet(Object id) {
return false;
}
@Override
public void resetPropertyValue(Object id) {
// Do nothing
}
@Override
public void setPropertyValue(Object id, Object value) {
// Do nothing
}
}
private static class SourceLookupPropertySource implements IPropertySource {
private static final String ID_FILE_NAME = "callsite_file"; //$NON-NLS-1$
private static final String ID_LINE_NUMBER = "callsite_line"; //$NON-NLS-1$
private static final String NAME_FILE_NAME = "File"; //$NON-NLS-1$
private static final String NAME_LINE_NUMBER = "Line"; //$NON-NLS-1$
private final ITmfSourceLookup fSourceLookup;
public SourceLookupPropertySource(ITmfSourceLookup lookup) {
fSourceLookup = lookup;
}
@Override
public Object getEditableValue() {
ITmfCallsite cs = fSourceLookup.getCallsite();
if (cs != null) {
return cs.toString();
}
return null;
}
@Override
public IPropertyDescriptor[] getPropertyDescriptors() {
List<IPropertyDescriptor> descriptors= new ArrayList<>();
ITmfCallsite cs = fSourceLookup.getCallsite();
if (cs != null) {
descriptors.add(new ReadOnlyTextPropertyDescriptor(ID_FILE_NAME, NAME_FILE_NAME));
descriptors.add(new ReadOnlyTextPropertyDescriptor(ID_LINE_NUMBER, NAME_LINE_NUMBER));
}
return descriptors.toArray(new IPropertyDescriptor[0]);
}
@Override
public String getPropertyValue(Object id) {
ITmfCallsite cs = fSourceLookup.getCallsite();
if (cs == null) {
/*
* The callsite should not be null here, we would not have
* created the descriptors otherwise
*/
throw new IllegalStateException();
}
if (!(id instanceof String)) {
return null;
}
switch ((String) id) {
case ID_FILE_NAME:
return cs.getFileName();
case ID_LINE_NUMBER:
return nullToEmptyString(cs.getLineNo());
default:
return null;
}
}
@Override
public boolean isPropertySet(Object id) {
return false;
}
@Override
public void resetPropertyValue(Object id) {
// Do nothing
}
@Override
public void setPropertyValue(Object id, Object value) {
// Do nothing
}
}
private class CustomAttributePropertySource implements IPropertySource {
private final ITmfCustomAttributes event;
public CustomAttributePropertySource(ITmfCustomAttributes event) {
this.event = event;
}
@Override
public Object getEditableValue() {
return EMPTY_STRING;
}
@Override
public IPropertyDescriptor[] getPropertyDescriptors() {
List<IPropertyDescriptor> descriptors = new ArrayList<>();
for (String customAttribute : event.listCustomAttributes()) {
descriptors.add(new ReadOnlyTextPropertyDescriptor(customAttribute, customAttribute));
}
return descriptors.toArray(new IPropertyDescriptor[0]);
}
@Override
public Object getPropertyValue(Object id) {
if (!(id instanceof String)) {
return null;
}
return event.getCustomAttribute((String) id);
}
@Override
public boolean isPropertySet(Object id) {
return false;
}
@Override
public void resetPropertyValue(Object id) {
// Do nothing
}
@Override
public void setPropertyValue(Object id, Object value) {
// Do nothing
}
}
/**
* Default constructor
*
* @param event the event
*/
public TmfEventPropertySource(ITmfEvent event) {
super();
this.fEvent = event;
}
@Override
public Object getEditableValue() {
return null;
}
@Override
public IPropertyDescriptor[] getPropertyDescriptors() {
List<IPropertyDescriptor> descriptors= new ArrayList<>();
/* Display basic event information */
descriptors.add(new ReadOnlyTextPropertyDescriptor(ID_TIMESTAMP, NAME_TIMESTAMP));
descriptors.add(new ReadOnlyTextPropertyDescriptor(ID_TYPE, NAME_TYPE));
descriptors.add(new ReadOnlyTextPropertyDescriptor(ID_TRACE, NAME_TRACE));
/* Display event fields */
descriptors.add(new ReadOnlyTextPropertyDescriptor(ID_CONTENT, NAME_CONTENT));
/* Display source lookup information, if the event supplies it */
if ((fEvent instanceof ITmfSourceLookup) && (((ITmfSourceLookup)fEvent).getCallsite() != null)) {
descriptors.add(new ReadOnlyTextPropertyDescriptor(ID_SOURCE_LOOKUP, NAME_SOURCE_LOOKUP));
}
/* Display Model URI information, if the event supplies it */
if ((fEvent instanceof ITmfModelLookup) && (((ITmfModelLookup) fEvent).getModelUri() != null)) {
descriptors.add(new ReadOnlyTextPropertyDescriptor(ID_MODEL_URI, NAME_MODEL_URI));
}
/* Display custom attributes, if available */
if (fEvent instanceof ITmfCustomAttributes) {
ITmfCustomAttributes event = (ITmfCustomAttributes) fEvent;
if (!event.listCustomAttributes().isEmpty()) {
descriptors.add(new ReadOnlyTextPropertyDescriptor(ID_CUSTOM_ATTRIBUTE, NAME_CUSTOM_ATTRIBUTES));
}
}
return descriptors.toArray(new IPropertyDescriptor[0]);
}
@Override
public Object getPropertyValue(Object id) {
if (id.equals(ID_TIMESTAMP)) {
return new TimestampPropertySource(fEvent.getTimestamp());
} else if (id.equals(ID_TYPE) && fEvent.getType() != null) {
return fEvent.getType().toString();
} else if (id.equals(ID_TRACE)) {
return fEvent.getTrace().getName();
} else if (id.equals(ID_MODEL_URI)) {
return ((ITmfModelLookup)fEvent).getModelUri();
} else if (id.equals(ID_SOURCE_LOOKUP)) {
return new SourceLookupPropertySource(((ITmfSourceLookup)fEvent));
} else if (id.equals(ID_CONTENT) && fEvent.getContent() != null) {
return new ContentPropertySource(fEvent.getContent());
} else if (id.equals(ID_CUSTOM_ATTRIBUTE)) {
return new CustomAttributePropertySource((ITmfCustomAttributes) fEvent);
}
return null;
}
@Override
public boolean isPropertySet(Object id) {
return false;
}
@Override
public void resetPropertyValue(Object id) {
// Do nothing
}
@Override
public void setPropertyValue(Object id, Object value) {
// Do nothing
}
}