diff -r a151135b0cf9 -r aa2539c91954 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 { + + /** + * List of traces, sorted by ID + */ + private ArrayList tracesByID = new ArrayList(); + + /** + * List of traces, sorted by name + */ + private ArrayList tracesByName = new ArrayList(); + + /** + * 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 getTraces() { + return tracesByID.iterator(); + } + + /* + * (non-Javadoc) + * + * @see java.lang.Iterable#iterator() + */ + public Iterator 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); + } +}