1
2
3
4 package org.rcfaces.core.internal.util;
5
6 import javax.faces.component.UIComponent;
7 import javax.faces.component.UIParameter;
8
9 import org.apache.commons.logging.Log;
10 import org.apache.commons.logging.LogFactory;
11 import org.rcfaces.core.component.iterator.IParameterIterator;
12 import org.rcfaces.core.internal.lang.StringAppender;
13 import org.rcfaces.core.internal.tools.ParameterTools;
14
15
16
17
18
19
20 public class ParamUtils {
21 private static final String REVISION = "$Revision: 1.1 $";
22
23 private static final Log LOG = LogFactory.getLog(ParamUtils.class);
24
25 public static String formatMessage(UIComponent component, String pattern) {
26 if (pattern == null || pattern.length() < 1) {
27 return pattern;
28 }
29
30 IParameterIterator it = ParameterTools.listParameters(component);
31 if (it.hasNext() == false) {
32 return pattern;
33 }
34
35 UIParameter parameters[] = it.toArray();
36
37 StringAppender[] segments = new StringAppender[2];
38 for (int i = 0; i < segments.length; ++i) {
39 segments[i] = new StringAppender();
40 }
41 int part = 0;
42 int formatNumber = 0;
43 boolean inQuote = false;
44 int braceStack = 0;
45
46 char chs[] = pattern.toCharArray();
47
48 next_char: for (int i = 0; i < chs.length; ++i) {
49 char ch = chs[i];
50 if (part == 0) {
51 if (ch == '\'') {
52 if (i + 1 < chs.length && chs[i + 1] == '\'') {
53 segments[part].append(ch);
54 i++;
55 continue;
56 }
57
58 inQuote = !inQuote;
59 continue;
60 }
61
62 if (ch == '{' && !inQuote) {
63 part = 1;
64 continue;
65 }
66
67 segments[part].append(ch);
68 continue;
69 }
70
71 if (inQuote) {
72 segments[part].append(ch);
73 if (ch == '\'') {
74 inQuote = false;
75 }
76 continue;
77 }
78
79 switch (ch) {
80
81 case ',':
82 if (part < 3) {
83 part++;
84 continue next_char;
85 }
86
87 segments[part].append(ch);
88 continue next_char;
89
90 case '{':
91 braceStack++;
92 segments[part].append(ch);
93 continue next_char;
94
95 case '}':
96 if (braceStack == 1) {
97 part = 0;
98 makeFormat(segments, parameters);
99 formatNumber++;
100
101 segments[1].setLength(0);
102 segments[2].setLength(0);
103 segments[3].setLength(0);
104 continue next_char;
105 }
106
107 braceStack--;
108 segments[part].append(ch);
109 continue next_char;
110
111 case '\'':
112 inQuote = true;
113 continue next_char;
114
115 default:
116 segments[part].append(ch);
117 break;
118 }
119 }
120
121 if (braceStack == 0 && part > 0) {
122 throw new IllegalArgumentException(
123 "Unmatched braces in the pattern.");
124 }
125
126 return segments[0].toString();
127 }
128
129 private static void makeFormat(StringAppender[] segments,
130 UIParameter parameters[]) {
131
132 String key = segments[1].toString();
133
134 if (key.length() < 1) {
135 return;
136 }
137
138 if (Character.isDigit(key.charAt(0))) {
139 int idx = Integer.parseInt(key);
140 if (idx < 0 || idx >= parameters.length) {
141 if (LOG.isDebugEnabled()) {
142 LOG.debug("Index out of bounds 0=<" + idx + "<"
143 + parameters.length);
144 }
145 return;
146 }
147
148 Object v = parameters[idx].getValue();
149 if (v == null) {
150 return;
151 }
152
153 segments[0].append(String.valueOf(v));
154
155 return;
156 }
157
158 for (int i = 0; i < parameters.length; i++) {
159 UIParameter parameter = parameters[i];
160
161 if (key.equals(parameter.getName()) == false) {
162 continue;
163 }
164
165 Object v = parameter.getValue();
166 if (v == null) {
167 return;
168 }
169
170 segments[0].append(String.valueOf(v));
171 return;
172 }
173 }
174 }