trace/traceviewer/com.nokia.trace.dictionary/src/com/nokia/trace/dictionary/model/handlers/InstanceHandler.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/trace/traceviewer/com.nokia.trace.dictionary/src/com/nokia/trace/dictionary/model/handlers/InstanceHandler.java Wed Jun 23 14:49:59 2010 +0300
@@ -0,0 +1,181 @@
+/*
+ * Copyright (c) 2007-2010 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:
+ *
+ * Instance handler
+ *
+ */
+package com.nokia.trace.dictionary.model.handlers;
+
+import org.xml.sax.Attributes;
+
+import com.nokia.trace.dictionary.TraceDictionaryEngine;
+import com.nokia.trace.dictionary.model.DecodeObject;
+import com.nokia.trace.dictionary.model.DictionaryContentHandler;
+import com.nokia.trace.dictionary.model.DictionaryContentVariables;
+import com.nokia.trace.dictionary.model.DictionaryDecodeModel;
+import com.nokia.trace.dictionary.model.Location;
+import com.nokia.trace.dictionary.model.Trace;
+import com.nokia.trace.dictionary.model.TraceData;
+import com.nokia.trace.dictionary.model.TraceGroup;
+import com.nokia.trace.dictionary.model.DictionaryContentVariables.ParentDecodeObject;
+import com.nokia.trace.eventrouter.TraceEvent;
+
+/**
+ * Instance handler
+ */
+final class InstanceHandler extends BaseHandler {
+
+ /**
+ * Tag name this handler handles
+ */
+ private static final String INSTANCE_TAG = "instance"; //$NON-NLS-1$
+
+ /**
+ * Constructor
+ *
+ * @param model
+ * the model
+ */
+ InstanceHandler(DictionaryDecodeModel model) {
+ super(model, INSTANCE_TAG);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * com.nokia.trace.dictionary.model.handlers.BaseHandler#processStartElement
+ * (org.xml.sax.Attributes,
+ * com.nokia.trace.dictionary.model.DictionaryContentHandler)
+ */
+ @Override
+ public void processStartElement(Attributes atts,
+ DictionaryContentHandler handler) {
+ DictionaryContentVariables variables = handler.getVariables();
+ // Get parent group
+ TraceGroup parentGroup = variables.getPreviousGroup();
+ // Get this traces data-ref value
+ int dataRef = variables.getPreviousTraceDataRef();
+ // Get this traces name
+ String traceName = variables.getPreviousTraceName();
+ // Get trace data for this data-ref value
+ TraceData traceData = model.getTraceData(dataRef);
+ // Get location for this instance
+ Location location = model.getLocation(Integer.parseInt(atts
+ .getValue(LOCREF)));
+
+ // Create new trace instance
+ Trace trace = model.getFactory().createTrace(
+ Integer.parseInt(atts.getValue(ID)), traceName, traceData,
+ location, Integer.parseInt(atts.getValue(LINE)),
+ atts.getValue(METHODNAME), atts.getValue(CLASSNAME),
+ parentGroup);
+
+ // Add trace to the group
+ Trace oldTrace = parentGroup.addTrace(trace);
+
+ // Check collision
+ trace = checkCollision(oldTrace, trace, handler);
+
+ // Set this trace to be the previous trace instance and decode object
+ variables.setPreviousTrace(trace);
+ variables.setParentDecodeObject(ParentDecodeObject.TRACEINSTANCE);
+
+ // Add trace to the trace instance list
+ if (oldTrace != trace) {
+ variables.getTraceInstanceList().addTrace(trace);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * com.nokia.trace.dictionary.model.handlers.BaseHandler#processEndElement
+ * (java.lang.StringBuffer, java.lang.Object,
+ * com.nokia.trace.dictionary.model.DictionaryContentHandler,
+ * com.nokia.trace.dictionary.model.DecodeObject)
+ */
+ @Override
+ public void processEndElement(StringBuffer elementContent,
+ Object unFinishedObject, DictionaryContentHandler handler,
+ DecodeObject parentObject) {
+ // Parent decode object is set back to trace
+ handler.getVariables().setParentDecodeObject(ParentDecodeObject.TRACE);
+ }
+
+ /**
+ * Check collision
+ *
+ * @param oldTrace
+ * old trace
+ * @param newTrace
+ * new trace
+ * @param handler
+ * dictionary content handler
+ * @return the trace which caused the collision or null if everything is OK
+ */
+ private Trace checkCollision(Trace oldTrace, Trace newTrace,
+ DictionaryContentHandler handler) {
+ boolean collision = true;
+ // If old trace is null, everything is ok. If not, check collision
+ if (oldTrace != null) {
+ // Trace data must be the same
+ if (oldTrace.getTraceData() == newTrace.getTraceData()) {
+ // Locations must be same
+ if (oldTrace.getLocation() == newTrace.getLocation()) {
+ // Line numbers must be same
+ if (oldTrace.getLineNumber() == newTrace.getLineNumber()) {
+ // Class names must be same
+ String className = oldTrace.getClassName();
+ String className2 = newTrace.getClassName();
+ if (className == null) {
+ className = ""; //$NON-NLS-1$
+ }
+ if (className2 == null) {
+ className2 = ""; //$NON-NLS-1$
+ }
+ if (className.equals(className2)) {
+ // Method names must be same
+ String methodName = oldTrace.getMethodName();
+ String methodName2 = newTrace.getMethodName();
+ if (methodName == null) {
+ methodName = ""; //$NON-NLS-1$
+ }
+ if (methodName2 == null) {
+ methodName2 = ""; //$NON-NLS-1$
+ }
+ if (methodName.equals(methodName2)) {
+ collision = false;
+ }
+ }
+ }
+ }
+ }
+ if (collision) {
+ newTrace = oldTrace;
+ TraceEvent event = new TraceEvent(TraceEvent.WARNING, Messages
+ .getString("InstanceHandler.CollisionTraceID") //$NON-NLS-1$
+ + oldTrace.getId());
+ event.setCategory(EVENT_CATEGORY);
+ event.setSource(Integer.valueOf(handler.getLocator()
+ .getLineNumber()));
+ TraceDictionaryEngine.postEvent(event);
+ }
+ }
+ return newTrace;
+ }
+
+}