tracesrv/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/RulesEngine.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) 2007 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
* Implementation of TraceObjectRuleFactory interface
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
hgs
parents:
diff changeset
    23
import com.nokia.tracecompiler.engine.TraceCompilerEngineConfiguration;
hgs
parents:
diff changeset
    24
import com.nokia.tracecompiler.engine.TraceCompilerEngineConfigurationListener;
hgs
parents:
diff changeset
    25
import com.nokia.tracecompiler.engine.TraceCompilerEngineGlobals;
hgs
parents:
diff changeset
    26
import com.nokia.tracecompiler.engine.header.ComplexHeaderRule;
hgs
parents:
diff changeset
    27
import com.nokia.tracecompiler.engine.rules.osttrace.OstTraceFormatRule;
hgs
parents:
diff changeset
    28
import com.nokia.tracecompiler.engine.source.SourceParserRule;
hgs
parents:
diff changeset
    29
import com.nokia.tracecompiler.engine.source.TraceParameterFormattingRule;
hgs
parents:
diff changeset
    30
import com.nokia.tracecompiler.model.Trace;
hgs
parents:
diff changeset
    31
import com.nokia.tracecompiler.model.TraceCompilerException;
hgs
parents:
diff changeset
    32
import com.nokia.tracecompiler.model.TraceModel;
hgs
parents:
diff changeset
    33
import com.nokia.tracecompiler.model.TraceModelExtension;
hgs
parents:
diff changeset
    34
import com.nokia.tracecompiler.model.TraceModelListener;
hgs
parents:
diff changeset
    35
import com.nokia.tracecompiler.model.TraceModelPersistentExtension;
hgs
parents:
diff changeset
    36
import com.nokia.tracecompiler.model.TraceModelResetListener;
hgs
parents:
diff changeset
    37
import com.nokia.tracecompiler.model.TraceObject;
hgs
parents:
diff changeset
    38
import com.nokia.tracecompiler.model.TraceObjectRuleFactory;
hgs
parents:
diff changeset
    39
import com.nokia.tracecompiler.model.TraceParameter;
hgs
parents:
diff changeset
    40
import com.nokia.tracecompiler.project.TraceProjectAPI;
hgs
parents:
diff changeset
    41
import com.nokia.tracecompiler.rules.FillerParameterRule;
hgs
parents:
diff changeset
    42
import com.nokia.tracecompiler.source.SourceUtils;
hgs
parents:
diff changeset
    43
hgs
parents:
diff changeset
    44
/**
hgs
parents:
diff changeset
    45
 * Provides rules for trace objects.
hgs
parents:
diff changeset
    46
 * 
hgs
parents:
diff changeset
    47
 */
hgs
parents:
diff changeset
    48
public class RulesEngine implements TraceObjectRuleFactory {
hgs
parents:
diff changeset
    49
hgs
parents:
diff changeset
    50
	/**
hgs
parents:
diff changeset
    51
	 * Number of parameters in a simple trace
hgs
parents:
diff changeset
    52
	 */
hgs
parents:
diff changeset
    53
	private static final int SIMPLE_TRACE_MAX_PARAMETER_COUNT = 1;
hgs
parents:
diff changeset
    54
hgs
parents:
diff changeset
    55
	/**
hgs
parents:
diff changeset
    56
	 * Trace model listener updates the fillers and complex type flagging when
hgs
parents:
diff changeset
    57
	 * traces and parameters are modified
hgs
parents:
diff changeset
    58
	 */
hgs
parents:
diff changeset
    59
	private TraceModelListener modelListener;
hgs
parents:
diff changeset
    60
hgs
parents:
diff changeset
    61
	/**
hgs
parents:
diff changeset
    62
	 * Trace model reset listener uses modelValid to update the complex header
hgs
parents:
diff changeset
    63
	 * rules
hgs
parents:
diff changeset
    64
	 */
hgs
parents:
diff changeset
    65
	private TraceModelResetListener resetListener;
hgs
parents:
diff changeset
    66
hgs
parents:
diff changeset
    67
	/**
hgs
parents:
diff changeset
    68
	 * Manager for plug-in API's
hgs
parents:
diff changeset
    69
	 */
hgs
parents:
diff changeset
    70
	private RulesEnginePluginManager pluginManager;
hgs
parents:
diff changeset
    71
hgs
parents:
diff changeset
    72
	/**
hgs
parents:
diff changeset
    73
	 * Configuration listener for source format changes
hgs
parents:
diff changeset
    74
	 */
hgs
parents:
diff changeset
    75
	private TraceCompilerEngineConfigurationListener configurationListener = new RulesEngineConfigurationListener(
hgs
parents:
diff changeset
    76
			this);
hgs
parents:
diff changeset
    77
hgs
parents:
diff changeset
    78
	/**
hgs
parents:
diff changeset
    79
	 * Trace model
hgs
parents:
diff changeset
    80
	 */
hgs
parents:
diff changeset
    81
	private TraceModel model;
hgs
parents:
diff changeset
    82
hgs
parents:
diff changeset
    83
	/**
hgs
parents:
diff changeset
    84
	 * Constructor
hgs
parents:
diff changeset
    85
	 */
hgs
parents:
diff changeset
    86
	public RulesEngine() {
hgs
parents:
diff changeset
    87
		TraceCompilerEngineGlobals.getConfiguration().addConfigurationListener(
hgs
parents:
diff changeset
    88
				configurationListener);
hgs
parents:
diff changeset
    89
	}
hgs
parents:
diff changeset
    90
hgs
parents:
diff changeset
    91
	/*
hgs
parents:
diff changeset
    92
	 * (non-Javadoc)
hgs
parents:
diff changeset
    93
	 * 
hgs
parents:
diff changeset
    94
	 * @see com.nokia.tracecompiler.model.TraceObjectRuleFactory#
hgs
parents:
diff changeset
    95
	 *      createExtension(com.nokia.tracecompiler.model.TraceObject,
hgs
parents:
diff changeset
    96
	 *      java.lang.String)
hgs
parents:
diff changeset
    97
	 */
hgs
parents:
diff changeset
    98
	public TraceModelPersistentExtension createExtension(TraceObject target,
hgs
parents:
diff changeset
    99
			String name) {
hgs
parents:
diff changeset
   100
		TraceModelPersistentExtension retval = null;
hgs
parents:
diff changeset
   101
		ClassNameWrapper[] table = RulesEngineConstants.PERSISTENT_EXTENSIONS;
hgs
parents:
diff changeset
   102
		for (int i = 0; i < table.length && retval == null; i++) {
hgs
parents:
diff changeset
   103
			if (name.equals(table[i].name)) {
hgs
parents:
diff changeset
   104
				retval = createPersistentExtensionAt(target, i);
hgs
parents:
diff changeset
   105
			}
hgs
parents:
diff changeset
   106
		}
hgs
parents:
diff changeset
   107
		return retval;
hgs
parents:
diff changeset
   108
	}
hgs
parents:
diff changeset
   109
hgs
parents:
diff changeset
   110
	/**
hgs
parents:
diff changeset
   111
	 * Creates a persistent extension
hgs
parents:
diff changeset
   112
	 * 
hgs
parents:
diff changeset
   113
	 * @param target
hgs
parents:
diff changeset
   114
	 *            the target object
hgs
parents:
diff changeset
   115
	 * @param i
hgs
parents:
diff changeset
   116
	 *            index to the persistent extensions array
hgs
parents:
diff changeset
   117
	 * @return the extension
hgs
parents:
diff changeset
   118
	 */
hgs
parents:
diff changeset
   119
	private TraceModelPersistentExtension createPersistentExtensionAt(
hgs
parents:
diff changeset
   120
			TraceObject target, int i) {
hgs
parents:
diff changeset
   121
		ClassNameWrapper wrapper = RulesEngineConstants.PERSISTENT_EXTENSIONS[i];
hgs
parents:
diff changeset
   122
		TraceModelPersistentExtension retval = null;
hgs
parents:
diff changeset
   123
		TraceModelPersistentExtension o = target.getExtension(wrapper.clasz);
hgs
parents:
diff changeset
   124
		if (o == null) {
hgs
parents:
diff changeset
   125
			try {
hgs
parents:
diff changeset
   126
				retval = wrapper.clasz.newInstance();
hgs
parents:
diff changeset
   127
			} catch (Exception e) {
hgs
parents:
diff changeset
   128
				if (TraceCompilerEngineConfiguration.ASSERTIONS_ENABLED) {
hgs
parents:
diff changeset
   129
					TraceCompilerEngineGlobals.getEvents().postAssertionFailed(
hgs
parents:
diff changeset
   130
							"Invalid extension - " + wrapper.name, null); //$NON-NLS-1$
hgs
parents:
diff changeset
   131
				}
hgs
parents:
diff changeset
   132
			}
hgs
parents:
diff changeset
   133
		}
hgs
parents:
diff changeset
   134
		return retval;
hgs
parents:
diff changeset
   135
	}
hgs
parents:
diff changeset
   136
hgs
parents:
diff changeset
   137
	/*
hgs
parents:
diff changeset
   138
	 * (non-Javadoc)
hgs
parents:
diff changeset
   139
	 * 
hgs
parents:
diff changeset
   140
	 * @see com.nokia.tracecompiler.model.TraceObjectRuleFactory#
hgs
parents:
diff changeset
   141
	 *      preProcessNewRules(com.nokia.tracecompiler.model.TraceObject)
hgs
parents:
diff changeset
   142
	 */
hgs
parents:
diff changeset
   143
	public void preProcessNewRules(TraceObject object) {
hgs
parents:
diff changeset
   144
		if (object instanceof TraceModel) {
hgs
parents:
diff changeset
   145
			// NOTE: This is only called once when builder is started
hgs
parents:
diff changeset
   146
			// There is no cleanup code
hgs
parents:
diff changeset
   147
			this.model = (TraceModel) object;
hgs
parents:
diff changeset
   148
			modelListener = new RulesEngineModelListener(this);
hgs
parents:
diff changeset
   149
			resetListener = new RulesEngineResetListener(this, model);
hgs
parents:
diff changeset
   150
			model.addModelListener(modelListener);
hgs
parents:
diff changeset
   151
			model.addResetListener(resetListener);
hgs
parents:
diff changeset
   152
			// Adds the plug-in trace parser / formatter manager to the model as
hgs
parents:
diff changeset
   153
			// extension. The plug-in manager delegates the formatters and
hgs
parents:
diff changeset
   154
			// parsers to this object when plug-in components register to
hgs
parents:
diff changeset
   155
			// TraceCompiler.
hgs
parents:
diff changeset
   156
			pluginManager = new RulesEnginePluginManager(this);
hgs
parents:
diff changeset
   157
			model.addExtension(pluginManager);
hgs
parents:
diff changeset
   158
			createTraceParsers();
hgs
parents:
diff changeset
   159
			createTraceAPIs();
hgs
parents:
diff changeset
   160
		}
hgs
parents:
diff changeset
   161
	}
hgs
parents:
diff changeset
   162
hgs
parents:
diff changeset
   163
	/**
hgs
parents:
diff changeset
   164
	 * Creates the trace parsers and stores them to the model
hgs
parents:
diff changeset
   165
	 */
hgs
parents:
diff changeset
   166
	private void createTraceParsers() {
hgs
parents:
diff changeset
   167
		for (SourceParserRule element : RulesEngineConstants.TRACE_PARSERS) {
hgs
parents:
diff changeset
   168
			// Creates all source parsers specified in the constants
hgs
parents:
diff changeset
   169
			model.addExtension(element);
hgs
parents:
diff changeset
   170
		}
hgs
parents:
diff changeset
   171
	}
hgs
parents:
diff changeset
   172
hgs
parents:
diff changeset
   173
	/**
hgs
parents:
diff changeset
   174
	 * Creates the default trace API's and adds them to the plug-in manager
hgs
parents:
diff changeset
   175
	 */
hgs
parents:
diff changeset
   176
	private void createTraceAPIs() {
hgs
parents:
diff changeset
   177
		for (TraceProjectAPI api : RulesEngineConstants.TRACE_APIS) {
hgs
parents:
diff changeset
   178
			pluginManager.addAPI(api);
hgs
parents:
diff changeset
   179
		}
hgs
parents:
diff changeset
   180
	}
hgs
parents:
diff changeset
   181
hgs
parents:
diff changeset
   182
	/**
hgs
parents:
diff changeset
   183
	 * Creates the trace formatter and stores it to the model
hgs
parents:
diff changeset
   184
	 */
hgs
parents:
diff changeset
   185
	void setDefaultTraceAPI() {
hgs
parents:
diff changeset
   186
		// If the formatter did not exist in the project file, it is added based
hgs
parents:
diff changeset
   187
		// on the configuration default
hgs
parents:
diff changeset
   188
		if (model.getExtension(TraceProjectAPI.class) == null) {
hgs
parents:
diff changeset
   189
			String api = TraceCompilerEngineGlobals.getConfiguration().getText(
hgs
parents:
diff changeset
   190
					TraceCompilerEngineConfiguration.FORMATTER_NAME);
hgs
parents:
diff changeset
   191
			traceAPIChanged(api);
hgs
parents:
diff changeset
   192
		}
hgs
parents:
diff changeset
   193
	}
hgs
parents:
diff changeset
   194
hgs
parents:
diff changeset
   195
	/**
hgs
parents:
diff changeset
   196
	 * API change notification
hgs
parents:
diff changeset
   197
	 * 
hgs
parents:
diff changeset
   198
	 * @param apiName
hgs
parents:
diff changeset
   199
	 *            the name of new api
hgs
parents:
diff changeset
   200
	 */
hgs
parents:
diff changeset
   201
	void traceAPIChanged(String apiName) {
hgs
parents:
diff changeset
   202
		TraceProjectAPI api = model.getExtension(TraceProjectAPI.class);
hgs
parents:
diff changeset
   203
		boolean found = false;
hgs
parents:
diff changeset
   204
		if (api != null) {
hgs
parents:
diff changeset
   205
			if (api.getName().equals(apiName)) {
hgs
parents:
diff changeset
   206
				found = true;
hgs
parents:
diff changeset
   207
			} else {
hgs
parents:
diff changeset
   208
				model.removeExtension(api);
hgs
parents:
diff changeset
   209
			}
hgs
parents:
diff changeset
   210
		}
hgs
parents:
diff changeset
   211
		if (!found) {
hgs
parents:
diff changeset
   212
			changeTraceAPI(apiName);
hgs
parents:
diff changeset
   213
		}
hgs
parents:
diff changeset
   214
	}
hgs
parents:
diff changeset
   215
hgs
parents:
diff changeset
   216
	/**
hgs
parents:
diff changeset
   217
	 * Creates a trace API
hgs
parents:
diff changeset
   218
	 * 
hgs
parents:
diff changeset
   219
	 * @param apiName
hgs
parents:
diff changeset
   220
	 *            the name of the API to be created
hgs
parents:
diff changeset
   221
	 */
hgs
parents:
diff changeset
   222
	void changeTraceAPI(String apiName) {
hgs
parents:
diff changeset
   223
		if (apiName == null || apiName.length() == 0) {
hgs
parents:
diff changeset
   224
			apiName = OstTraceFormatRule.STORAGE_NAME;
hgs
parents:
diff changeset
   225
		}
hgs
parents:
diff changeset
   226
		Iterator<TraceProjectAPI> apis = pluginManager.getAPIs();
hgs
parents:
diff changeset
   227
		boolean apifound = false;
hgs
parents:
diff changeset
   228
		while (apis.hasNext()) {
hgs
parents:
diff changeset
   229
			TraceProjectAPI api = apis.next();
hgs
parents:
diff changeset
   230
			if (api.getName().equals(apiName)) {
hgs
parents:
diff changeset
   231
				model.addExtension(api);
hgs
parents:
diff changeset
   232
				apifound = true;
hgs
parents:
diff changeset
   233
			}
hgs
parents:
diff changeset
   234
		}
hgs
parents:
diff changeset
   235
		if (!apifound) {
hgs
parents:
diff changeset
   236
			// If API from configuration was not found, the first one is used
hgs
parents:
diff changeset
   237
			apis = pluginManager.getAPIs();
hgs
parents:
diff changeset
   238
			if (apis.hasNext()) {
hgs
parents:
diff changeset
   239
				model.addExtension(apis.next());
hgs
parents:
diff changeset
   240
			}
hgs
parents:
diff changeset
   241
		}
hgs
parents:
diff changeset
   242
	}
hgs
parents:
diff changeset
   243
hgs
parents:
diff changeset
   244
	/*
hgs
parents:
diff changeset
   245
	 * (non-Javadoc)
hgs
parents:
diff changeset
   246
	 * 
hgs
parents:
diff changeset
   247
	 * @see com.nokia.tracecompiler.model.TraceObjectRuleFactory#
hgs
parents:
diff changeset
   248
	 *      postProcessNewRules(com.nokia.tracecompiler.model.TraceObject)
hgs
parents:
diff changeset
   249
	 */
hgs
parents:
diff changeset
   250
	public void postProcessNewRules(TraceObject object) {
hgs
parents:
diff changeset
   251
	}
hgs
parents:
diff changeset
   252
hgs
parents:
diff changeset
   253
	/**
hgs
parents:
diff changeset
   254
	 * Checks the count and types of parameters of given trace and flags it with
hgs
parents:
diff changeset
   255
	 * ComplexParameterRule if necessary
hgs
parents:
diff changeset
   256
	 * 
hgs
parents:
diff changeset
   257
	 * @param trace
hgs
parents:
diff changeset
   258
	 *            the trace
hgs
parents:
diff changeset
   259
	 */
hgs
parents:
diff changeset
   260
	void checkParameterTypes(Trace trace) {
hgs
parents:
diff changeset
   261
		// When converting traces from source, the converter takes care of
hgs
parents:
diff changeset
   262
		// flagging the traces as complex. The complex flag needs to be checked
hgs
parents:
diff changeset
   263
		// when trace are modified via UI
hgs
parents:
diff changeset
   264
		if (!TraceCompilerEngineGlobals.getSourceContextManager().isConverting()) {
hgs
parents:
diff changeset
   265
			boolean complex = false;
hgs
parents:
diff changeset
   266
			int count = trace.getParameterCount();
hgs
parents:
diff changeset
   267
			Iterator<TraceParameter> itr = trace.getParameters();
hgs
parents:
diff changeset
   268
			while (itr.hasNext() && !complex) {
hgs
parents:
diff changeset
   269
				TraceParameter parameter = itr.next();
hgs
parents:
diff changeset
   270
				TraceParameterFormattingRule rule = parameter
hgs
parents:
diff changeset
   271
						.getExtension(TraceParameterFormattingRule.class);
hgs
parents:
diff changeset
   272
				boolean isShown = true;
hgs
parents:
diff changeset
   273
				if (rule != null && !rule.isShownInSource()) {
hgs
parents:
diff changeset
   274
					isShown = false;
hgs
parents:
diff changeset
   275
				}
hgs
parents:
diff changeset
   276
				if (isShown) {
hgs
parents:
diff changeset
   277
					complex = !SourceUtils.isSimpleType(parameter);
hgs
parents:
diff changeset
   278
				} else {
hgs
parents:
diff changeset
   279
					count--;
hgs
parents:
diff changeset
   280
				}
hgs
parents:
diff changeset
   281
			}
hgs
parents:
diff changeset
   282
			// Any trace with more than one parameter is a complex trace
hgs
parents:
diff changeset
   283
			if (!complex && count > SIMPLE_TRACE_MAX_PARAMETER_COUNT) {
hgs
parents:
diff changeset
   284
				complex = true;
hgs
parents:
diff changeset
   285
			}
hgs
parents:
diff changeset
   286
			ComplexHeaderRule rule = trace
hgs
parents:
diff changeset
   287
					.getExtension(ComplexHeaderRule.class);
hgs
parents:
diff changeset
   288
			if (complex && rule == null) {
hgs
parents:
diff changeset
   289
				trace.addExtension(new ComplexHeaderRuleImpl());
hgs
parents:
diff changeset
   290
			} else if (!complex && rule != null) {
hgs
parents:
diff changeset
   291
				trace.removeExtension(rule);
hgs
parents:
diff changeset
   292
			}
hgs
parents:
diff changeset
   293
		}
hgs
parents:
diff changeset
   294
	}
hgs
parents:
diff changeset
   295
hgs
parents:
diff changeset
   296
	/**
hgs
parents:
diff changeset
   297
	 * Adds fillers to align trace parameters to 32-bit boundaries.
hgs
parents:
diff changeset
   298
	 * 
hgs
parents:
diff changeset
   299
	 * @param trace
hgs
parents:
diff changeset
   300
	 *            the trace to be updated
hgs
parents:
diff changeset
   301
	 * @throws TraceCompilerException 
hgs
parents:
diff changeset
   302
	 */
hgs
parents:
diff changeset
   303
	void checkFillerParameters(Trace trace) throws TraceCompilerException {
hgs
parents:
diff changeset
   304
		// Flags the model so listeners don't perform intermediate updates
hgs
parents:
diff changeset
   305
		trace.getModel().startProcessing();
hgs
parents:
diff changeset
   306
		try {
hgs
parents:
diff changeset
   307
			// Removes all existing fillers
hgs
parents:
diff changeset
   308
			for (int i = 0; i < trace.getParameterCount(); i++) {
hgs
parents:
diff changeset
   309
				TraceParameter parameter = trace.getParameter(i);
hgs
parents:
diff changeset
   310
				if (parameter.getExtension(FillerParameterRule.class) != null) {
hgs
parents:
diff changeset
   311
					trace.removeParameterAt(i);
hgs
parents:
diff changeset
   312
					i--;
hgs
parents:
diff changeset
   313
				}
hgs
parents:
diff changeset
   314
			}
hgs
parents:
diff changeset
   315
			int bytesInBlock = 0;
hgs
parents:
diff changeset
   316
			int parameterIndex = 0;
hgs
parents:
diff changeset
   317
			for (; parameterIndex < trace.getParameterCount(); parameterIndex++) {
hgs
parents:
diff changeset
   318
				TraceParameter parameter = trace.getParameter(parameterIndex);
hgs
parents:
diff changeset
   319
				int paramSize = SourceUtils.mapParameterTypeToSize(parameter);
hgs
parents:
diff changeset
   320
				// Parameters are aligned to 32 bits. Parameter after
hgs
parents:
diff changeset
   321
				// end-of-string is aligned dynamically and thus no filler is
hgs
parents:
diff changeset
   322
				// created for it
hgs
parents:
diff changeset
   323
				if (paramSize == 0 || paramSize == 4 || paramSize == 8) { // CodForChk_Dis_Magic
hgs
parents:
diff changeset
   324
					if (bytesInBlock > 0) {
hgs
parents:
diff changeset
   325
						int fillerCount = 4 - bytesInBlock; // CodForChk_Dis_Magic
hgs
parents:
diff changeset
   326
						for (int i = 0; i < fillerCount; i++) {
hgs
parents:
diff changeset
   327
							createFillerParameter(trace, parameterIndex++);
hgs
parents:
diff changeset
   328
						}
hgs
parents:
diff changeset
   329
						bytesInBlock = 0;
hgs
parents:
diff changeset
   330
					}
hgs
parents:
diff changeset
   331
				} else if (paramSize == 2) { // CodForChk_Dis_Magic
hgs
parents:
diff changeset
   332
					if (bytesInBlock == 1 || bytesInBlock == 3) { // CodForChk_Dis_Magic
hgs
parents:
diff changeset
   333
						createFillerParameter(trace, parameterIndex++);
hgs
parents:
diff changeset
   334
						// If there was 1 existing byte and filler was added,
hgs
parents:
diff changeset
   335
						// the number of bytes in the block is now 4 including
hgs
parents:
diff changeset
   336
						// the 2-byte parameter. If there was 3 bytes, the
hgs
parents:
diff changeset
   337
						// filler brings it to 4 and the 16-bit parameter
hgs
parents:
diff changeset
   338
						// changes it to 2
hgs
parents:
diff changeset
   339
						bytesInBlock += 3; // CodForChk_Dis_Magic
hgs
parents:
diff changeset
   340
					} else {
hgs
parents:
diff changeset
   341
						bytesInBlock += 2; // CodForChk_Dis_Magic
hgs
parents:
diff changeset
   342
					}
hgs
parents:
diff changeset
   343
					if (bytesInBlock >= 4) { // CodForChk_Dis_Magic
hgs
parents:
diff changeset
   344
						bytesInBlock -= 4; // CodForChk_Dis_Magic
hgs
parents:
diff changeset
   345
					}
hgs
parents:
diff changeset
   346
				} else {
hgs
parents:
diff changeset
   347
					bytesInBlock++;
hgs
parents:
diff changeset
   348
					if (bytesInBlock == 4) { // CodForChk_Dis_Magic
hgs
parents:
diff changeset
   349
						bytesInBlock = 0;
hgs
parents:
diff changeset
   350
					}
hgs
parents:
diff changeset
   351
				}
hgs
parents:
diff changeset
   352
			}
hgs
parents:
diff changeset
   353
			// Adds fillers also the the end of the parameter list
hgs
parents:
diff changeset
   354
			if (bytesInBlock > 0) {
hgs
parents:
diff changeset
   355
				int fillerCount = 4 - bytesInBlock; // CodForChk_Dis_Magic
hgs
parents:
diff changeset
   356
				for (int i = 0; i < fillerCount; i++) {
hgs
parents:
diff changeset
   357
					createFillerParameter(trace, parameterIndex++);
hgs
parents:
diff changeset
   358
				}
hgs
parents:
diff changeset
   359
				bytesInBlock = 0;
hgs
parents:
diff changeset
   360
			}
hgs
parents:
diff changeset
   361
		} finally {
hgs
parents:
diff changeset
   362
			trace.getModel().processingComplete();
hgs
parents:
diff changeset
   363
		}
hgs
parents:
diff changeset
   364
	}
hgs
parents:
diff changeset
   365
hgs
parents:
diff changeset
   366
	/**
hgs
parents:
diff changeset
   367
	 * Creates a filler parameter
hgs
parents:
diff changeset
   368
	 * 
hgs
parents:
diff changeset
   369
	 * @param trace
hgs
parents:
diff changeset
   370
	 *            the trace for the parameter
hgs
parents:
diff changeset
   371
	 * @param parameterIndex
hgs
parents:
diff changeset
   372
	 *            the index where the filler is inserted
hgs
parents:
diff changeset
   373
	 * @throws TraceCompilerException 
hgs
parents:
diff changeset
   374
	 */
hgs
parents:
diff changeset
   375
	private void createFillerParameter(Trace trace, int parameterIndex) throws TraceCompilerException {
hgs
parents:
diff changeset
   376
		trace.getModel().getFactory().createTraceParameter(parameterIndex,
hgs
parents:
diff changeset
   377
				trace, trace.getParameterCount(),
hgs
parents:
diff changeset
   378
				"Filler", //$NON-NLS-1$
hgs
parents:
diff changeset
   379
				TraceParameter.HEX8,
hgs
parents:
diff changeset
   380
				new TraceModelExtension[] { new FillerParameterRuleImpl() });
hgs
parents:
diff changeset
   381
	}
hgs
parents:
diff changeset
   382
hgs
parents:
diff changeset
   383
}