tracesrv/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/TraceGroup.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
* Represents a logical collection of traces somehow related to each other
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.Iterator;
hgs
parents:
diff changeset
    24
hgs
parents:
diff changeset
    25
/**
hgs
parents:
diff changeset
    26
 * Represents a logical collection of traces somehow related to each other. Each
hgs
parents:
diff changeset
    27
 * trace group specifies a prefix that is attached to all trace lines made
hgs
parents:
diff changeset
    28
 * within that group.
hgs
parents:
diff changeset
    29
 * 
hgs
parents:
diff changeset
    30
 */
hgs
parents:
diff changeset
    31
public class TraceGroup extends TraceObject implements Iterable<Trace> {
hgs
parents:
diff changeset
    32
hgs
parents:
diff changeset
    33
	/**
hgs
parents:
diff changeset
    34
	 * List of traces, sorted by ID
hgs
parents:
diff changeset
    35
	 */
hgs
parents:
diff changeset
    36
	private ArrayList<Trace> tracesByID = new ArrayList<Trace>();
hgs
parents:
diff changeset
    37
hgs
parents:
diff changeset
    38
	/**
hgs
parents:
diff changeset
    39
	 * List of traces, sorted by name
hgs
parents:
diff changeset
    40
	 */
hgs
parents:
diff changeset
    41
	private ArrayList<Trace> tracesByName = new ArrayList<Trace>();
hgs
parents:
diff changeset
    42
hgs
parents:
diff changeset
    43
	/**
hgs
parents:
diff changeset
    44
	 * Creates a new trace group and associates it with given trace model.
hgs
parents:
diff changeset
    45
	 * 
hgs
parents:
diff changeset
    46
	 * @param model
hgs
parents:
diff changeset
    47
	 *            the trace model
hgs
parents:
diff changeset
    48
	 */
hgs
parents:
diff changeset
    49
	TraceGroup(TraceModel model) {
hgs
parents:
diff changeset
    50
		setModel(model);
hgs
parents:
diff changeset
    51
		model.addGroup(this);
hgs
parents:
diff changeset
    52
	}
hgs
parents:
diff changeset
    53
hgs
parents:
diff changeset
    54
	/**
hgs
parents:
diff changeset
    55
	 * Adds a trace to this group. Creates objectAdded event to model listeners
hgs
parents:
diff changeset
    56
	 * 
hgs
parents:
diff changeset
    57
	 * @see TraceModelListener#objectAdded(TraceObject, TraceObject)
hgs
parents:
diff changeset
    58
	 * @param trace
hgs
parents:
diff changeset
    59
	 *            the trace to be added
hgs
parents:
diff changeset
    60
	 */
hgs
parents:
diff changeset
    61
	void addTrace(Trace trace) {
hgs
parents:
diff changeset
    62
		// Sorted when ID is set to trace
hgs
parents:
diff changeset
    63
		tracesByID.add(trace);
hgs
parents:
diff changeset
    64
		// Sorted when name is set to trace
hgs
parents:
diff changeset
    65
		tracesByName.add(trace);
hgs
parents:
diff changeset
    66
		getModel().notifyObjectAdded(this, trace);
hgs
parents:
diff changeset
    67
	}
hgs
parents:
diff changeset
    68
hgs
parents:
diff changeset
    69
	/**
hgs
parents:
diff changeset
    70
	 * Removes a trace from this group. Creates objectRemoved event to model
hgs
parents:
diff changeset
    71
	 * listeners
hgs
parents:
diff changeset
    72
	 * 
hgs
parents:
diff changeset
    73
	 * @see TraceModelListener#objectRemoved(TraceObject, TraceObject)
hgs
parents:
diff changeset
    74
	 * @param trace
hgs
parents:
diff changeset
    75
	 *            the trace to be removed
hgs
parents:
diff changeset
    76
	 * @throws TraceCompilerException 
hgs
parents:
diff changeset
    77
	 */
hgs
parents:
diff changeset
    78
	public void removeTrace(Trace trace) throws TraceCompilerException {
hgs
parents:
diff changeset
    79
		int index = Collections.binarySearch(tracesByID, trace,
hgs
parents:
diff changeset
    80
				TraceObjectUtils.traceObjectIDComparator);
hgs
parents:
diff changeset
    81
		if (index >= 0) {
hgs
parents:
diff changeset
    82
			tracesByID.remove(index);
hgs
parents:
diff changeset
    83
			index = Collections.binarySearch(tracesByName, trace,
hgs
parents:
diff changeset
    84
					TraceObjectUtils.traceObjectNameComparator);
hgs
parents:
diff changeset
    85
			tracesByName.remove(index);
hgs
parents:
diff changeset
    86
			getModel().notifyObjectRemoved(this, trace);
hgs
parents:
diff changeset
    87
			trace.reset();
hgs
parents:
diff changeset
    88
		}
hgs
parents:
diff changeset
    89
	}
hgs
parents:
diff changeset
    90
hgs
parents:
diff changeset
    91
	/**
hgs
parents:
diff changeset
    92
	 * Determines if this group has traces.
hgs
parents:
diff changeset
    93
	 * 
hgs
parents:
diff changeset
    94
	 * @return true if the group contains traces
hgs
parents:
diff changeset
    95
	 */
hgs
parents:
diff changeset
    96
	public boolean hasTraces() {
hgs
parents:
diff changeset
    97
		return !tracesByID.isEmpty();
hgs
parents:
diff changeset
    98
	}
hgs
parents:
diff changeset
    99
hgs
parents:
diff changeset
   100
	/**
hgs
parents:
diff changeset
   101
	 * Gets the number of traces in this group.
hgs
parents:
diff changeset
   102
	 * 
hgs
parents:
diff changeset
   103
	 * @return the number of traces
hgs
parents:
diff changeset
   104
	 */
hgs
parents:
diff changeset
   105
	public int getTraceCount() {
hgs
parents:
diff changeset
   106
		return tracesByID.size();
hgs
parents:
diff changeset
   107
	}
hgs
parents:
diff changeset
   108
hgs
parents:
diff changeset
   109
	/**
hgs
parents:
diff changeset
   110
	 * Returns an iterator over the traces within this group.
hgs
parents:
diff changeset
   111
	 * 
hgs
parents:
diff changeset
   112
	 * @return the iterator
hgs
parents:
diff changeset
   113
	 */
hgs
parents:
diff changeset
   114
	public Iterator<Trace> getTraces() {
hgs
parents:
diff changeset
   115
		return tracesByID.iterator();
hgs
parents:
diff changeset
   116
	}
hgs
parents:
diff changeset
   117
hgs
parents:
diff changeset
   118
	/*
hgs
parents:
diff changeset
   119
	 * (non-Javadoc)
hgs
parents:
diff changeset
   120
	 * 
hgs
parents:
diff changeset
   121
	 * @see java.lang.Iterable#iterator()
hgs
parents:
diff changeset
   122
	 */
hgs
parents:
diff changeset
   123
	public Iterator<Trace> iterator() {
hgs
parents:
diff changeset
   124
		return tracesByID.iterator();
hgs
parents:
diff changeset
   125
	}
hgs
parents:
diff changeset
   126
hgs
parents:
diff changeset
   127
	/*
hgs
parents:
diff changeset
   128
	 * (non-Javadoc)
hgs
parents:
diff changeset
   129
	 * 
hgs
parents:
diff changeset
   130
	 * @see com.nokia.tracecompiler.model.TraceObject#reset()
hgs
parents:
diff changeset
   131
	 */
hgs
parents:
diff changeset
   132
	@Override
hgs
parents:
diff changeset
   133
	void reset() {
hgs
parents:
diff changeset
   134
		// Reset removes constant table references
hgs
parents:
diff changeset
   135
		for (Trace trace : tracesByID) {
hgs
parents:
diff changeset
   136
			// Model listeners are not notified on reset, but if the
hgs
parents:
diff changeset
   137
			// trace itself implements a delete notification interface,
hgs
parents:
diff changeset
   138
			// it must be called to do appropriate cleanup
hgs
parents:
diff changeset
   139
			notifyOnDelete(trace);
hgs
parents:
diff changeset
   140
			trace.reset();
hgs
parents:
diff changeset
   141
		}
hgs
parents:
diff changeset
   142
		tracesByID.clear();
hgs
parents:
diff changeset
   143
		tracesByName.clear();
hgs
parents:
diff changeset
   144
		super.reset();
hgs
parents:
diff changeset
   145
	}
hgs
parents:
diff changeset
   146
hgs
parents:
diff changeset
   147
	/**
hgs
parents:
diff changeset
   148
	 * Returns highest trace ID + 1. Can be used to create an unique ID for a
hgs
parents:
diff changeset
   149
	 * new trace.
hgs
parents:
diff changeset
   150
	 * 
hgs
parents:
diff changeset
   151
	 * @return the next trace ID
hgs
parents:
diff changeset
   152
	 */
hgs
parents:
diff changeset
   153
	public int getNextTraceID() {
hgs
parents:
diff changeset
   154
		int ret;
hgs
parents:
diff changeset
   155
		if (tracesByID.size() > 0) {
hgs
parents:
diff changeset
   156
			ret = tracesByID.get(tracesByID.size() - 1).getID() + 1;
hgs
parents:
diff changeset
   157
		} else {
hgs
parents:
diff changeset
   158
			ret = 1;
hgs
parents:
diff changeset
   159
		}
hgs
parents:
diff changeset
   160
		return ret;
hgs
parents:
diff changeset
   161
	}
hgs
parents:
diff changeset
   162
hgs
parents:
diff changeset
   163
	/**
hgs
parents:
diff changeset
   164
	 * Gets the trace which has given ID
hgs
parents:
diff changeset
   165
	 * 
hgs
parents:
diff changeset
   166
	 * @param id
hgs
parents:
diff changeset
   167
	 *            the trace ID
hgs
parents:
diff changeset
   168
	 * @return the trace or null
hgs
parents:
diff changeset
   169
	 */
hgs
parents:
diff changeset
   170
	public Trace findTraceByID(int id) {
hgs
parents:
diff changeset
   171
		int index = Collections.binarySearch(tracesByID, id,
hgs
parents:
diff changeset
   172
				TraceObjectUtils.traceToIDComparator);
hgs
parents:
diff changeset
   173
		Trace retval;
hgs
parents:
diff changeset
   174
		if (index >= 0) {
hgs
parents:
diff changeset
   175
			retval = tracesByID.get(index);
hgs
parents:
diff changeset
   176
		} else {
hgs
parents:
diff changeset
   177
			retval = null;
hgs
parents:
diff changeset
   178
		}
hgs
parents:
diff changeset
   179
		return retval;
hgs
parents:
diff changeset
   180
	}
hgs
parents:
diff changeset
   181
hgs
parents:
diff changeset
   182
	/**
hgs
parents:
diff changeset
   183
	 * Called by the model when a trace property is updated
hgs
parents:
diff changeset
   184
	 * 
hgs
parents:
diff changeset
   185
	 * @param source
hgs
parents:
diff changeset
   186
	 *            the trace that was changed
hgs
parents:
diff changeset
   187
	 * @param property
hgs
parents:
diff changeset
   188
	 *            the property that was changed
hgs
parents:
diff changeset
   189
	 */
hgs
parents:
diff changeset
   190
	void tracePropertyUpdated(TraceObject source, int property) {
hgs
parents:
diff changeset
   191
		if (property == TraceModelListener.NAME) {
hgs
parents:
diff changeset
   192
			Collections.sort(tracesByName,
hgs
parents:
diff changeset
   193
					TraceObjectUtils.traceObjectNameComparator);
hgs
parents:
diff changeset
   194
		} else if (property == TraceModelListener.ID) {
hgs
parents:
diff changeset
   195
			traceIDsUpdated();
hgs
parents:
diff changeset
   196
		}
hgs
parents:
diff changeset
   197
	}
hgs
parents:
diff changeset
   198
hgs
parents:
diff changeset
   199
	/**
hgs
parents:
diff changeset
   200
	 * Sorts the trace array based on new ID configuration
hgs
parents:
diff changeset
   201
	 */
hgs
parents:
diff changeset
   202
	void traceIDsUpdated() {
hgs
parents:
diff changeset
   203
		Collections.sort(tracesByID, TraceObjectUtils.traceObjectIDComparator);
hgs
parents:
diff changeset
   204
	}
hgs
parents:
diff changeset
   205
}