1 package org.sapia.archie.impl; 2 3 import java.util.StringTokenizer ; 4 5 import org.sapia.archie.Name; 6 import org.sapia.archie.NameParser; 7 import org.sapia.archie.NamePart; 8 import org.sapia.archie.ProcessingException; 9 10 18 public class AttributeNameParser implements NameParser{ 19 20 static final char QMARK = '?'; 21 static final String AMP = "&"; 22 static final char EQ = '='; 23 static final String SLASH = "/"; 24 static final char SEPARATOR = '/'; 25 26 29 public String asString(Name name) { 30 StringBuffer buff = new StringBuffer (); 31 for(int i = 0; i < name.count(); i++){ 32 buff.append(name.get(i).asString()); 33 if(i < name.count() - 1){ 34 buff.append(SEPARATOR); 35 } 36 } 37 return buff.toString(); 38 } 39 42 public Name parse(String name) throws ProcessingException { 43 Name n = new Name(); 44 StringBuffer buf = new StringBuffer (); 45 46 for (int i = 0; i < name.length(); i++) { 47 if (name.charAt(i) == SEPARATOR) { 48 n.add(parseNamePart(buf.toString())); 49 buf.delete(0, buf.length()); 50 } else { 51 buf.append(name.charAt(i)); 52 } 53 } 54 55 if (buf.length() > 0) { 56 n.add(parseNamePart(buf.toString())); 57 } 58 59 return n; 60 } 61 64 public NamePart parseNamePart(String namePart) throws ProcessingException { 65 AttributeNamePart anp = new AttributeNamePart(); 66 parseName(anp, namePart); 67 return anp; 68 } 69 private void parseName(AttributeNamePart anp, String name) { 70 int idx = name.indexOf(QMARK); 71 72 if (idx < 0) { 73 anp.setName(name); 74 75 return; 76 } 77 78 anp.setName(name.substring(0, idx)); 79 80 if (idx == (name.length() - 1)) { 81 return; 82 } 83 84 parseProperties(anp, name.substring(idx + 1)); 85 } 86 87 88 private void parseProperties(AttributeNamePart anp, String props) { 89 StringTokenizer st = new StringTokenizer (props, AMP); 90 String token; 91 92 while (st.hasMoreTokens()) { 93 token = st.nextToken(); 94 parseProperty(anp, token); 95 } 96 } 97 98 99 private void parseProperty(AttributeNamePart anp, String prop) { 100 String name = null; 101 String value = null; 102 103 int idx = prop.indexOf(EQ); 104 105 if (idx < 0) { 106 if (prop.length() > 0) { 107 name = prop; 108 } 109 } else { 110 name = prop.substring(0, idx); 111 112 if (idx != (prop.length() - 1)) { 113 value = prop.substring(idx + 1); 114 } 115 } 116 117 if (name != null && value != null) { 118 anp.addProperty(name, value); 119 } 120 } 121 } 122 | Popular Tags |