tracesrv/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/TraceLocationConverter.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) 2008-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
 * Location converter monitors locations and converts them to traces if necessary.
hgs
parents:
diff changeset
    17
 *
hgs
parents:
diff changeset
    18
 */
hgs
parents:
diff changeset
    19
package com.nokia.tracecompiler.engine;
hgs
parents:
diff changeset
    20
hgs
parents:
diff changeset
    21
import java.io.*;
hgs
parents:
diff changeset
    22
import java.util.ArrayList;
hgs
parents:
diff changeset
    23
import java.util.HashMap;
hgs
parents:
diff changeset
    24
import java.util.Iterator;
hgs
parents:
diff changeset
    25
import java.util.Map;
hgs
parents:
diff changeset
    26
import java.util.Properties;
hgs
parents:
diff changeset
    27
hgs
parents:
diff changeset
    28
import com.nokia.tracecompiler.TraceCompilerConstants;
hgs
parents:
diff changeset
    29
import com.nokia.tracecompiler.TraceCompilerLogger;
hgs
parents:
diff changeset
    30
import com.nokia.tracecompiler.engine.TraceCompilerEngineErrorCodes.TraceCompilerErrorCode;
hgs
parents:
diff changeset
    31
import com.nokia.tracecompiler.engine.project.ProjectConstants;
hgs
parents:
diff changeset
    32
import com.nokia.tracecompiler.engine.project.ProjectEngine;
hgs
parents:
diff changeset
    33
import com.nokia.tracecompiler.engine.project.SortedProperties;
hgs
parents:
diff changeset
    34
import com.nokia.tracecompiler.engine.project.TraceIDCache;
hgs
parents:
diff changeset
    35
import com.nokia.tracecompiler.engine.rules.PerformanceEventRuleBase;
hgs
parents:
diff changeset
    36
import com.nokia.tracecompiler.engine.rules.StateTraceRule;
hgs
parents:
diff changeset
    37
import com.nokia.tracecompiler.engine.source.SourceParserRule;
hgs
parents:
diff changeset
    38
import com.nokia.tracecompiler.engine.source.SourceProperties;
hgs
parents:
diff changeset
    39
import com.nokia.tracecompiler.engine.source.SourceParserRule.ParameterConversionResult;
hgs
parents:
diff changeset
    40
import com.nokia.tracecompiler.engine.source.SourceParserRule.TraceConversionResult;
hgs
parents:
diff changeset
    41
import com.nokia.tracecompiler.model.Trace;
hgs
parents:
diff changeset
    42
import com.nokia.tracecompiler.model.TraceCompilerException;
hgs
parents:
diff changeset
    43
import com.nokia.tracecompiler.model.TraceGroup;
hgs
parents:
diff changeset
    44
import com.nokia.tracecompiler.model.TraceModel;
hgs
parents:
diff changeset
    45
import com.nokia.tracecompiler.model.TraceModelExtension;
hgs
parents:
diff changeset
    46
import com.nokia.tracecompiler.model.TraceModelPersistentExtension;
hgs
parents:
diff changeset
    47
import com.nokia.tracecompiler.model.TraceParameter;
hgs
parents:
diff changeset
    48
import com.nokia.tracecompiler.project.FormattingUtils;
hgs
parents:
diff changeset
    49
import com.nokia.tracecompiler.project.GroupNames;
hgs
parents:
diff changeset
    50
import com.nokia.tracecompiler.project.ProjectUtils;
hgs
parents:
diff changeset
    51
import com.nokia.tracecompiler.source.SourceConstants;
hgs
parents:
diff changeset
    52
hgs
parents:
diff changeset
    53
/**
hgs
parents:
diff changeset
    54
 * Location converter monitors locations and converts them to traces if
hgs
parents:
diff changeset
    55
 * necessary.
hgs
parents:
diff changeset
    56
 * 
hgs
parents:
diff changeset
    57
 */
hgs
parents:
diff changeset
    58
public final class TraceLocationConverter {
hgs
parents:
diff changeset
    59
hgs
parents:
diff changeset
    60
	/**
hgs
parents:
diff changeset
    61
	 * Number of deprecated groups
hgs
parents:
diff changeset
    62
	 */
hgs
parents:
diff changeset
    63
	final static int NUMBER_OF_DEPRECATED_GROUPS = 3;
hgs
parents:
diff changeset
    64
hgs
parents:
diff changeset
    65
	/**
hgs
parents:
diff changeset
    66
	 * Deprecated group name map
hgs
parents:
diff changeset
    67
	 */
hgs
parents:
diff changeset
    68
	Map<String, String> deprecatedGroupNameMap = new HashMap<String, String>(
hgs
parents:
diff changeset
    69
			NUMBER_OF_DEPRECATED_GROUPS);
hgs
parents:
diff changeset
    70
hgs
parents:
diff changeset
    71
	/**
hgs
parents:
diff changeset
    72
	 * Trace model
hgs
parents:
diff changeset
    73
	 */
hgs
parents:
diff changeset
    74
	private TraceModel model;
hgs
parents:
diff changeset
    75
hgs
parents:
diff changeset
    76
	/**
hgs
parents:
diff changeset
    77
	 * Constructor
hgs
parents:
diff changeset
    78
	 * 
hgs
parents:
diff changeset
    79
	 * @param model
hgs
parents:
diff changeset
    80
	 *            the trace model
hgs
parents:
diff changeset
    81
	 */
hgs
parents:
diff changeset
    82
	TraceLocationConverter(TraceModel model) {
hgs
parents:
diff changeset
    83
		this.model = model;
hgs
parents:
diff changeset
    84
		initializeDeprecatedGroupNameMap();
hgs
parents:
diff changeset
    85
	}
hgs
parents:
diff changeset
    86
hgs
parents:
diff changeset
    87
	/**
hgs
parents:
diff changeset
    88
	 * Initialize deprecated group name map
hgs
parents:
diff changeset
    89
	 */
hgs
parents:
diff changeset
    90
	private void initializeDeprecatedGroupNameMap() {
hgs
parents:
diff changeset
    91
		deprecatedGroupNameMap.put(GroupNames.TRACE_API,
hgs
parents:
diff changeset
    92
				GroupNames.TRACE_BORDER);
hgs
parents:
diff changeset
    93
		deprecatedGroupNameMap.put(GroupNames.TRACE_DEBUG,
hgs
parents:
diff changeset
    94
				GroupNames.TRACE_DUMP);
hgs
parents:
diff changeset
    95
		deprecatedGroupNameMap.put(GroupNames.TRACE_DETAILED,
hgs
parents:
diff changeset
    96
				GroupNames.TRACE_INTERNALS);
hgs
parents:
diff changeset
    97
	}
hgs
parents:
diff changeset
    98
hgs
parents:
diff changeset
    99
	/**
hgs
parents:
diff changeset
   100
	 * Source opened notification
hgs
parents:
diff changeset
   101
	 * 
hgs
parents:
diff changeset
   102
	 * @param properties
hgs
parents:
diff changeset
   103
	 *            the source properties
hgs
parents:
diff changeset
   104
	 * @throws TraceCompilerException 
hgs
parents:
diff changeset
   105
	 */
hgs
parents:
diff changeset
   106
	void sourceOpened(SourceProperties properties) throws TraceCompilerException {
hgs
parents:
diff changeset
   107
		//make sure all errors are reported AFTER processing a file
hgs
parents:
diff changeset
   108
		TraceCompilerEngineGlobals.getSourceContextManager()
hgs
parents:
diff changeset
   109
				.setConverting(true);
hgs
parents:
diff changeset
   110
		model.startProcessing();
hgs
parents:
diff changeset
   111
		try {
hgs
parents:
diff changeset
   112
			// Load fixed group and trace ids from definition file to model
hgs
parents:
diff changeset
   113
			//no errors are reported here 
hgs
parents:
diff changeset
   114
			if (model.getFixedIds() == null) {
hgs
parents:
diff changeset
   115
				loadFixedIdsFromDefinitionFileToModel();
hgs
parents:
diff changeset
   116
			}
hgs
parents:
diff changeset
   117
hgs
parents:
diff changeset
   118
			for (TraceLocation loc : properties) {
hgs
parents:
diff changeset
   119
				autoConvertLocation(loc);
hgs
parents:
diff changeset
   120
			}
hgs
parents:
diff changeset
   121
			// If there are duplicates or unused traces, they are removed
hgs
parents:
diff changeset
   122
			// Note that this will work across source files although this
hgs
parents:
diff changeset
   123
			// function is processing only one file.
hgs
parents:
diff changeset
   124
			// If a trace is created, all locations from all open source files
hgs
parents:
diff changeset
   125
			// are linked to that trace and thus it will be removed as
hgs
parents:
diff changeset
   126
			// duplicate.
hgs
parents:
diff changeset
   127
			removeDuplicateTraces();
hgs
parents:
diff changeset
   128
hgs
parents:
diff changeset
   129
		} finally {
hgs
parents:
diff changeset
   130
			model.processingComplete();
hgs
parents:
diff changeset
   131
			SourceContextManager manager = TraceCompilerEngineGlobals
hgs
parents:
diff changeset
   132
					.getSourceContextManager();
hgs
parents:
diff changeset
   133
			manager.setConverting(false);
hgs
parents:
diff changeset
   134
			manager.setContext(null);
hgs
parents:
diff changeset
   135
		}
hgs
parents:
diff changeset
   136
	}
hgs
parents:
diff changeset
   137
hgs
parents:
diff changeset
   138
	/**
hgs
parents:
diff changeset
   139
	 * Load fixed Ids from definiton file to properties
hgs
parents:
diff changeset
   140
	 * 
hgs
parents:
diff changeset
   141
	 */
hgs
parents:
diff changeset
   142
	private void loadFixedIdsFromDefinitionFileToModel() {
hgs
parents:
diff changeset
   143
		TraceIDCache cache = model.getExtension(TraceIDCache.class);
hgs
parents:
diff changeset
   144
hgs
parents:
diff changeset
   145
		// Create trace Id cache if it does not exist
hgs
parents:
diff changeset
   146
		try {
hgs
parents:
diff changeset
   147
			if (cache == null) {
hgs
parents:
diff changeset
   148
				String path;
hgs
parents:
diff changeset
   149
				path = ProjectUtils.getLocationForFile(model,
hgs
parents:
diff changeset
   150
						ProjectEngine.traceFolderName,
hgs
parents:
diff changeset
   151
						ProjectConstants.FIXED_ID_DEFINITIONS_FILE_NAME, false);
hgs
parents:
diff changeset
   152
				if (path != null) {
hgs
parents:
diff changeset
   153
					cache = new TraceIDCache(new File(path).getParent());
hgs
parents:
diff changeset
   154
					model.addExtension(cache);
hgs
parents:
diff changeset
   155
				}
hgs
parents:
diff changeset
   156
			}
hgs
parents:
diff changeset
   157
			if (cache != null) {
hgs
parents:
diff changeset
   158
				File cacheFile = new File(cache.getAbsolutePath());
hgs
parents:
diff changeset
   159
				// Try to load Ids from trace Id cache file
hgs
parents:
diff changeset
   160
				try {
hgs
parents:
diff changeset
   161
					SortedProperties fixedIds = new SortedProperties();
hgs
parents:
diff changeset
   162
					if (cacheFile.exists()) {
hgs
parents:
diff changeset
   163
						String thisLine;
hgs
parents:
diff changeset
   164
						boolean allOldFixedIdsAreValid = true;
hgs
parents:
diff changeset
   165
						String group = model.GROUP_PROPERTY_PREFIX;
hgs
parents:
diff changeset
   166
						FileInputStream fis = new FileInputStream(cacheFile);
hgs
parents:
diff changeset
   167
						BufferedReader myInput = new BufferedReader(
hgs
parents:
diff changeset
   168
								new InputStreamReader(fis));
hgs
parents:
diff changeset
   169
						// Read the old fixed id definition file
hgs
parents:
diff changeset
   170
						while ((thisLine = myInput.readLine()) != null) {
hgs
parents:
diff changeset
   171
							if (thisLine.indexOf(group) != -1) {
hgs
parents:
diff changeset
   172
								thisLine = thisLine.substring(group.length(),
hgs
parents:
diff changeset
   173
										thisLine.length());
hgs
parents:
diff changeset
   174
								if (!searchForOldGroupIds(thisLine)) {						
hgs
parents:
diff changeset
   175
									String msg  = Messages.getString("TraceLocationConverter.GroupIdValueError"); //$NON-NLS-1$
hgs
parents:
diff changeset
   176
									TraceCompilerEngineGlobals.getEvents().postWarningMessage(msg, null);
hgs
parents:
diff changeset
   177
									// We need only one old invalid id to make all of them invalid
hgs
parents:
diff changeset
   178
									allOldFixedIdsAreValid = false;
hgs
parents:
diff changeset
   179
									break;
hgs
parents:
diff changeset
   180
								}
hgs
parents:
diff changeset
   181
							}
hgs
parents:
diff changeset
   182
						}
hgs
parents:
diff changeset
   183
						fis.close();
hgs
parents:
diff changeset
   184
						
hgs
parents:
diff changeset
   185
						if (allOldFixedIdsAreValid) {
hgs
parents:
diff changeset
   186
							// Create file input stream again
hgs
parents:
diff changeset
   187
							FileInputStream newFis = new FileInputStream(cacheFile);
hgs
parents:
diff changeset
   188
							fixedIds.load(newFis);
hgs
parents:
diff changeset
   189
							// Load fixed Ids from properties to model
hgs
parents:
diff changeset
   190
							model.setFixedIds(fixedIds);
hgs
parents:
diff changeset
   191
							newFis.close();
hgs
parents:
diff changeset
   192
						}
hgs
parents:
diff changeset
   193
						
hgs
parents:
diff changeset
   194
					}
hgs
parents:
diff changeset
   195
				} catch (IOException e) {
hgs
parents:
diff changeset
   196
					// If there is a problem with the cache file, just delete it
hgs
parents:
diff changeset
   197
					// make sure the model fixed ids is null
hgs
parents:
diff changeset
   198
					model.setFixedIds(null);
hgs
parents:
diff changeset
   199
					cacheFile.delete();
hgs
parents:
diff changeset
   200
					// We do not raise an exception but we need to report a info
hgs
parents:
diff changeset
   201
					TraceCompilerLogger.printWarning(Messages.getString("TraceLocationConverter.FixedIdProblemWarningBeginText") + cacheFile.toString() + Messages.getString("TraceLocationConverter.FixedIdProblemWarningMiddleText") + e.getMessage()); //$NON-NLS-1$ //$NON-NLS-2$
hgs
parents:
diff changeset
   202
				}
hgs
parents:
diff changeset
   203
			}
hgs
parents:
diff changeset
   204
		} catch (TraceCompilerException e) {
hgs
parents:
diff changeset
   205
			// This exception can probably be ignored
hgs
parents:
diff changeset
   206
			TraceCompilerLogger.printWarning("Could not create ID cache : " + e.getMessage()); //$NON-NLS-1$
hgs
parents:
diff changeset
   207
		}
hgs
parents:
diff changeset
   208
	}
hgs
parents:
diff changeset
   209
hgs
parents:
diff changeset
   210
	/**
hgs
parents:
diff changeset
   211
	 * Searches the fixed_id file to see if there are any old definitions
hgs
parents:
diff changeset
   212
	 * 
hgs
parents:
diff changeset
   213
	 * @param string
hgs
parents:
diff changeset
   214
	 *            of text from the fixed_id files
hgs
parents:
diff changeset
   215
	 * @return boolean 
hgs
parents:
diff changeset
   216
	 */
hgs
parents:
diff changeset
   217
	public static boolean searchForOldGroupIds(String str) {
hgs
parents:
diff changeset
   218
		
hgs
parents:
diff changeset
   219
		boolean oldGroupIdValid = true;
hgs
parents:
diff changeset
   220
hgs
parents:
diff changeset
   221
		//get group name from the string
hgs
parents:
diff changeset
   222
		int index = str.indexOf(SourceConstants.ASSIGN_WITH_OUT_SPACES);
hgs
parents:
diff changeset
   223
		if (index == -1) {
hgs
parents:
diff changeset
   224
			//not valid string, so ignore it, just return success
hgs
parents:
diff changeset
   225
			return true;
hgs
parents:
diff changeset
   226
		}
hgs
parents:
diff changeset
   227
hgs
parents:
diff changeset
   228
		String groupName = str.substring(0, index);
hgs
parents:
diff changeset
   229
hgs
parents:
diff changeset
   230
		//get group id
hgs
parents:
diff changeset
   231
		str = str.substring(str.indexOf(SourceConstants.HEX_PREFIX) + 2, str
hgs
parents:
diff changeset
   232
				.length());
hgs
parents:
diff changeset
   233
hgs
parents:
diff changeset
   234
		int groupId = -1;
hgs
parents:
diff changeset
   235
hgs
parents:
diff changeset
   236
		try {
hgs
parents:
diff changeset
   237
			groupId = Integer.parseInt(str.trim(),
hgs
parents:
diff changeset
   238
					TraceCompilerConstants.HEX_RADIX);
hgs
parents:
diff changeset
   239
		} catch (NumberFormatException e) {
hgs
parents:
diff changeset
   240
			//it's not an hex number so fail
hgs
parents:
diff changeset
   241
			oldGroupIdValid = false;
hgs
parents:
diff changeset
   242
		}
hgs
parents:
diff changeset
   243
hgs
parents:
diff changeset
   244
		//get group id from ost header file
hgs
parents:
diff changeset
   245
		int fileGroupId = GroupNames.getIdByName(groupName);
hgs
parents:
diff changeset
   246
hgs
parents:
diff changeset
   247
		if (fileGroupId != 0) {
hgs
parents:
diff changeset
   248
			//found 1
hgs
parents:
diff changeset
   249
			if (fileGroupId != groupId) //group id has changed, so old one can't be used
hgs
parents:
diff changeset
   250
				oldGroupIdValid = false;
hgs
parents:
diff changeset
   251
		} else {
hgs
parents:
diff changeset
   252
			if ((GroupNames.USER_GROUP_ID_FIRST > groupId)
hgs
parents:
diff changeset
   253
					|| (groupId > GroupNames.USER_GROUP_ID_LAST)) //not within new user defined Ids
hgs
parents:
diff changeset
   254
				oldGroupIdValid = false;
hgs
parents:
diff changeset
   255
		}
hgs
parents:
diff changeset
   256
hgs
parents:
diff changeset
   257
		return oldGroupIdValid;
hgs
parents:
diff changeset
   258
	}
hgs
parents:
diff changeset
   259
hgs
parents:
diff changeset
   260
	/**
hgs
parents:
diff changeset
   261
	 * Converts the given location to trace if parser supports auto-conversion
hgs
parents:
diff changeset
   262
	 * 
hgs
parents:
diff changeset
   263
	 * @param location
hgs
parents:
diff changeset
   264
	 *            the location
hgs
parents:
diff changeset
   265
	 */
hgs
parents:
diff changeset
   266
	private void autoConvertLocation(TraceLocation location) {
hgs
parents:
diff changeset
   267
		// Stores the context of the location to the context manager.
hgs
parents:
diff changeset
   268
		TraceCompilerEngineGlobals.getSourceContextManager().setContext(
hgs
parents:
diff changeset
   269
				location.getParser().getContext(location.getOffset()));
hgs
parents:
diff changeset
   270
		Trace trace = location.getTrace();
hgs
parents:
diff changeset
   271
		if (trace == null) {
hgs
parents:
diff changeset
   272
			// If the trace does not exist, the parser determines if the
hgs
parents:
diff changeset
   273
			// location can be converted
hgs
parents:
diff changeset
   274
			if (location.getParserRule().getLocationParser()
hgs
parents:
diff changeset
   275
					.isLocationConverted(location)) {
hgs
parents:
diff changeset
   276
				try {
hgs
parents:
diff changeset
   277
					convertLocation(location, null, true);
hgs
parents:
diff changeset
   278
				} catch (TraceCompilerException e) {
hgs
parents:
diff changeset
   279
					// If converter fails, the error code is stored into the
hgs
parents:
diff changeset
   280
					// location. The location notifies all validity listeners
hgs
parents:
diff changeset
   281
					// about the change
hgs
parents:
diff changeset
   282
					location.setConverterErrorCode((TraceCompilerErrorCode) e
hgs
parents:
diff changeset
   283
							.getErrorCode(), e.getErrorParameters());
hgs
parents:
diff changeset
   284
				}
hgs
parents:
diff changeset
   285
			}
hgs
parents:
diff changeset
   286
		} else {
hgs
parents:
diff changeset
   287
			// If the trace already exists in the model, it is updated
hgs
parents:
diff changeset
   288
			// based on the source file contents
hgs
parents:
diff changeset
   289
			updateLocation(location);
hgs
parents:
diff changeset
   290
		}
hgs
parents:
diff changeset
   291
	}
hgs
parents:
diff changeset
   292
hgs
parents:
diff changeset
   293
	/**
hgs
parents:
diff changeset
   294
	 * Recreates the trace from changed location when source is saved
hgs
parents:
diff changeset
   295
	 * 
hgs
parents:
diff changeset
   296
	 * @param location
hgs
parents:
diff changeset
   297
	 *            the location to be checked
hgs
parents:
diff changeset
   298
	 */
hgs
parents:
diff changeset
   299
	private void updateLocation(TraceLocation location) {
hgs
parents:
diff changeset
   300
		// Parser determines if the location can be converted
hgs
parents:
diff changeset
   301
		if (location.getParserRule().getLocationParser().isLocationConverted(
hgs
parents:
diff changeset
   302
				location)) {
hgs
parents:
diff changeset
   303
			try {
hgs
parents:
diff changeset
   304
				Trace trace = location.getTrace();
hgs
parents:
diff changeset
   305
				// If a location has changed, the old trace is removed
hgs
parents:
diff changeset
   306
				// and a new one created. Persistent extensions are moved to the
hgs
parents:
diff changeset
   307
				// new trace
hgs
parents:
diff changeset
   308
				Iterator<TraceModelPersistentExtension> extensions = null;
hgs
parents:
diff changeset
   309
				if (trace != null) {
hgs
parents:
diff changeset
   310
					extensions = trace
hgs
parents:
diff changeset
   311
							.getExtensions(TraceModelPersistentExtension.class);
hgs
parents:
diff changeset
   312
					trace.getGroup().removeTrace(trace);
hgs
parents:
diff changeset
   313
				}
hgs
parents:
diff changeset
   314
				convertLocation(location, extensions, true);
hgs
parents:
diff changeset
   315
hgs
parents:
diff changeset
   316
				// Check that the location is inside a function. Otherwise throw
hgs
parents:
diff changeset
   317
				// an error because the code is unreachable
hgs
parents:
diff changeset
   318
				if (location.getFunctionName() == null) {
hgs
parents:
diff changeset
   319
					throw new TraceCompilerException(
hgs
parents:
diff changeset
   320
							TraceCompilerErrorCode.UNREACHABLE_TRACE_LOCATION);
hgs
parents:
diff changeset
   321
				}
hgs
parents:
diff changeset
   322
hgs
parents:
diff changeset
   323
			} catch (TraceCompilerException e) {
hgs
parents:
diff changeset
   324
				// If converter fails, the error code is stored into the
hgs
parents:
diff changeset
   325
				// location. The location notifies all validity listeners about
hgs
parents:
diff changeset
   326
				// the change
hgs
parents:
diff changeset
   327
				location.setConverterErrorCode((TraceCompilerErrorCode) e
hgs
parents:
diff changeset
   328
						.getErrorCode(), e.getErrorParameters());
hgs
parents:
diff changeset
   329
			}
hgs
parents:
diff changeset
   330
		}
hgs
parents:
diff changeset
   331
	}
hgs
parents:
diff changeset
   332
hgs
parents:
diff changeset
   333
	/**
hgs
parents:
diff changeset
   334
	 * Removes all duplicate traces from the model
hgs
parents:
diff changeset
   335
	 * @throws TraceCompilerException 
hgs
parents:
diff changeset
   336
	 */
hgs
parents:
diff changeset
   337
	private void removeDuplicateTraces() throws TraceCompilerException {
hgs
parents:
diff changeset
   338
		boolean groupRemoved = true;
hgs
parents:
diff changeset
   339
		while (groupRemoved) {
hgs
parents:
diff changeset
   340
			groupRemoved = false;
hgs
parents:
diff changeset
   341
			for (TraceGroup group : model) {
hgs
parents:
diff changeset
   342
				removeDuplicateTracesFromGroup(group);
hgs
parents:
diff changeset
   343
				if (!group.hasTraces()) {
hgs
parents:
diff changeset
   344
					model.removeGroup(group);
hgs
parents:
diff changeset
   345
					groupRemoved = true;
hgs
parents:
diff changeset
   346
					break;
hgs
parents:
diff changeset
   347
				}
hgs
parents:
diff changeset
   348
			}
hgs
parents:
diff changeset
   349
		}
hgs
parents:
diff changeset
   350
	}
hgs
parents:
diff changeset
   351
hgs
parents:
diff changeset
   352
	/**
hgs
parents:
diff changeset
   353
	 * Removes duplicate traces from a trace group
hgs
parents:
diff changeset
   354
	 * 
hgs
parents:
diff changeset
   355
	 * @param group
hgs
parents:
diff changeset
   356
	 *            the group
hgs
parents:
diff changeset
   357
	 * @throws TraceCompilerException 
hgs
parents:
diff changeset
   358
	 */
hgs
parents:
diff changeset
   359
	private void removeDuplicateTracesFromGroup(TraceGroup group) throws TraceCompilerException {
hgs
parents:
diff changeset
   360
		boolean traceRemoved = true;
hgs
parents:
diff changeset
   361
		while (traceRemoved) {
hgs
parents:
diff changeset
   362
			traceRemoved = false;
hgs
parents:
diff changeset
   363
			for (Trace trace : group) {
hgs
parents:
diff changeset
   364
				TraceLocationList list = trace
hgs
parents:
diff changeset
   365
						.getExtension(TraceLocationList.class);
hgs
parents:
diff changeset
   366
				if (list != null) {
hgs
parents:
diff changeset
   367
					if (list.getLocationCount() > 1) {
hgs
parents:
diff changeset
   368
						// All the locations are marked as duplicates and the
hgs
parents:
diff changeset
   369
						// trace is deleted
hgs
parents:
diff changeset
   370
						TraceCompilerErrorCode code = TraceCompilerErrorCode.TRACE_HAS_MULTIPLE_LOCATIONS;
hgs
parents:
diff changeset
   371
						for (LocationProperties loc : list) {
hgs
parents:
diff changeset
   372
							((TraceLocation) loc).setConverterErrorCode(code,
hgs
parents:
diff changeset
   373
									null);
hgs
parents:
diff changeset
   374
						}
hgs
parents:
diff changeset
   375
						group.removeTrace(trace);
hgs
parents:
diff changeset
   376
						traceRemoved = true;
hgs
parents:
diff changeset
   377
						break;
hgs
parents:
diff changeset
   378
					}
hgs
parents:
diff changeset
   379
				}
hgs
parents:
diff changeset
   380
			}
hgs
parents:
diff changeset
   381
		}
hgs
parents:
diff changeset
   382
	}
hgs
parents:
diff changeset
   383
hgs
parents:
diff changeset
   384
	/**
hgs
parents:
diff changeset
   385
	 * Converts a location to a Trace object.
hgs
parents:
diff changeset
   386
	 * 
hgs
parents:
diff changeset
   387
	 * @param location
hgs
parents:
diff changeset
   388
	 *            the location to be converted
hgs
parents:
diff changeset
   389
	 * @param extensions
hgs
parents:
diff changeset
   390
	 *            persistent extensions to be added to the new trace
hgs
parents:
diff changeset
   391
	 * @param autoConvert
hgs
parents:
diff changeset
   392
	 *            true if converting without user interaction
hgs
parents:
diff changeset
   393
	 * @return the new trace
hgs
parents:
diff changeset
   394
	 * @throws TraceCompilerException
hgs
parents:
diff changeset
   395
	 *             if conversion fails
hgs
parents:
diff changeset
   396
	 */
hgs
parents:
diff changeset
   397
	private Trace convertLocation(TraceLocation location,
hgs
parents:
diff changeset
   398
			Iterator<TraceModelPersistentExtension> extensions,
hgs
parents:
diff changeset
   399
			boolean autoConvert) throws TraceCompilerException {
hgs
parents:
diff changeset
   400
		Trace trace = null;
hgs
parents:
diff changeset
   401
		// If the parser has failed, the validity code is not OK and the
hgs
parents:
diff changeset
   402
		// location cannot be converted. Traces marked with no-trace error code
hgs
parents:
diff changeset
   403
		// have not yet been converted, so that is OK. Traces that have
hgs
parents:
diff changeset
   404
		// duplicate ID's error code can be parsed, since the duplicates might
hgs
parents:
diff changeset
   405
		// no longer exist.
hgs
parents:
diff changeset
   406
		if (!autoConvert
hgs
parents:
diff changeset
   407
				|| location.getValidityCode() == TraceCompilerErrorCode.OK
hgs
parents:
diff changeset
   408
				|| location.getValidityCode() == TraceCompilerErrorCode.TRACE_DOES_NOT_EXIST
hgs
parents:
diff changeset
   409
				|| location.getValidityCode() == TraceCompilerErrorCode.TRACE_HAS_MULTIPLE_LOCATIONS) {
hgs
parents:
diff changeset
   410
			// The parser does the actual conversion
hgs
parents:
diff changeset
   411
			SourceParserRule rule = location.getParserRule();
hgs
parents:
diff changeset
   412
			TraceConversionResult result = rule.getLocationParser()
hgs
parents:
diff changeset
   413
					.convertLocation(location);
hgs
parents:
diff changeset
   414
			// After parser has finished, the trace is created.
hgs
parents:
diff changeset
   415
			trace = convertWithoutUI(result, extensions);
hgs
parents:
diff changeset
   416
hgs
parents:
diff changeset
   417
			if (trace != null) {
hgs
parents:
diff changeset
   418
				model.startProcessing();
hgs
parents:
diff changeset
   419
				try {
hgs
parents:
diff changeset
   420
					createParametersFromConversionResult(location, result,
hgs
parents:
diff changeset
   421
							trace);
hgs
parents:
diff changeset
   422
					// Runs a location validity check and notifies listeners
hgs
parents:
diff changeset
   423
					// that location is now OK
hgs
parents:
diff changeset
   424
					location.setConverterErrorCode(TraceCompilerErrorCode.OK,
hgs
parents:
diff changeset
   425
							null);
hgs
parents:
diff changeset
   426
				} catch (TraceCompilerException e) {
hgs
parents:
diff changeset
   427
					// If parameters cannot be created, the trace is removed
hgs
parents:
diff changeset
   428
					TraceGroup group = trace.getGroup();
hgs
parents:
diff changeset
   429
					trace.getGroup().removeTrace(trace);
hgs
parents:
diff changeset
   430
					if (!group.hasTraces()) {
hgs
parents:
diff changeset
   431
						group.getModel().removeGroup(group);
hgs
parents:
diff changeset
   432
					}
hgs
parents:
diff changeset
   433
					throw e;
hgs
parents:
diff changeset
   434
				} finally {
hgs
parents:
diff changeset
   435
					model.processingComplete();
hgs
parents:
diff changeset
   436
				}
hgs
parents:
diff changeset
   437
			}
hgs
parents:
diff changeset
   438
		}
hgs
parents:
diff changeset
   439
		return trace;
hgs
parents:
diff changeset
   440
	}
hgs
parents:
diff changeset
   441
hgs
parents:
diff changeset
   442
	/**
hgs
parents:
diff changeset
   443
	 * Converts a location to trace without UI
hgs
parents:
diff changeset
   444
	 * 
hgs
parents:
diff changeset
   445
	 * @param result
hgs
parents:
diff changeset
   446
	 *            the conversion result from parser
hgs
parents:
diff changeset
   447
	 * @param extensions
hgs
parents:
diff changeset
   448
	 *            persistent extensions to be added to the new trace
hgs
parents:
diff changeset
   449
	 * @return the converted trace
hgs
parents:
diff changeset
   450
	 * @throws TraceCompilerException
hgs
parents:
diff changeset
   451
	 *             if location properties are not valid
hgs
parents:
diff changeset
   452
	 */
hgs
parents:
diff changeset
   453
	private Trace convertWithoutUI(TraceConversionResult result,
hgs
parents:
diff changeset
   454
			Iterator<TraceModelPersistentExtension> extensions)
hgs
parents:
diff changeset
   455
			throws TraceCompilerException {
hgs
parents:
diff changeset
   456
		Trace trace = null;
hgs
parents:
diff changeset
   457
		if (result.group != null) {
hgs
parents:
diff changeset
   458
			String groupName = result.group;
hgs
parents:
diff changeset
   459
			TraceGroup group = handleGroup(groupName);
hgs
parents:
diff changeset
   460
			trace = handleTrace(result, extensions, group);
hgs
parents:
diff changeset
   461
		} else {
hgs
parents:
diff changeset
   462
			throw new TraceCompilerException(
hgs
parents:
diff changeset
   463
					TraceCompilerErrorCode.GROUP_NOT_SELECTED);
hgs
parents:
diff changeset
   464
		}
hgs
parents:
diff changeset
   465
		return trace;
hgs
parents:
diff changeset
   466
	}
hgs
parents:
diff changeset
   467
hgs
parents:
diff changeset
   468
	/**
hgs
parents:
diff changeset
   469
	 * Handle trace
hgs
parents:
diff changeset
   470
	 * 
hgs
parents:
diff changeset
   471
	 * @param result
hgs
parents:
diff changeset
   472
	 *            the conversion result from parser
hgs
parents:
diff changeset
   473
	 * @param extensions
hgs
parents:
diff changeset
   474
	 *            persistent extensions to be added to the new trace
hgs
parents:
diff changeset
   475
	 * @param group
hgs
parents:
diff changeset
   476
	 *            the group where trace belongs to
hgs
parents:
diff changeset
   477
	 * @return the trace
hgs
parents:
diff changeset
   478
	 * @throws TraceCompilerException
hgs
parents:
diff changeset
   479
	 */
hgs
parents:
diff changeset
   480
	private Trace handleTrace(TraceConversionResult result,
hgs
parents:
diff changeset
   481
			Iterator<TraceModelPersistentExtension> extensions, TraceGroup group)
hgs
parents:
diff changeset
   482
			throws TraceCompilerException {
hgs
parents:
diff changeset
   483
		// First try to find Id to trace from fixed Ids
hgs
parents:
diff changeset
   484
		Trace trace = null;
hgs
parents:
diff changeset
   485
		Properties fixedIds = model.getFixedIds();
hgs
parents:
diff changeset
   486
		String groupName = result.group;
hgs
parents:
diff changeset
   487
		String traceName = result.name;
hgs
parents:
diff changeset
   488
		int groupId = group.getID();
hgs
parents:
diff changeset
   489
		String groupIdString = SourceConstants.HEX_PREFIX
hgs
parents:
diff changeset
   490
				+ Integer.toString(groupId, model.HEX_RADIX).toUpperCase();
hgs
parents:
diff changeset
   491
		int traceId = 0;
hgs
parents:
diff changeset
   492
		if (fixedIds != null) {
hgs
parents:
diff changeset
   493
			String tracePropertyName = groupName + model.GROUP_ID_PREFIX
hgs
parents:
diff changeset
   494
					+ groupIdString + model.GROUP_ID_SUFFIX
hgs
parents:
diff changeset
   495
					+ SourceConstants.UNDERSCORE + traceName;
hgs
parents:
diff changeset
   496
			String value = fixedIds.getProperty(model.TRACE_PROPERTY_PREFIX
hgs
parents:
diff changeset
   497
					+ tracePropertyName);
hgs
parents:
diff changeset
   498
			if (value != null) {
hgs
parents:
diff changeset
   499
				try {
hgs
parents:
diff changeset
   500
					traceId = Integer.decode(value).intValue();
hgs
parents:
diff changeset
   501
				} catch (NumberFormatException e) {
hgs
parents:
diff changeset
   502
					// Corrupted, assign a proper Id later on
hgs
parents:
diff changeset
   503
					traceId = 0;
hgs
parents:
diff changeset
   504
				}
hgs
parents:
diff changeset
   505
			}
hgs
parents:
diff changeset
   506
		}
hgs
parents:
diff changeset
   507
		// If there was no fixed Id to this trace, get Id from model
hgs
parents:
diff changeset
   508
		if (traceId == 0) {
hgs
parents:
diff changeset
   509
			traceId = model.getNextTraceId(group);
hgs
parents:
diff changeset
   510
		}
hgs
parents:
diff changeset
   511
hgs
parents:
diff changeset
   512
		String text = result.text;
hgs
parents:
diff changeset
   513
		model.getVerifier().checkTraceProperties(group, null, traceId,
hgs
parents:
diff changeset
   514
				traceName, text);
hgs
parents:
diff changeset
   515
		TraceModelExtension[] extArray = createExtensionArray(result,
hgs
parents:
diff changeset
   516
				extensions);
hgs
parents:
diff changeset
   517
		trace = model.getFactory().createTrace(group, traceId, traceName, text,
hgs
parents:
diff changeset
   518
				extArray);
hgs
parents:
diff changeset
   519
hgs
parents:
diff changeset
   520
		if ((trace.getExtension(StateTraceRule.class) == null)
hgs
parents:
diff changeset
   521
				&& (group.getName()
hgs
parents:
diff changeset
   522
						.equals("TRACE_STATE"))) { //$NON-NLS-1$
hgs
parents:
diff changeset
   523
			throw new TraceCompilerException(
hgs
parents:
diff changeset
   524
					TraceCompilerErrorCode.INVALID_USAGE_OF_TRACE_STATE_GROUP_NAME);
hgs
parents:
diff changeset
   525
		} else if ((trace.getExtension(PerformanceEventRuleBase.class) == null)
hgs
parents:
diff changeset
   526
				&& (group.getName()
hgs
parents:
diff changeset
   527
						.equals("TRACE_PERFORMANCE"))) { //$NON-NLS-1$
hgs
parents:
diff changeset
   528
			throw new TraceCompilerException(
hgs
parents:
diff changeset
   529
					TraceCompilerErrorCode.INVALID_USAGE_OF_TRACE_PERFORMACE_GROUP_NAME);
hgs
parents:
diff changeset
   530
		}
hgs
parents:
diff changeset
   531
hgs
parents:
diff changeset
   532
		return trace;
hgs
parents:
diff changeset
   533
	}
hgs
parents:
diff changeset
   534
hgs
parents:
diff changeset
   535
	/**
hgs
parents:
diff changeset
   536
	 * Handle group. Try to fnd group from model. If it does not exist then
hgs
parents:
diff changeset
   537
	 * create new group.
hgs
parents:
diff changeset
   538
	 * 
hgs
parents:
diff changeset
   539
	 * @param groupName
hgs
parents:
diff changeset
   540
	 *            the name of the group
hgs
parents:
diff changeset
   541
	 * @return the handled group
hgs
parents:
diff changeset
   542
	 * @throws TraceCompilerException
hgs
parents:
diff changeset
   543
	 */
hgs
parents:
diff changeset
   544
	private TraceGroup handleGroup(String groupName)
hgs
parents:
diff changeset
   545
			throws TraceCompilerException {
hgs
parents:
diff changeset
   546
		String deprecatedGroupName = null;
hgs
parents:
diff changeset
   547
		
hgs
parents:
diff changeset
   548
		// Convert deprecated group name to valid group name if needed
hgs
parents:
diff changeset
   549
		if (deprecatedGroupNameMap.containsKey(groupName)) {
hgs
parents:
diff changeset
   550
			deprecatedGroupName = groupName;
hgs
parents:
diff changeset
   551
			groupName = deprecatedGroupNameMap.get(groupName);
hgs
parents:
diff changeset
   552
		}
hgs
parents:
diff changeset
   553
hgs
parents:
diff changeset
   554
		// If auto-convert flag is set, the location is converted without
hgs
parents:
diff changeset
   555
		// user interaction. A new trace group is created if not found
hgs
parents:
diff changeset
   556
		TraceGroup group = model.findGroupByName(groupName);
hgs
parents:
diff changeset
   557
		if (group == null) {
hgs
parents:
diff changeset
   558
			
hgs
parents:
diff changeset
   559
			// Print warning related to deprecated group name change if needed
hgs
parents:
diff changeset
   560
			if (deprecatedGroupName != null) {
hgs
parents:
diff changeset
   561
				String message = Messages
hgs
parents:
diff changeset
   562
						.getString("TraceLocationConverter.DeprecatedGroupIdWarningStart");//$NON-NLS-1$
hgs
parents:
diff changeset
   563
				message += SourceConstants.SPACE + deprecatedGroupName
hgs
parents:
diff changeset
   564
						+ SourceConstants.SPACE;
hgs
parents:
diff changeset
   565
				message += Messages
hgs
parents:
diff changeset
   566
						.getString("TraceLocationConverter.DeprecatedGroupIdWarningMiddle");//$NON-NLS-1$
hgs
parents:
diff changeset
   567
				message += SourceConstants.SPACE + groupName
hgs
parents:
diff changeset
   568
						+ SourceConstants.SPACE;
hgs
parents:
diff changeset
   569
				message += Messages
hgs
parents:
diff changeset
   570
						.getString("TraceLocationConverter.DeprecatedGroupIdWarningEnd");//$NON-NLS-1$
hgs
parents:
diff changeset
   571
				TraceCompilerLogger.printWarning(message);
hgs
parents:
diff changeset
   572
			}
hgs
parents:
diff changeset
   573
hgs
parents:
diff changeset
   574
			int groupId = 0;
hgs
parents:
diff changeset
   575
			Properties fixedIds = model.getFixedIds();
hgs
parents:
diff changeset
   576
hgs
parents:
diff changeset
   577
			// First try to find Id to group from fixed Ids
hgs
parents:
diff changeset
   578
			if (fixedIds != null) {
hgs
parents:
diff changeset
   579
				String value = fixedIds.getProperty(model.GROUP_PROPERTY_PREFIX
hgs
parents:
diff changeset
   580
						+ groupName);
hgs
parents:
diff changeset
   581
				if (value != null) {
hgs
parents:
diff changeset
   582
					try {
hgs
parents:
diff changeset
   583
						groupId = Integer.decode(value).intValue();
hgs
parents:
diff changeset
   584
					} catch (NumberFormatException e) {
hgs
parents:
diff changeset
   585
						// Corrupted, assign a proper Id later on
hgs
parents:
diff changeset
   586
						groupId = 0;
hgs
parents:
diff changeset
   587
					}
hgs
parents:
diff changeset
   588
				}
hgs
parents:
diff changeset
   589
			}
hgs
parents:
diff changeset
   590
			// If there was no fixed Id to this group, get Id from model
hgs
parents:
diff changeset
   591
			if (groupId == 0) {
hgs
parents:
diff changeset
   592
				groupId = FormattingUtils.getGroupID(model, groupName);
hgs
parents:
diff changeset
   593
			}
hgs
parents:
diff changeset
   594
			model.getVerifier().checkTraceGroupProperties(model, null, groupId,
hgs
parents:
diff changeset
   595
					groupName);
hgs
parents:
diff changeset
   596
			group = model.getFactory().createTraceGroup(groupId, groupName,
hgs
parents:
diff changeset
   597
					null);
hgs
parents:
diff changeset
   598
		}
hgs
parents:
diff changeset
   599
hgs
parents:
diff changeset
   600
		return group;
hgs
parents:
diff changeset
   601
	}
hgs
parents:
diff changeset
   602
hgs
parents:
diff changeset
   603
	/**
hgs
parents:
diff changeset
   604
	 * Combines extensions into one array
hgs
parents:
diff changeset
   605
	 * 
hgs
parents:
diff changeset
   606
	 * @param result
hgs
parents:
diff changeset
   607
	 *            the conversion result
hgs
parents:
diff changeset
   608
	 * @param extensions
hgs
parents:
diff changeset
   609
	 *            the persistent extensions from old trace
hgs
parents:
diff changeset
   610
	 * @return the combined array of extensions
hgs
parents:
diff changeset
   611
	 */
hgs
parents:
diff changeset
   612
	private TraceModelExtension[] createExtensionArray(
hgs
parents:
diff changeset
   613
			TraceConversionResult result,
hgs
parents:
diff changeset
   614
			Iterator<TraceModelPersistentExtension> extensions) {
hgs
parents:
diff changeset
   615
		TraceModelExtension[] extArray = null;
hgs
parents:
diff changeset
   616
		ArrayList<TraceModelExtension> ext = null;
hgs
parents:
diff changeset
   617
		if (result.extensions != null) {
hgs
parents:
diff changeset
   618
			ext = new ArrayList<TraceModelExtension>();
hgs
parents:
diff changeset
   619
			ext.addAll(result.extensions);
hgs
parents:
diff changeset
   620
		}
hgs
parents:
diff changeset
   621
		if (extensions != null) {
hgs
parents:
diff changeset
   622
			if (ext == null) {
hgs
parents:
diff changeset
   623
				ext = new ArrayList<TraceModelExtension>();
hgs
parents:
diff changeset
   624
			}
hgs
parents:
diff changeset
   625
			while (extensions.hasNext()) {
hgs
parents:
diff changeset
   626
				ext.add(extensions.next());
hgs
parents:
diff changeset
   627
			}
hgs
parents:
diff changeset
   628
		}
hgs
parents:
diff changeset
   629
		if (ext != null) {
hgs
parents:
diff changeset
   630
			extArray = new TraceModelExtension[ext.size()];
hgs
parents:
diff changeset
   631
			ext.toArray(extArray);
hgs
parents:
diff changeset
   632
		}
hgs
parents:
diff changeset
   633
		return extArray;
hgs
parents:
diff changeset
   634
	}
hgs
parents:
diff changeset
   635
hgs
parents:
diff changeset
   636
	/**
hgs
parents:
diff changeset
   637
	 * Creates the trace parameters based on trace conversion result
hgs
parents:
diff changeset
   638
	 * 
hgs
parents:
diff changeset
   639
	 * @param converted
hgs
parents:
diff changeset
   640
	 *            the location that was converted
hgs
parents:
diff changeset
   641
	 * @param result
hgs
parents:
diff changeset
   642
	 *            the conversion result
hgs
parents:
diff changeset
   643
	 * @param trace
hgs
parents:
diff changeset
   644
	 *            the trace
hgs
parents:
diff changeset
   645
	 * @throws TraceCompilerException
hgs
parents:
diff changeset
   646
	 *             if parameters cannot be created
hgs
parents:
diff changeset
   647
	 */
hgs
parents:
diff changeset
   648
	private void createParametersFromConversionResult(TraceLocation converted,
hgs
parents:
diff changeset
   649
			TraceConversionResult result, Trace trace)
hgs
parents:
diff changeset
   650
			throws TraceCompilerException {
hgs
parents:
diff changeset
   651
		if (result.parameters != null) {
hgs
parents:
diff changeset
   652
			for (int i = 0; i < result.parameters.size(); i++) {
hgs
parents:
diff changeset
   653
				int id = trace.getNextParameterID();
hgs
parents:
diff changeset
   654
				ParameterConversionResult res = result.parameters.get(i);
hgs
parents:
diff changeset
   655
				boolean warning = false;
hgs
parents:
diff changeset
   656
				if (res.type == null) {
hgs
parents:
diff changeset
   657
					warning = true;
hgs
parents:
diff changeset
   658
					res.type = TraceParameter.HEX32;
hgs
parents:
diff changeset
   659
				}
hgs
parents:
diff changeset
   660
				model.getVerifier().checkTraceParameterProperties(trace, null,
hgs
parents:
diff changeset
   661
						id, res.name, res.type);
hgs
parents:
diff changeset
   662
				TraceModelExtension[] extArray = null;
hgs
parents:
diff changeset
   663
				if (res.extensions != null) {
hgs
parents:
diff changeset
   664
					extArray = new TraceModelExtension[res.extensions.size()];
hgs
parents:
diff changeset
   665
					res.extensions.toArray(extArray);
hgs
parents:
diff changeset
   666
				}
hgs
parents:
diff changeset
   667
				TraceParameter param = model.getFactory().createTraceParameter(
hgs
parents:
diff changeset
   668
						trace, id, res.name, res.type, extArray);
hgs
parents:
diff changeset
   669
				if (warning) {
hgs
parents:
diff changeset
   670
					String msg = Messages
hgs
parents:
diff changeset
   671
							.getString("TraceCompiler.UnknownTypeWarning"); //$NON-NLS-1$
hgs
parents:
diff changeset
   672
					TraceCompilerEngineGlobals.getEvents().postWarningMessage(
hgs
parents:
diff changeset
   673
							msg, param);
hgs
parents:
diff changeset
   674
				}
hgs
parents:
diff changeset
   675
			}
hgs
parents:
diff changeset
   676
		}
hgs
parents:
diff changeset
   677
	}
hgs
parents:
diff changeset
   678
hgs
parents:
diff changeset
   679
}