diff -r 14dc2103a631 -r ed1c9f64298a trace/tracebuilder/com.nokia.tracebuilder/src/com/nokia/tracebuilder/engine/rules/osttrace/OstTraceFormatRule.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/trace/tracebuilder/com.nokia.tracebuilder/src/com/nokia/tracebuilder/engine/rules/osttrace/OstTraceFormatRule.java Wed Jun 23 14:35:40 2010 +0300 @@ -0,0 +1,624 @@ +/* + * Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: + * + * Formatting rule for OST traces + * + */ +package com.nokia.tracebuilder.engine.rules.osttrace; + +import com.nokia.tracebuilder.engine.TraceBuilderGlobals; +import com.nokia.tracebuilder.engine.rules.AutomaticTraceTextRule; +import com.nokia.tracebuilder.engine.rules.ComplexHeaderRule; +import com.nokia.tracebuilder.engine.rules.EntryTraceRule; +import com.nokia.tracebuilder.engine.rules.ExitTraceRule; +import com.nokia.tracebuilder.engine.rules.PerformanceEventRuleBase; +import com.nokia.tracebuilder.engine.rules.PerformanceEventStartRule; +import com.nokia.tracebuilder.engine.rules.PerformanceEventStopRule; +import com.nokia.tracebuilder.engine.rules.StateTraceRule; +import com.nokia.tracebuilder.engine.rules.TraceFormatRuleBase; +import com.nokia.tracebuilder.model.Trace; +import com.nokia.tracebuilder.model.TraceModelListener; +import com.nokia.tracebuilder.model.TraceObject; +import com.nokia.tracebuilder.model.TraceParameter; +import com.nokia.tracebuilder.plugin.TraceFormatConstants; +import com.nokia.tracebuilder.plugin.TraceHeaderContribution; +import com.nokia.tracebuilder.plugin.TraceAPIFormatter.TraceFormatType; +import com.nokia.tracebuilder.project.GroupNameHandlerBase; +import com.nokia.tracebuilder.rules.HiddenTraceObjectRule; +import com.nokia.tracebuilder.source.SourceConstants; +import com.nokia.tracebuilder.source.SourceUtils; +import java.util.regex.Matcher; + +/** + * Formatting rule for OST traces. + * + */ +public final class OstTraceFormatRule extends TraceFormatRuleBase implements + TraceHeaderContribution, TraceModelListener { + + /** + * Separator for parameters within trace text + */ + private static final String PARAMETER_VALUE_SEPARATOR = "="; //$NON-NLS-1$ + + /** + * Separator for parameter name ane value + */ + private static final String PARAMETER_SEPARATOR = ";"; //$NON-NLS-1$ + + /** + * String parameter tag + */ + private static final String STRING_PARAMETER_TAG = "%s"; //$NON-NLS-1$ + + /** + * Hex parameter tag + */ + private static final String HEX_PARAMETER_TAG = "0x%x"; //$NON-NLS-1$ + + /** + * SDEC parameter tag + */ + private static final String SDEC_PARAMETER_TAG = "%d"; //$NON-NLS-1$ + + /** + * Category for traces + */ + private static final String TRACE_CATEGORY = "KBTraceCategoryOpenSystemTrace"; //$NON-NLS-1$ + + /** + * Title shown in UI + */ + private static final String UI_TITLE = "Open System Trace"; //$NON-NLS-1$ + + /** + * Name for storage + */ + public static final String STORAGE_NAME = "OstTraceFormat"; //$NON-NLS-1$ + + /** + * OstTraceEventStart tag + */ + public static final String OST_TRACE_EVENT_START_TAG = "OstTraceEventStart"; //$NON-NLS-1$ + + /** + * OstTraceEventStop tag + */ + public static final String OST_TRACE_EVENT_STOP_TAG = "OstTraceEventStop"; //$NON-NLS-1$ + + /** + * Source formatting + */ + private static final String TRACE_FORMAT = "OstTrace" //$NON-NLS-1$ + + TraceFormatConstants.PARAM_COUNT_FORMAT // Number of parameters + + "( " //$NON-NLS-1$ + + TraceFormatConstants.GROUP_FORMAT // Group name + + ", " //$NON-NLS-1$ + + TraceFormatConstants.NAME_FORMAT // Trace name + + ", " //$NON-NLS-1$ + + TraceFormatConstants.TEXT_FORMAT // Trace text + + TraceFormatConstants.PARAMETERS_FORMAT // Trace parameters + + " );"; //$NON-NLS-1$ + + /** + * Source formatting with complex traces + */ + private static final String COMPLEX_TRACE_FORMAT = "OstTraceExt" //$NON-NLS-1$ + + TraceFormatConstants.PARAM_COUNT_FORMAT // Number of parameters + + "( " //$NON-NLS-1$ + + TraceFormatConstants.GROUP_FORMAT // Group name + + ", " //$NON-NLS-1$ + + TraceFormatConstants.NAME_FORMAT // Trace name + + ", " //$NON-NLS-1$ + + TraceFormatConstants.TEXT_FORMAT // Trace text + + TraceFormatConstants.PARAMETERS_FORMAT // Trace parameters + + " );"; //$NON-NLS-1$ + + /** + * Function entry formatting + */ + private static final String ENTRY_TRACE_FORMAT = "OstTraceFunctionEntry" //$NON-NLS-1$ + + TraceFormatConstants.PARAM_COUNT_FORMAT + "( " //$NON-NLS-1$ + + TraceFormatConstants.NAME_FORMAT // Trace name + + TraceFormatConstants.PARAMETERS_FORMAT // Trace parameters + + " );"; //$NON-NLS-1$ + + /** + * Function entry Ext formatting + */ + private static final String ENTRY_TRACE_EXT_FORMAT_THIS = "OstTraceFunctionEntryExt( " //$NON-NLS-1$ + + TraceFormatConstants.NAME_FORMAT // Trace name + + ", this );"; //$NON-NLS-1$ + + /** + * Function exit formatting + */ + private static final String EXIT_TRACE_FORMAT = "OstTraceFunctionExit" //$NON-NLS-1$ + + TraceFormatConstants.PARAM_COUNT_FORMAT + "( " //$NON-NLS-1$ + + TraceFormatConstants.NAME_FORMAT // Trace name + + TraceFormatConstants.PARAMETERS_FORMAT // Trace parameters + + " );"; //$NON-NLS-1$ + + /** + * Function exit Ext formatting + */ + private static final String EXIT_TRACE_EXT_FORMAT = "OstTraceFunctionExitExt( " //$NON-NLS-1$ + + TraceFormatConstants.NAME_FORMAT // Trace name + + TraceFormatConstants.PARAMETERS_FORMAT // Trace parameters + + " );"; //$NON-NLS-1$ + + /** + * State formatting + */ + private static final String STATE_TRACE_FORMAT = "OstTraceState" //$NON-NLS-1$ + + TraceFormatConstants.PARAM_COUNT_FORMAT + + "( " //$NON-NLS-1$ + + TraceFormatConstants.NAME_FORMAT // Trace name + + TraceFormatConstants.STATE_MACHINE_NAME_FORMAT + + TraceFormatConstants.STATE_MACHINE_STATE_FORMAT + + TraceFormatConstants.PARAMETERS_FORMAT // Trace parameters + + " );"; //$NON-NLS-1$ + + /** + * Performance event start formatting + */ + private static final String EVENT_START_FORMAT = OST_TRACE_EVENT_START_TAG + + TraceFormatConstants.PARAM_COUNT_FORMAT + "( " //$NON-NLS-1$ + + TraceFormatConstants.NAME_FORMAT // Trace name + + ", " //$NON-NLS-1$ + + TraceFormatConstants.EVENT_NAME_FORMAT // Event name + + TraceFormatConstants.PARAMETERS_FORMAT // Trace parameters + + " );"; //$NON-NLS-1$ + + /** + * Performance event stop formatting + */ + private static final String EVENT_STOP_FORMAT = OST_TRACE_EVENT_STOP_TAG + + "( " //$NON-NLS-1$ + + TraceFormatConstants.NAME_FORMAT // Trace name + + ", " //$NON-NLS-1$ + + TraceFormatConstants.EVENT_NAME_FORMAT // Event name + + ", " //$NON-NLS-1$ + // Start Event Trace name + + TraceFormatConstants.EVENT_START_TRACE_NAME_FORMAT + + TraceFormatConstants.PARAMETERS_FORMAT // Trace parameters + + " );"; //$NON-NLS-1$ + + /** + * Ext-function declaration format + */ + private static final String HEADER_FORMAT = "OstTraceGen" //$NON-NLS-1$ + + TraceFormatConstants.PARAM_COUNT_FORMAT // Number of parameters + + "( TUint32 aTraceID" //$NON-NLS-1$ + + TraceFormatConstants.PARAMETERS_FORMAT // Trace parameters + + " )"; //$NON-NLS-1$ + + /** + * Activation query formatting + */ + private static final String ACTIVATION_FORMAT = "BTrace8( " //$NON-NLS-1$ + + TRACE_CATEGORY + ", " //$NON-NLS-1$ + + "EOstTraceActivationQuery, KOstTraceComponentID, aTraceID )"; //$NON-NLS-1$ + + /** + * Buffered trace format + */ + private static final String TRACE_BUFFER_FORMAT = "OstSendNBytes( " //$NON-NLS-1$ + + TRACE_CATEGORY + ", " //$NON-NLS-1$ + + "EOstTrace, KOstTraceComponentID, aTraceID, " //$NON-NLS-1$ + + TraceFormatConstants.DATA_BUFFER_FORMAT // Trace data + + ", " //$NON-NLS-1$ + + TraceFormatConstants.DATA_LENGTH_FORMAT // Trace data length + + " );"; //$NON-NLS-1$ + + /** + * Packed trace format + */ + private static final String TRACE_PACKED_FORMAT = "BTraceContext12( " //$NON-NLS-1$ + + TRACE_CATEGORY + ", " //$NON-NLS-1$ + + "EOstTrace, KOstTraceComponentID, aTraceID, " //$NON-NLS-1$ + + TraceFormatConstants.DATA_BUFFER_FORMAT // Trace data + + " );"; //$NON-NLS-1$ + + /** + * #include format + */ + private String INCLUDE_FORMAT = "#include \"OstTraceDefinitions.h\"\r\n" //$NON-NLS-1$ + + "#ifdef OST_TRACE_COMPILER_IN_USE\r\n#include \"" //$NON-NLS-1$ + + TraceFormatConstants.INCLUDE_FORMAT + "\"\r\n#endif"; //$NON-NLS-1$ + + /** + * Template for the OstTraceDefinitions.h header file + */ + private static final String[] MAIN_HEADER_TEMPLATE = { "\r\n" //$NON-NLS-1$ + + "// OST_TRACE_COMPILER_IN_USE flag has been added by Trace Compiler\r\n" //$NON-NLS-1$ + + "// REMOVE BEFORE CHECK-IN TO VERSION CONTROL\r\n" //$NON-NLS-1$ + + "#define OST_TRACE_COMPILER_IN_USE\r\n" //$NON-NLS-1$ + + "#include \r\n#endif\r\n" }; //$NON-NLS-1$ + + /* + * (non-Javadoc) + * + * @see com.nokia.tracebuilder.project.TraceProjectAPI#getName() + */ + public String getName() { + return STORAGE_NAME; + } + + /* + * (non-Javadoc) + * + * @see com.nokia.tracebuilder.project.TraceProjectAPI#getTitle() + */ + public String getTitle() { + return UI_TITLE; + } + + /* + * (non-Javadoc) + * + * @see com.nokia.tracebuilder.engine.source.TraceFormattingRule# + * getFormat(com.nokia.tracebuilder.model.Trace, + * com.nokia.tracebuilder.plugin.TraceAPIFormatter.TraceFormatType) + */ + public String getFormat(Trace trace, TraceFormatType formatType) { // CodForChk_Dis_ComplexFunc + String retval; + if (formatType == TraceFormatType.NORMAL_TRACE + || formatType == TraceFormatType.COMPLEX_TRACE) { + if (trace.getExtension(PerformanceEventStartRule.class) != null) { + retval = EVENT_START_FORMAT; + } else if (trace.getExtension(PerformanceEventStopRule.class) != null) { + retval = EVENT_STOP_FORMAT; + } else if (trace.getExtension(EntryTraceRule.class) != null) { + // If the trace is entry trace with function parameters, the + // parameters are not inserted into source. Instead, only the + // "this" pointer is added + if (trace.getExtension(ComplexHeaderRule.class) != null) { + retval = ENTRY_TRACE_EXT_FORMAT_THIS; + } else { + retval = ENTRY_TRACE_FORMAT; + } + } else if (trace.getExtension(ExitTraceRule.class) != null) { + if (trace.getExtension(ComplexHeaderRule.class) != null) { + retval = EXIT_TRACE_EXT_FORMAT; + } else { + retval = EXIT_TRACE_FORMAT; + } + } else if (trace.getExtension(StateTraceRule.class) != null) { + retval = STATE_TRACE_FORMAT; + } else { + if (formatType == TraceFormatType.NORMAL_TRACE) { + retval = TRACE_FORMAT; + } else if (formatType == TraceFormatType.COMPLEX_TRACE) { + retval = COMPLEX_TRACE_FORMAT; + } else { + retval = null; + } + } + } else { + if (formatType == TraceFormatType.HEADER) { + retval = HEADER_FORMAT; + } else if (formatType == TraceFormatType.TRACE_BUFFER) { + retval = TRACE_BUFFER_FORMAT; + } else if (formatType == TraceFormatType.TRACE_PACKED) { + retval = TRACE_PACKED_FORMAT; + } else if (formatType == TraceFormatType.TRACE_ACTIVATION) { + retval = ACTIVATION_FORMAT; + } else if (formatType == TraceFormatType.INCLUDE_FORMAT) { + retval = INCLUDE_FORMAT; + } else { + retval = null; + } + } + return retval; + } + + /* + * (non-Javadoc) + * + * @see com.nokia.tracebuilder.engine.source.SourceFormatRule# + * mapParameterCountToSource(com.nokia.tracebuilder.model.Trace, int) + */ + @Override + public String mapParameterCountToSource(Trace trace, int count) { + String retval; + ComplexHeaderRule rule = trace.getExtension(ComplexHeaderRule.class); + if (rule != null && rule.getTraceIDDefineExtension() != null) { + // Uses the extension tag with extension headers + retval = OstConstants.EXTENSION_TRACE_TAG; + } else { + retval = String.valueOf(count); + } + return retval; + } + + /* + * (non-Javadoc) + * + * @see com.nokia.tracebuilder.project.TraceHeaderContribution# + * getContribution(com.nokia.tracebuilder.project.TraceHeaderContribution.TraceHeaderContributionType) + */ + public String[] getContribution(TraceHeaderContributionType type) { + String[] retval = null; + if (type == TraceHeaderContributionType.GLOBAL_DEFINES) { + retval = new String[] { "KOstTraceComponentID 0x" //$NON-NLS-1$ + + Integer.toHexString(getOwner().getModel().getID()) }; + } else if (type == TraceHeaderContributionType.MAIN_HEADER_CONTENT) { + retval = MAIN_HEADER_TEMPLATE; + } + return retval; + } + + /* + * (non-Javadoc) + * + * @see com.nokia.tracebuilder.project.TraceProjectAPI#isVisibleInConfiguration() + */ + public boolean isVisibleInConfiguration() { + return true; + } + + /* + * (non-Javadoc) + * + * @see com.nokia.tracebuilder.engine.rules.ExtensionBase#setOwner(com.nokia.tracebuilder.model.TraceObject) + */ + @Override + public void setOwner(TraceObject owner) { + if (getOwner() != null) { + getOwner().getModel().removeModelListener(this); + } + super.setOwner(owner); + if (owner != null) { + owner.getModel().addModelListener(this); + } + } + + /* + * (non-Javadoc) + * + * @see com.nokia.tracebuilder.model.TraceModelListener# + * objectAdded(com.nokia.tracebuilder.model.TraceObject, + * com.nokia.tracebuilder.model.TraceObject) + */ + public void objectAdded(TraceObject owner, TraceObject object) { + } + + /* + * (non-Javadoc) + * + * @see com.nokia.tracebuilder.model.TraceModelListener# + * objectCreationComplete(com.nokia.tracebuilder.model.TraceObject) + */ + public void objectCreationComplete(TraceObject object) { + // Model must be valid and converter not running + // -> Parameter was added via UI + // Also, parameter must not be hidden, otherwise fillers would update + // the trace + if (object.getModel().isValid() + && object instanceof TraceParameter + && !TraceBuilderGlobals.getSourceContextManager() + .isConverting() + && object.getExtension(HiddenTraceObjectRule.class) == null) { + TraceParameter param = (TraceParameter) object; + Trace parent = param.getTrace(); + + // In case of performance event trace we do not add parameter to + // trace text + GroupNameHandlerBase groupNameHandler = TraceBuilderGlobals.getGroupNameHandler(); + if (!(parent.getGroup().getName() + .equals(groupNameHandler.getDefaultGroups()[groupNameHandler.getPerformanceGroupIdIndex()]))) { + addParameterToTraceText(param); + } + } + } + + /** + * Adds parameter formatting to trace text + * + * @param param + * the parameter + */ + private void addParameterToTraceText(TraceParameter param) { + // Adds the parameter format to the trace text + // Auto-text traces are not updated + String text; + Trace parent = param.getTrace(); + + if (parent.getExtension(AutomaticTraceTextRule.class) == null) { + text = parent.getTrace() + PARAMETER_SEPARATOR + param.getName() + + PARAMETER_VALUE_SEPARATOR + + SourceUtils.mapParameterTypeToFormat(param); + + parent.setTrace(text); + } + } + + /* + * (non-Javadoc) + * + * @see com.nokia.tracebuilder.model.TraceModelListener# + * objectRemoved(com.nokia.tracebuilder.model.TraceObject, + * com.nokia.tracebuilder.model.TraceObject) + */ + public void objectRemoved(TraceObject owner, TraceObject object) { + } + + /* + * (non-Javadoc) + * + * @see com.nokia.tracebuilder.engine.rules.TraceFormatRuleBase# + * parameterAboutToBeRemoved(com.nokia.tracebuilder.model.TraceParameter, + * int) + */ + @Override + public void parameterAboutToBeRemoved(TraceParameter parameter, int index) { + Trace trace = parameter.getTrace(); + String tracetext = trace.getTrace(); + + if (tracetext != "") { //$NON-NLS-1$ + Matcher matcher = SourceUtils.traceTextPattern.matcher(tracetext); + + boolean found = true; + int i = -1; + int previousmatchend = 0; + + do { + found = matcher.find(); + i++; + // Store end location of the previous match + if (i < index) { + previousmatchend = matcher.start() + + matcher.group().length(); + } + } while (i < index); + + if (found) { + int matchstart = matcher.start(); + String group = matcher.group(); + + if (index == 0) { + // Fist parameter is going to be removed + int firstpartend = tracetext.lastIndexOf(';', matchstart); + if (firstpartend < 0) { + // Trace text is not TB in format, so remove only + // parameter tag. + firstpartend = matchstart; + + // If trace group is TRACE_PERFORMANCE, trace could be + // in LocigAnalyzer format. Remove also extra space + // before parameter tag + String traceGroupName = trace.getGroup().getName(); + GroupNameHandlerBase groupNameHandler = TraceBuilderGlobals.getGroupNameHandler(); + int performanceGroupIndex = groupNameHandler.getPerformanceGroupIdIndex(); + String performanceGroupName = groupNameHandler.getDefaultGroups()[performanceGroupIndex]; + if (traceGroupName.equals(performanceGroupName)) { + if (tracetext.charAt(firstpartend - 1) == SourceConstants.SPACE_CHAR) { + firstpartend--; + } + } + } + trace.setTrace(tracetext.substring(0, firstpartend) + + tracetext.substring(matchstart + group.length())); + } else { + // Some other than first parameter is going to be removed + if (tracetext.charAt(previousmatchend) == ';') { + // Trace text is TB in format, so remove also some text + // before parameter tag. + trace.setTrace(tracetext.substring(0, previousmatchend) + + tracetext.substring(matchstart + + group.length())); + } else { + // Trace text is not TB in format, so remove only + // parameter tag. + trace.setTrace(tracetext.substring(0, matchstart) + + tracetext.substring(matchstart + + group.length())); + } + } + } + } + } + + /* + * (non-Javadoc) + * + * @see com.nokia.tracebuilder.model.TraceModelListener# + * propertyUpdated(com.nokia.tracebuilder.model.TraceObject, int) + */ + public void propertyUpdated(TraceObject object, int property) { + } + + /* + * (non-Javadoc) + * + * @see com.nokia.tracebuilder.project.TraceProjectAPI# + * formatTraceForExport(com.nokia.tracebuilder.model.Trace, + * com.nokia.tracebuilder.project.TraceProjectAPI.TraceFormatFlags) + */ + public String formatTraceForExport(Trace trace, TraceFormatFlags flags) { + // TODO: This uses default formats + // -> Should be configurable + // > for entry traces + // < for exit traces + // Logic analyzer format for performance traces + String retval = trace.getTrace(); + AutomaticTraceTextRule rule = trace + .getExtension(AutomaticTraceTextRule.class); + int parameterCount = trace.getParameterCount(); + if (rule != null) { + if (rule instanceof EntryTraceRule) { + retval = "> " //$NON-NLS-1$ + + retval; + } else if (rule instanceof ExitTraceRule) { + retval = "< " //$NON-NLS-1$ + + retval; + } else if (rule instanceof StateTraceRule) { + if (parameterCount == 2) { // CodForChk_Dis_Magic + retval = retval + "Machine" + PARAMETER_VALUE_SEPARATOR //$NON-NLS-1$ + + STRING_PARAMETER_TAG + PARAMETER_SEPARATOR + + "State" + PARAMETER_VALUE_SEPARATOR //$NON-NLS-1$ + + STRING_PARAMETER_TAG; + } else { + retval = retval + + "Machine" + PARAMETER_VALUE_SEPARATOR //$NON-NLS-1$ + + STRING_PARAMETER_TAG + PARAMETER_SEPARATOR + + "State" + PARAMETER_VALUE_SEPARATOR //$NON-NLS-1$ + + STRING_PARAMETER_TAG + PARAMETER_SEPARATOR + + "Instance" + PARAMETER_VALUE_SEPARATOR //$NON-NLS-1$ + + HEX_PARAMETER_TAG; + } + } + + if (parameterCount >= 1 && !(rule instanceof StateTraceRule)) { + TraceParameter param; + for (int i = 0; i < parameterCount; i++) { + param = trace.getParameter(i); + retval += PARAMETER_SEPARATOR + param.getName() + + PARAMETER_VALUE_SEPARATOR + + SourceUtils.mapParameterTypeToFormat(param); + } + } + } else { + PerformanceEventRuleBase perf = trace + .getExtension(PerformanceEventRuleBase.class); + if (perf != null) { + if (perf instanceof PerformanceEventStartRule) { + retval = retval + "> " + PARAMETER_SEPARATOR //$NON-NLS-1$ + + "Value" + PARAMETER_VALUE_SEPARATOR //$NON-NLS-1$ + + SDEC_PARAMETER_TAG; + } else if (perf instanceof PerformanceEventStopRule) { + retval = retval + "< " //$NON-NLS-1$ + + PARAMETER_SEPARATOR + + "Value" + PARAMETER_VALUE_SEPARATOR //$NON-NLS-1$ + + SDEC_PARAMETER_TAG + + PARAMETER_SEPARATOR + + "Start Event Trace ID" + PARAMETER_VALUE_SEPARATOR //$NON-NLS-1$ + + SDEC_PARAMETER_TAG; + } + } + } + // If formatting is not supported the format characters and parameters + // are removed. + if (!flags.isFormattingSupported) { + int index = retval.indexOf(PARAMETER_SEPARATOR); + if (index > 0) { + retval = retval.substring(0, index); + } + retval = SourceUtils.removePrintfFormatting(retval).trim(); + } + return retval; + } +}