- Timestamp:
- 10/01/06 12:00:53 (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Jav_FW/com/scenari/s/fw/utils/HParamsQueryString.java
r1702 r6724 39 39 package com.scenari.s.fw.utils; 40 40 41 import java.util. Collections;41 import java.util.ArrayList; 42 42 import java.util.HashMap; 43 43 import java.util.Iterator; 44 import java.util.List; 44 45 import java.util.Map; 45 46 import java.util.StringTokenizer; … … 47 48 /** 48 49 * Ensemble des Paramètres issus d'une String de type QueryString d'une URL. 50 * Cette implémentation étend ArrayList et enregistre chaque couple key/value dans 2 entrées 51 * de la liste. 49 52 */ 50 public class HParamsQueryString { 51 52 /** Map des paramètres. */ 53 protected Map fMap = null; 54 55 /** 56 * WParams constructor comment. 57 */ 58 public HParamsQueryString() { 59 super(); 60 } 61 62 /** 63 * WParams constructor comment. 64 */ 65 public HParamsQueryString(String pParams) { 66 super(); 67 hInit(pParams); 68 } 53 public class HParamsQueryString extends ArrayList { 54 55 /** 56 * WParams constructor comment. 57 */ 58 public HParamsQueryString() { 59 super(); 60 } 61 62 /** 63 * WParams constructor comment. 64 */ 65 public HParamsQueryString(String pParams) { 66 super(); 67 hInit(pParams); 68 } 69 69 70 70 /** 71 71 * Parse une QueryString avec l'encoding UTF-8. 72 * Retourne une Map où la value est systématiquement un tableau de String (comme l'API Servlet). 72 73 */ 73 74 public static final Map hParseQueryString(String pParams) { … … 102 103 return vMap; 103 104 } 104 105 /** 106 * Retourne vrai si tous les paramètres sont identiques, quelquesoit l'ordre de leur déclaration. 107 */ 108 public final boolean equals(Object pObject) { 109 if (pObject != null && pObject instanceof HParamsQueryString) { 110 HParamsQueryString vParams = (HParamsQueryString) pObject; 111 if (vParams.hCountParams() == fMap.size()) { 112 Iterator vIt = fMap.entrySet().iterator(); 113 while (vIt.hasNext()) { 114 Map.Entry vEntry = (Map.Entry) vIt.next(); 115 String[] vVals2 = vParams.hGetValues((String) vEntry.getKey()); 116 String[] vVals = ((String[]) vEntry.getValue()); 117 if (vVals2 != null && vVals2.length == vVals.length) { 118 for (int i = 0; i < vVals.length; i++) { 119 int j = 0; 120 for (; j < vVals2.length; j++) { 121 if (vVals[i].equals(vVals2[j])) { 122 //Trouvé 123 break; 124 } 125 } 126 if (j >= vVals2.length) { 127 //Pas trouvé 128 return false; 129 } 130 } 131 } else { 132 return false; 133 } 134 } 135 //Tous les params sont égaux. 136 return true; 137 } 138 } 139 return false; 140 } 141 142 /** 143 * 144 */ 145 public final int hCountParams() { 146 return fMap.size(); 147 } 148 149 /** 150 * Liste l'ensemble des noms de paramètres. 151 */ 152 public final Iterator hGetParamNames() { 153 return Collections.unmodifiableSet(fMap.keySet()).iterator(); 154 } 155 156 /** 157 * 158 */ 159 public final String hGetValue(String pKey) { 160 String[] vRes = (String[]) fMap.get(pKey); 161 return (vRes == null) ? null : vRes[0]; 162 } 163 164 /** 165 * 166 */ 167 public final String[] hGetValues(String pKey) { 168 return (String[]) fMap.get(pKey); 169 } 170 171 /** 172 * 173 */ 174 public final void hInit(String pParams) { 175 fMap = hParseQueryString(pParams); 176 } 177 178 private static String parseName(String pName, StringBuffer pBuf) { 179 pBuf.setLength(0); 180 for (int i = 0; i < pName.length(); i++) { 181 char c = pName.charAt(i); 182 switch (c) { 183 case 43: // '+' 184 pBuf.append(' '); 185 break; 186 187 case 37: // '%' 188 try { 189 pBuf.append((char) Integer.parseInt(pName.substring(i + 1, i + 3), 16)); 190 i += 2; 191 break; 192 } catch (NumberFormatException e) { 193 throw new IllegalArgumentException(); 194 } catch (StringIndexOutOfBoundsException e) { 195 String rest = pName.substring(i); 196 pBuf.append(rest); 197 if (rest.length() == 2) i++; 198 } 199 break; 200 201 default: 202 pBuf.append(c); 203 break; 204 } 205 } 206 207 return pBuf.toString(); 208 } 105 106 /** 107 * Parse une QueryString avec l'encoding UTF-8 et retourne un Map : 108 * <li> de string si la clé est présente une seule fois 109 * <li> de tableaux de string si la clé est définie plusieurs fois. 110 */ 111 public static final Map hParseQueryStringAsMap(String pParams) { 112 Map vMap = new HashMap(); 113 if (pParams == null) { throw new IllegalArgumentException(); } 114 StringBuffer vBuf = new StringBuffer(); 115 String vKey; 116 for (StringTokenizer vTok = new StringTokenizer(pParams, "&"); vTok.hasMoreTokens();) { 117 Object vNewVal = null; 118 String vPair = vTok.nextToken(); 119 int vPos = vPair.indexOf('='); 120 if (vPos == -1) { throw new IllegalArgumentException(); } 121 vKey = parseName(vPair.substring(0, vPos), vBuf); 122 String val = parseName(vPair.substring(vPos + 1, vPair.length()), vBuf); 123 Object vOldVal = vMap.get(vKey); 124 if (vOldVal != null) { 125 if (vOldVal.getClass().isArray()) { 126 String[] vOldVals = (String[]) vOldVal; 127 String[] vNewVals = new String[vOldVals.length + 1]; 128 System.arraycopy(vOldVals, 0, vNewVals, 0, vOldVals.length); 129 vNewVals[vOldVals.length] = val; 130 vNewVal = vNewVals; 131 } else { 132 String[] vNewVals = new String[2]; 133 vNewVals[0] = (String) vOldVal; 134 vNewVals[1] = val; 135 vNewVal = vNewVals; 136 } 137 } else { 138 vNewVal = val; 139 } 140 vMap.put(vKey, vNewVal); 141 } 142 return vMap; 143 } 144 145 /** 146 * Parse une QueryString avec l'encoding UTF-8 et ajoute des coupes de 147 * valeurs key / value à la liste. 148 */ 149 public static final void hParseQueryStringAsList(String pParams, List pList) { 150 if (pParams == null) throw new IllegalArgumentException(); 151 StringBuffer vBuf = new StringBuffer(); 152 for (StringTokenizer vTok = new StringTokenizer(pParams, "&"); vTok.hasMoreTokens();) { 153 String vPair = vTok.nextToken(); 154 int vPos = vPair.indexOf('='); 155 if (vPos == -1) throw new IllegalArgumentException(); 156 String vKey = parseName(vPair.substring(0, vPos), vBuf); 157 String vVal = parseName(vPair.substring(vPos + 1, vPair.length()), vBuf); 158 pList.add(vKey); 159 pList.add(vVal); 160 } 161 } 162 163 /** 164 * Retourne vrai si tous les paramètres sont identiques, et dans le même 165 * ordre. 166 */ 167 public final boolean equals(Object pObject) { 168 if (pObject != null && pObject instanceof HParamsQueryString) { return this.equals(pObject); } 169 return false; 170 } 171 172 /** 173 * 174 */ 175 public final int hCountParams() { 176 return size() / 2; 177 } 178 179 /** 180 * Liste l'ensemble des noms de paramètres. 181 */ 182 public final Iterator hGetParamNames() { 183 return new Iterator() { 184 protected int fIdx = 0; 185 186 public boolean hasNext() { 187 return fIdx < size(); 188 } 189 190 public Object next() { 191 Object vRes = get(fIdx); 192 fIdx = fIdx + 2; 193 return vRes; 194 } 195 196 public void remove() { 197 HParamsQueryString.this.remove(fIdx); 198 HParamsQueryString.this.remove(fIdx); 199 } 200 }; 201 } 202 203 /** 204 * 205 */ 206 public final String hGetValue(String pKey) { 207 for (int i = 0; i < size(); i = i + 2) { 208 String vKey = (String) get(i); 209 if (vKey.equals(pKey)) return (String) get(i + 1); 210 } 211 return null; 212 } 213 214 /** 215 * 216 */ 217 public final String[] hGetValues(String pKey) { 218 List vList = new ArrayList(); 219 for (int i = 0; i < size(); i = i + 2) { 220 String vKey = (String) get(i); 221 if (vKey.equals(pKey)) { 222 vList.add(get(i + 1)); 223 } 224 } 225 return (String[]) vList.toArray(new String[vList.size()]); 226 } 227 228 /** 229 * 230 */ 231 public final void hInit(String pParams) { 232 clear(); 233 hParseQueryStringAsList(pParams, this); 234 } 235 236 private static String parseName(String pName, StringBuffer pBuf) { 237 pBuf.setLength(0); 238 for (int i = 0; i < pName.length(); i++) { 239 char c = pName.charAt(i); 240 switch (c) { 241 case 43: // '+' 242 pBuf.append(' '); 243 break; 244 245 case 37: // '%' 246 try { 247 pBuf.append((char) Integer.parseInt(pName.substring(i + 1, i + 3), 16)); 248 i += 2; 249 break; 250 } catch (NumberFormatException e) { 251 throw new IllegalArgumentException(); 252 } catch (StringIndexOutOfBoundsException e) { 253 String rest = pName.substring(i); 254 pBuf.append(rest); 255 if (rest.length() == 2) i++; 256 } 257 break; 258 259 default: 260 pBuf.append(c); 261 break; 262 } 263 } 264 265 return pBuf.toString(); 266 } 209 267 210 268 }
Note: See TracChangeset
for help on using the changeset viewer.