001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: *
017: */
018: package org.apache.lenya.util;
019:
020: import java.util.HashMap;
021: import java.util.Iterator;
022: import java.util.Map;
023: import java.util.StringTokenizer;
024:
025: /**
026: * <p>
027: * Utility class to analyze a query string of the form
028: * <code>key1=value1&key2=value2&...</code>.
029: * Access is not thread-safe.
030: * </p>
031: * <p>
032: * Invalid parts (not a valid key-value-pair) are omitted.
033: * </p>
034: */
035: public class Query {
036:
037: protected static final String PAIR_DELIMITER = "&";
038: protected static final String KEY_VALUE_DELIMITER = "=";
039: private String pairDelimiter;
040: private String keyValueDelimiter;
041:
042: /**
043: * Creates a query object with default values for the pair and key-value
044: * delimiters.
045: *
046: * @param string The query string.
047: */
048: public Query(String string) {
049: this (string, PAIR_DELIMITER, KEY_VALUE_DELIMITER);
050: }
051:
052: /**
053: * Creates a query object.
054: * @param string The string.
055: * @param pairDelimiter The delimiter between key-value pairs.
056: * @param keyValueDelimiter The delimiter between key and value.
057: */
058: public Query(String string, String pairDelimiter,
059: String keyValueDelimiter) {
060: this .key2value = new HashMap();
061: this .pairDelimiter = pairDelimiter;
062: this .keyValueDelimiter = keyValueDelimiter;
063: StringTokenizer tokenizer = new StringTokenizer(string,
064: pairDelimiter);
065: while (tokenizer.hasMoreTokens()) {
066: String token = tokenizer.nextToken();
067: StringTokenizer keyValueTokenizer = new StringTokenizer(
068: token, keyValueDelimiter);
069: if (keyValueTokenizer.countTokens() == 2) {
070: final String key = keyValueTokenizer.nextToken();
071: final String value = keyValueTokenizer.nextToken();
072: this .key2value.put(key, value);
073: }
074: }
075: }
076:
077: private Map key2value;
078:
079: public String getValue(String key) {
080: return (String) this .key2value.get(key);
081: }
082:
083: public String getValue(String key, String defaultValue) {
084: String value = getValue(key);
085: if (value == null) {
086: return defaultValue;
087: } else {
088: return value;
089: }
090: }
091:
092: public String getKeyValueDelimiter() {
093: return keyValueDelimiter;
094: }
095:
096: public String getPairDelimiter() {
097: return pairDelimiter;
098: }
099:
100: public void removeValue(String key) {
101: this .key2value.remove(key);
102: }
103:
104: public String toString() {
105: StringBuffer buf = new StringBuffer();
106: for (Iterator i = this .key2value.keySet().iterator(); i
107: .hasNext();) {
108: String key = (String) i.next();
109: String value = (String) this.key2value.get(key);
110: buf.append(key);
111: buf.append(this.keyValueDelimiter);
112: buf.append(value);
113: if (i.hasNext()) {
114: buf.append(this.pairDelimiter);
115: }
116: }
117: return buf.toString();
118: }
119:
120: }
|