tracesrv/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/RuleUtils.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) 2009 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
 * Utility functions for rules package
hgs
parents:
diff changeset
    17
 *
hgs
parents:
diff changeset
    18
 */
hgs
parents:
diff changeset
    19
package com.nokia.tracecompiler.engine.rules;
hgs
parents:
diff changeset
    20
hgs
parents:
diff changeset
    21
import java.util.Iterator;
hgs
parents:
diff changeset
    22
import java.util.List;
hgs
parents:
diff changeset
    23
hgs
parents:
diff changeset
    24
import com.nokia.tracecompiler.engine.TraceCompilerEngineConfiguration;
hgs
parents:
diff changeset
    25
import com.nokia.tracecompiler.engine.TraceCompilerEngineGlobals;
hgs
parents:
diff changeset
    26
import com.nokia.tracecompiler.model.Trace;
hgs
parents:
diff changeset
    27
import com.nokia.tracecompiler.model.TraceCompilerException;
hgs
parents:
diff changeset
    28
import com.nokia.tracecompiler.model.TraceConstantTable;
hgs
parents:
diff changeset
    29
import com.nokia.tracecompiler.model.TraceModel;
hgs
parents:
diff changeset
    30
import com.nokia.tracecompiler.model.TraceModelExtension;
hgs
parents:
diff changeset
    31
import com.nokia.tracecompiler.model.TraceObjectUtils;
hgs
parents:
diff changeset
    32
import com.nokia.tracecompiler.model.TraceParameter;
hgs
parents:
diff changeset
    33
import com.nokia.tracecompiler.source.ParsedType;
hgs
parents:
diff changeset
    34
import com.nokia.tracecompiler.source.SourceContext;
hgs
parents:
diff changeset
    35
import com.nokia.tracecompiler.source.SourceParserException;
hgs
parents:
diff changeset
    36
import com.nokia.tracecompiler.source.SourceReturn;
hgs
parents:
diff changeset
    37
import com.nokia.tracecompiler.source.TypeMapping;
hgs
parents:
diff changeset
    38
hgs
parents:
diff changeset
    39
/**
hgs
parents:
diff changeset
    40
 * Utility functions for rules package
hgs
parents:
diff changeset
    41
 * 
hgs
parents:
diff changeset
    42
 */
hgs
parents:
diff changeset
    43
public final class RuleUtils {
hgs
parents:
diff changeset
    44
hgs
parents:
diff changeset
    45
	/**
hgs
parents:
diff changeset
    46
	 * Entry-exit template
hgs
parents:
diff changeset
    47
	 */
hgs
parents:
diff changeset
    48
	public static final int TYPE_ENTRY_EXIT = 0; // CodForChk_Dis_Magic
hgs
parents:
diff changeset
    49
hgs
parents:
diff changeset
    50
	/**
hgs
parents:
diff changeset
    51
	 * Start-stop event template
hgs
parents:
diff changeset
    52
	 */
hgs
parents:
diff changeset
    53
	public static final int TYPE_PERF_EVENT = 1; // CodForChk_Dis_Magic
hgs
parents:
diff changeset
    54
hgs
parents:
diff changeset
    55
	/**
hgs
parents:
diff changeset
    56
	 * State trace template
hgs
parents:
diff changeset
    57
	 */
hgs
parents:
diff changeset
    58
	public static final int TYPE_STATE_TRACE = 2; // CodForChk_Dis_Magic
hgs
parents:
diff changeset
    59
hgs
parents:
diff changeset
    60
	/**
hgs
parents:
diff changeset
    61
	 * Trace name format base
hgs
parents:
diff changeset
    62
	 */
hgs
parents:
diff changeset
    63
	static final String NAME_FORMAT_BASE = "{$CN}_{$FN}"; //$NON-NLS-1$
hgs
parents:
diff changeset
    64
hgs
parents:
diff changeset
    65
	/**
hgs
parents:
diff changeset
    66
	 * Trace text format base
hgs
parents:
diff changeset
    67
	 */
hgs
parents:
diff changeset
    68
	static final String TEXT_FORMAT_BASE = "{$cn}::{$fn}"; //$NON-NLS-1$
hgs
parents:
diff changeset
    69
hgs
parents:
diff changeset
    70
	/**
hgs
parents:
diff changeset
    71
	 * Template titles
hgs
parents:
diff changeset
    72
	 */
hgs
parents:
diff changeset
    73
	private static final String[] ENTRY_TEMPLATE_TITLES = {
hgs
parents:
diff changeset
    74
			Messages.getString("RuleUtils.FunctionEntryTitle"), //$NON-NLS-1$
hgs
parents:
diff changeset
    75
			Messages.getString("RuleUtils.PerformanceEventTitle"), //$NON-NLS-1$
hgs
parents:
diff changeset
    76
			Messages.getString("RuleUtils.StateTraceTitle"), //$NON-NLS-1$
hgs
parents:
diff changeset
    77
	};
hgs
parents:
diff changeset
    78
hgs
parents:
diff changeset
    79
	/**
hgs
parents:
diff changeset
    80
	 * Entry name prefixes
hgs
parents:
diff changeset
    81
	 */
hgs
parents:
diff changeset
    82
	public static final String[] ENTRY_NAME_PREFIXES = { "", //$NON-NLS-1$
hgs
parents:
diff changeset
    83
			"EVENT_", //$NON-NLS-1$
hgs
parents:
diff changeset
    84
			"STATE_" //$NON-NLS-1$
hgs
parents:
diff changeset
    85
	};
hgs
parents:
diff changeset
    86
hgs
parents:
diff changeset
    87
	/**
hgs
parents:
diff changeset
    88
	 * Entry name suffixes
hgs
parents:
diff changeset
    89
	 */
hgs
parents:
diff changeset
    90
	public static final String[] ENTRY_NAME_SUFFIXES = { "_ENTRY", //$NON-NLS-1$
hgs
parents:
diff changeset
    91
			"_START", //$NON-NLS-1$
hgs
parents:
diff changeset
    92
			"" //$NON-NLS-1$
hgs
parents:
diff changeset
    93
	};
hgs
parents:
diff changeset
    94
hgs
parents:
diff changeset
    95
	/**
hgs
parents:
diff changeset
    96
	 * Exit name prefixes
hgs
parents:
diff changeset
    97
	 */
hgs
parents:
diff changeset
    98
	private static final String[] EXIT_NAME_PREFIXES = { "", //$NON-NLS-1$
hgs
parents:
diff changeset
    99
			"EVENT_", //$NON-NLS-1$
hgs
parents:
diff changeset
   100
			"" //$NON-NLS-1$
hgs
parents:
diff changeset
   101
	};
hgs
parents:
diff changeset
   102
hgs
parents:
diff changeset
   103
	/**
hgs
parents:
diff changeset
   104
	 * Exit name suffixes
hgs
parents:
diff changeset
   105
	 */
hgs
parents:
diff changeset
   106
	public static final String[] EXIT_NAME_SUFFIXES = { "_EXIT", //$NON-NLS-1$
hgs
parents:
diff changeset
   107
			"_STOP", //$NON-NLS-1$
hgs
parents:
diff changeset
   108
			"" //$NON-NLS-1$
hgs
parents:
diff changeset
   109
	};
hgs
parents:
diff changeset
   110
hgs
parents:
diff changeset
   111
	/**
hgs
parents:
diff changeset
   112
	 * Gets an entry template title
hgs
parents:
diff changeset
   113
	 * 
hgs
parents:
diff changeset
   114
	 * @param type
hgs
parents:
diff changeset
   115
	 *            the template type
hgs
parents:
diff changeset
   116
	 * @return the template title
hgs
parents:
diff changeset
   117
	 */
hgs
parents:
diff changeset
   118
	static String getEntryTemplateTitle(int type) {
hgs
parents:
diff changeset
   119
		return ENTRY_TEMPLATE_TITLES[type];
hgs
parents:
diff changeset
   120
	}
hgs
parents:
diff changeset
   121
hgs
parents:
diff changeset
   122
	/**
hgs
parents:
diff changeset
   123
	 * Creates exit name from entry name
hgs
parents:
diff changeset
   124
	 * 
hgs
parents:
diff changeset
   125
	 * @param entryName
hgs
parents:
diff changeset
   126
	 *            the entry name
hgs
parents:
diff changeset
   127
	 * @param type
hgs
parents:
diff changeset
   128
	 *            the type of entry
hgs
parents:
diff changeset
   129
	 * @return the exit name
hgs
parents:
diff changeset
   130
	 */
hgs
parents:
diff changeset
   131
	static String createExitName(String entryName, int type) {
hgs
parents:
diff changeset
   132
		// Strips the duplicate modifier from the name
hgs
parents:
diff changeset
   133
		entryName = TraceObjectUtils.removeDuplicateModifier(entryName);
hgs
parents:
diff changeset
   134
		StringBuffer sb = new StringBuffer();
hgs
parents:
diff changeset
   135
		if (entryName.startsWith(ENTRY_NAME_PREFIXES[type])) {
hgs
parents:
diff changeset
   136
			entryName = entryName.substring(ENTRY_NAME_PREFIXES[type].length());
hgs
parents:
diff changeset
   137
		}
hgs
parents:
diff changeset
   138
		if (entryName.endsWith(ENTRY_NAME_SUFFIXES[type])) {
hgs
parents:
diff changeset
   139
			entryName = entryName.substring(0, entryName.length()
hgs
parents:
diff changeset
   140
					- ENTRY_NAME_SUFFIXES[type].length());
hgs
parents:
diff changeset
   141
		}
hgs
parents:
diff changeset
   142
		sb.append(EXIT_NAME_PREFIXES[type]);
hgs
parents:
diff changeset
   143
		sb.append(entryName);
hgs
parents:
diff changeset
   144
		sb.append(EXIT_NAME_SUFFIXES[type]);
hgs
parents:
diff changeset
   145
		return sb.toString();
hgs
parents:
diff changeset
   146
	}
hgs
parents:
diff changeset
   147
hgs
parents:
diff changeset
   148
	/**
hgs
parents:
diff changeset
   149
	 * Creates an entry trace name format from type
hgs
parents:
diff changeset
   150
	 * 
hgs
parents:
diff changeset
   151
	 * @param type
hgs
parents:
diff changeset
   152
	 *            the trace format type
hgs
parents:
diff changeset
   153
	 * @return the trace name format
hgs
parents:
diff changeset
   154
	 */
hgs
parents:
diff changeset
   155
	public static String createEntryTraceNameFormat(int type) {
hgs
parents:
diff changeset
   156
		StringBuffer sb = new StringBuffer();
hgs
parents:
diff changeset
   157
		if (type == TYPE_PERF_EVENT || type == TYPE_STATE_TRACE) {
hgs
parents:
diff changeset
   158
			sb.append(NAME_FORMAT_BASE);
hgs
parents:
diff changeset
   159
		} else {
hgs
parents:
diff changeset
   160
			sb.append(ENTRY_NAME_PREFIXES[type]);
hgs
parents:
diff changeset
   161
			sb.append(NAME_FORMAT_BASE);
hgs
parents:
diff changeset
   162
			sb.append(ENTRY_NAME_SUFFIXES[type]);
hgs
parents:
diff changeset
   163
		}
hgs
parents:
diff changeset
   164
		return sb.toString();
hgs
parents:
diff changeset
   165
	}
hgs
parents:
diff changeset
   166
hgs
parents:
diff changeset
   167
	/**
hgs
parents:
diff changeset
   168
	 * Creates an exit trace name format based on type
hgs
parents:
diff changeset
   169
	 * 
hgs
parents:
diff changeset
   170
	 * @param type
hgs
parents:
diff changeset
   171
	 *            the format type
hgs
parents:
diff changeset
   172
	 * @return the trace name format
hgs
parents:
diff changeset
   173
	 */
hgs
parents:
diff changeset
   174
	public static String createExitTraceNameFormat(int type) {
hgs
parents:
diff changeset
   175
		StringBuffer sb = new StringBuffer();
hgs
parents:
diff changeset
   176
		sb.append(EXIT_NAME_PREFIXES[type]);
hgs
parents:
diff changeset
   177
		sb.append(NAME_FORMAT_BASE);
hgs
parents:
diff changeset
   178
		sb.append(EXIT_NAME_SUFFIXES[type]);
hgs
parents:
diff changeset
   179
		return sb.toString();
hgs
parents:
diff changeset
   180
	}
hgs
parents:
diff changeset
   181
hgs
parents:
diff changeset
   182
	/**
hgs
parents:
diff changeset
   183
	 * Gets the return statements from current context from the context manager.
hgs
parents:
diff changeset
   184
	 * 
hgs
parents:
diff changeset
   185
	 * @param returnStatements
hgs
parents:
diff changeset
   186
	 *            the list where the return statements are stored
hgs
parents:
diff changeset
   187
	 */
hgs
parents:
diff changeset
   188
	static void getCurrentContextReturns(List<SourceReturn> returnStatements) {
hgs
parents:
diff changeset
   189
		SourceContext context = TraceCompilerEngineGlobals.getSourceContextManager()
hgs
parents:
diff changeset
   190
				.getContext();
hgs
parents:
diff changeset
   191
		if (context != null) {
hgs
parents:
diff changeset
   192
			try {
hgs
parents:
diff changeset
   193
				context.parseReturnValues(returnStatements);
hgs
parents:
diff changeset
   194
			} catch (SourceParserException e) {
hgs
parents:
diff changeset
   195
				String msg = Messages
hgs
parents:
diff changeset
   196
						.getString("RuleUtils.FailedToParseReturnValues"); //$NON-NLS-1$
hgs
parents:
diff changeset
   197
				String cname = context.getClassName();
hgs
parents:
diff changeset
   198
				String source;
hgs
parents:
diff changeset
   199
				if (cname != null) {
hgs
parents:
diff changeset
   200
					source = cname + "::" + context.getFunctionName(); //$NON-NLS-1$;
hgs
parents:
diff changeset
   201
				} else {
hgs
parents:
diff changeset
   202
					source = context.getFunctionName();
hgs
parents:
diff changeset
   203
				}
hgs
parents:
diff changeset
   204
				TraceCompilerEngineGlobals.getEvents().postErrorMessage(msg, source,
hgs
parents:
diff changeset
   205
						true);
hgs
parents:
diff changeset
   206
			}
hgs
parents:
diff changeset
   207
		} else {
hgs
parents:
diff changeset
   208
			if (TraceCompilerEngineConfiguration.ASSERTIONS_ENABLED) {
hgs
parents:
diff changeset
   209
				TraceCompilerEngineGlobals.getEvents().postAssertionFailed(
hgs
parents:
diff changeset
   210
						"Function return not in function", null); //$NON-NLS-1$
hgs
parents:
diff changeset
   211
			}
hgs
parents:
diff changeset
   212
		}
hgs
parents:
diff changeset
   213
	}
hgs
parents:
diff changeset
   214
hgs
parents:
diff changeset
   215
	/**
hgs
parents:
diff changeset
   216
	 * Checks if the function is static. Currently this is just dummy, checking
hgs
parents:
diff changeset
   217
	 * that the class name exists and the function name is not New / NewL /
hgs
parents:
diff changeset
   218
	 * NewLC
hgs
parents:
diff changeset
   219
	 * 
hgs
parents:
diff changeset
   220
	 * @param context
hgs
parents:
diff changeset
   221
	 *            the context to be checked
hgs
parents:
diff changeset
   222
	 * @return true if static, false if not
hgs
parents:
diff changeset
   223
	 */
hgs
parents:
diff changeset
   224
	static boolean isStaticFunction(SourceContext context) {
hgs
parents:
diff changeset
   225
		boolean retval;
hgs
parents:
diff changeset
   226
		if (context.getClassName() == null) {
hgs
parents:
diff changeset
   227
			retval = true;
hgs
parents:
diff changeset
   228
		} else {
hgs
parents:
diff changeset
   229
			String fname = context.getFunctionName();
hgs
parents:
diff changeset
   230
			if (fname.equals("New") //$NON-NLS-1$
hgs
parents:
diff changeset
   231
					|| fname.equals("NewL") //$NON-NLS-1$
hgs
parents:
diff changeset
   232
					|| fname.equals("NewLC") //$NON-NLS-1$
hgs
parents:
diff changeset
   233
			) {
hgs
parents:
diff changeset
   234
				retval = true;
hgs
parents:
diff changeset
   235
			} else {
hgs
parents:
diff changeset
   236
				retval = false;
hgs
parents:
diff changeset
   237
			}
hgs
parents:
diff changeset
   238
		}
hgs
parents:
diff changeset
   239
		return retval;
hgs
parents:
diff changeset
   240
	}
hgs
parents:
diff changeset
   241
hgs
parents:
diff changeset
   242
	/**
hgs
parents:
diff changeset
   243
	 * Locates a constant table based on type definition parsed from source
hgs
parents:
diff changeset
   244
	 * 
hgs
parents:
diff changeset
   245
	 * @param model
hgs
parents:
diff changeset
   246
	 *            the trace model
hgs
parents:
diff changeset
   247
	 * @param type
hgs
parents:
diff changeset
   248
	 *            the parameter type
hgs
parents:
diff changeset
   249
	 * @return the constant table or null if not found
hgs
parents:
diff changeset
   250
	 */
hgs
parents:
diff changeset
   251
	static TraceConstantTable findConstantTableByType(TraceModel model,
hgs
parents:
diff changeset
   252
			ParsedType type) {
hgs
parents:
diff changeset
   253
		Iterator<TraceConstantTable> tables = model.getConstantTables();
hgs
parents:
diff changeset
   254
		TraceConstantTable foundTable = null;
hgs
parents:
diff changeset
   255
		while (tables.hasNext() && foundTable == null) {
hgs
parents:
diff changeset
   256
			TraceConstantTable table = tables.next();
hgs
parents:
diff changeset
   257
			if (type.typeEquals(table.getName())) {
hgs
parents:
diff changeset
   258
				foundTable = table;
hgs
parents:
diff changeset
   259
			}
hgs
parents:
diff changeset
   260
		}
hgs
parents:
diff changeset
   261
		return foundTable;
hgs
parents:
diff changeset
   262
	}
hgs
parents:
diff changeset
   263
hgs
parents:
diff changeset
   264
	/**
hgs
parents:
diff changeset
   265
	 * Creates a parameter based on TypeMapping definition
hgs
parents:
diff changeset
   266
	 * 
hgs
parents:
diff changeset
   267
	 * @param owner
hgs
parents:
diff changeset
   268
	 *            the parameter owner
hgs
parents:
diff changeset
   269
	 * @param name
hgs
parents:
diff changeset
   270
	 *            the parameter name
hgs
parents:
diff changeset
   271
	 * @param type
hgs
parents:
diff changeset
   272
	 *            the type mapping
hgs
parents:
diff changeset
   273
	 * @return the parameter
hgs
parents:
diff changeset
   274
	 * @throws TraceCompilerException
hgs
parents:
diff changeset
   275
	 *             if parameter cannot be created
hgs
parents:
diff changeset
   276
	 */
hgs
parents:
diff changeset
   277
	static TraceParameter createParameterFromType(Trace owner, String name,
hgs
parents:
diff changeset
   278
			TypeMapping type) throws TraceCompilerException {
hgs
parents:
diff changeset
   279
		int id = owner.getNextParameterID();
hgs
parents:
diff changeset
   280
		owner.getModel().getVerifier().checkTraceParameterProperties(owner,
hgs
parents:
diff changeset
   281
				null, id, name, type.type);
hgs
parents:
diff changeset
   282
		TraceModelExtension[] extensions = null;
hgs
parents:
diff changeset
   283
		if (type.needsCasting || type.valueToPointer
hgs
parents:
diff changeset
   284
				|| type.type.equals(TraceParameter.TIME)) {
hgs
parents:
diff changeset
   285
			extensions = new TraceModelExtension[1];
hgs
parents:
diff changeset
   286
			extensions[0] = new ParameterTypeMappingRule(type);
hgs
parents:
diff changeset
   287
		}
hgs
parents:
diff changeset
   288
		TraceParameter parameter = owner.getModel().getFactory()
hgs
parents:
diff changeset
   289
				.createTraceParameter(owner, id, name, type.type, extensions);
hgs
parents:
diff changeset
   290
		return parameter;
hgs
parents:
diff changeset
   291
	}
hgs
parents:
diff changeset
   292
hgs
parents:
diff changeset
   293
	/**
hgs
parents:
diff changeset
   294
	 * Creates a parameter object from constant table
hgs
parents:
diff changeset
   295
	 * 
hgs
parents:
diff changeset
   296
	 * @param owner
hgs
parents:
diff changeset
   297
	 *            the parameter owner
hgs
parents:
diff changeset
   298
	 * @param name
hgs
parents:
diff changeset
   299
	 *            the name for the parameter
hgs
parents:
diff changeset
   300
	 * @param table
hgs
parents:
diff changeset
   301
	 *            the constant table
hgs
parents:
diff changeset
   302
	 * @return the parameter
hgs
parents:
diff changeset
   303
	 * @throws TraceCompilerException
hgs
parents:
diff changeset
   304
	 *             if parameter cannot be created
hgs
parents:
diff changeset
   305
	 */
hgs
parents:
diff changeset
   306
	static TraceParameter createParameterFromConstantTable(Trace owner,
hgs
parents:
diff changeset
   307
			String name, TraceConstantTable table) throws TraceCompilerException {
hgs
parents:
diff changeset
   308
		int id = owner.getNextParameterID();
hgs
parents:
diff changeset
   309
		owner.getModel().getVerifier().checkTraceParameterProperties(owner,
hgs
parents:
diff changeset
   310
				null, id, name, table.getType());
hgs
parents:
diff changeset
   311
		// Constant tables need a cast to constant table type
hgs
parents:
diff changeset
   312
		TypeMapping type = new TypeMapping(table.getType());
hgs
parents:
diff changeset
   313
		type.needsCasting = true;
hgs
parents:
diff changeset
   314
		TraceModelExtension[] extensions = new TraceModelExtension[1];
hgs
parents:
diff changeset
   315
		extensions[0] = new ParameterTypeMappingRule(type);
hgs
parents:
diff changeset
   316
		return owner.getModel().getFactory().createTraceParameter(owner, id,
hgs
parents:
diff changeset
   317
				name, table.getName(), extensions);
hgs
parents:
diff changeset
   318
	}
hgs
parents:
diff changeset
   319
hgs
parents:
diff changeset
   320
}