trace/traceviewer/com.nokia.traceviewer/src/com/nokia/traceviewer/engine/dataprocessor/SearchUtils.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/trace/traceviewer/com.nokia.traceviewer/src/com/nokia/traceviewer/engine/dataprocessor/SearchUtils.java Wed Jun 23 14:49:59 2010 +0300
@@ -0,0 +1,384 @@
+/*
+ * 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:
+ *
+ * Search utils
+ *
+ */
+package com.nokia.traceviewer.engine.dataprocessor;
+
+import java.util.List;
+
+import com.nokia.traceviewer.engine.TraceInformation;
+
+/**
+ * Search utils
+ */
+public final class SearchUtils {
+
+ /**
+ * Empty String
+ */
+ public static final String EMPTY = ""; //$NON-NLS-1$
+
+ /**
+ * Dash string
+ */
+ private static final String DASH = "-"; //$NON-NLS-1$
+
+ /**
+ * Indicates not found
+ */
+ public static final int NOT_FOUND = -1;
+
+ /**
+ * Semicolon
+ */
+ private static final char SEMICOLON = ';';
+
+ /**
+ * Component ID String
+ */
+ private static final String CID_STR = "cid:"; //$NON-NLS-1$
+
+ /**
+ * Group ID String
+ */
+ private static final String GID_STR = "gid:"; //$NON-NLS-1$
+
+ /**
+ * Trace ID String
+ */
+ private static final String TID_STR = "tid:"; //$NON-NLS-1$
+
+ /**
+ * Timestamp String
+ */
+ private static final String TIMESTAMP_STR = "{timestamp_srch}:"; //$NON-NLS-1$
+
+ /**
+ * Parses trace information class from the seach string
+ *
+ * @param searchStr
+ * the search string
+ * @return trace information containing cid, gid and tid
+ */
+ public static TraceInformation parseIDsFromString(String searchStr) {
+ TraceInformation inf = new TraceInformation();
+
+ // Parse component ID
+ int cidIndex = searchStr.indexOf(CID_STR);
+ String cidStr = searchStr.substring(cidIndex + CID_STR.length(),
+ searchStr.indexOf(SEMICOLON, cidIndex));
+ int cid = Integer.parseInt(cidStr);
+
+ // Parse group ID
+ int gidIndex = searchStr.indexOf(GID_STR);
+ String gidStr = searchStr.substring(gidIndex + GID_STR.length(),
+ searchStr.indexOf(SEMICOLON, gidIndex));
+ int gid = Integer.parseInt(gidStr);
+ searchStr = searchStr.substring(searchStr.indexOf(SEMICOLON) + 1);
+
+ // Parse trace ID
+ int tidIndex = searchStr.indexOf(TID_STR);
+ String tidStr = searchStr.substring(tidIndex + TID_STR.length(),
+ searchStr.indexOf(SEMICOLON, tidIndex));
+ int tid = Integer.parseInt(tidStr);
+
+ // Set ID's and return
+ inf.setComponentId(cid);
+ inf.setGroupId(gid);
+ inf.setTraceId(tid);
+
+ return inf;
+ }
+
+ /**
+ * Parses searchable timestamp from the seach string
+ *
+ * @param searchStr
+ * the search string
+ * @param getFirstTimestamp
+ * if true, get first timestamp. If false, get second timestamp
+ * @return searchable timestamp
+ */
+ public static String parseTimestampFromString(String searchStr,
+ boolean getFirstTimestamp) {
+
+ int timestampStartIndex = searchStr.indexOf(TIMESTAMP_STR);
+ int startIndex = timestampStartIndex + TIMESTAMP_STR.length();
+ int endIndex = searchStr.length();
+
+ int dashIndex = searchStr.indexOf(DASH);
+ if (dashIndex != -1) {
+
+ // Get first timestamp
+ if (getFirstTimestamp) {
+ endIndex = dashIndex;
+ } else {
+ startIndex = dashIndex + 1;
+ }
+ }
+
+ // Parse timestamp
+ String timestampStr = searchStr.substring(startIndex, endIndex);
+
+ return timestampStr;
+ }
+
+ /**
+ * Finds trace line from informations array
+ *
+ * @param startTrace
+ * start trace where to start search
+ * @param inf
+ * trace information to search for
+ * @param informations
+ * trace informations arraylist
+ * @param searchForward
+ * if true, search forward. Otherwise search backward
+ * @return line of found trace or -1 if not found
+ */
+ public static int findTraceOffsetFromInformations(int startTrace,
+ TraceInformation inf, List<TraceInformation> informations,
+ boolean searchForward) {
+ int line = NOT_FOUND;
+
+ // Search forward
+ if (searchForward && informations != null) {
+ // Start from start line and go through ID's
+ for (int i = startTrace; i < informations.size(); i++) {
+ TraceInformation listInf = informations.get(i);
+ if (idsMatch(inf, listInf)) {
+ line = i;
+ break;
+ }
+ }
+
+ // Search backwards
+ } else if (informations != null) {
+ // Start from start line and go through ID's backwards
+ for (int i = startTrace; i >= 0; i--) {
+ TraceInformation listInf = informations.get(i);
+ if (idsMatch(inf, listInf)) {
+ line = i;
+ break;
+ }
+ }
+ }
+
+ return line;
+ }
+
+ /**
+ * Finds trace line from timestamps array
+ *
+ * @param startTrace
+ * start trace where to start search
+ * @param timestamp
+ * timestamp to search for
+ * @param timestamps
+ * timestamps arraylist
+ * @param searchForward
+ * if true, search forward. Otherwise search backward
+ * @return line of found trace or -1 if not found
+ */
+ public static int findTraceOffsetFromTimestamps(int startTrace,
+ String timestamp, List<String> timestamps, boolean searchForward) {
+ int line = NOT_FOUND;
+
+ // Search forward
+ if (searchForward && timestamps != null) {
+
+ // Start from start line and go through timestamps
+ for (int i = startTrace; i < timestamps.size(); i++) {
+ if (i < timestamps.size()) {
+ String ts = timestamps.get(i);
+ if (ts.compareTo(timestamp) >= 0) {
+ line = i;
+ break;
+ }
+ }
+ }
+
+ // Search backwards
+ } else if (timestamps != null) {
+ // Start from start line and go through timestamps backwards
+ for (int i = startTrace; i >= 0; i--) {
+ if (i < timestamps.size()) {
+ String ts = timestamps.get(i);
+ if (ts.compareTo(timestamp) <= 0) {
+ line = i;
+ break;
+ }
+ }
+ }
+ }
+
+ return line;
+ }
+
+ /**
+ * Checks if all ID's match
+ *
+ * @param inf
+ * first ID list
+ * @param listInf
+ * second ID list
+ * @return true if all ID's match
+ */
+ private static boolean idsMatch(TraceInformation inf,
+ TraceInformation listInf) {
+ return listInf.getComponentId() == inf.getComponentId()
+ && listInf.getGroupId() == inf.getGroupId()
+ && listInf.getTraceId() == inf.getTraceId();
+ }
+
+ /**
+ * Checks does the search string contain ID query
+ *
+ * @param searchString
+ * the search string
+ * @return true if search string contains ID query
+ */
+ public static boolean containsIdQuery(String searchString) {
+ boolean containsIdQuery = false;
+
+ // Check that string contains cid, gid and tid strings
+ if (searchString.contains(CID_STR) && searchString.contains(GID_STR)
+ && searchString.contains(TID_STR)) {
+
+ // Parse ID's as strings
+ int cidIdx = searchString.indexOf(CID_STR);
+ String cid = searchString.substring(cidIdx + CID_STR.length(),
+ searchString.indexOf(SEMICOLON, cidIdx));
+ int gidIdx = searchString.indexOf(GID_STR);
+ String gid = searchString.substring(gidIdx + GID_STR.length(),
+ searchString.indexOf(SEMICOLON, gidIdx));
+ int tidIdx = searchString.indexOf(TID_STR);
+ String tid = searchString.substring(tidIdx + TID_STR.length(),
+ searchString.indexOf(SEMICOLON, tidIdx));
+
+ // Check that ID's are real integers
+ if (!cid.equals(EMPTY) && !gid.equals(EMPTY) && !tid.equals(EMPTY)) {
+ try {
+ Integer.parseInt(cid);
+ Integer.parseInt(gid);
+ Integer.parseInt(tid);
+ containsIdQuery = true;
+ } catch (NumberFormatException e) {
+ containsIdQuery = false;
+ }
+ }
+ }
+
+ return containsIdQuery;
+ }
+
+ /**
+ * Checks does the search string contain timestamp query
+ *
+ * @param searchString
+ * the search string
+ * @return true if search string contains timestamp query
+ */
+ public static boolean containsTimestampQuery(String searchString) {
+ boolean containsTimestampQuery = false;
+
+ // Check that string contains timestamp strings
+ if (searchString.contains(TIMESTAMP_STR)) {
+ containsTimestampQuery = true;
+ }
+
+ return containsTimestampQuery;
+ }
+
+ /**
+ * Checks does the search string contain timestamp range query. User should
+ * first call "containsTimestampQuery" before this to actually ensure this
+ * is timestamp range query.
+ *
+ * @param searchString
+ * the search string
+ * @return true if search string contains timestamp query
+ */
+ public static boolean containsTimestampRangeQuery(String searchString) {
+ boolean containsTimestampRangeQuery = false;
+
+ // Check that string contains timestamp range string
+ int dashIndex = searchString.indexOf(DASH);
+ if (dashIndex != -1 && searchString.length() > dashIndex + 1) {
+ containsTimestampRangeQuery = true;
+ }
+
+ return containsTimestampRangeQuery;
+ }
+
+ /**
+ * Creates a search string from ID's
+ *
+ * @param cid
+ * Component ID
+ * @param gid
+ * Group ID
+ * @param tid
+ * Trace ID
+ * @return a search string that can be used to search with ID's
+ */
+ public static String createStringFromIDs(int cid, int gid, int tid) {
+ StringBuffer buf = new StringBuffer();
+ // Add component ID
+ buf.append(CID_STR);
+ buf.append(cid);
+ buf.append(SEMICOLON);
+
+ // Add group ID
+ buf.append(GID_STR);
+ buf.append(gid);
+ buf.append(SEMICOLON);
+
+ // Add trace ID
+ buf.append(TID_STR);
+ buf.append(tid);
+ buf.append(SEMICOLON);
+
+ return buf.toString();
+ }
+
+ /**
+ * Creates a search string from timestamp
+ *
+ * @param startTimestamp
+ * start timestamp
+ * @param endTimestamp
+ * end timestamp
+ * @return a search string that can be used to search with timestamp
+ */
+ public static String createStringFromTimestamp(String startTimestamp,
+ String endTimestamp) {
+ StringBuffer buf = new StringBuffer();
+
+ // Add start timestamp
+ buf.append(TIMESTAMP_STR);
+ buf.append(startTimestamp);
+
+ // If end timestamp exists, add it
+ if (endTimestamp != null) {
+ buf.append(DASH);
+ buf.append(endTimestamp);
+ }
+
+ return buf.toString();
+ }
+}