tracesrv/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/TraceModel.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 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
* Trace model is a collection of trace groups
hgs
parents:
diff changeset
    17
*
hgs
parents:
diff changeset
    18
*/
hgs
parents:
diff changeset
    19
package com.nokia.tracecompiler.model;
hgs
parents:
diff changeset
    20
hgs
parents:
diff changeset
    21
import java.util.ArrayList;
hgs
parents:
diff changeset
    22
import java.util.Collections;
hgs
parents:
diff changeset
    23
import java.util.Enumeration;
hgs
parents:
diff changeset
    24
import java.util.Iterator;
hgs
parents:
diff changeset
    25
import java.util.Properties;
hgs
parents:
diff changeset
    26
hgs
parents:
diff changeset
    27
import com.nokia.tracecompiler.engine.TraceCompilerEngineGlobals;
hgs
parents:
diff changeset
    28
import com.nokia.tracecompiler.engine.TraceCompilerEngineErrorCodes.TraceCompilerErrorCode;
hgs
parents:
diff changeset
    29
import com.nokia.tracecompiler.engine.project.SortedProperties;
hgs
parents:
diff changeset
    30
import com.nokia.tracecompiler.project.FormattingUtils;
hgs
parents:
diff changeset
    31
import com.nokia.tracecompiler.source.SourceConstants;
hgs
parents:
diff changeset
    32
hgs
parents:
diff changeset
    33
/**
hgs
parents:
diff changeset
    34
 * Trace model is a collection of trace groups. Listener interfaces can be
hgs
parents:
diff changeset
    35
 * attached to a trace model to receive change notifications when traces are
hgs
parents:
diff changeset
    36
 * added, removed or modified.
hgs
parents:
diff changeset
    37
 * 
hgs
parents:
diff changeset
    38
 */
hgs
parents:
diff changeset
    39
public class TraceModel extends TraceObject implements Iterable<TraceGroup> {
hgs
parents:
diff changeset
    40
hgs
parents:
diff changeset
    41
	/**
hgs
parents:
diff changeset
    42
	 * Group property prefix
hgs
parents:
diff changeset
    43
	 */
hgs
parents:
diff changeset
    44
	public final String GROUP_PROPERTY_PREFIX = "[GROUP]"; //$NON-NLS-1$
hgs
parents:
diff changeset
    45
hgs
parents:
diff changeset
    46
	/**
hgs
parents:
diff changeset
    47
	 * Trace property prefix
hgs
parents:
diff changeset
    48
	 */
hgs
parents:
diff changeset
    49
	public final String TRACE_PROPERTY_PREFIX = "[TRACE]"; //$NON-NLS-1$
hgs
parents:
diff changeset
    50
hgs
parents:
diff changeset
    51
	/**
hgs
parents:
diff changeset
    52
	 * Obsolete property prefix
hgs
parents:
diff changeset
    53
	 */
hgs
parents:
diff changeset
    54
	public final String OBSOLETE_PROPERTY_PREFIX = "[[OBSOLETE]]"; //$NON-NLS-1$
hgs
parents:
diff changeset
    55
hgs
parents:
diff changeset
    56
	/**
hgs
parents:
diff changeset
    57
	 * Group Id prefix
hgs
parents:
diff changeset
    58
	 */
hgs
parents:
diff changeset
    59
	public final String GROUP_ID_PREFIX = "["; //$NON-NLS-1$
hgs
parents:
diff changeset
    60
hgs
parents:
diff changeset
    61
	/**
hgs
parents:
diff changeset
    62
	 * Group Id suffix
hgs
parents:
diff changeset
    63
	 */
hgs
parents:
diff changeset
    64
	public final String GROUP_ID_SUFFIX = "]"; //$NON-NLS-1$	
hgs
parents:
diff changeset
    65
hgs
parents:
diff changeset
    66
	/**
hgs
parents:
diff changeset
    67
	 * Factory object for creating other trace objects
hgs
parents:
diff changeset
    68
	 */
hgs
parents:
diff changeset
    69
	private TraceObjectFactory factory;
hgs
parents:
diff changeset
    70
hgs
parents:
diff changeset
    71
	/**
hgs
parents:
diff changeset
    72
	 * Property verifier interface
hgs
parents:
diff changeset
    73
	 */
hgs
parents:
diff changeset
    74
	private TraceObjectPropertyVerifier verifier;
hgs
parents:
diff changeset
    75
hgs
parents:
diff changeset
    76
	/**
hgs
parents:
diff changeset
    77
	 * List of trace groups
hgs
parents:
diff changeset
    78
	 */
hgs
parents:
diff changeset
    79
	private ArrayList<TraceGroup> groups = new ArrayList<TraceGroup>();
hgs
parents:
diff changeset
    80
hgs
parents:
diff changeset
    81
	/**
hgs
parents:
diff changeset
    82
	 * List of traces, sorted by name
hgs
parents:
diff changeset
    83
	 */
hgs
parents:
diff changeset
    84
	private ArrayList<Trace> tracesByName = new ArrayList<Trace>();
hgs
parents:
diff changeset
    85
hgs
parents:
diff changeset
    86
	/**
hgs
parents:
diff changeset
    87
	 * List of model listeners
hgs
parents:
diff changeset
    88
	 */
hgs
parents:
diff changeset
    89
	private ArrayList<TraceModelListener> modelListeners = new ArrayList<TraceModelListener>();
hgs
parents:
diff changeset
    90
hgs
parents:
diff changeset
    91
	/**
hgs
parents:
diff changeset
    92
	 * List of extension listeners
hgs
parents:
diff changeset
    93
	 */
hgs
parents:
diff changeset
    94
	private ArrayList<TraceModelExtensionListener> extensionListeners = new ArrayList<TraceModelExtensionListener>();
hgs
parents:
diff changeset
    95
hgs
parents:
diff changeset
    96
	/**
hgs
parents:
diff changeset
    97
	 * List of reset listeners
hgs
parents:
diff changeset
    98
	 */
hgs
parents:
diff changeset
    99
	private ArrayList<TraceModelResetListener> resetListeners = new ArrayList<TraceModelResetListener>();
hgs
parents:
diff changeset
   100
hgs
parents:
diff changeset
   101
	/**
hgs
parents:
diff changeset
   102
	 * Processing listeners
hgs
parents:
diff changeset
   103
	 */
hgs
parents:
diff changeset
   104
	private ArrayList<TraceProcessingListener> processingListeners = new ArrayList<TraceProcessingListener>();
hgs
parents:
diff changeset
   105
hgs
parents:
diff changeset
   106
	/**
hgs
parents:
diff changeset
   107
	 * List of constant tables
hgs
parents:
diff changeset
   108
	 */
hgs
parents:
diff changeset
   109
	private ArrayList<TraceConstantTable> constantTables = new ArrayList<TraceConstantTable>();
hgs
parents:
diff changeset
   110
hgs
parents:
diff changeset
   111
	/**
hgs
parents:
diff changeset
   112
	 * Validity flag
hgs
parents:
diff changeset
   113
	 */
hgs
parents:
diff changeset
   114
	private boolean valid;
hgs
parents:
diff changeset
   115
hgs
parents:
diff changeset
   116
	/**
hgs
parents:
diff changeset
   117
	 * Number of nested calls to startProcessing
hgs
parents:
diff changeset
   118
	 */
hgs
parents:
diff changeset
   119
	private int isProcessing;
hgs
parents:
diff changeset
   120
hgs
parents:
diff changeset
   121
	/**
hgs
parents:
diff changeset
   122
	 * Model was changed during processing
hgs
parents:
diff changeset
   123
	 */
hgs
parents:
diff changeset
   124
	private boolean modelChangedDuringProcessing;
hgs
parents:
diff changeset
   125
hgs
parents:
diff changeset
   126
	/**
hgs
parents:
diff changeset
   127
	 * Fixed Ids from fixed Ids definition file
hgs
parents:
diff changeset
   128
	 */
hgs
parents:
diff changeset
   129
	private SortedProperties fixedIds;
hgs
parents:
diff changeset
   130
hgs
parents:
diff changeset
   131
	/**
hgs
parents:
diff changeset
   132
	 * Hex radix
hgs
parents:
diff changeset
   133
	 */
hgs
parents:
diff changeset
   134
	public int HEX_RADIX = 16; // CodForChk_Dis_Magic
hgs
parents:
diff changeset
   135
hgs
parents:
diff changeset
   136
	/**
hgs
parents:
diff changeset
   137
	 * Constructor
hgs
parents:
diff changeset
   138
	 * 
hgs
parents:
diff changeset
   139
	 * @param factory
hgs
parents:
diff changeset
   140
	 *            the rule factory
hgs
parents:
diff changeset
   141
	 * @param verifier
hgs
parents:
diff changeset
   142
	 *            the property verifier
hgs
parents:
diff changeset
   143
	 * @throws TraceCompilerException 
hgs
parents:
diff changeset
   144
	 */
hgs
parents:
diff changeset
   145
	public TraceModel(TraceObjectRuleFactory factory,
hgs
parents:
diff changeset
   146
			TraceObjectPropertyVerifier verifier) throws TraceCompilerException {
hgs
parents:
diff changeset
   147
		// Stored for callback purposes
hgs
parents:
diff changeset
   148
		setModel(this);
hgs
parents:
diff changeset
   149
		this.factory = new TraceObjectFactory(this, factory);
hgs
parents:
diff changeset
   150
		this.verifier = verifier;
hgs
parents:
diff changeset
   151
	}
hgs
parents:
diff changeset
   152
hgs
parents:
diff changeset
   153
	/**
hgs
parents:
diff changeset
   154
	 * Adds a new trace model listener to this model
hgs
parents:
diff changeset
   155
	 * 
hgs
parents:
diff changeset
   156
	 * @param listener
hgs
parents:
diff changeset
   157
	 *            the new listener
hgs
parents:
diff changeset
   158
	 */
hgs
parents:
diff changeset
   159
	public void addModelListener(TraceModelListener listener) {
hgs
parents:
diff changeset
   160
		modelListeners.add(listener);
hgs
parents:
diff changeset
   161
	}
hgs
parents:
diff changeset
   162
hgs
parents:
diff changeset
   163
	/**
hgs
parents:
diff changeset
   164
	 * Removes a trace model listener. Does nothing if the listener is not found
hgs
parents:
diff changeset
   165
	 * 
hgs
parents:
diff changeset
   166
	 * @param listener
hgs
parents:
diff changeset
   167
	 *            the listener to be removed
hgs
parents:
diff changeset
   168
	 */
hgs
parents:
diff changeset
   169
	public void removeModelListener(TraceModelListener listener) {
hgs
parents:
diff changeset
   170
		modelListeners.remove(listener);
hgs
parents:
diff changeset
   171
	}
hgs
parents:
diff changeset
   172
hgs
parents:
diff changeset
   173
	/**
hgs
parents:
diff changeset
   174
	 * Adds a new trace model extension listener to this model
hgs
parents:
diff changeset
   175
	 * 
hgs
parents:
diff changeset
   176
	 * @param listener
hgs
parents:
diff changeset
   177
	 *            the new listener
hgs
parents:
diff changeset
   178
	 */
hgs
parents:
diff changeset
   179
	public void addExtensionListener(TraceModelExtensionListener listener) {
hgs
parents:
diff changeset
   180
		extensionListeners.add(listener);
hgs
parents:
diff changeset
   181
	}
hgs
parents:
diff changeset
   182
hgs
parents:
diff changeset
   183
	/**
hgs
parents:
diff changeset
   184
	 * Removes a trace model extension listener. Does nothing if the listener is
hgs
parents:
diff changeset
   185
	 * not found
hgs
parents:
diff changeset
   186
	 * 
hgs
parents:
diff changeset
   187
	 * @param listener
hgs
parents:
diff changeset
   188
	 *            the listener to be removed
hgs
parents:
diff changeset
   189
	 */
hgs
parents:
diff changeset
   190
	public void removeExtensionListener(TraceModelExtensionListener listener) {
hgs
parents:
diff changeset
   191
		extensionListeners.remove(listener);
hgs
parents:
diff changeset
   192
	}
hgs
parents:
diff changeset
   193
hgs
parents:
diff changeset
   194
	/**
hgs
parents:
diff changeset
   195
	 * Adds a new trace model reset listener to this model
hgs
parents:
diff changeset
   196
	 * 
hgs
parents:
diff changeset
   197
	 * @param listener
hgs
parents:
diff changeset
   198
	 *            the new listener
hgs
parents:
diff changeset
   199
	 */
hgs
parents:
diff changeset
   200
	public void addResetListener(TraceModelResetListener listener) {
hgs
parents:
diff changeset
   201
		resetListeners.add(listener);
hgs
parents:
diff changeset
   202
	}
hgs
parents:
diff changeset
   203
hgs
parents:
diff changeset
   204
	/**
hgs
parents:
diff changeset
   205
	 * Removes a trace model reset listener. Does nothing if the listener is not
hgs
parents:
diff changeset
   206
	 * found
hgs
parents:
diff changeset
   207
	 * 
hgs
parents:
diff changeset
   208
	 * @param listener
hgs
parents:
diff changeset
   209
	 *            the listener to be removed
hgs
parents:
diff changeset
   210
	 */
hgs
parents:
diff changeset
   211
	public void removeResetListener(TraceModelResetListener listener) {
hgs
parents:
diff changeset
   212
		resetListeners.remove(listener);
hgs
parents:
diff changeset
   213
	}
hgs
parents:
diff changeset
   214
hgs
parents:
diff changeset
   215
	/**
hgs
parents:
diff changeset
   216
	 * Adds a new trace model listener to this model
hgs
parents:
diff changeset
   217
	 * 
hgs
parents:
diff changeset
   218
	 * @param listener
hgs
parents:
diff changeset
   219
	 *            the new listener
hgs
parents:
diff changeset
   220
	 */
hgs
parents:
diff changeset
   221
	public void addProcessingListener(TraceProcessingListener listener) {
hgs
parents:
diff changeset
   222
		processingListeners.add(listener);
hgs
parents:
diff changeset
   223
	}
hgs
parents:
diff changeset
   224
hgs
parents:
diff changeset
   225
	/**
hgs
parents:
diff changeset
   226
	 * Removes a processing listener. Does nothing if the listener is not found
hgs
parents:
diff changeset
   227
	 * 
hgs
parents:
diff changeset
   228
	 * @param listener
hgs
parents:
diff changeset
   229
	 *            the listener to be removed
hgs
parents:
diff changeset
   230
	 */
hgs
parents:
diff changeset
   231
	public void removeProcessingListener(TraceProcessingListener listener) {
hgs
parents:
diff changeset
   232
		processingListeners.remove(listener);
hgs
parents:
diff changeset
   233
	}
hgs
parents:
diff changeset
   234
hgs
parents:
diff changeset
   235
	/**
hgs
parents:
diff changeset
   236
	 * Returns highest group ID + 1. Can be used to create an unique ID for a
hgs
parents:
diff changeset
   237
	 * new trace group.
hgs
parents:
diff changeset
   238
	 * 
hgs
parents:
diff changeset
   239
	 * @return the next trace group ID
hgs
parents:
diff changeset
   240
	 * @throws TraceCompilerException
hgs
parents:
diff changeset
   241
	 */
hgs
parents:
diff changeset
   242
	public int getNextGroupID() throws TraceCompilerException {
hgs
parents:
diff changeset
   243
		int currentMaxGroupId = 0;
hgs
parents:
diff changeset
   244
		int nextGroupId = 0;
hgs
parents:
diff changeset
   245
		// Check if there are some fixed Ids
hgs
parents:
diff changeset
   246
		if (fixedIds != null) {
hgs
parents:
diff changeset
   247
			Enumeration<Object> keys = this.fixedIds.keys();
hgs
parents:
diff changeset
   248
			// Go through fixed Ids and check if there are fixed group Ids
hgs
parents:
diff changeset
   249
			while (keys.hasMoreElements()) {
hgs
parents:
diff changeset
   250
				String key = (String) keys.nextElement();
hgs
parents:
diff changeset
   251
				if (key.startsWith(GROUP_PROPERTY_PREFIX)
hgs
parents:
diff changeset
   252
						|| key.startsWith(OBSOLETE_PROPERTY_PREFIX
hgs
parents:
diff changeset
   253
								+ GROUP_PROPERTY_PREFIX)) {
hgs
parents:
diff changeset
   254
					// Fixed group Id found. Try to covert it to int value.
hgs
parents:
diff changeset
   255
					String value = fixedIds.getProperty(key);
hgs
parents:
diff changeset
   256
					int fixedId = 0;
hgs
parents:
diff changeset
   257
					try {
hgs
parents:
diff changeset
   258
						fixedId = Integer.decode(value).intValue();
hgs
parents:
diff changeset
   259
					} catch (NumberFormatException e) {
hgs
parents:
diff changeset
   260
						// Corrupted. Get next group Id later on.
hgs
parents:
diff changeset
   261
						currentMaxGroupId = 0;
hgs
parents:
diff changeset
   262
						break;
hgs
parents:
diff changeset
   263
					}
hgs
parents:
diff changeset
   264
					// Check if found fixed Id is bigger than current max group
hgs
parents:
diff changeset
   265
					// Id
hgs
parents:
diff changeset
   266
					if (fixedId > currentMaxGroupId) {
hgs
parents:
diff changeset
   267
						currentMaxGroupId = fixedId;
hgs
parents:
diff changeset
   268
					}
hgs
parents:
diff changeset
   269
				}
hgs
parents:
diff changeset
   270
			}
hgs
parents:
diff changeset
   271
		}
hgs
parents:
diff changeset
   272
hgs
parents:
diff changeset
   273
		// If there were fixed group Ids. Set next group Id to be current max
hgs
parents:
diff changeset
   274
		// group Id + 1
hgs
parents:
diff changeset
   275
		if (currentMaxGroupId != 0) {
hgs
parents:
diff changeset
   276
			nextGroupId = currentMaxGroupId + 1;
hgs
parents:
diff changeset
   277
		}
hgs
parents:
diff changeset
   278
hgs
parents:
diff changeset
   279
		// Get current max group id in model
hgs
parents:
diff changeset
   280
		int maxGroupIdInModel = 0;
hgs
parents:
diff changeset
   281
		for (TraceGroup group : groups) {
hgs
parents:
diff changeset
   282
			int groupIdInModel = group.getID();
hgs
parents:
diff changeset
   283
			if (groupIdInModel > maxGroupIdInModel) {
hgs
parents:
diff changeset
   284
				maxGroupIdInModel = groupIdInModel;
hgs
parents:
diff changeset
   285
			}
hgs
parents:
diff changeset
   286
		}
hgs
parents:
diff changeset
   287
hgs
parents:
diff changeset
   288
		// If next group Id is zero or smaller than current max group id in
hgs
parents:
diff changeset
   289
		// model + 1. Set it be same as current max group id in model + 1. This
hgs
parents:
diff changeset
   290
		// is done in case that we have added more than one new group after last
hgs
parents:
diff changeset
   291
		// fixed Id update
hgs
parents:
diff changeset
   292
		if (nextGroupId == 0 || nextGroupId < maxGroupIdInModel + 1) {
hgs
parents:
diff changeset
   293
			nextGroupId = maxGroupIdInModel + 1;
hgs
parents:
diff changeset
   294
		}
hgs
parents:
diff changeset
   295
hgs
parents:
diff changeset
   296
		// Check that next group Id is not bigger than max group Id
hgs
parents:
diff changeset
   297
		if (nextGroupId > TraceCompilerEngineGlobals.MAX_GROUP_ID) {
hgs
parents:
diff changeset
   298
			throw new TraceCompilerException(
hgs
parents:
diff changeset
   299
					TraceCompilerErrorCode.RUN_OUT_OF_GROUP_IDS);
hgs
parents:
diff changeset
   300
		}
hgs
parents:
diff changeset
   301
hgs
parents:
diff changeset
   302
		return nextGroupId;
hgs
parents:
diff changeset
   303
	}
hgs
parents:
diff changeset
   304
hgs
parents:
diff changeset
   305
	/**
hgs
parents:
diff changeset
   306
	 * Returns highest constant table ID + 1. Can be used to create an unique ID
hgs
parents:
diff changeset
   307
	 * for a new constant table.
hgs
parents:
diff changeset
   308
	 * 
hgs
parents:
diff changeset
   309
	 * @return the next constant table ID
hgs
parents:
diff changeset
   310
	 */
hgs
parents:
diff changeset
   311
	public int getNextConstantTableID() {
hgs
parents:
diff changeset
   312
		int max = 0;
hgs
parents:
diff changeset
   313
		for (TraceConstantTable table : constantTables) {
hgs
parents:
diff changeset
   314
			int id = table.getID();
hgs
parents:
diff changeset
   315
			if (id > max) {
hgs
parents:
diff changeset
   316
				max = id;
hgs
parents:
diff changeset
   317
			}
hgs
parents:
diff changeset
   318
		}
hgs
parents:
diff changeset
   319
		return max + 1;
hgs
parents:
diff changeset
   320
	}
hgs
parents:
diff changeset
   321
hgs
parents:
diff changeset
   322
	/**
hgs
parents:
diff changeset
   323
	 * Removes a trace group from this model. Create groupRemoved event to model
hgs
parents:
diff changeset
   324
	 * listeners
hgs
parents:
diff changeset
   325
	 * 
hgs
parents:
diff changeset
   326
	 * @param group
hgs
parents:
diff changeset
   327
	 *            the group to be removed
hgs
parents:
diff changeset
   328
	 * @throws TraceCompilerException 
hgs
parents:
diff changeset
   329
	 */
hgs
parents:
diff changeset
   330
	public void removeGroup(TraceGroup group) throws TraceCompilerException {
hgs
parents:
diff changeset
   331
		if (groups.remove(group)) {
hgs
parents:
diff changeset
   332
			notifyObjectRemoved(this, group);
hgs
parents:
diff changeset
   333
			group.reset();
hgs
parents:
diff changeset
   334
		}
hgs
parents:
diff changeset
   335
	}
hgs
parents:
diff changeset
   336
hgs
parents:
diff changeset
   337
	/**
hgs
parents:
diff changeset
   338
	 * Determines if this model contains any trace groups
hgs
parents:
diff changeset
   339
	 * 
hgs
parents:
diff changeset
   340
	 * @return true if there are trace groups
hgs
parents:
diff changeset
   341
	 */
hgs
parents:
diff changeset
   342
	public boolean hasGroups() {
hgs
parents:
diff changeset
   343
		return !groups.isEmpty();
hgs
parents:
diff changeset
   344
	}
hgs
parents:
diff changeset
   345
hgs
parents:
diff changeset
   346
	/**
hgs
parents:
diff changeset
   347
	 * Gets the number of trace groups
hgs
parents:
diff changeset
   348
	 * 
hgs
parents:
diff changeset
   349
	 * @return trace group count
hgs
parents:
diff changeset
   350
	 */
hgs
parents:
diff changeset
   351
	public int getGroupCount() {
hgs
parents:
diff changeset
   352
		return groups.size();
hgs
parents:
diff changeset
   353
	}
hgs
parents:
diff changeset
   354
hgs
parents:
diff changeset
   355
	/**
hgs
parents:
diff changeset
   356
	 * Returns the trace groups of this model
hgs
parents:
diff changeset
   357
	 * 
hgs
parents:
diff changeset
   358
	 * @return the iterator over the groups
hgs
parents:
diff changeset
   359
	 */
hgs
parents:
diff changeset
   360
	public Iterator<TraceGroup> getGroups() {
hgs
parents:
diff changeset
   361
		return groups.iterator();
hgs
parents:
diff changeset
   362
	}
hgs
parents:
diff changeset
   363
hgs
parents:
diff changeset
   364
	/*
hgs
parents:
diff changeset
   365
	 * (non-Javadoc)
hgs
parents:
diff changeset
   366
	 * 
hgs
parents:
diff changeset
   367
	 * @see java.lang.Iterable#iterator()
hgs
parents:
diff changeset
   368
	 */
hgs
parents:
diff changeset
   369
	public Iterator<TraceGroup> iterator() {
hgs
parents:
diff changeset
   370
		return groups.iterator();
hgs
parents:
diff changeset
   371
	}
hgs
parents:
diff changeset
   372
hgs
parents:
diff changeset
   373
	/**
hgs
parents:
diff changeset
   374
	 * Removes all trace groups and parameters from this model. Extensions are
hgs
parents:
diff changeset
   375
	 * not removed. Notifies the reset listeners with modelResetting and
hgs
parents:
diff changeset
   376
	 * modelReset
hgs
parents:
diff changeset
   377
	 * 
hgs
parents:
diff changeset
   378
	 * @see TraceModelResetListener#modelResetting
hgs
parents:
diff changeset
   379
	 * @see TraceModelResetListener#modelReset
hgs
parents:
diff changeset
   380
	 */
hgs
parents:
diff changeset
   381
	@Override
hgs
parents:
diff changeset
   382
	public void reset() {
hgs
parents:
diff changeset
   383
		notifyModelResetting();
hgs
parents:
diff changeset
   384
		// Properties are removed, other extensions are left
hgs
parents:
diff changeset
   385
		removeExtensions(TraceObjectPropertyList.class);
hgs
parents:
diff changeset
   386
		groups.clear();
hgs
parents:
diff changeset
   387
		tracesByName.clear();
hgs
parents:
diff changeset
   388
		constantTables.clear();
hgs
parents:
diff changeset
   389
		fixedIds = null;
hgs
parents:
diff changeset
   390
		super.reset();
hgs
parents:
diff changeset
   391
		notifyModelReset();
hgs
parents:
diff changeset
   392
	}
hgs
parents:
diff changeset
   393
hgs
parents:
diff changeset
   394
	/**
hgs
parents:
diff changeset
   395
	 * Gets the group which has given ID
hgs
parents:
diff changeset
   396
	 * 
hgs
parents:
diff changeset
   397
	 * @param id
hgs
parents:
diff changeset
   398
	 *            the id
hgs
parents:
diff changeset
   399
	 * @return group or null
hgs
parents:
diff changeset
   400
	 */
hgs
parents:
diff changeset
   401
	public TraceGroup findGroupByID(int id) {
hgs
parents:
diff changeset
   402
		TraceGroup retval = null;
hgs
parents:
diff changeset
   403
		for (TraceGroup group : groups) {
hgs
parents:
diff changeset
   404
			if (group.getID() == id) {
hgs
parents:
diff changeset
   405
				retval = group;
hgs
parents:
diff changeset
   406
				break;
hgs
parents:
diff changeset
   407
			}
hgs
parents:
diff changeset
   408
		}
hgs
parents:
diff changeset
   409
		return retval;
hgs
parents:
diff changeset
   410
	}
hgs
parents:
diff changeset
   411
hgs
parents:
diff changeset
   412
	/**
hgs
parents:
diff changeset
   413
	 * Locates a trace group which has the given name.
hgs
parents:
diff changeset
   414
	 * 
hgs
parents:
diff changeset
   415
	 * @param name
hgs
parents:
diff changeset
   416
	 *            the name of the trace group
hgs
parents:
diff changeset
   417
	 * @return the group or null if not found
hgs
parents:
diff changeset
   418
	 * @see TraceObject#getName
hgs
parents:
diff changeset
   419
	 */
hgs
parents:
diff changeset
   420
	public TraceGroup findGroupByName(String name) {
hgs
parents:
diff changeset
   421
		TraceGroup retval = null;
hgs
parents:
diff changeset
   422
		for (TraceGroup group : groups) {
hgs
parents:
diff changeset
   423
			if (group.getName().equals(name)) {
hgs
parents:
diff changeset
   424
				retval = group;
hgs
parents:
diff changeset
   425
				break;
hgs
parents:
diff changeset
   426
			}
hgs
parents:
diff changeset
   427
		}
hgs
parents:
diff changeset
   428
		return retval;
hgs
parents:
diff changeset
   429
	}
hgs
parents:
diff changeset
   430
hgs
parents:
diff changeset
   431
	/**
hgs
parents:
diff changeset
   432
	 * Locates a trace which has the given name.
hgs
parents:
diff changeset
   433
	 * 
hgs
parents:
diff changeset
   434
	 * @param name
hgs
parents:
diff changeset
   435
	 *            the name of the trace
hgs
parents:
diff changeset
   436
	 * @return the trace or null if not found
hgs
parents:
diff changeset
   437
	 * @see TraceObject#getName
hgs
parents:
diff changeset
   438
	 */
hgs
parents:
diff changeset
   439
	public Trace findTraceByName(String name) {
hgs
parents:
diff changeset
   440
		Trace retval;
hgs
parents:
diff changeset
   441
		int index = Collections.binarySearch(tracesByName, name,
hgs
parents:
diff changeset
   442
				TraceObjectUtils.traceToNameComparator);
hgs
parents:
diff changeset
   443
		if (index >= 0) {
hgs
parents:
diff changeset
   444
			retval = tracesByName.get(index);
hgs
parents:
diff changeset
   445
		} else {
hgs
parents:
diff changeset
   446
			retval = null;
hgs
parents:
diff changeset
   447
		}
hgs
parents:
diff changeset
   448
		return retval;
hgs
parents:
diff changeset
   449
	}
hgs
parents:
diff changeset
   450
hgs
parents:
diff changeset
   451
	/**
hgs
parents:
diff changeset
   452
	 * Returns the group at given index
hgs
parents:
diff changeset
   453
	 * 
hgs
parents:
diff changeset
   454
	 * @param index
hgs
parents:
diff changeset
   455
	 *            the group index
hgs
parents:
diff changeset
   456
	 * @return the group
hgs
parents:
diff changeset
   457
	 */
hgs
parents:
diff changeset
   458
	public TraceGroup getGroupAt(int index) {
hgs
parents:
diff changeset
   459
		return groups.get(index);
hgs
parents:
diff changeset
   460
	}
hgs
parents:
diff changeset
   461
hgs
parents:
diff changeset
   462
	/**
hgs
parents:
diff changeset
   463
	 * Removes a constant table from this model. Creates objectRemoved event to
hgs
parents:
diff changeset
   464
	 * model listeners
hgs
parents:
diff changeset
   465
	 * 
hgs
parents:
diff changeset
   466
	 * @see TraceModelListener#objectRemoved(TraceObject, TraceObject)
hgs
parents:
diff changeset
   467
	 * @param table
hgs
parents:
diff changeset
   468
	 *            the table to be removed
hgs
parents:
diff changeset
   469
	 * @throws TraceCompilerException 
hgs
parents:
diff changeset
   470
	 */
hgs
parents:
diff changeset
   471
	public void removeConstantTable(TraceConstantTable table) throws TraceCompilerException {
hgs
parents:
diff changeset
   472
		if (constantTables.remove(table)) {
hgs
parents:
diff changeset
   473
			notifyObjectRemoved(this, table);
hgs
parents:
diff changeset
   474
			table.reset();
hgs
parents:
diff changeset
   475
		}
hgs
parents:
diff changeset
   476
	}
hgs
parents:
diff changeset
   477
hgs
parents:
diff changeset
   478
	/**
hgs
parents:
diff changeset
   479
	 * Gets the constant tables of this model
hgs
parents:
diff changeset
   480
	 * 
hgs
parents:
diff changeset
   481
	 * @return the tables iterator
hgs
parents:
diff changeset
   482
	 */
hgs
parents:
diff changeset
   483
	public Iterator<TraceConstantTable> getConstantTables() {
hgs
parents:
diff changeset
   484
		return constantTables.iterator();
hgs
parents:
diff changeset
   485
	}
hgs
parents:
diff changeset
   486
hgs
parents:
diff changeset
   487
	/**
hgs
parents:
diff changeset
   488
	 * Gets a constant table by ID
hgs
parents:
diff changeset
   489
	 * 
hgs
parents:
diff changeset
   490
	 * @param id
hgs
parents:
diff changeset
   491
	 *            the ID
hgs
parents:
diff changeset
   492
	 * @return the table or null
hgs
parents:
diff changeset
   493
	 */
hgs
parents:
diff changeset
   494
	public TraceConstantTable findConstantTableByID(int id) {
hgs
parents:
diff changeset
   495
		TraceConstantTable retval = null;
hgs
parents:
diff changeset
   496
		for (TraceConstantTable table : constantTables) {
hgs
parents:
diff changeset
   497
			if (table.getID() == id) {
hgs
parents:
diff changeset
   498
				retval = table;
hgs
parents:
diff changeset
   499
				break;
hgs
parents:
diff changeset
   500
			}
hgs
parents:
diff changeset
   501
		}
hgs
parents:
diff changeset
   502
		return retval;
hgs
parents:
diff changeset
   503
	}
hgs
parents:
diff changeset
   504
hgs
parents:
diff changeset
   505
	/**
hgs
parents:
diff changeset
   506
	 * Gets a constant table by name
hgs
parents:
diff changeset
   507
	 * 
hgs
parents:
diff changeset
   508
	 * @param tableName
hgs
parents:
diff changeset
   509
	 *            the name
hgs
parents:
diff changeset
   510
	 * @return the table or null
hgs
parents:
diff changeset
   511
	 */
hgs
parents:
diff changeset
   512
	public TraceConstantTable findConstantTableByName(String tableName) {
hgs
parents:
diff changeset
   513
		TraceConstantTable retval = null;
hgs
parents:
diff changeset
   514
		for (TraceConstantTable table : constantTables) {
hgs
parents:
diff changeset
   515
			if (table.getName().equals(tableName)) {
hgs
parents:
diff changeset
   516
				retval = table;
hgs
parents:
diff changeset
   517
				break;
hgs
parents:
diff changeset
   518
			}
hgs
parents:
diff changeset
   519
		}
hgs
parents:
diff changeset
   520
		return retval;
hgs
parents:
diff changeset
   521
	}
hgs
parents:
diff changeset
   522
hgs
parents:
diff changeset
   523
	/**
hgs
parents:
diff changeset
   524
	 * Checks if this model contains constant tables
hgs
parents:
diff changeset
   525
	 * 
hgs
parents:
diff changeset
   526
	 * @return true if there are constant tables
hgs
parents:
diff changeset
   527
	 */
hgs
parents:
diff changeset
   528
	public boolean hasConstantTables() {
hgs
parents:
diff changeset
   529
		return !constantTables.isEmpty();
hgs
parents:
diff changeset
   530
	}
hgs
parents:
diff changeset
   531
hgs
parents:
diff changeset
   532
	/**
hgs
parents:
diff changeset
   533
	 * Returns the constant table at given index
hgs
parents:
diff changeset
   534
	 * 
hgs
parents:
diff changeset
   535
	 * @param index
hgs
parents:
diff changeset
   536
	 *            the group index
hgs
parents:
diff changeset
   537
	 * @return the group
hgs
parents:
diff changeset
   538
	 */
hgs
parents:
diff changeset
   539
	public TraceConstantTable getConstantTableAt(int index) {
hgs
parents:
diff changeset
   540
		return constantTables.get(index);
hgs
parents:
diff changeset
   541
	}
hgs
parents:
diff changeset
   542
hgs
parents:
diff changeset
   543
	/**
hgs
parents:
diff changeset
   544
	 * Adds a new trace group to this model. Creates objectAdded event to model
hgs
parents:
diff changeset
   545
	 * listeners. This is only intended to be called from TraceGroup
hgs
parents:
diff changeset
   546
	 * constructor, so this is not public.
hgs
parents:
diff changeset
   547
	 * 
hgs
parents:
diff changeset
   548
	 * @see TraceModelListener#objectAdded(TraceObject, TraceObject)
hgs
parents:
diff changeset
   549
	 * @param group
hgs
parents:
diff changeset
   550
	 *            the group to be added
hgs
parents:
diff changeset
   551
	 */
hgs
parents:
diff changeset
   552
	void addGroup(TraceGroup group) {
hgs
parents:
diff changeset
   553
		groups.add(group);
hgs
parents:
diff changeset
   554
		notifyObjectAdded(this, group);
hgs
parents:
diff changeset
   555
	}
hgs
parents:
diff changeset
   556
hgs
parents:
diff changeset
   557
	/**
hgs
parents:
diff changeset
   558
	 * Adds a constant table to this model. Created objectAdded event to model
hgs
parents:
diff changeset
   559
	 * listeners. This is only intended to be called from constant table
hgs
parents:
diff changeset
   560
	 * constructor, so this is not public
hgs
parents:
diff changeset
   561
	 * 
hgs
parents:
diff changeset
   562
	 * @see TraceModelListener#objectAdded(TraceObject, TraceObject)
hgs
parents:
diff changeset
   563
	 * @param table
hgs
parents:
diff changeset
   564
	 *            the constant table
hgs
parents:
diff changeset
   565
	 */
hgs
parents:
diff changeset
   566
	void addConstantTable(TraceConstantTable table) {
hgs
parents:
diff changeset
   567
		constantTables.add(table);
hgs
parents:
diff changeset
   568
		notifyObjectAdded(this, table);
hgs
parents:
diff changeset
   569
	}
hgs
parents:
diff changeset
   570
hgs
parents:
diff changeset
   571
	/**
hgs
parents:
diff changeset
   572
	 * Fires propertiesUpdated event. Called from trace objects when their
hgs
parents:
diff changeset
   573
	 * properties change.
hgs
parents:
diff changeset
   574
	 * 
hgs
parents:
diff changeset
   575
	 * @see TraceModelListener#propertyUpdated(TraceObject, int)
hgs
parents:
diff changeset
   576
	 * @param source
hgs
parents:
diff changeset
   577
	 *            the object that changed
hgs
parents:
diff changeset
   578
	 * @param property
hgs
parents:
diff changeset
   579
	 *            the property that changed
hgs
parents:
diff changeset
   580
	 * @throws TraceCompilerException 
hgs
parents:
diff changeset
   581
	 */
hgs
parents:
diff changeset
   582
	void notifyPropertyUpdated(TraceObject source, int property) throws TraceCompilerException {
hgs
parents:
diff changeset
   583
		if (source instanceof Trace) {
hgs
parents:
diff changeset
   584
			if (property == TraceModelListener.NAME) {
hgs
parents:
diff changeset
   585
				Collections.sort(tracesByName,
hgs
parents:
diff changeset
   586
						TraceObjectUtils.traceObjectNameComparator);
hgs
parents:
diff changeset
   587
			}
hgs
parents:
diff changeset
   588
			((Trace) source).getGroup().tracePropertyUpdated(source, property);
hgs
parents:
diff changeset
   589
		}
hgs
parents:
diff changeset
   590
		for (TraceModelListener l : modelListeners) {
hgs
parents:
diff changeset
   591
			l.propertyUpdated(source, property);
hgs
parents:
diff changeset
   592
		}
hgs
parents:
diff changeset
   593
		modelChangedDuringProcessing = true;
hgs
parents:
diff changeset
   594
	}
hgs
parents:
diff changeset
   595
hgs
parents:
diff changeset
   596
	/**
hgs
parents:
diff changeset
   597
	 * Fires objectAdded event to listeners
hgs
parents:
diff changeset
   598
	 * 
hgs
parents:
diff changeset
   599
	 * @see TraceModelListener#objectAdded(TraceObject, TraceObject)
hgs
parents:
diff changeset
   600
	 * @param owner
hgs
parents:
diff changeset
   601
	 *            the owner object
hgs
parents:
diff changeset
   602
	 * @param object
hgs
parents:
diff changeset
   603
	 *            the object that was added
hgs
parents:
diff changeset
   604
	 */
hgs
parents:
diff changeset
   605
	void notifyObjectAdded(TraceObject owner, TraceObject object) {
hgs
parents:
diff changeset
   606
		// List is sorted when the name is set to the trace
hgs
parents:
diff changeset
   607
		if (object instanceof Trace) {
hgs
parents:
diff changeset
   608
			tracesByName.add((Trace) object);
hgs
parents:
diff changeset
   609
		}
hgs
parents:
diff changeset
   610
		for (TraceModelListener l : modelListeners) {
hgs
parents:
diff changeset
   611
			l.objectAdded(owner, object);
hgs
parents:
diff changeset
   612
		}
hgs
parents:
diff changeset
   613
		modelChangedDuringProcessing = true;
hgs
parents:
diff changeset
   614
	}
hgs
parents:
diff changeset
   615
hgs
parents:
diff changeset
   616
	/**
hgs
parents:
diff changeset
   617
	 * Fires objectRemoved event to listeners
hgs
parents:
diff changeset
   618
	 * 
hgs
parents:
diff changeset
   619
	 * @see TraceModelListener#objectRemoved(TraceObject, TraceObject)
hgs
parents:
diff changeset
   620
	 * @param owner
hgs
parents:
diff changeset
   621
	 *            the owner object
hgs
parents:
diff changeset
   622
	 * @param object
hgs
parents:
diff changeset
   623
	 *            the object that was removed
hgs
parents:
diff changeset
   624
	 * @throws TraceCompilerException 
hgs
parents:
diff changeset
   625
	 */
hgs
parents:
diff changeset
   626
	void notifyObjectRemoved(TraceObject owner, TraceObject object) throws TraceCompilerException {
hgs
parents:
diff changeset
   627
		if (object instanceof Trace) {
hgs
parents:
diff changeset
   628
			int index = Collections.binarySearch(tracesByName, (Trace) object,
hgs
parents:
diff changeset
   629
					TraceObjectUtils.traceObjectNameComparator);
hgs
parents:
diff changeset
   630
			tracesByName.remove(index);
hgs
parents:
diff changeset
   631
		}
hgs
parents:
diff changeset
   632
		notifyOnDelete(object);
hgs
parents:
diff changeset
   633
		for (TraceModelListener l : modelListeners) {
hgs
parents:
diff changeset
   634
			l.objectRemoved(owner, object);
hgs
parents:
diff changeset
   635
		}
hgs
parents:
diff changeset
   636
		modelChangedDuringProcessing = true;
hgs
parents:
diff changeset
   637
	}
hgs
parents:
diff changeset
   638
hgs
parents:
diff changeset
   639
	/**
hgs
parents:
diff changeset
   640
	 * Notifies that an object creation is complete
hgs
parents:
diff changeset
   641
	 * 
hgs
parents:
diff changeset
   642
	 * @see TraceModelListener#objectCreationComplete(TraceObject)
hgs
parents:
diff changeset
   643
	 * @param object
hgs
parents:
diff changeset
   644
	 *            the object
hgs
parents:
diff changeset
   645
	 * @throws TraceCompilerException 
hgs
parents:
diff changeset
   646
	 */
hgs
parents:
diff changeset
   647
	void notifyObjectCreationComplete(TraceObject object) throws TraceCompilerException {
hgs
parents:
diff changeset
   648
		for (TraceModelListener l : modelListeners) {
hgs
parents:
diff changeset
   649
			l.objectCreationComplete(object);
hgs
parents:
diff changeset
   650
		}
hgs
parents:
diff changeset
   651
	}
hgs
parents:
diff changeset
   652
hgs
parents:
diff changeset
   653
	/**
hgs
parents:
diff changeset
   654
	 * Fires modelResetting event to all listeners
hgs
parents:
diff changeset
   655
	 * 
hgs
parents:
diff changeset
   656
	 * @see TraceModelResetListener#modelResetting()
hgs
parents:
diff changeset
   657
	 */
hgs
parents:
diff changeset
   658
	private void notifyModelResetting() {
hgs
parents:
diff changeset
   659
		for (TraceModelResetListener l : resetListeners) {
hgs
parents:
diff changeset
   660
			l.modelResetting();
hgs
parents:
diff changeset
   661
		}
hgs
parents:
diff changeset
   662
	}
hgs
parents:
diff changeset
   663
hgs
parents:
diff changeset
   664
	/**
hgs
parents:
diff changeset
   665
	 * Fires modelReset event to all listeners
hgs
parents:
diff changeset
   666
	 * 
hgs
parents:
diff changeset
   667
	 * @see TraceModelResetListener#modelReset()
hgs
parents:
diff changeset
   668
	 */
hgs
parents:
diff changeset
   669
	private void notifyModelReset() {
hgs
parents:
diff changeset
   670
		for (TraceModelResetListener l : resetListeners) {
hgs
parents:
diff changeset
   671
			l.modelReset();
hgs
parents:
diff changeset
   672
		}
hgs
parents:
diff changeset
   673
	}
hgs
parents:
diff changeset
   674
hgs
parents:
diff changeset
   675
	/**
hgs
parents:
diff changeset
   676
	 * Fires extensionAdded event. Called from TraceObject when extension is
hgs
parents:
diff changeset
   677
	 * added to it
hgs
parents:
diff changeset
   678
	 * 
hgs
parents:
diff changeset
   679
	 * @see TraceModelExtensionListener#extensionAdded(TraceObject,
hgs
parents:
diff changeset
   680
	 *      TraceModelExtension)
hgs
parents:
diff changeset
   681
	 * @param object
hgs
parents:
diff changeset
   682
	 *            the trace object
hgs
parents:
diff changeset
   683
	 * @param extension
hgs
parents:
diff changeset
   684
	 *            the new extension
hgs
parents:
diff changeset
   685
	 */
hgs
parents:
diff changeset
   686
	void notifyExtensionAdded(TraceObject object, TraceModelExtension extension) {
hgs
parents:
diff changeset
   687
		for (TraceModelExtensionListener l : extensionListeners) {
hgs
parents:
diff changeset
   688
			l.extensionAdded(object, extension);
hgs
parents:
diff changeset
   689
		}
hgs
parents:
diff changeset
   690
		modelChangedDuringProcessing = true;
hgs
parents:
diff changeset
   691
	}
hgs
parents:
diff changeset
   692
hgs
parents:
diff changeset
   693
	/**
hgs
parents:
diff changeset
   694
	 * Fires extensionRemoved event. Called from TraceObject when extension is
hgs
parents:
diff changeset
   695
	 * removed from it
hgs
parents:
diff changeset
   696
	 * 
hgs
parents:
diff changeset
   697
	 * @see TraceModelExtensionListener#extensionRemoved(TraceObject,
hgs
parents:
diff changeset
   698
	 *      TraceModelExtension)
hgs
parents:
diff changeset
   699
	 * @param object
hgs
parents:
diff changeset
   700
	 *            the object
hgs
parents:
diff changeset
   701
	 * @param extension
hgs
parents:
diff changeset
   702
	 *            the removed extension
hgs
parents:
diff changeset
   703
	 */
hgs
parents:
diff changeset
   704
	void notifyExtensionRemoved(TraceObject object,
hgs
parents:
diff changeset
   705
			TraceModelExtension extension) {
hgs
parents:
diff changeset
   706
		for (TraceModelExtensionListener l : extensionListeners) {
hgs
parents:
diff changeset
   707
			l.extensionRemoved(object, extension);
hgs
parents:
diff changeset
   708
		}
hgs
parents:
diff changeset
   709
		modelChangedDuringProcessing = true;
hgs
parents:
diff changeset
   710
	}
hgs
parents:
diff changeset
   711
hgs
parents:
diff changeset
   712
	/**
hgs
parents:
diff changeset
   713
	 * Gets the validity flag of this model
hgs
parents:
diff changeset
   714
	 * 
hgs
parents:
diff changeset
   715
	 * @return the validity flag
hgs
parents:
diff changeset
   716
	 */
hgs
parents:
diff changeset
   717
	public boolean isValid() {
hgs
parents:
diff changeset
   718
		return valid;
hgs
parents:
diff changeset
   719
	}
hgs
parents:
diff changeset
   720
hgs
parents:
diff changeset
   721
	/**
hgs
parents:
diff changeset
   722
	 * Sets the validity flag
hgs
parents:
diff changeset
   723
	 * 
hgs
parents:
diff changeset
   724
	 * @param valid
hgs
parents:
diff changeset
   725
	 *            new flag value
hgs
parents:
diff changeset
   726
	 * @throws TraceCompilerException 
hgs
parents:
diff changeset
   727
	 */
hgs
parents:
diff changeset
   728
	public void setValid(boolean valid) throws TraceCompilerException {
hgs
parents:
diff changeset
   729
		if (valid != this.valid) {
hgs
parents:
diff changeset
   730
			this.valid = valid;
hgs
parents:
diff changeset
   731
			for (TraceModelResetListener l : resetListeners) {
hgs
parents:
diff changeset
   732
				l.modelValid(valid);
hgs
parents:
diff changeset
   733
			}
hgs
parents:
diff changeset
   734
		}
hgs
parents:
diff changeset
   735
	}
hgs
parents:
diff changeset
   736
hgs
parents:
diff changeset
   737
	/**
hgs
parents:
diff changeset
   738
	 * Gets the trace object factory
hgs
parents:
diff changeset
   739
	 * 
hgs
parents:
diff changeset
   740
	 * @return the factory
hgs
parents:
diff changeset
   741
	 */
hgs
parents:
diff changeset
   742
	public TraceObjectFactory getFactory() {
hgs
parents:
diff changeset
   743
		return factory;
hgs
parents:
diff changeset
   744
	}
hgs
parents:
diff changeset
   745
hgs
parents:
diff changeset
   746
	/**
hgs
parents:
diff changeset
   747
	 * Gets the object verifier interface. The verifier should be used before
hgs
parents:
diff changeset
   748
	 * updating object properties
hgs
parents:
diff changeset
   749
	 * 
hgs
parents:
diff changeset
   750
	 * @return the verifier
hgs
parents:
diff changeset
   751
	 */
hgs
parents:
diff changeset
   752
	public TraceObjectPropertyVerifier getVerifier() {
hgs
parents:
diff changeset
   753
		return verifier;
hgs
parents:
diff changeset
   754
	}
hgs
parents:
diff changeset
   755
hgs
parents:
diff changeset
   756
	/**
hgs
parents:
diff changeset
   757
	 * Notifies the process listeners that a process the results in multiple
hgs
parents:
diff changeset
   758
	 * listener updates is about to start
hgs
parents:
diff changeset
   759
	 */
hgs
parents:
diff changeset
   760
	public void startProcessing() {
hgs
parents:
diff changeset
   761
		isProcessing++;
hgs
parents:
diff changeset
   762
		if (isProcessing == 1) {
hgs
parents:
diff changeset
   763
			modelChangedDuringProcessing = false;
hgs
parents:
diff changeset
   764
			for (TraceProcessingListener l : processingListeners) {
hgs
parents:
diff changeset
   765
				l.processingStarted();
hgs
parents:
diff changeset
   766
			}
hgs
parents:
diff changeset
   767
		}
hgs
parents:
diff changeset
   768
	}
hgs
parents:
diff changeset
   769
hgs
parents:
diff changeset
   770
	/**
hgs
parents:
diff changeset
   771
	 * Notifies the process listeners that a process the results in multiple
hgs
parents:
diff changeset
   772
	 * listener updates has finished
hgs
parents:
diff changeset
   773
	 */
hgs
parents:
diff changeset
   774
	public void processingComplete() {
hgs
parents:
diff changeset
   775
		isProcessing--;
hgs
parents:
diff changeset
   776
		if (isProcessing == 0) {
hgs
parents:
diff changeset
   777
			for (TraceProcessingListener l : processingListeners) {
hgs
parents:
diff changeset
   778
				l.processingComplete(modelChangedDuringProcessing);
hgs
parents:
diff changeset
   779
			}
hgs
parents:
diff changeset
   780
			modelChangedDuringProcessing = false;
hgs
parents:
diff changeset
   781
		}
hgs
parents:
diff changeset
   782
	}
hgs
parents:
diff changeset
   783
hgs
parents:
diff changeset
   784
	/**
hgs
parents:
diff changeset
   785
	 * Checks the state of the processing flag
hgs
parents:
diff changeset
   786
	 * 
hgs
parents:
diff changeset
   787
	 * @return the processing flag
hgs
parents:
diff changeset
   788
	 */
hgs
parents:
diff changeset
   789
	public boolean isProcessing() {
hgs
parents:
diff changeset
   790
		return isProcessing > 0;
hgs
parents:
diff changeset
   791
	}
hgs
parents:
diff changeset
   792
hgs
parents:
diff changeset
   793
	/**
hgs
parents:
diff changeset
   794
	 * Checks if model has traces
hgs
parents:
diff changeset
   795
	 * 
hgs
parents:
diff changeset
   796
	 * @return true if there's traces, false if not
hgs
parents:
diff changeset
   797
	 */
hgs
parents:
diff changeset
   798
	public boolean hasTraces() {
hgs
parents:
diff changeset
   799
		boolean retval = false;
hgs
parents:
diff changeset
   800
		for (TraceGroup group : groups) {
hgs
parents:
diff changeset
   801
			if (group.hasTraces()) {
hgs
parents:
diff changeset
   802
				retval = true;
hgs
parents:
diff changeset
   803
				break;
hgs
parents:
diff changeset
   804
			}
hgs
parents:
diff changeset
   805
		}
hgs
parents:
diff changeset
   806
		return retval;
hgs
parents:
diff changeset
   807
	}
hgs
parents:
diff changeset
   808
hgs
parents:
diff changeset
   809
	/**
hgs
parents:
diff changeset
   810
	 * Gets group ID from properties
hgs
parents:
diff changeset
   811
	 * 
hgs
parents:
diff changeset
   812
	 * @param properties
hgs
parents:
diff changeset
   813
	 *            the properties
hgs
parents:
diff changeset
   814
	 * @param group
hgs
parents:
diff changeset
   815
	 *            the group
hgs
parents:
diff changeset
   816
	 * @return the group ID
hgs
parents:
diff changeset
   817
	 * @throws TraceCompilerException
hgs
parents:
diff changeset
   818
	 */
hgs
parents:
diff changeset
   819
	public int getGroupID(Properties properties, TraceGroup group)
hgs
parents:
diff changeset
   820
			throws TraceCompilerException {
hgs
parents:
diff changeset
   821
		String value = properties.getProperty(GROUP_PROPERTY_PREFIX
hgs
parents:
diff changeset
   822
				+ group.getName());
hgs
parents:
diff changeset
   823
		int id;
hgs
parents:
diff changeset
   824
		if (value == null) {
hgs
parents:
diff changeset
   825
			// Not found, assign a proper ID
hgs
parents:
diff changeset
   826
			id = getNewIdForGroup(group);
hgs
parents:
diff changeset
   827
hgs
parents:
diff changeset
   828
		} else {
hgs
parents:
diff changeset
   829
			try {
hgs
parents:
diff changeset
   830
				id = Integer.decode(value).intValue();
hgs
parents:
diff changeset
   831
				TraceGroup traceGroup = findGroupByID(id);
hgs
parents:
diff changeset
   832
				if (traceGroup != null && !traceGroup.equals(group)) {
hgs
parents:
diff changeset
   833
					// Id already in use, assign a proper ID
hgs
parents:
diff changeset
   834
					id = getNewIdForGroup(group);
hgs
parents:
diff changeset
   835
				}
hgs
parents:
diff changeset
   836
			} catch (NumberFormatException e) {
hgs
parents:
diff changeset
   837
				// Corrupted, assign a proper ID
hgs
parents:
diff changeset
   838
				id = getNewIdForGroup(group);
hgs
parents:
diff changeset
   839
			}
hgs
parents:
diff changeset
   840
		}
hgs
parents:
diff changeset
   841
		group.internalSetID(id);
hgs
parents:
diff changeset
   842
		return id;
hgs
parents:
diff changeset
   843
	}
hgs
parents:
diff changeset
   844
hgs
parents:
diff changeset
   845
	/**
hgs
parents:
diff changeset
   846
	 * Gets a new ID for this group
hgs
parents:
diff changeset
   847
	 * 
hgs
parents:
diff changeset
   848
	 * @param group
hgs
parents:
diff changeset
   849
	 *            the group
hgs
parents:
diff changeset
   850
	 * @return a new ID for this group
hgs
parents:
diff changeset
   851
	 * @throws TraceCompilerException
hgs
parents:
diff changeset
   852
	 */
hgs
parents:
diff changeset
   853
	private int getNewIdForGroup(TraceGroup group) throws TraceCompilerException {
hgs
parents:
diff changeset
   854
		int id = FormattingUtils.getGroupID(group.getModel(), group.getName());
hgs
parents:
diff changeset
   855
		return id;
hgs
parents:
diff changeset
   856
	}
hgs
parents:
diff changeset
   857
hgs
parents:
diff changeset
   858
	/**
hgs
parents:
diff changeset
   859
	 * Saves trace and group identifiers to given properties.
hgs
parents:
diff changeset
   860
	 * 
hgs
parents:
diff changeset
   861
	 * @param properties
hgs
parents:
diff changeset
   862
	 *            the properties to use
hgs
parents:
diff changeset
   863
	 */
hgs
parents:
diff changeset
   864
	public void saveIDs(Properties properties) {
hgs
parents:
diff changeset
   865
		properties.clear();
hgs
parents:
diff changeset
   866
		StringBuffer sb = new StringBuffer();
hgs
parents:
diff changeset
   867
		for (TraceGroup group : this) {
hgs
parents:
diff changeset
   868
			int groupId = group.getID();
hgs
parents:
diff changeset
   869
			properties.setProperty(GROUP_PROPERTY_PREFIX + group.getName(),
hgs
parents:
diff changeset
   870
					SourceConstants.HEX_PREFIX + Integer.toHexString(groupId));
hgs
parents:
diff changeset
   871
			for (Trace trace : group) {
hgs
parents:
diff changeset
   872
				int traceId = trace.getID();
hgs
parents:
diff changeset
   873
				properties.setProperty(TRACE_PROPERTY_PREFIX
hgs
parents:
diff changeset
   874
						+ createTraceName(sb, group, trace),
hgs
parents:
diff changeset
   875
						SourceConstants.HEX_PREFIX
hgs
parents:
diff changeset
   876
								+ Integer.toHexString(traceId));
hgs
parents:
diff changeset
   877
			}
hgs
parents:
diff changeset
   878
		}
hgs
parents:
diff changeset
   879
	}
hgs
parents:
diff changeset
   880
hgs
parents:
diff changeset
   881
	/**
hgs
parents:
diff changeset
   882
	 * Merges the group and trace names together
hgs
parents:
diff changeset
   883
	 * 
hgs
parents:
diff changeset
   884
	 * @param sb
hgs
parents:
diff changeset
   885
	 *            the buffer where name is stored
hgs
parents:
diff changeset
   886
	 * @param group
hgs
parents:
diff changeset
   887
	 *            group
hgs
parents:
diff changeset
   888
	 * @param trace
hgs
parents:
diff changeset
   889
	 *            trace
hgs
parents:
diff changeset
   890
	 * @return the trace name
hgs
parents:
diff changeset
   891
	 */
hgs
parents:
diff changeset
   892
	public String createTraceName(StringBuffer sb, TraceGroup group, Trace trace) {
hgs
parents:
diff changeset
   893
		sb.setLength(0);
hgs
parents:
diff changeset
   894
		sb.append(group.getName());
hgs
parents:
diff changeset
   895
		sb.append(GROUP_ID_PREFIX);
hgs
parents:
diff changeset
   896
		int groupId = group.getID();
hgs
parents:
diff changeset
   897
		String groupIdString = SourceConstants.HEX_PREFIX
hgs
parents:
diff changeset
   898
				+ Integer.toString(groupId, HEX_RADIX).toUpperCase();
hgs
parents:
diff changeset
   899
		sb.append(groupIdString);
hgs
parents:
diff changeset
   900
		sb.append(GROUP_ID_SUFFIX);
hgs
parents:
diff changeset
   901
		sb.append(SourceConstants.UNDERSCORE);
hgs
parents:
diff changeset
   902
		sb.append(trace.getName());
hgs
parents:
diff changeset
   903
		return sb.toString();
hgs
parents:
diff changeset
   904
	}
hgs
parents:
diff changeset
   905
hgs
parents:
diff changeset
   906
	/**
hgs
parents:
diff changeset
   907
	 * Gets fixed group and trace ids
hgs
parents:
diff changeset
   908
	 * 
hgs
parents:
diff changeset
   909
	 * @return fixed Ids
hgs
parents:
diff changeset
   910
	 */
hgs
parents:
diff changeset
   911
	public SortedProperties getFixedIds() {
hgs
parents:
diff changeset
   912
		return fixedIds;
hgs
parents:
diff changeset
   913
	}
hgs
parents:
diff changeset
   914
hgs
parents:
diff changeset
   915
	/**
hgs
parents:
diff changeset
   916
	 * Set fixed group and trace ids
hgs
parents:
diff changeset
   917
	 * 
hgs
parents:
diff changeset
   918
	 * @param fixedIds
hgs
parents:
diff changeset
   919
	 *            fixed Ids
hgs
parents:
diff changeset
   920
	 */
hgs
parents:
diff changeset
   921
	public void setFixedIds(SortedProperties fixedIds) {
hgs
parents:
diff changeset
   922
		this.fixedIds = fixedIds;
hgs
parents:
diff changeset
   923
	}
hgs
parents:
diff changeset
   924
hgs
parents:
diff changeset
   925
	/**
hgs
parents:
diff changeset
   926
	 * Gets next trace ID
hgs
parents:
diff changeset
   927
	 * 
hgs
parents:
diff changeset
   928
	 * @param group
hgs
parents:
diff changeset
   929
	 *            the group
hgs
parents:
diff changeset
   930
	 * @return the trace ID
hgs
parents:
diff changeset
   931
	 * @throws TraceCompilerException
hgs
parents:
diff changeset
   932
	 */
hgs
parents:
diff changeset
   933
	public int getNextTraceId(TraceGroup group) throws TraceCompilerException {
hgs
parents:
diff changeset
   934
		int currentMaxTraceID = 0;
hgs
parents:
diff changeset
   935
		int nextTraceId = 0;
hgs
parents:
diff changeset
   936
		// Check if there are some fixed Ids
hgs
parents:
diff changeset
   937
		if (fixedIds != null) {
hgs
parents:
diff changeset
   938
			Enumeration<Object> keys = this.fixedIds.keys();
hgs
parents:
diff changeset
   939
			String groupName = group.getName();
hgs
parents:
diff changeset
   940
			int groupId = group.getID();
hgs
parents:
diff changeset
   941
			String groupIdString = SourceConstants.HEX_PREFIX
hgs
parents:
diff changeset
   942
					+ Integer.toString(groupId, HEX_RADIX).toUpperCase();
hgs
parents:
diff changeset
   943
			// Go through fixed Ids and check if there are fixed trace Ids to
hgs
parents:
diff changeset
   944
			// this group
hgs
parents:
diff changeset
   945
			while (keys.hasMoreElements()) {
hgs
parents:
diff changeset
   946
				String key = (String) keys.nextElement();
hgs
parents:
diff changeset
   947
				if (key.startsWith(TRACE_PROPERTY_PREFIX + groupName
hgs
parents:
diff changeset
   948
						+ GROUP_ID_PREFIX + groupIdString + GROUP_ID_SUFFIX
hgs
parents:
diff changeset
   949
						+ SourceConstants.UNDERSCORE)
hgs
parents:
diff changeset
   950
						|| key.startsWith(OBSOLETE_PROPERTY_PREFIX
hgs
parents:
diff changeset
   951
								+ TRACE_PROPERTY_PREFIX + groupName
hgs
parents:
diff changeset
   952
								+ GROUP_ID_PREFIX + groupIdString
hgs
parents:
diff changeset
   953
								+ GROUP_ID_SUFFIX + SourceConstants.UNDERSCORE)) {
hgs
parents:
diff changeset
   954
					// Fixed trace Id to in this group found. Try to covert it
hgs
parents:
diff changeset
   955
					// to int value.
hgs
parents:
diff changeset
   956
					String value = fixedIds.getProperty(key);
hgs
parents:
diff changeset
   957
					int fixedId = 0;
hgs
parents:
diff changeset
   958
					try {
hgs
parents:
diff changeset
   959
						fixedId = Integer.decode(value).intValue();
hgs
parents:
diff changeset
   960
					} catch (NumberFormatException e) {
hgs
parents:
diff changeset
   961
						// Corrupted. Get next trace Id later on.
hgs
parents:
diff changeset
   962
						nextTraceId = 0;
hgs
parents:
diff changeset
   963
						break;
hgs
parents:
diff changeset
   964
					}
hgs
parents:
diff changeset
   965
					// Check if found fixed Id is bigger than current max trace
hgs
parents:
diff changeset
   966
					// Id in this group
hgs
parents:
diff changeset
   967
					if (fixedId > currentMaxTraceID) {
hgs
parents:
diff changeset
   968
						currentMaxTraceID = fixedId;
hgs
parents:
diff changeset
   969
					}
hgs
parents:
diff changeset
   970
				}
hgs
parents:
diff changeset
   971
			}
hgs
parents:
diff changeset
   972
			// If there were fixed trace Ids to this group. Set next trace Id to
hgs
parents:
diff changeset
   973
			// be current max trace Id + 1
hgs
parents:
diff changeset
   974
			if (currentMaxTraceID != 0) {
hgs
parents:
diff changeset
   975
				nextTraceId = currentMaxTraceID + 1;
hgs
parents:
diff changeset
   976
			}
hgs
parents:
diff changeset
   977
			// If next trace Id is zero or smaller than trace Id that group
hgs
parents:
diff changeset
   978
			// suggest. Set it be same as group suggest. This is done in case
hgs
parents:
diff changeset
   979
			// that we have added more than one new trace to same group after
hgs
parents:
diff changeset
   980
			// last fixed Id update
hgs
parents:
diff changeset
   981
			if (nextTraceId == 0 || nextTraceId < group.getNextTraceID()) {
hgs
parents:
diff changeset
   982
				nextTraceId = group.getNextTraceID();
hgs
parents:
diff changeset
   983
			}
hgs
parents:
diff changeset
   984
		} else {
hgs
parents:
diff changeset
   985
			// No fixed Ids. Get next trace Id from group
hgs
parents:
diff changeset
   986
			nextTraceId = group.getNextTraceID();
hgs
parents:
diff changeset
   987
		}
hgs
parents:
diff changeset
   988
		// Check that next trace Id is not bigger than max trace Id
hgs
parents:
diff changeset
   989
		if (nextTraceId > TraceCompilerEngineGlobals.MAX_TRACE_ID) {
hgs
parents:
diff changeset
   990
			throw new TraceCompilerException(
hgs
parents:
diff changeset
   991
					TraceCompilerErrorCode.RUN_OUT_OF_TRACE_IDS);
hgs
parents:
diff changeset
   992
		}
hgs
parents:
diff changeset
   993
hgs
parents:
diff changeset
   994
		return nextTraceId;
hgs
parents:
diff changeset
   995
	}
hgs
parents:
diff changeset
   996
hgs
parents:
diff changeset
   997
}