/******************************************************************************* * Copyright (c) 2004, 2005 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.test.internal.performance.db; import java.util.Arrays; import java.util.Properties; import java.util.Set; import java.util.StringTokenizer; import org.eclipse.test.internal.performance.PerformanceTestPlugin; /** * The <code>Variations</code> class represents a set of key/value pairs * and is used to tag data stored in the performance database and when * querying for data from the database. */ public class Variations extends Properties { private static final long serialVersionUID= 1L; /** * Creates an empty set of key/value pairs. */ public Variations() { // } /** * Creates a Variations object that is populated with a "config" and a "build" key/value pair. * @param configValue a value to store under the config key * @param buildValue a value to store under the build key * @deprecated Use the default constructor instead and fill in key/value pairs explicitely. */ public Variations(String configValue, String buildValue) { if (configValue != null) put(PerformanceTestPlugin.CONFIG, configValue); if (buildValue != null) put(PerformanceTestPlugin.BUILD, buildValue); } /** * Creates a set of key/value pairs by parsing the given string. * The format of the string must be: * <pre> * key1=value1;key2=value2; .... ; keyn=valuen * </pre> * @param keyValuePairs */ public Variations(String keyValuePairs) { parsePairs(keyValuePairs); } public String toExactMatchString() { return toDB(this, false); } public String toQueryPattern() { return toDB(this, true); } public void parsePairs(String keyvaluepairs) { parse(keyvaluepairs, ";"); //$NON-NLS-1$ } public void parseDB(String keyvaluepairs) { parse(keyvaluepairs, "|"); //$NON-NLS-1$ } /** * parsing the given string as key/value pairs and stores them in Variations. * The string's format is an implementation detail of the database. * @param keyvaluepairs * @param separator */ private void parse(String keyvaluepairs, String separator) { StringTokenizer st= new StringTokenizer(keyvaluepairs, separator); while (st.hasMoreTokens()) { String token= st.nextToken(); int i= token.indexOf('='); if (i < 1) throw new IllegalArgumentException("kev/value pair '" + token + "' is illformed"); //$NON-NLS-1$ //$NON-NLS-2$ String value= token.substring(i+1); token= token.substring(0, i); //System.out.println(token + ": <" + value + ">"); put(token, value); } } /* * TODO: we need to escape '=' and ';' characters in key/values. */ private static String toDB(Properties keyValues, boolean asQuery) { Set set= keyValues.keySet(); String[] keys= (String[]) set.toArray(new String[set.size()]); Arrays.sort(keys); StringBuffer sb= new StringBuffer(); for (int i= 0; i < keys.length; i++) { if (asQuery) sb.append('%'); String key= keys[i]; String value= keyValues.getProperty(key); sb.append('|'); sb.append(key); sb.append('='); if (value != null) sb.append(value); sb.append('|'); } if (asQuery) sb.append('%'); return sb.toString(); } }