1 13 package com.tonbeller.wcf.component; 14 15 import java.io.StringWriter ; 16 import java.net.MalformedURLException ; 17 import java.net.URL ; 18 import java.util.HashMap ; 19 import java.util.Iterator ; 20 import java.util.Map ; 21 22 import javax.servlet.http.HttpServletRequest ; 23 import javax.servlet.jsp.JspException ; 24 import javax.servlet.jsp.tagext.TagSupport ; 25 import javax.xml.transform.Transformer ; 26 import javax.xml.transform.dom.DOMSource ; 27 import javax.xml.transform.stream.StreamResult ; 28 29 import org.apache.log4j.Logger; 30 import org.w3c.dom.Document ; 31 import org.w3c.dom.Element ; 32 import org.w3c.dom.Node ; 33 import org.w3c.dom.NodeList ; 34 35 import com.tonbeller.wcf.controller.RequestContext; 36 import com.tonbeller.wcf.expr.ExprUtils; 37 import com.tonbeller.wcf.token.RequestToken; 38 import com.tonbeller.wcf.utils.DomUtils; 39 import com.tonbeller.wcf.utils.XmlUtils; 40 41 79 public class RendererTag extends TagSupport { 80 String xslUri; 81 boolean xslCache = true; 82 String ref; 83 Map parameters = new HashMap (); 84 85 private static Logger logger = Logger.getLogger(RendererTag.class); 86 87 90 void addParameter(String name, Object value) { 91 parameters.put(name, value); 92 } 93 94 98 public void removeParameter(String name) { 99 parameters.remove(name); 100 } 101 102 public int doStartTag() throws JspException { 103 parameters.putAll(RendererParameters.getParameterMap((HttpServletRequest ) pageContext.getRequest())); 104 return EVAL_BODY_INCLUDE; 105 } 106 107 110 public int doEndTag() throws JspException { 111 logger.info("enter " + ref); 112 113 try { 114 RequestContext context = RequestContext.instance(); 115 Object x = context.getModelReference(getRef()); 116 if (x == null) 117 throw new JspException ("component \"" + getRef() + "\" not found"); 118 if(!(x instanceof Renderable)) 119 throw new JspException ("component \"" + getRef() + "\" is not Renderable: " + x.getClass()); 120 Renderable comp = (Renderable) x; 121 122 if (comp instanceof Visible && !((Visible) comp).isVisible()) 123 return EVAL_PAGE; 124 125 if (comp instanceof RoleExprHolder) { 126 String roleExpr = ((RoleExprHolder) comp).getRoleExpr(); 127 if (!context.isUserInRole(roleExpr)) 128 return EVAL_PAGE; 129 } 130 131 createPredefinedParameters(context); 133 134 Transformer transformer = XmlUtils.getTransformer(pageContext.getSession(), xslUri, xslCache); 135 setXslParameters(context, transformer); 136 137 Document document = comp.render(context); 138 139 143 setXmlParameters(document); 144 145 DOMSource source = new DOMSource (document); 148 StringWriter sw = new StringWriter (); 149 StreamResult result = new StreamResult (sw); 150 151 transformer.transform(source, result); 152 sw.flush(); 153 pageContext.getOut().write(sw.toString()); 154 155 parameters.clear(); 156 logger.info("leave " + ref); 157 return EVAL_PAGE; 158 } catch (Exception e) { 159 logger.error("trouble rendering " + getRef(), e); 160 throw new JspException (e.toString(), e); 161 } 162 } 163 164 183 protected void setXmlParameters(Document document) { 184 199 Element root = document.getDocumentElement(); 202 if (root != null && "xform".equals(root.getNodeName())) 203 setXmlParameters(document.getChildNodes()); 204 } 205 206 protected void setXmlParameters(NodeList list) { 207 int len = list.getLength(); 208 for (int i = 0; i < len; i++) { 209 Node n = list.item(i); 210 if (n.getNodeType() != Node.ELEMENT_NODE) 211 continue; 212 Element x = (Element ) list.item(i); 213 214 if ("param".equals(x.getNodeName())) { 215 String paramName = x.getAttribute("name"); 216 String attrName = x.getAttribute("attr"); 217 String value = (String ) parameters.get(paramName); 218 Element parent = (Element ) x.getParentNode(); 219 if (value == null || value.length() == 0) 220 DomUtils.removeAttribute(parent, attrName); 221 else 222 parent.setAttribute(attrName, value); 223 } else { 224 setXmlParameters(x.getChildNodes()); 225 } 226 } 227 } 228 229 232 void setXslParameters(RequestContext context, Transformer transformer) { 233 for (Iterator it = parameters.keySet().iterator(); it.hasNext();) { 234 String name = (String ) it.next(); 235 Object value = parameters.get(name); 236 transformer.setParameter(name, value); 237 } 238 } 239 240 241 private void createPredefinedParameters(RequestContext context) throws MalformedURLException { 242 String renderId = this.getId(); 243 if (renderId == null || renderId.length() == 0) 244 renderId = ExprUtils.getBeanName(getRef()); 245 parameters.put("renderId", renderId); 246 parameters.put("context", context.getRequest().getContextPath()); 247 parameters.put("contextUrl", createContextURLValue(context)); 249 250 if (context.getSession() != null) { 252 RequestToken tok = RequestToken.instance(context.getSession()); 253 if (tok != null) { 254 parameters.put("token", tok.getHttpParameterName() + "=" + tok.getToken()); 255 } 256 } 257 } 258 259 260 private String createContextURLValue(RequestContext context) throws MalformedURLException { 261 262 if (context.getRequest() == null || context.getRequest().getRequestURL() == null) { 263 return "UNDEFINED"; 264 } 265 266 URL url = new URL ((context.getRequest()).getRequestURL().toString()); 267 268 StringBuffer c = new StringBuffer (); 269 c.append(url.getProtocol()); 270 c.append("://"); 271 c.append(url.getHost()); 272 if (url.getPort() != 80) { 273 c.append(":"); 274 c.append(url.getPort()); 275 } 276 c.append(context.getRequest().getContextPath()); 277 278 return c.toString(); 279 } 280 281 285 public String getRef() { 286 return ref; 287 } 288 289 293 public boolean isXslCache() { 294 return xslCache; 295 } 296 297 301 public String getXslUri() { 302 return xslUri; 303 } 304 305 309 public void setRef(String ref) { 310 this.ref = ref; 311 } 312 313 317 public void setXslCache(boolean xslCache) { 318 this.xslCache = xslCache; 319 } 320 321 325 public void setXslUri(String xslUri) { 326 this.xslUri = xslUri; 327 } 328 329 } 330 | Popular Tags |