001 // Copyright 2004, 2005 The Apache Software Foundation 002 // 003 // Licensed under the Apache License, Version 2.0 (the "License"); 004 // you may not use this file except in compliance with the License. 005 // You may obtain a copy of the License at 006 // 007 // http://www.apache.org/licenses/LICENSE-2.0 008 // 009 // Unless required by applicable law or agreed to in writing, software 010 // distributed under the License is distributed on an "AS IS" BASIS, 011 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 012 // See the License for the specific language governing permissions and 013 // limitations under the License. 014 015 package org.apache.tapestry.util; 016 017 import java.util.Arrays; 018 import java.util.HashMap; 019 import java.util.Map; 020 021 import org.apache.hivemind.util.Defense; 022 023 /** 024 * A wrapper around a Map that stores query parameter values. Map keys are strings. Map values can 025 * be simple strings or array of string (or null). 026 * 027 * @author Howard M. Lewis Ship 028 * @since 4.0 029 */ 030 public class QueryParameterMap 031 { 032 private final Map _parameters; 033 034 public QueryParameterMap() 035 { 036 this(new HashMap()); 037 } 038 039 /** 040 * Constructor around an existing Map whose keys and values are expected to conform expected use 041 * (keys are strings, values are null, string or string array). The map passed in is retained ( 042 * not copied). 043 */ 044 045 public QueryParameterMap(Map parameterMap) 046 { 047 Defense.notNull(parameterMap, "parameterMap"); 048 049 _parameters = parameterMap; 050 } 051 052 /** 053 * Replaces the parameter value for the given name wit the new value (which may be null). 054 */ 055 056 public void setParameterValue(String name, String value) 057 { 058 Defense.notNull(name, "name"); 059 060 _parameters.put(name, value); 061 } 062 063 /** 064 * Replaces the parameter value for the given name wit the new list of values (which may be 065 * empty or null). 066 */ 067 068 public void setParameterValues(String name, String[] values) 069 { 070 Defense.notNull(name, "name"); 071 072 _parameters.put(name, values); 073 } 074 075 /** 076 * Gets a query parameter value. If an array of values was stored, this returns the first value. 077 * May return null. 078 */ 079 080 public String getParameterValue(String name) 081 { 082 Defense.notNull(name, "name"); 083 084 Object values = _parameters.get(name); 085 086 if (values == null || values instanceof String) 087 return (String) values; 088 089 String[] array = (String[]) values; 090 091 return array[0]; 092 } 093 094 /** 095 * Returns the array of values for the specified parameter. If only a lone value was stored (via 096 * {@link #setParameterValue(String, String)}, then the value is wrapped as a string array and 097 * returned. 098 */ 099 public String[] getParameterValues(String name) 100 { 101 Defense.notNull(name, "name"); 102 103 Object values = _parameters.get(name); 104 105 if (values == null || values instanceof String[]) 106 return (String[]) values; 107 108 String loneValue = (String) values; 109 110 return new String[] 111 { loneValue }; 112 } 113 114 /** 115 * Returns the names of all parameters, sorted alphabetically. 116 */ 117 public String[] getParameterNames() 118 { 119 int count = _parameters.size(); 120 121 String[] result = (String[]) _parameters.keySet().toArray(new String[count]); 122 123 Arrays.sort(result); 124 125 return result; 126 } 127 }