Ignore:
Timestamp:
10/01/06 12:00:53 (6 years ago)
Author:
sys
Message:

Optimisation : passage Map -> List

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Jav_FW/com/scenari/s/fw/utils/HParamsQueryString.java

    r1702 r6724  
    3939package com.scenari.s.fw.utils; 
    4040 
    41 import java.util.Collections; 
     41import java.util.ArrayList; 
    4242import java.util.HashMap; 
    4343import java.util.Iterator; 
     44import java.util.List; 
    4445import java.util.Map; 
    4546import java.util.StringTokenizer; 
     
    4748/** 
    4849 * 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. 
    4952 */ 
    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     } 
     53public 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        } 
    6969 
    7070    /** 
    7171     * 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). 
    7273     */ 
    7374    public static final Map hParseQueryString(String pParams) { 
     
    102103        return vMap; 
    103104    } 
    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        } 
    209267 
    210268} 
Note: See TracChangeset for help on using the changeset viewer.