KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > outerj > daisy > query > model > ParamString


1 /*
2  * Copyright 2004 Outerthought bvba and Schaubroeck nv
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */

16 package org.outerj.daisy.query.model;
17
18 import java.util.Map JavaDoc;
19 import java.util.List JavaDoc;
20 import java.util.ArrayList JavaDoc;
21
22 public class ParamString {
23     private StringPart[] parts;
24
25     public ParamString(String JavaDoc string) {
26         List JavaDoc parts = new ArrayList JavaDoc();
27         StringBuffer JavaDoc currentWord = new StringBuffer JavaDoc();
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 JavaDoc("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 JavaDoc buffer, Map JavaDoc params);
72     }
73
74     class FixedStringPart implements StringPart {
75         private final String JavaDoc string;
76
77         FixedStringPart(String JavaDoc string) {
78             this.string = string;
79         }
80
81         public void append(StringBuffer JavaDoc buffer, Map JavaDoc params) {
82             buffer.append(string);
83         }
84     }
85
86     class ParamStringPart implements StringPart {
87         private final String JavaDoc name;
88
89         ParamStringPart(String JavaDoc name) {
90             this.name = name;
91         }
92
93         public void append(StringBuffer JavaDoc buffer, Map JavaDoc params) {
94             String JavaDoc value = (String JavaDoc)params.get(name);
95             if (value != null)
96                 buffer.append(value);
97         }
98     }
99
100     public String JavaDoc toString(Map JavaDoc params) {
101         StringBuffer JavaDoc result = new StringBuffer JavaDoc();
102         this.append(result, params);
103         return result.toString();
104     }
105
106     public void append(StringBuffer JavaDoc buffer, Map JavaDoc params) {
107         for (int i = 0; i < parts.length; i++) {
108             parts[i].append(buffer, params);
109         }
110     }
111 }
112
Popular Tags