| 1 package org.sapia.ubik.net; 2 3 import java.util.*; 4 5 import javax.naming.CompositeName ; 6 import javax.naming.Name ; 7 import javax.naming.NameParser ; 8 import javax.naming.NamingException ; 9 10 11 30 public class QueryStringParser implements NameParser { 31 static final char QMARK = '?'; 32 static final String AMP = "&"; 33 static final char EQ = '='; 34 static final String SLASH = "/"; 35 36 39 public QueryStringParser() { 40 super(); 41 } 42 43 48 public QueryString parseQueryString(String string) { 49 QueryString qs = new QueryString(); 50 51 if ((string == null) || (string.length() == 0)) { 52 return qs; 53 } 54 55 parseName(qs, string); 56 57 return qs; 58 } 59 60 72 public Enumeration parseNameTokens(String queryString) { 73 Vector tokens = new Vector(); 74 QueryString qs = new QueryString(); 75 76 parseName(qs, queryString); 77 78 StringTokenizer st = new StringTokenizer(qs.getPath(), SLASH); 79 80 while (st.hasMoreTokens()) { 81 tokens.add(st.nextToken()); 82 } 83 84 if (qs.getParameters().size() > 0) { 85 StringBuffer buf = new StringBuffer ((String ) tokens.lastElement()); 86 Map.Entry entry; 87 buf.append(QueryStringParser.QMARK); 88 89 Iterator itr = qs.getParameters().entrySet().iterator(); 90 int count = 0; 91 92 while (itr.hasNext()) { 93 entry = (Map.Entry) itr.next(); 94 95 if (count > 0) { 96 buf.append(QueryStringParser.AMP); 97 } 98 99 buf.append(entry.getKey().toString()).append(QueryStringParser.EQ) 100 .append(entry.getValue()); 101 count++; 102 } 103 104 tokens.set(tokens.size() - 1, buf.toString()); 105 } 106 107 return tokens.elements(); 108 } 109 110 119 public Name parse(String queryString) throws NamingException { 120 return new CompositeNameEx(parseNameTokens(queryString)); 121 } 122 123 128 public String nameToString(Name n) { 129 StringBuffer buf = new StringBuffer (); 130 131 for (int i = 0; i < n.size(); i++) { 132 buf.append(n.get(i)); 133 134 if (i < (n.size() - 1)) { 135 buf.append(SLASH); 136 } 137 } 138 139 return buf.toString(); 140 } 141 142 143 private void parseName(QueryString qs, String name) { 144 int idx = name.indexOf(QMARK); 145 146 if (idx < 0) { 147 qs.setPath(name); 148 149 return; 150 } 151 152 qs.setPath(name.substring(0, idx)); 153 154 if (idx == (name.length() - 1)) { 155 return; 156 } 157 158 parseProperties(qs, name.substring(idx + 1)); 159 } 160 161 162 private void parseProperties(QueryString tn, String props) { 163 StringTokenizer st = new StringTokenizer(props, AMP); 164 String token; 165 166 while (st.hasMoreTokens()) { 167 token = st.nextToken(); 168 parseProperty(tn, token); 169 } 170 } 171 172 173 private void parseProperty(QueryString qs, String prop) { 174 String name = null; 175 String value = null; 176 177 int idx = prop.indexOf(EQ); 178 179 if (idx < 0) { 180 if (prop.length() > 0) { 181 name = prop; 182 } 183 } else { 184 name = prop.substring(0, idx); 185 186 if (idx != (prop.length() - 1)) { 187 value = prop.substring(idx + 1); 188 } 189 } 190 191 if ((name != null) && (value != null)) { 192 qs.addParameter(name, value); 193 } 194 } 195 196 199 static final class CompositeNameEx extends CompositeName { 200 protected CompositeNameEx(Enumeration en) { 201 super(en); 202 } 203 } 204 } 205 | Popular Tags |