tracesrv/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/source/SourceFormatter.java
author hgs
Fri, 08 Oct 2010 14:56:39 +0300
changeset 56 aa2539c91954
permissions -rw-r--r--
201041
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
56
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
 * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). 
hgs
parents:
diff changeset
     3
 * All rights reserved.
hgs
parents:
diff changeset
     4
 * This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
 * under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
 * which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
 *
hgs
parents:
diff changeset
     9
 * Initial Contributors:
hgs
parents:
diff changeset
    10
 * Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
 *
hgs
parents:
diff changeset
    12
 * Contributors:
hgs
parents:
diff changeset
    13
 *
hgs
parents:
diff changeset
    14
 * Description:
hgs
parents:
diff changeset
    15
 *
hgs
parents:
diff changeset
    16
 * Formatting rules are provided by Trace objects
hgs
parents:
diff changeset
    17
 *
hgs
parents:
diff changeset
    18
 */
hgs
parents:
diff changeset
    19
package com.nokia.tracecompiler.engine.source;
hgs
parents:
diff changeset
    20
hgs
parents:
diff changeset
    21
import java.util.Iterator;
hgs
parents:
diff changeset
    22
hgs
parents:
diff changeset
    23
import com.nokia.tracecompiler.engine.TraceCompilerEngineGlobals;
hgs
parents:
diff changeset
    24
import com.nokia.tracecompiler.engine.rules.StateTraceRule;
hgs
parents:
diff changeset
    25
import com.nokia.tracecompiler.model.Trace;
hgs
parents:
diff changeset
    26
import com.nokia.tracecompiler.model.TraceParameter;
hgs
parents:
diff changeset
    27
import com.nokia.tracecompiler.plugin.TraceFormatConstants;
hgs
parents:
diff changeset
    28
import com.nokia.tracecompiler.plugin.TraceAPIFormatter.TraceFormatType;
hgs
parents:
diff changeset
    29
import com.nokia.tracecompiler.source.SourceConstants;
hgs
parents:
diff changeset
    30
import com.nokia.tracecompiler.source.SourceUtils;
hgs
parents:
diff changeset
    31
import com.nokia.tracecompiler.source.SymbianConstants;
hgs
parents:
diff changeset
    32
hgs
parents:
diff changeset
    33
/**
hgs
parents:
diff changeset
    34
 * Static functions for source formatting
hgs
parents:
diff changeset
    35
 * 
hgs
parents:
diff changeset
    36
 */
hgs
parents:
diff changeset
    37
public class SourceFormatter {
hgs
parents:
diff changeset
    38
hgs
parents:
diff changeset
    39
	/**
hgs
parents:
diff changeset
    40
	 * Value parameter name
hgs
parents:
diff changeset
    41
	 */
hgs
parents:
diff changeset
    42
	public static final String VALUE_PARAMETER_NAME = "value"; //$NON-NLS-1$	
hgs
parents:
diff changeset
    43
hgs
parents:
diff changeset
    44
	/**
hgs
parents:
diff changeset
    45
	 * Event start trace id parameter name
hgs
parents:
diff changeset
    46
	 */
hgs
parents:
diff changeset
    47
	public static final String EVENT_START_TRACE_ID_PARAMETER_NAME = "linkToStart"; //$NON-NLS-1$		
hgs
parents:
diff changeset
    48
hgs
parents:
diff changeset
    49
	/**
hgs
parents:
diff changeset
    50
	 * Constructor is hidden
hgs
parents:
diff changeset
    51
	 */
hgs
parents:
diff changeset
    52
	private SourceFormatter() {
hgs
parents:
diff changeset
    53
	}
hgs
parents:
diff changeset
    54
hgs
parents:
diff changeset
    55
	/**
hgs
parents:
diff changeset
    56
	 * Formats a trace to string format using the formatting rule from the trace
hgs
parents:
diff changeset
    57
	 * 
hgs
parents:
diff changeset
    58
	 * @param trace
hgs
parents:
diff changeset
    59
	 *            the trace
hgs
parents:
diff changeset
    60
	 * @param formatType
hgs
parents:
diff changeset
    61
	 *            the type of format
hgs
parents:
diff changeset
    62
	 * @return the trace string
hgs
parents:
diff changeset
    63
	 */
hgs
parents:
diff changeset
    64
	public static String formatTrace(Trace trace, TraceFormatType formatType) {
hgs
parents:
diff changeset
    65
		return formatTrace(trace, null, formatType, null, false);
hgs
parents:
diff changeset
    66
	}
hgs
parents:
diff changeset
    67
hgs
parents:
diff changeset
    68
	/**
hgs
parents:
diff changeset
    69
	 * Formats a trace to string format
hgs
parents:
diff changeset
    70
	 * 
hgs
parents:
diff changeset
    71
	 * @param trace
hgs
parents:
diff changeset
    72
	 *            the trace
hgs
parents:
diff changeset
    73
	 * @param traceRule
hgs
parents:
diff changeset
    74
	 *            the formatting rule to be used
hgs
parents:
diff changeset
    75
	 * @param formatType
hgs
parents:
diff changeset
    76
	 *            the type of format
hgs
parents:
diff changeset
    77
	 * @param tags
hgs
parents:
diff changeset
    78
	 *            the tags for parameters or null if parameter names are used
hgs
parents:
diff changeset
    79
	 * @param fixedTags
hgs
parents:
diff changeset
    80
	 *            true if the <i>tags</i> iterator is fixed, false if the
hgs
parents:
diff changeset
    81
	 *            contents of <i>tags</i> should go through
hgs
parents:
diff changeset
    82
	 *            <code>SourceRule.mapNameToSource</code>
hgs
parents:
diff changeset
    83
	 * @return the trace string
hgs
parents:
diff changeset
    84
	 */
hgs
parents:
diff changeset
    85
	static String formatTrace(Trace trace, TraceFormattingRule traceRule,
hgs
parents:
diff changeset
    86
			TraceFormatType formatType, Iterator<String> tags, boolean fixedTags) {
hgs
parents:
diff changeset
    87
		StringBuffer data = new StringBuffer();
hgs
parents:
diff changeset
    88
		String format = null;
hgs
parents:
diff changeset
    89
		if (traceRule == null) {
hgs
parents:
diff changeset
    90
hgs
parents:
diff changeset
    91
			// If rule is not explicitly provided, it is fetched from the trace
hgs
parents:
diff changeset
    92
			traceRule = trace.getExtension(TraceFormattingRule.class);
hgs
parents:
diff changeset
    93
			if (traceRule == null) {
hgs
parents:
diff changeset
    94
hgs
parents:
diff changeset
    95
				// If trace does not have a formatting rule, the project API's
hgs
parents:
diff changeset
    96
				// should implement default rule
hgs
parents:
diff changeset
    97
				traceRule = trace.getModel().getExtension(
hgs
parents:
diff changeset
    98
						TraceFormattingRule.class);
hgs
parents:
diff changeset
    99
			}
hgs
parents:
diff changeset
   100
		}
hgs
parents:
diff changeset
   101
		if (traceRule != null) {
hgs
parents:
diff changeset
   102
			format = traceRule.getFormat(trace, formatType);
hgs
parents:
diff changeset
   103
		}
hgs
parents:
diff changeset
   104
		if (format != null && traceRule != null) {
hgs
parents:
diff changeset
   105
			data.append(format);
hgs
parents:
diff changeset
   106
			data.append(SourceConstants.LINE_FEED);
hgs
parents:
diff changeset
   107
			buildParameterList(trace, traceRule, data, formatType, tags,
hgs
parents:
diff changeset
   108
					fixedTags);
hgs
parents:
diff changeset
   109
hgs
parents:
diff changeset
   110
			String traceName = traceRule.mapNameToSource(trace);
hgs
parents:
diff changeset
   111
			String traceGroupName = trace.getGroup().getName();
hgs
parents:
diff changeset
   112
hgs
parents:
diff changeset
   113
			// %NAME% is replaced with rule-mapped trace name
hgs
parents:
diff changeset
   114
			replaceData(data, traceName, TraceFormatConstants.NAME_FORMAT);
hgs
parents:
diff changeset
   115
hgs
parents:
diff changeset
   116
			// %GROUP% is replaced with group name
hgs
parents:
diff changeset
   117
			replaceData(data, traceGroupName, TraceFormatConstants.GROUP_FORMAT);
hgs
parents:
diff changeset
   118
hgs
parents:
diff changeset
   119
			// %TEXT% is replaced with trace text
hgs
parents:
diff changeset
   120
			replaceData(data, "\"" + trace.getTrace() //$NON-NLS-1$
hgs
parents:
diff changeset
   121
					+ "\"", TraceFormatConstants.TEXT_FORMAT); //$NON-NLS-1$
hgs
parents:
diff changeset
   122
hgs
parents:
diff changeset
   123
			// %FORMATTED_TRACE% is replaced with trace data
hgs
parents:
diff changeset
   124
			replaceData(data, trace.getTrace(),
hgs
parents:
diff changeset
   125
					TraceFormatConstants.FORMATTED_TRACE);
hgs
parents:
diff changeset
   126
hgs
parents:
diff changeset
   127
			// Comment is inserted before the trace
hgs
parents:
diff changeset
   128
			int index = data.indexOf(TraceFormatConstants.COMMENT_FORMAT);
hgs
parents:
diff changeset
   129
			if (index >= 0) {
hgs
parents:
diff changeset
   130
				String comment = data.substring(index + 1);
hgs
parents:
diff changeset
   131
				data.delete(index, data.length());
hgs
parents:
diff changeset
   132
				data.insert(0, comment);
hgs
parents:
diff changeset
   133
				data.append(SourceConstants.LINE_FEED);
hgs
parents:
diff changeset
   134
			}
hgs
parents:
diff changeset
   135
		}
hgs
parents:
diff changeset
   136
hgs
parents:
diff changeset
   137
		// If trace does not have formatting, it is not shown in source
hgs
parents:
diff changeset
   138
		return data.toString();
hgs
parents:
diff changeset
   139
	}
hgs
parents:
diff changeset
   140
hgs
parents:
diff changeset
   141
	/**
hgs
parents:
diff changeset
   142
	 * Adds the parameters to the data buffer
hgs
parents:
diff changeset
   143
	 * 
hgs
parents:
diff changeset
   144
	 * @param trace
hgs
parents:
diff changeset
   145
	 *            the trace
hgs
parents:
diff changeset
   146
	 * @param format
hgs
parents:
diff changeset
   147
	 *            the formatter from trace
hgs
parents:
diff changeset
   148
	 * @param data
hgs
parents:
diff changeset
   149
	 *            the data buffer where the formatted data is stored
hgs
parents:
diff changeset
   150
	 * @param formatType
hgs
parents:
diff changeset
   151
	 *            the format type to be applied
hgs
parents:
diff changeset
   152
	 * @param tags
hgs
parents:
diff changeset
   153
	 *            the tags for parameters or null if parameter names are used
hgs
parents:
diff changeset
   154
	 * @param fixedTags
hgs
parents:
diff changeset
   155
	 *            true if the <i>tags</i> iterator is fixed, false if the
hgs
parents:
diff changeset
   156
	 *            contents of <i>tags</i> should go through
hgs
parents:
diff changeset
   157
	 *            <code>SourceRule.mapNameToSource</code>
hgs
parents:
diff changeset
   158
	 */
hgs
parents:
diff changeset
   159
	private static void buildParameterList(Trace trace,
hgs
parents:
diff changeset
   160
			TraceFormattingRule format, StringBuffer data,
hgs
parents:
diff changeset
   161
			TraceFormatType formatType, Iterator<String> tags, boolean fixedTags) {
hgs
parents:
diff changeset
   162
hgs
parents:
diff changeset
   163
		int count = trace.getParameterCount();
hgs
parents:
diff changeset
   164
hgs
parents:
diff changeset
   165
		Iterator<TraceParameter> itr = trace.getParameters();
hgs
parents:
diff changeset
   166
		StringBuffer paramList = new StringBuffer();
hgs
parents:
diff changeset
   167
		// Index is incremented by one for each parameter that has been added to
hgs
parents:
diff changeset
   168
		// source
hgs
parents:
diff changeset
   169
		int parameterIndex = 0;
hgs
parents:
diff changeset
   170
		while (itr.hasNext()) {
hgs
parents:
diff changeset
   171
			TraceParameter param = itr.next();
hgs
parents:
diff changeset
   172
			TraceParameterFormattingRule rule = param
hgs
parents:
diff changeset
   173
					.getExtension(TraceParameterFormattingRule.class);
hgs
parents:
diff changeset
   174
			String name;
hgs
parents:
diff changeset
   175
			// Count and name may be adjusted by rules provided by parameters
hgs
parents:
diff changeset
   176
			if (rule != null) {
hgs
parents:
diff changeset
   177
				boolean isInSource = rule.isShownInSource();
hgs
parents:
diff changeset
   178
				// If the parameter iterator is explicitly provided, the
hgs
parents:
diff changeset
   179
				// parameter name is fetched from it. If the parameter list does
hgs
parents:
diff changeset
   180
				// not have enough tags (for example when a new parameter is
hgs
parents:
diff changeset
   181
				// added to trace) the name of the parameter is used. The source
hgs
parents:
diff changeset
   182
				// rule is used to map the parameter name to correct format
hgs
parents:
diff changeset
   183
				if (isInSource) {
hgs
parents:
diff changeset
   184
					name = getTagWithoutMapping(tags, param);
hgs
parents:
diff changeset
   185
					addParameter(paramList, param, name, ++parameterIndex,
hgs
parents:
diff changeset
   186
							formatType);
hgs
parents:
diff changeset
   187
				} else {
hgs
parents:
diff changeset
   188
					// If the parameter is not shown in source, it is skipped
hgs
parents:
diff changeset
   189
					count--;
hgs
parents:
diff changeset
   190
				}
hgs
parents:
diff changeset
   191
			} else {
hgs
parents:
diff changeset
   192
				// If the parameter is not associated with a source rule, it is
hgs
parents:
diff changeset
   193
				// added without mapping
hgs
parents:
diff changeset
   194
				name = getTagWithoutMapping(tags, param);
hgs
parents:
diff changeset
   195
				addParameter(paramList, param, name, ++parameterIndex,
hgs
parents:
diff changeset
   196
						formatType);
hgs
parents:
diff changeset
   197
			}
hgs
parents:
diff changeset
   198
		}
hgs
parents:
diff changeset
   199
		// %PC% is replaced with adjusted parameter count
hgs
parents:
diff changeset
   200
		// In case of packed trace, the header engine does the count mapping
hgs
parents:
diff changeset
   201
		if (formatType != TraceFormatType.TRACE_PACKED) {
hgs
parents:
diff changeset
   202
			String val = format.mapParameterCountToSource(trace, count);
hgs
parents:
diff changeset
   203
hgs
parents:
diff changeset
   204
			if (trace.getExtension(StateTraceRule.class) != null
hgs
parents:
diff changeset
   205
					&& data.toString().startsWith("OstTraceState")) { //$NON-NLS-1$
hgs
parents:
diff changeset
   206
hgs
parents:
diff changeset
   207
				// In case of State Trace macro value in trace macro is
hgs
parents:
diff changeset
   208
				// parameter count - 2
hgs
parents:
diff changeset
   209
				if (count > 1) {
hgs
parents:
diff changeset
   210
					val = String.valueOf(count - 2); // CodForChk_Dis_Magic
hgs
parents:
diff changeset
   211
				} else {
hgs
parents:
diff changeset
   212
					val = String.valueOf(count);
hgs
parents:
diff changeset
   213
				}
hgs
parents:
diff changeset
   214
			}
hgs
parents:
diff changeset
   215
			replaceData(data, val, TraceFormatConstants.PARAM_COUNT_FORMAT);
hgs
parents:
diff changeset
   216
		}
hgs
parents:
diff changeset
   217
		// %PARAMETERS% is replaced with parameter names
hgs
parents:
diff changeset
   218
		replaceData(data, paramList.toString(),
hgs
parents:
diff changeset
   219
				TraceFormatConstants.PARAMETERS_FORMAT);
hgs
parents:
diff changeset
   220
	}
hgs
parents:
diff changeset
   221
hgs
parents:
diff changeset
   222
	/**
hgs
parents:
diff changeset
   223
	 * Gets the name for a parameter without source rule mapping. If the tags
hgs
parents:
diff changeset
   224
	 * iterator contains a valid entry, the name is fetched from it. If not, the
hgs
parents:
diff changeset
   225
	 * parameter name is used instead.
hgs
parents:
diff changeset
   226
	 * 
hgs
parents:
diff changeset
   227
	 * @param tags
hgs
parents:
diff changeset
   228
	 *            the list of tags
hgs
parents:
diff changeset
   229
	 * @param param
hgs
parents:
diff changeset
   230
	 *            the parameter
hgs
parents:
diff changeset
   231
	 * @return the parameter name
hgs
parents:
diff changeset
   232
	 */
hgs
parents:
diff changeset
   233
	private static String getTagWithoutMapping(Iterator<String> tags,
hgs
parents:
diff changeset
   234
			TraceParameter param) {
hgs
parents:
diff changeset
   235
		String name;
hgs
parents:
diff changeset
   236
		// If the parameter iterator is explicitly provided, the
hgs
parents:
diff changeset
   237
		// parameter name is fetched from it
hgs
parents:
diff changeset
   238
		if (tags != null && tags.hasNext()) {
hgs
parents:
diff changeset
   239
			name = tags.next();
hgs
parents:
diff changeset
   240
			// The list may contain 0-length items to represent
hgs
parents:
diff changeset
   241
			// that that parameter name should be used instead
hgs
parents:
diff changeset
   242
			if (name == null || name.length() == 0) {
hgs
parents:
diff changeset
   243
				name = param.getName();
hgs
parents:
diff changeset
   244
			}
hgs
parents:
diff changeset
   245
		} else {
hgs
parents:
diff changeset
   246
			name = param.getName();
hgs
parents:
diff changeset
   247
		}
hgs
parents:
diff changeset
   248
		return name;
hgs
parents:
diff changeset
   249
	}
hgs
parents:
diff changeset
   250
hgs
parents:
diff changeset
   251
	/**
hgs
parents:
diff changeset
   252
	 * Adds a parameter to the parameter list
hgs
parents:
diff changeset
   253
	 * 
hgs
parents:
diff changeset
   254
	 * @param paramList
hgs
parents:
diff changeset
   255
	 *            the parameter list
hgs
parents:
diff changeset
   256
	 * @param param
hgs
parents:
diff changeset
   257
	 *            the parameter to be added
hgs
parents:
diff changeset
   258
	 * @param name
hgs
parents:
diff changeset
   259
	 *            a name replacement for the parameter
hgs
parents:
diff changeset
   260
	 * @param parameterIndex
hgs
parents:
diff changeset
   261
	 *            the index of the parameter
hgs
parents:
diff changeset
   262
	 * @param formatType
hgs
parents:
diff changeset
   263
	 *            the type of the format
hgs
parents:
diff changeset
   264
	 */
hgs
parents:
diff changeset
   265
	private static void addParameter(StringBuffer paramList,
hgs
parents:
diff changeset
   266
			TraceParameter param, String name, int parameterIndex,
hgs
parents:
diff changeset
   267
			TraceFormatType formatType) {
hgs
parents:
diff changeset
   268
		paramList.append(SourceConstants.PARAMETER_SEPARATOR);
hgs
parents:
diff changeset
   269
		if (formatType == TraceFormatType.HEADER) {
hgs
parents:
diff changeset
   270
			paramList.append(SourceUtils.mapParameterTypeToSymbianType(param));
hgs
parents:
diff changeset
   271
			paramList.append(SourceConstants.SPACE_CHAR);
hgs
parents:
diff changeset
   272
			paramList.append(SymbianConstants.PARAMETER_DECLARATION_PREFIX);
hgs
parents:
diff changeset
   273
			paramList.append(parameterIndex);
hgs
parents:
diff changeset
   274
		} else if (formatType == TraceFormatType.EMPTY_MACRO) {
hgs
parents:
diff changeset
   275
			paramList.append(SymbianConstants.PARAMETER_DECLARATION_PREFIX);
hgs
parents:
diff changeset
   276
			paramList.append(parameterIndex);
hgs
parents:
diff changeset
   277
		}
hgs
parents:
diff changeset
   278
	}
hgs
parents:
diff changeset
   279
hgs
parents:
diff changeset
   280
	/**
hgs
parents:
diff changeset
   281
	 * Replaces data from the stringbuffer
hgs
parents:
diff changeset
   282
	 * 
hgs
parents:
diff changeset
   283
	 * @param data
hgs
parents:
diff changeset
   284
	 *            the data
hgs
parents:
diff changeset
   285
	 * @param replaceData
hgs
parents:
diff changeset
   286
	 *            the data to be used
hgs
parents:
diff changeset
   287
	 * @param replaceFormat
hgs
parents:
diff changeset
   288
	 *            the format to be replaced
hgs
parents:
diff changeset
   289
	 */
hgs
parents:
diff changeset
   290
	private static void replaceData(StringBuffer data, String replaceData,
hgs
parents:
diff changeset
   291
			String replaceFormat) {
hgs
parents:
diff changeset
   292
		TraceCompilerEngineGlobals.getEvents().postInfoMessage(Messages.getString("SourceFormatter.replaceAllBeginText") + replaceFormat + Messages.getString("SourceFormatter.replaceAllMiddleText") + replaceData , null); //$NON-NLS-1$ //$NON-NLS-2$
hgs
parents:
diff changeset
   293
hgs
parents:
diff changeset
   294
		int replaceOffset = 0;
hgs
parents:
diff changeset
   295
		do {
hgs
parents:
diff changeset
   296
			replaceOffset = data.indexOf(replaceFormat, replaceOffset);
hgs
parents:
diff changeset
   297
			if (replaceOffset >= 0) {
hgs
parents:
diff changeset
   298
				data.replace(replaceOffset, replaceOffset
hgs
parents:
diff changeset
   299
						+ replaceFormat.length(), replaceData);
hgs
parents:
diff changeset
   300
				replaceOffset += replaceData.length();
hgs
parents:
diff changeset
   301
			}
hgs
parents:
diff changeset
   302
		} while (replaceOffset != -1);
hgs
parents:
diff changeset
   303
	}
hgs
parents:
diff changeset
   304
hgs
parents:
diff changeset
   305
}