1 16 package org.outerj.daisy.query.model; 17 18 import java.util.Map ; 19 import java.util.List ; 20 import java.util.ArrayList ; 21 22 public class ParamString { 23 private StringPart[] parts; 24 25 public ParamString(String string) { 26 List parts = new ArrayList (); 27 StringBuffer currentWord = new StringBuffer (); 28 final int IN_TEXT = 0; 29 final int IN_PARAM = 1; 30 int state = IN_TEXT; 31 for (int i = 0; i < string.length(); i++) { 32 char c = string.charAt(i); 33 switch (c) { 34 case '{': 35 if (state == IN_PARAM) { 36 if (currentWord.length() == 0) { 37 state = IN_TEXT; 38 currentWord.append("{"); 39 } else { 40 throw new RuntimeException ("Error parsing pattern: nested '{'."); 41 } 42 } else { 43 if (currentWord.length() > 0) { 44 parts.add(new FixedStringPart(currentWord.toString())); 45 currentWord.setLength(0); 46 } 47 state = IN_PARAM; 48 } 49 break; 50 case '}': 51 if (state == IN_PARAM) { 52 if (currentWord.length() > 0) { 53 parts.add(new ParamStringPart(currentWord.toString())); 54 currentWord.setLength(0); 55 } 56 state = IN_TEXT; 57 } else { 58 currentWord.append("}"); 59 } 60 break; 61 default: 62 currentWord.append(c); 63 } 64 } 65 if (currentWord.length() > 0) 66 parts.add(new FixedStringPart(currentWord.toString())); 67 this.parts = (StringPart[])parts.toArray(new StringPart[parts.size()]); 68 } 69 70 interface StringPart { 71 void append(StringBuffer buffer, Map params); 72 } 73 74 class FixedStringPart implements StringPart { 75 private final String string; 76 77 FixedStringPart(String string) { 78 this.string = string; 79 } 80 81 public void append(StringBuffer buffer, Map params) { 82 buffer.append(string); 83 } 84 } 85 86 class ParamStringPart implements StringPart { 87 private final String name; 88 89 ParamStringPart(String name) { 90 this.name = name; 91 } 92 93 public void append(StringBuffer buffer, Map params) { 94 String value = (String )params.get(name); 95 if (value != null) 96 buffer.append(value); 97 } 98 } 99 100 public String toString(Map params) { 101 StringBuffer result = new StringBuffer (); 102 this.append(result, params); 103 return result.toString(); 104 } 105 106 public void append(StringBuffer buffer, Map params) { 107 for (int i = 0; i < parts.length; i++) { 108 parts[i].append(buffer, params); 109 } 110 } 111 } 112 | Popular Tags |