1 10 package org.mmbase.util.functions; 11 12 import java.util.*; 13 import java.util.regex.*; 14 import javax.servlet.http.HttpServletRequest ; 15 import java.lang.reflect.Method ; 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 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 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 template; 71 Map requestMethods = null; 72 PatternNodeFunction(String 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 .class.getMethod(matcher.group(1), new Class [] {})); 82 } catch (NoSuchMethodException nsme) { 83 log.error(nsme.getMessage(), nsme); 84 } 85 } 86 } 87 88 } 89 protected static Parameter[] getParameterDef(String 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 .class, "")); 100 } 101 return (Parameter[]) params.toArray(new Parameter[] {}); 102 } 103 104 protected Object getFunctionValue(final Node node, final Parameters parameters) { 105 StringBuffer sb = new StringBuffer (); 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 req = (HttpServletRequest ) parameters.get(Parameter.REQUEST); 118 sb = new StringBuffer (); 119 while(request.find()) { 120 if(request.group(1).equals("getContextPath")) { 121 String 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 m = (Method ) 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 [] {})); 137 } catch (IllegalAccessException iae) { 138 log.error(iae.getMessage(), iae); 139 } catch (java.lang.reflect.InvocationTargetException 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 req = (HttpServletRequest ) 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 (); 155 while(requestParam.find()) { 156 String paramName = requestParam.group(1); 157 String 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 req = (HttpServletRequest ) 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 (); 174 while(requestAttribute.find()) { 175 String paramName = requestAttribute.group(1); 176 String 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 (); 188 while(params.find()) { 189 params.appendReplacement(sb, (String ) 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 (); 200 while(initParams.find()) { 201 String 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 |