tracesrv/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/TraceGroup.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tracesrv/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/TraceGroup.java Fri Oct 08 14:56:39 2010 +0300
@@ -0,0 +1,205 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+* Represents a logical collection of traces somehow related to each other
+*
+*/
+package com.nokia.tracecompiler.model;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+
+/**
+ * Represents a logical collection of traces somehow related to each other. Each
+ * trace group specifies a prefix that is attached to all trace lines made
+ * within that group.
+ *
+ */
+public class TraceGroup extends TraceObject implements Iterable<Trace> {
+
+ /**
+ * List of traces, sorted by ID
+ */
+ private ArrayList<Trace> tracesByID = new ArrayList<Trace>();
+
+ /**
+ * List of traces, sorted by name
+ */
+ private ArrayList<Trace> tracesByName = new ArrayList<Trace>();
+
+ /**
+ * Creates a new trace group and associates it with given trace model.
+ *
+ * @param model
+ * the trace model
+ */
+ TraceGroup(TraceModel model) {
+ setModel(model);
+ model.addGroup(this);
+ }
+
+ /**
+ * Adds a trace to this group. Creates objectAdded event to model listeners
+ *
+ * @see TraceModelListener#objectAdded(TraceObject, TraceObject)
+ * @param trace
+ * the trace to be added
+ */
+ void addTrace(Trace trace) {
+ // Sorted when ID is set to trace
+ tracesByID.add(trace);
+ // Sorted when name is set to trace
+ tracesByName.add(trace);
+ getModel().notifyObjectAdded(this, trace);
+ }
+
+ /**
+ * Removes a trace from this group. Creates objectRemoved event to model
+ * listeners
+ *
+ * @see TraceModelListener#objectRemoved(TraceObject, TraceObject)
+ * @param trace
+ * the trace to be removed
+ * @throws TraceCompilerException
+ */
+ public void removeTrace(Trace trace) throws TraceCompilerException {
+ int index = Collections.binarySearch(tracesByID, trace,
+ TraceObjectUtils.traceObjectIDComparator);
+ if (index >= 0) {
+ tracesByID.remove(index);
+ index = Collections.binarySearch(tracesByName, trace,
+ TraceObjectUtils.traceObjectNameComparator);
+ tracesByName.remove(index);
+ getModel().notifyObjectRemoved(this, trace);
+ trace.reset();
+ }
+ }
+
+ /**
+ * Determines if this group has traces.
+ *
+ * @return true if the group contains traces
+ */
+ public boolean hasTraces() {
+ return !tracesByID.isEmpty();
+ }
+
+ /**
+ * Gets the number of traces in this group.
+ *
+ * @return the number of traces
+ */
+ public int getTraceCount() {
+ return tracesByID.size();
+ }
+
+ /**
+ * Returns an iterator over the traces within this group.
+ *
+ * @return the iterator
+ */
+ public Iterator<Trace> getTraces() {
+ return tracesByID.iterator();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Iterable#iterator()
+ */
+ public Iterator<Trace> iterator() {
+ return tracesByID.iterator();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.nokia.tracecompiler.model.TraceObject#reset()
+ */
+ @Override
+ void reset() {
+ // Reset removes constant table references
+ for (Trace trace : tracesByID) {
+ // Model listeners are not notified on reset, but if the
+ // trace itself implements a delete notification interface,
+ // it must be called to do appropriate cleanup
+ notifyOnDelete(trace);
+ trace.reset();
+ }
+ tracesByID.clear();
+ tracesByName.clear();
+ super.reset();
+ }
+
+ /**
+ * Returns highest trace ID + 1. Can be used to create an unique ID for a
+ * new trace.
+ *
+ * @return the next trace ID
+ */
+ public int getNextTraceID() {
+ int ret;
+ if (tracesByID.size() > 0) {
+ ret = tracesByID.get(tracesByID.size() - 1).getID() + 1;
+ } else {
+ ret = 1;
+ }
+ return ret;
+ }
+
+ /**
+ * Gets the trace which has given ID
+ *
+ * @param id
+ * the trace ID
+ * @return the trace or null
+ */
+ public Trace findTraceByID(int id) {
+ int index = Collections.binarySearch(tracesByID, id,
+ TraceObjectUtils.traceToIDComparator);
+ Trace retval;
+ if (index >= 0) {
+ retval = tracesByID.get(index);
+ } else {
+ retval = null;
+ }
+ return retval;
+ }
+
+ /**
+ * Called by the model when a trace property is updated
+ *
+ * @param source
+ * the trace that was changed
+ * @param property
+ * the property that was changed
+ */
+ void tracePropertyUpdated(TraceObject source, int property) {
+ if (property == TraceModelListener.NAME) {
+ Collections.sort(tracesByName,
+ TraceObjectUtils.traceObjectNameComparator);
+ } else if (property == TraceModelListener.ID) {
+ traceIDsUpdated();
+ }
+ }
+
+ /**
+ * Sorts the trace array based on new ID configuration
+ */
+ void traceIDsUpdated() {
+ Collections.sort(tracesByID, TraceObjectUtils.traceObjectIDComparator);
+ }
+}