KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > mmbase > util > functions > PatternNodeFunctionProvider


1 /*
2
3 This software is OSI Certified Open Source Software.
4 OSI Certified is a certification mark of the Open Source Initiative.
5
6 The license (Mozilla version 1.0) can be read at the MMBase site.
7 See http://www.MMBase.org/license
8
9 */

10 package org.mmbase.util.functions;
11
12 import java.util.*;
13 import java.util.regex.*;
14 import javax.servlet.http.HttpServletRequest JavaDoc;
15 import java.lang.reflect.Method JavaDoc;
16 import org.mmbase.bridge.Node;
17 import org.mmbase.util.Casting;
18 import org.mmbase.util.logging.Logger;
19 import org.mmbase.util.logging.Logging;
20
21 /**
22  * This Function provider creates function objects , which can create a String function based on a
23  * pattern. Several kind of patterns are recognized. {PARAM.abc} creates a parameter 'abc' and puts the
24  * value of it on that place in the result. {NODE.title}, puts the title field of the node on which
25  * the function was applied on that place, and {REQUEST.getContextPath} applies that method to the
26  * request parameter (and the result is added). {INITPARAM.xyz} access the servletcontext init parameters xyz.
27  *
28  * It is also possible to use request parameters and attributes with {REQUESTPARAM.xxx} and {REQUESTATTRIBUTE.yyy}.
29  *
30  * The functions which are created have silly names like string0, string1 etc, so you want to wrap
31  * them in a function with a reasonable name (this is done when specifying this thing in the builder
32  * xml).
33  *
34  * @author Michiel Meeuwissen
35  * @version $Id: PatternNodeFunctionProvider.java,v 1.9 2006/03/29 15:05:51 michiel Exp $
36  * @since MMBase-1.8
37  */

38 public class PatternNodeFunctionProvider extends FunctionProvider {
39
40     private static final Logger log = Logging.getLoggerInstance(PatternNodeFunctionProvider.class);
41     private static final PatternNodeFunctionProvider instance = new PatternNodeFunctionProvider();
42
43     public PatternNodeFunctionProvider() {
44     }
45
46     public static PatternNodeFunctionProvider getInstance() {
47         return instance;
48     }
49
50     public Function getFunction(String JavaDoc name) {
51         Function func = (Function) functions.get(name);
52         if (func == null) {
53             func = new PatternNodeFunction(name);
54             functions.put(name, func);
55         }
56         return func;
57     }
58
59     private static final Pattern fieldsPattern = Pattern.compile("\\{NODE\\.(.+?)\\}");
60     private static final Pattern requestPattern = Pattern.compile("\\{REQUEST\\.(.+?)\\}");
61     private static final Pattern requestParamPattern = Pattern.compile("\\{REQUESTPARAM\\.(.+?)\\}");
62     private static final Pattern requestAttributePattern = Pattern.compile("\\{REQUESTATTRIBUTE\\.(.+?)\\}");
63     private static final Pattern paramPattern = Pattern.compile("\\{PARAM\\.(.+?)\\}");
64     private static final Pattern initParamPattern = Pattern.compile("\\{INITPARAM\\.(.+?)\\}");
65
66     private static int counter = 0;
67
68     protected static class PatternNodeFunction extends NodeFunction {
69
70         String JavaDoc template;
71         Map requestMethods = null;
72         PatternNodeFunction(String JavaDoc template) {
73             super("string" + (counter++), getParameterDef(template), ReturnType.STRING);
74             this.template = template;
75             Matcher matcher = requestPattern.matcher(template);
76             if (matcher.find()) {
77                 matcher.reset();
78                 requestMethods = new HashMap();
79                 while(matcher.find()) {
80                     try {
81                         requestMethods.put(matcher.group(1), HttpServletRequest JavaDoc.class.getMethod(matcher.group(1), new Class JavaDoc[] {}));
82                     } catch (NoSuchMethodException JavaDoc nsme) {
83                         log.error(nsme.getMessage(), nsme);
84                     }
85                 }
86             }
87
88         }
89         protected static Parameter[] getParameterDef(String JavaDoc template) {
90             List params = new ArrayList();
91             if (requestPattern.matcher(template).find() ||
92                 requestParamPattern.matcher(template).find() ||
93                 requestAttributePattern.matcher(template).find()
94                 ) {
95                 params.add(Parameter.REQUEST);
96             }
97             Matcher args = paramPattern.matcher(template);
98             while(args.find()) {
99                 params.add(new Parameter(args.group(1), String JavaDoc.class, ""));
100             }
101             return (Parameter[]) params.toArray(new Parameter[] {});
102         }
103
104         protected Object JavaDoc getFunctionValue(final Node node, final Parameters parameters) {
105             StringBuffer JavaDoc sb = new StringBuffer JavaDoc();
106             {
107                 Matcher fields = fieldsPattern.matcher(template);
108                 while (fields.find()) {
109                     fields.appendReplacement(sb, node.getStringValue(fields.group(1)));
110                 }
111                 fields.appendTail(sb);
112             }
113             {
114                 Matcher request = requestPattern.matcher(sb.toString());
115                 if (request.find()) {
116                     request.reset();
117                     HttpServletRequest JavaDoc req = (HttpServletRequest JavaDoc) parameters.get(Parameter.REQUEST);
118                     sb = new StringBuffer JavaDoc();
119                     while(request.find()) {
120                         if(request.group(1).equals("getContextPath")) {
121                             String JavaDoc r = req == null ? org.mmbase.module.core.MMBaseContext.getHtmlRootUrlPath() : req.getContextPath() + '/';
122                             request.appendReplacement(sb, r.substring(0, r.length() - 1));
123                             continue;
124                         }
125
126                         if (req == null) {
127                             log.error("Did't find the request among the parameters");
128                             continue;
129                         }
130                         try {
131                             Method JavaDoc m = (Method JavaDoc) requestMethods.get(request.group(1));
132                             if (m == null) {
133                                 log.error("Didn't find the method " + request.group(1) + " on request object");
134                                 continue;
135                             }
136                             request.appendReplacement(sb, "" + m.invoke(req, new Object JavaDoc[] {}));
137                         } catch (IllegalAccessException JavaDoc iae) {
138                             log.error(iae.getMessage(), iae);
139                         } catch (java.lang.reflect.InvocationTargetException JavaDoc ite) {
140                             log.error(ite.getMessage(), ite);
141                         }
142                     }
143                     request.appendTail(sb);
144                 }
145             }
146             {
147                 Matcher requestParam = requestParamPattern.matcher(sb.toString());
148                 if (requestParam.find()) {
149                     HttpServletRequest JavaDoc req = (HttpServletRequest JavaDoc) parameters.get(Parameter.REQUEST);
150                     if (req == null) {
151                         log.error("Did't find the request among the parameters");
152                     } else {
153                         requestParam.reset();
154                         sb = new StringBuffer JavaDoc();
155                         while(requestParam.find()) {
156                             String JavaDoc paramName = requestParam.group(1);
157                             String JavaDoc value = req.getParameter(paramName);
158                             if (value == null) value = "";
159                             requestParam.appendReplacement(sb, value);
160                         }
161                         requestParam.appendTail(sb);
162                     }
163                 }
164             }
165             {
166                 Matcher requestAttribute = requestAttributePattern.matcher(sb.toString());
167                 if (requestAttribute.find()) {
168                     HttpServletRequest JavaDoc req = (HttpServletRequest JavaDoc) parameters.get(Parameter.REQUEST);
169                     if (req == null) {
170                         log.error("Did't find the request among the parameters");
171                     } else {
172                         requestAttribute.reset();
173                         sb = new StringBuffer JavaDoc();
174                         while(requestAttribute.find()) {
175                             String JavaDoc paramName = requestAttribute.group(1);
176                             String JavaDoc value = Casting.toString(req.getAttribute(paramName));
177                             requestAttribute.appendReplacement(sb, value);
178                         }
179                         requestAttribute.appendTail(sb);
180                     }
181                 }
182             }
183             {
184                 Matcher params = paramPattern.matcher(sb.toString());
185                 if (params.find()) {
186                     params.reset();
187                     sb = new StringBuffer JavaDoc();
188                     while(params.find()) {
189                         params.appendReplacement(sb, (String JavaDoc) parameters.get(params.group(1)));
190                     }
191                     params.appendTail(sb);
192                 }
193             }
194             {
195
196                 Matcher initParams = initParamPattern.matcher(sb.toString());
197                 if (initParams.find()) {
198                     initParams.reset();
199                     sb = new StringBuffer JavaDoc();
200                     while(initParams.find()) {
201                         String JavaDoc s = org.mmbase.module.core.MMBaseContext.getServletContext().getInitParameter(initParams.group(1));
202                         if (s == null) s = "";
203                         initParams.appendReplacement(sb, s);
204                     }
205                     initParams.appendTail(sb);
206                 }
207             }
208             return sb.toString();
209
210         }
211
212
213
214     }
215 }
216
Popular Tags