tracesrv/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/DuplicateValueModifier.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tracesrv/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/DuplicateValueModifier.java Fri Oct 08 14:56:39 2010 +0300
@@ -0,0 +1,183 @@
+/*
+* 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:
+*
+* Base class for value modifiers
+*
+*/
+package com.nokia.tracecompiler.model;
+
+/**
+ * Base class for value modifiers
+ *
+ */
+abstract class DuplicateValueModifier implements TraceObjectModifier {
+
+ /**
+ * Duplicate tag for values
+ */
+ private static final String DUPLICATE_TAG = "DUP"; //$NON-NLS-1$
+
+ /**
+ * Duplicate tag separator
+ */
+ private static final char DUPLICATE_SEPARATOR = '_';
+
+ /**
+ * Value
+ */
+ private String value;
+
+ /**
+ * Changed flag
+ */
+ private boolean changed;
+
+ /**
+ * Constructor
+ *
+ * @param value
+ * the value
+ */
+ DuplicateValueModifier(String value) {
+ this.value = value;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.nokia.tracecompiler.model.TraceObjectUtils.TraceObjectModifier#getData()
+ */
+ public String getData() {
+ return value;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.nokia.tracecompiler.model.TraceObjectUtils.TraceObjectModifier#hasChanged()
+ */
+ public boolean hasChanged() {
+ return changed;
+ }
+
+ /**
+ * Gets the separator character
+ *
+ * @return the char
+ */
+ protected char getSeparator() {
+ return DUPLICATE_SEPARATOR;
+ }
+
+ /**
+ * Processes the name and modifies if there are duplicates
+ */
+ void processName() {
+ int index = getStartIndex(value);
+ TraceObject object;
+ do {
+ object = findObject(value);
+ if (object != null) {
+ changed = true;
+ value = appendIndexToString(value, index);
+ index++;
+ }
+ } while (object != null);
+ }
+
+ /**
+ * Gets the start index from given text
+ *
+ * @param value
+ * the value to be parsed
+ * @return the start index
+ */
+ private int getStartIndex(String value) {
+ String valueStr = null;
+ if (value.startsWith(DUPLICATE_TAG)) {
+ for (int i = DUPLICATE_TAG.length(); i < value.length(); i++) {
+ char c = value.charAt(i);
+ if (!Character.isDigit(c)) {
+ valueStr = value.substring(DUPLICATE_TAG.length(), i);
+ i = value.length();
+ }
+ }
+ }
+ int retval = -1;
+ if (valueStr != null && valueStr.length() > 0) {
+ retval = Integer.parseInt(valueStr);
+ }
+ return retval;
+ }
+
+ /**
+ * Appends an index value to given string replacing existing index if it
+ * exists
+ *
+ * @param value
+ * the string
+ * @param index
+ * the index
+ * @return the changed string
+ */
+ private String appendIndexToString(String value, int index) {
+ StringBuffer newValue = new StringBuffer();
+ if (index >= 0) {
+ String indexStr = String.valueOf(index);
+ newValue.append(DUPLICATE_TAG);
+ newValue.append(String.valueOf(index + 1));
+ newValue.append(getSeparator());
+ newValue.append(value.substring(DUPLICATE_TAG.length()
+ + indexStr.length() + 1)); // Add separator
+ } else {
+ newValue.append(DUPLICATE_TAG);
+ newValue.append("1"); //$NON-NLS-1$
+ newValue.append(getSeparator());
+ newValue.append(value);
+ }
+ return newValue.toString();
+ }
+
+ /**
+ * Gets the duplicate modifier from beginning of given text
+ *
+ * @param text
+ * the text
+ * @return the modifier
+ */
+ static String getModifier(String text) {
+ String retval = null;
+ if (text.startsWith(DUPLICATE_TAG)) {
+ for (int i = DUPLICATE_TAG.length(); i < text.length(); i++) {
+ char c = text.charAt(i);
+ if (!Character.isDigit(c)) {
+ retval = text.substring(0, i + 1); // Add separator
+ i = text.length();
+ }
+ }
+ }
+ return retval;
+ }
+
+ /**
+ * Finds the object from model
+ *
+ * @param value
+ * the value
+ * @return the object or null if not found
+ */
+ abstract TraceObject findObject(String value);
+
+}
\ No newline at end of file