1 18 19 package org.apache.roller.ui.rendering.velocity; 20 21 import java.io.StringWriter ; 22 import java.io.Writer ; 23 import java.util.Map ; 24 import org.apache.commons.logging.Log; 25 import org.apache.commons.logging.LogFactory; 26 import org.apache.roller.pojos.Template; 27 import org.apache.roller.ui.rendering.Renderer; 28 import org.apache.roller.ui.rendering.RenderingException; 29 import org.apache.roller.ui.rendering.model.UtilitiesModel; 30 import org.apache.velocity.VelocityContext; 31 import org.apache.velocity.context.Context; 32 import org.apache.velocity.exception.MethodInvocationException; 33 import org.apache.velocity.exception.ParseErrorException; 34 import org.apache.velocity.exception.ResourceNotFoundException; 35 36 37 40 public class VelocityRenderer implements Renderer { 41 42 private static Log log = LogFactory.getLog(VelocityRenderer.class); 43 44 private Template renderTemplate = null; 46 47 private org.apache.velocity.Template velocityTemplate = null; 49 private org.apache.velocity.Template velocityDecorator = null; 50 51 private Exception parseException = null; 53 54 55 public VelocityRenderer(Template template) throws Exception { 56 57 this.renderTemplate = template; 59 60 try { 61 velocityTemplate = RollerVelocity.getTemplate(template.getId(), "UTF-8"); 64 65 Template decorator = renderTemplate.getDecorator(); 67 if(decorator != null) { 68 velocityDecorator = RollerVelocity.getTemplate(decorator.getId()); 69 } 70 71 } catch(ResourceNotFoundException ex) { 72 log.warn("Error creating renderer for "+template.getId()+ 74 " due to ["+ex.getMessage()+"]"); 75 76 throw ex; 78 79 } catch(ParseErrorException ex) { 80 parseException = ex; 83 84 velocityTemplate = RollerVelocity.getTemplate("templates/error-page.vm"); 86 87 } catch(Exception ex) { 88 log.error("Unknown exception creatting renderer for "+template.getId(), ex); 90 91 throw ex; 93 } 94 } 95 96 97 public void render(Map model, Writer out) throws RenderingException { 98 99 try { 100 if(parseException != null) { 101 102 Context ctx = new VelocityContext(model); 103 ctx.put("exception", parseException); 104 ctx.put("exceptionSource", renderTemplate.getId()); 105 ctx.put("utils", new UtilitiesModel()); 106 107 velocityTemplate.merge(ctx, out); 109 110 return; 112 } 113 114 long startTime = System.currentTimeMillis(); 115 116 Context ctx = new VelocityContext(model); 118 119 if(velocityDecorator != null) { 120 121 125 126 StringWriter sw = new StringWriter (); 128 velocityTemplate.merge(ctx, sw); 129 130 ctx.put("decorator_body", sw.toString()); 132 133 log.debug("Applying decorator "+velocityDecorator.getName()); 134 135 velocityDecorator.merge(ctx, out); 137 138 } else { 139 140 velocityTemplate.merge(ctx, out); 142 } 143 144 long endTime = System.currentTimeMillis(); 145 long renderTime = (endTime - startTime)/1000; 146 147 log.debug("Rendered ["+renderTemplate.getId()+"] in "+renderTime+" secs"); 148 149 } catch (Exception ex) { 150 throw new RenderingException("Error during rendering", ex); 152 } 153 } 154 155 } 156 | Popular Tags |