| /******************************************************************************* |
| * 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 v1.0 which |
| * accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * 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 |
| } |
| |
| } |