import java.util.*; class URIParser { private static Vector Tokenize(String s, String delim) { StringTokenizer st = new StringTokenizer(s, delim); Vector v = new Vector(); while (st.hasMoreTokens()) v.add(st.nextToken()); return v; } public URI parseResource(String s) throws URLParseException { if (s.indexOf("?") > 0) { Vector v = Tokenize(s, "?"); if (v.size() != 2) throw new URLParseException("parseResource detected a syntax error: "+s); return new URI((String) v.elementAt(0), parseArguments((String) v.elementAt(1))); } else return new URI(s); } public Hashtable parseArguments(String s) throws URLParseException { Vector args = Tokenize(s, "&"); Hashtable h = new Hashtable(); for (Enumeration e = args.elements(); e.hasMoreElements();) { String arg = (String) e.nextElement(); if (arg.indexOf("=") > 0) { Vector v = Tokenize(arg, "="); if (v.size() != 2) throw new URLParseException("parseArguments detected a syntax error: "+arg); h.put(v.elementAt(0), decodeArgument((String)v.elementAt(1))); } else h.put(arg, ""); } return h; } private String decodeArgument(String s) throws URLParseException { String t = new String(); int i,j=0; for (i = s.indexOf("%"); (i < s.length()) && (i > 0);) { if (i+3 > s.length()) throw new URLParseException("decodeArgument detected a syntax error: "+s); else { try { String code = s.substring(i,i+3).trim(); Integer intcode = new Integer(0); code = code.replace('%','#'); intcode = intcode.decode(code); t = t+s.substring(j,i)+(char)intcode.intValue(); } catch (NumberFormatException nf) { throw new URLParseException("decodeArgument detected a syntax error (number format): " +nf.getMessage()); } } j=i+3; i = s.indexOf("%", i+1); } t = t+s.substring(j,s.length()); t = t.replace('+',' '); return t; } }