diff -r a151135b0cf9 -r aa2539c91954 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