View Javadoc

1   /*
2    * $Id: ParamUtils.java,v 1.1 2006/12/08 17:26:06 oeuillot Exp $
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   * @author Olivier Oeuillot (latest modification by $Author: oeuillot $)
18   * @version $Revision: 1.1 $ $Date: 2006/12/08 17:26:06 $
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); // handle doubles
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) { // just copy quotes in parts
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++; // Accolade dans une accolade !
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 }