tracesrv/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/model/DuplicateValueModifier.java
author hgs
Fri, 08 Oct 2010 14:56:39 +0300
changeset 56 aa2539c91954
permissions -rw-r--r--
201041
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
56
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description:
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
* Base class for value modifiers
hgs
parents:
diff changeset
    17
*
hgs
parents:
diff changeset
    18
*/
hgs
parents:
diff changeset
    19
package com.nokia.tracecompiler.model;
hgs
parents:
diff changeset
    20
hgs
parents:
diff changeset
    21
/**
hgs
parents:
diff changeset
    22
 * Base class for value modifiers
hgs
parents:
diff changeset
    23
 * 
hgs
parents:
diff changeset
    24
 */
hgs
parents:
diff changeset
    25
abstract class DuplicateValueModifier implements TraceObjectModifier {
hgs
parents:
diff changeset
    26
hgs
parents:
diff changeset
    27
	/**
hgs
parents:
diff changeset
    28
	 * Duplicate tag for values
hgs
parents:
diff changeset
    29
	 */
hgs
parents:
diff changeset
    30
	private static final String DUPLICATE_TAG = "DUP"; //$NON-NLS-1$
hgs
parents:
diff changeset
    31
hgs
parents:
diff changeset
    32
	/**
hgs
parents:
diff changeset
    33
	 * Duplicate tag separator
hgs
parents:
diff changeset
    34
	 */
hgs
parents:
diff changeset
    35
	private static final char DUPLICATE_SEPARATOR = '_';
hgs
parents:
diff changeset
    36
hgs
parents:
diff changeset
    37
	/**
hgs
parents:
diff changeset
    38
	 * Value
hgs
parents:
diff changeset
    39
	 */
hgs
parents:
diff changeset
    40
	private String value;
hgs
parents:
diff changeset
    41
hgs
parents:
diff changeset
    42
	/**
hgs
parents:
diff changeset
    43
	 * Changed flag
hgs
parents:
diff changeset
    44
	 */
hgs
parents:
diff changeset
    45
	private boolean changed;
hgs
parents:
diff changeset
    46
hgs
parents:
diff changeset
    47
	/**
hgs
parents:
diff changeset
    48
	 * Constructor
hgs
parents:
diff changeset
    49
	 * 
hgs
parents:
diff changeset
    50
	 * @param value
hgs
parents:
diff changeset
    51
	 *            the value
hgs
parents:
diff changeset
    52
	 */
hgs
parents:
diff changeset
    53
	DuplicateValueModifier(String value) {
hgs
parents:
diff changeset
    54
		this.value = value;
hgs
parents:
diff changeset
    55
	}
hgs
parents:
diff changeset
    56
hgs
parents:
diff changeset
    57
	/*
hgs
parents:
diff changeset
    58
	 * (non-Javadoc)
hgs
parents:
diff changeset
    59
	 * 
hgs
parents:
diff changeset
    60
	 * @see com.nokia.tracecompiler.model.TraceObjectUtils.TraceObjectModifier#getData()
hgs
parents:
diff changeset
    61
	 */
hgs
parents:
diff changeset
    62
	public String getData() {
hgs
parents:
diff changeset
    63
		return value;
hgs
parents:
diff changeset
    64
	}
hgs
parents:
diff changeset
    65
hgs
parents:
diff changeset
    66
	/*
hgs
parents:
diff changeset
    67
	 * (non-Javadoc)
hgs
parents:
diff changeset
    68
	 * 
hgs
parents:
diff changeset
    69
	 * @see com.nokia.tracecompiler.model.TraceObjectUtils.TraceObjectModifier#hasChanged()
hgs
parents:
diff changeset
    70
	 */
hgs
parents:
diff changeset
    71
	public boolean hasChanged() {
hgs
parents:
diff changeset
    72
		return changed;
hgs
parents:
diff changeset
    73
	}
hgs
parents:
diff changeset
    74
hgs
parents:
diff changeset
    75
	/**
hgs
parents:
diff changeset
    76
	 * Gets the separator character
hgs
parents:
diff changeset
    77
	 * 
hgs
parents:
diff changeset
    78
	 * @return the char
hgs
parents:
diff changeset
    79
	 */
hgs
parents:
diff changeset
    80
	protected char getSeparator() {
hgs
parents:
diff changeset
    81
		return DUPLICATE_SEPARATOR;
hgs
parents:
diff changeset
    82
	}
hgs
parents:
diff changeset
    83
hgs
parents:
diff changeset
    84
	/**
hgs
parents:
diff changeset
    85
	 * Processes the name and modifies if there are duplicates
hgs
parents:
diff changeset
    86
	 */
hgs
parents:
diff changeset
    87
	void processName() {
hgs
parents:
diff changeset
    88
		int index = getStartIndex(value);
hgs
parents:
diff changeset
    89
		TraceObject object;
hgs
parents:
diff changeset
    90
		do {
hgs
parents:
diff changeset
    91
			object = findObject(value);
hgs
parents:
diff changeset
    92
			if (object != null) {
hgs
parents:
diff changeset
    93
				changed = true;
hgs
parents:
diff changeset
    94
				value = appendIndexToString(value, index);
hgs
parents:
diff changeset
    95
				index++;
hgs
parents:
diff changeset
    96
			}
hgs
parents:
diff changeset
    97
		} while (object != null);
hgs
parents:
diff changeset
    98
	}
hgs
parents:
diff changeset
    99
hgs
parents:
diff changeset
   100
	/**
hgs
parents:
diff changeset
   101
	 * Gets the start index from given text
hgs
parents:
diff changeset
   102
	 * 
hgs
parents:
diff changeset
   103
	 * @param value
hgs
parents:
diff changeset
   104
	 *            the value to be parsed
hgs
parents:
diff changeset
   105
	 * @return the start index
hgs
parents:
diff changeset
   106
	 */
hgs
parents:
diff changeset
   107
	private int getStartIndex(String value) {
hgs
parents:
diff changeset
   108
		String valueStr = null;
hgs
parents:
diff changeset
   109
		if (value.startsWith(DUPLICATE_TAG)) {
hgs
parents:
diff changeset
   110
			for (int i = DUPLICATE_TAG.length(); i < value.length(); i++) {
hgs
parents:
diff changeset
   111
				char c = value.charAt(i);
hgs
parents:
diff changeset
   112
				if (!Character.isDigit(c)) {
hgs
parents:
diff changeset
   113
					valueStr = value.substring(DUPLICATE_TAG.length(), i);
hgs
parents:
diff changeset
   114
					i = value.length();
hgs
parents:
diff changeset
   115
				}
hgs
parents:
diff changeset
   116
			}
hgs
parents:
diff changeset
   117
		}
hgs
parents:
diff changeset
   118
		int retval = -1;
hgs
parents:
diff changeset
   119
		if (valueStr != null && valueStr.length() > 0) {
hgs
parents:
diff changeset
   120
			retval = Integer.parseInt(valueStr);
hgs
parents:
diff changeset
   121
		}
hgs
parents:
diff changeset
   122
		return retval;
hgs
parents:
diff changeset
   123
	}
hgs
parents:
diff changeset
   124
hgs
parents:
diff changeset
   125
	/**
hgs
parents:
diff changeset
   126
	 * Appends an index value to given string replacing existing index if it
hgs
parents:
diff changeset
   127
	 * exists
hgs
parents:
diff changeset
   128
	 * 
hgs
parents:
diff changeset
   129
	 * @param value
hgs
parents:
diff changeset
   130
	 *            the string
hgs
parents:
diff changeset
   131
	 * @param index
hgs
parents:
diff changeset
   132
	 *            the index
hgs
parents:
diff changeset
   133
	 * @return the changed string
hgs
parents:
diff changeset
   134
	 */
hgs
parents:
diff changeset
   135
	private String appendIndexToString(String value, int index) {
hgs
parents:
diff changeset
   136
		StringBuffer newValue = new StringBuffer();
hgs
parents:
diff changeset
   137
		if (index >= 0) {
hgs
parents:
diff changeset
   138
			String indexStr = String.valueOf(index);
hgs
parents:
diff changeset
   139
			newValue.append(DUPLICATE_TAG);
hgs
parents:
diff changeset
   140
			newValue.append(String.valueOf(index + 1));
hgs
parents:
diff changeset
   141
			newValue.append(getSeparator());
hgs
parents:
diff changeset
   142
			newValue.append(value.substring(DUPLICATE_TAG.length()
hgs
parents:
diff changeset
   143
					+ indexStr.length() + 1)); // Add separator
hgs
parents:
diff changeset
   144
		} else {
hgs
parents:
diff changeset
   145
			newValue.append(DUPLICATE_TAG);
hgs
parents:
diff changeset
   146
			newValue.append("1"); //$NON-NLS-1$
hgs
parents:
diff changeset
   147
			newValue.append(getSeparator());
hgs
parents:
diff changeset
   148
			newValue.append(value);
hgs
parents:
diff changeset
   149
		}
hgs
parents:
diff changeset
   150
		return newValue.toString();
hgs
parents:
diff changeset
   151
	}
hgs
parents:
diff changeset
   152
hgs
parents:
diff changeset
   153
	/**
hgs
parents:
diff changeset
   154
	 * Gets the duplicate modifier from beginning of given text
hgs
parents:
diff changeset
   155
	 * 
hgs
parents:
diff changeset
   156
	 * @param text
hgs
parents:
diff changeset
   157
	 *            the text
hgs
parents:
diff changeset
   158
	 * @return the modifier
hgs
parents:
diff changeset
   159
	 */
hgs
parents:
diff changeset
   160
	static String getModifier(String text) {
hgs
parents:
diff changeset
   161
		String retval = null;
hgs
parents:
diff changeset
   162
		if (text.startsWith(DUPLICATE_TAG)) {
hgs
parents:
diff changeset
   163
			for (int i = DUPLICATE_TAG.length(); i < text.length(); i++) {
hgs
parents:
diff changeset
   164
				char c = text.charAt(i);
hgs
parents:
diff changeset
   165
				if (!Character.isDigit(c)) {
hgs
parents:
diff changeset
   166
					retval = text.substring(0, i + 1); // Add separator
hgs
parents:
diff changeset
   167
					i = text.length();
hgs
parents:
diff changeset
   168
				}
hgs
parents:
diff changeset
   169
			}
hgs
parents:
diff changeset
   170
		}
hgs
parents:
diff changeset
   171
		return retval;
hgs
parents:
diff changeset
   172
	}
hgs
parents:
diff changeset
   173
hgs
parents:
diff changeset
   174
	/**
hgs
parents:
diff changeset
   175
	 * Finds the object from model
hgs
parents:
diff changeset
   176
	 * 
hgs
parents:
diff changeset
   177
	 * @param value
hgs
parents:
diff changeset
   178
	 *            the value
hgs
parents:
diff changeset
   179
	 * @return the object or null if not found
hgs
parents:
diff changeset
   180
	 */
hgs
parents:
diff changeset
   181
	abstract TraceObject findObject(String value);
hgs
parents:
diff changeset
   182
hgs
parents:
diff changeset
   183
}