Author: mrdon Date: Sat Aug 20 01:17:03 2005 New Revision: 234006 URL: http://svn.apache.org/viewcvs?rev=234006&view=rev Log: * Refactored template processing to its own service * Started looking at how to handle compilation errors
Added: struts/sandbox/trunk/ti/core/src/java/org/apache/ti/devmode/ struts/sandbox/trunk/ti/core/src/java/org/apache/ti/devmode/TemplateCompilationProblemHandler.java (with props) struts/sandbox/trunk/ti/core/src/java/org/apache/ti/devmode/compilationProblems.vm (with props) struts/sandbox/trunk/ti/core/src/java/org/apache/ti/util/TemplateProcessor.java (with props) struts/sandbox/trunk/ti/core/src/java/org/apache/ti/util/VelocityTemplateProcessor.java (with props) struts/sandbox/trunk/ti/core/src/java/org/apache/ti/util/velocity.properties - copied unchanged from r233126, struts/sandbox/trunk/ti/core/src/java/org/apache/ti/config/velocity.properties Removed: struts/sandbox/trunk/ti/core/src/java/org/apache/ti/config/velocity.properties Modified: struts/sandbox/trunk/ti/core/src/java/org/apache/ti/config/ProcessTagsTask.java struts/sandbox/trunk/ti/core/src/java/org/apache/ti/config/XDocletParser.java struts/sandbox/trunk/ti/core/src/java/org/apache/ti/config/spring-config-servlet.xml struts/sandbox/trunk/ti/core/src/java/org/apache/ti/processor/CompilingObjectFactory.java struts/sandbox/trunk/ti/core/src/test/org/apache/ti/config/TestXDocletParser.java struts/sandbox/trunk/ti/core/src/test/org/apache/ti/config/XDocletTestBase.java Modified: struts/sandbox/trunk/ti/core/src/java/org/apache/ti/config/ProcessTagsTask.java URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/ti/core/src/java/org/apache/ti/config/ProcessTagsTask.java?rev=234006&r1=234005&r2=234006&view=diff ============================================================================== --- struts/sandbox/trunk/ti/core/src/java/org/apache/ti/config/ProcessTagsTask.java (original) +++ struts/sandbox/trunk/ti/core/src/java/org/apache/ti/config/ProcessTagsTask.java Sat Aug 20 01:17:03 2005 @@ -17,6 +17,8 @@ */ package org.apache.ti.config; +import org.apache.ti.util.*; + import java.util.List; import java.util.ArrayList; @@ -46,8 +48,12 @@ } public void execute() { + VelocityTemplateProcessor proc = new VelocityTemplateProcessor(); + proc.init(); + XDocletParser parser = new XDocletParser(); - parser.init(); + parser.setTemplateProcessor(proc); + ProcessTags pt = new ProcessTags(); pt.setXdocletParser(parser); Modified: struts/sandbox/trunk/ti/core/src/java/org/apache/ti/config/XDocletParser.java URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/ti/core/src/java/org/apache/ti/config/XDocletParser.java?rev=234006&r1=234005&r2=234006&view=diff ============================================================================== --- struts/sandbox/trunk/ti/core/src/java/org/apache/ti/config/XDocletParser.java (original) +++ struts/sandbox/trunk/ti/core/src/java/org/apache/ti/config/XDocletParser.java Sat Aug 20 01:17:03 2005 @@ -30,11 +30,6 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.apache.velocity.Template; -import org.apache.velocity.VelocityContext; -import org.apache.velocity.app.VelocityEngine; -import org.apache.velocity.exception.ResourceNotFoundException; -import org.apache.velocity.exception.ParseErrorException; import xjavadoc.XClass; import xjavadoc.XMethod; @@ -42,30 +37,22 @@ import xjavadoc.filesystem.ReaderFile; import xjavadoc.filesystem.XJavadocFile; +import org.apache.ti.util.*; + /** * Processes xdoclet-style tags and uses a velocity template to generate * content. This class is not thread-safe. */ public class XDocletParser { - private VelocityEngine velocity = null; - private Map templateCache = new HashMap(); private Map parameters; + private TemplateProcessor processor; private static final Log log = LogFactory.getLog(XDocletParser.class); - public void init() { - velocity = new VelocityEngine(); - - Properties props = new Properties(); - try { - props.load(getClass().getResourceAsStream("velocity.properties")); - velocity.init(props); - } catch (Exception ex) { - log.error("Unable to intialize velocity", ex); - } - + public void setTemplateProcessor(TemplateProcessor p) { + this.processor = p; } - + public void setParameters(Map map) { this.parameters = map; } @@ -93,34 +80,26 @@ jdoc.addAbstractFile(className, file); } - Map contextMap = new HashMap(); + Map context = new HashMap(); if (parameters != null) { - contextMap.putAll(parameters); + context.putAll(parameters); } - VelocityContext context = new VelocityContext(contextMap); OutputType output; XClass xclass; - Template template; for (Iterator o = outputs.iterator(); o.hasNext(); ) { output = (OutputType)o.next(); - try { - template = velocity.getTemplate(output.getTemplate()); - } catch (Exception ex) { - log.error("Unable to locate or parse template: "+output.getTemplate(), ex); - continue; - } if (output.getFrequency() == output.ONCE) { - generateOnce(sources, destRoot, jdoc, output, template, context); + generateOnce(sources, destRoot, jdoc, output, context); } else { for (Iterator i = sources.iterator(); i.hasNext(); ) { source = (String)i.next(); xclass = jdoc.getXClass(getClassName(source)); if (output.getFrequency() == output.PER_CONTROLLER) { - generatePerController(source, destRoot, xclass, output, template, context); + generatePerController(source, destRoot, xclass, output, context); } else if (output.getFrequency() == output.PER_ACTION) { - generatePerAction(source, destRoot, xclass, output, template, context); + generatePerAction(source, destRoot, xclass, output, context); } } } @@ -128,7 +107,7 @@ } protected void generateOnce(List sources, File destRoot, XJavaDoc jdoc, - OutputType output, Template template, VelocityContext context) { + OutputType output, Map context) { String source, className; XClass xclass; Map xclasses = new HashMap(); @@ -140,22 +119,22 @@ } Writer writer = output.getWriter(destRoot, null, null); context.put("xclasses", xclasses); - writeOutput(template, writer, context); + processor.process(output.getTemplate(), context, writer); } protected void generatePerController(String source, File destRoot, XClass xclass, - OutputType output, Template template, VelocityContext context) { + OutputType output, Map context) { Writer writer = output.getWriter(destRoot, source, null); context.put("xclass", xclass); context.put("javaFile", source); - writeOutput(template, writer, context); + processor.process(output.getTemplate(), context, writer); } protected void generatePerAction(String source, File destRoot, XClass xclass, - OutputType output, Template template, VelocityContext context) { + OutputType output, Map context) { List methods = xclass.getMethods(); XMethod m; Writer writer; @@ -167,22 +146,8 @@ context.put("xmethod", m); context.put("javaFile", source); - writeOutput(template, writer, context); + processor.process(output.getTemplate(), context, writer); } } - } - - protected void writeOutput(Template template, Writer writer, VelocityContext ctx) { - try { - template.merge(ctx, writer); - } catch (Exception ex) { - log.error("Unable to generate output", ex); - } finally { - if (writer != null) { - try { - writer.close(); - } catch (IOException ex) {} - } - } } } Modified: struts/sandbox/trunk/ti/core/src/java/org/apache/ti/config/spring-config-servlet.xml URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/ti/core/src/java/org/apache/ti/config/spring-config-servlet.xml?rev=234006&r1=234005&r2=234006&view=diff ============================================================================== --- struts/sandbox/trunk/ti/core/src/java/org/apache/ti/config/spring-config-servlet.xml (original) +++ struts/sandbox/trunk/ti/core/src/java/org/apache/ti/config/spring-config-servlet.xml Sat Aug 20 01:17:03 2005 @@ -23,6 +23,7 @@ <bean id="compilingObjectFactory" class="org.apache.ti.processor.CompilingObjectFactory"> <property name="javaCompiler" ref="javaCompiler" /> + <property name="compilationProblemHandler" ref="compilationProblemHandler" /> <property name="srcPath"><value>${ti.srcPath}</value></property> </bean> @@ -33,13 +34,21 @@ <property name="classesPath"><value>${ti.classesPath}</value></property> </bean> + <bean id="templateProcessor" class="org.apache.ti.util.VelocityTemplateProcessor" init-method="init" /> + + <bean id="compilationProblemHandler" class="org.apache.ti.devmode.TemplateCompilationProblemHandler"> + <property name="templateProcessor" ref="templateProcessor" /> + </bean> + <bean id="actionProxyFactory" class="org.apache.ti.processor.ControllerActionProxyFactory" /> <bean id="processTags" class="org.apache.ti.config.ProcessTags"> <property name="xdocletParser" ref="xdocletParser" /> </bean> - <bean id="xdocletParser" class="org.apache.ti.config.XDocletParser" init-method="init" /> + <bean id="xdocletParser" class="org.apache.ti.config.XDocletParser"> + <property name="templateProcessor" ref="templateProcessor" /> + </bean> <!-- Chain commands that need DI --> <bean id="createActionMapping" class="org.apache.ti.processor.chain.CreateActionMapping"> Added: struts/sandbox/trunk/ti/core/src/java/org/apache/ti/devmode/TemplateCompilationProblemHandler.java URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/ti/core/src/java/org/apache/ti/devmode/TemplateCompilationProblemHandler.java?rev=234006&view=auto ============================================================================== --- struts/sandbox/trunk/ti/core/src/java/org/apache/ti/devmode/TemplateCompilationProblemHandler.java (added) +++ struts/sandbox/trunk/ti/core/src/java/org/apache/ti/devmode/TemplateCompilationProblemHandler.java Sat Aug 20 01:17:03 2005 @@ -0,0 +1,77 @@ +/* + * Copyright 1999-2004 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ti.devmode; + +import org.apache.commons.jci.problems.*; +import java.util.*; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.ti.util.*; + + + + +/** + */ +public class TemplateCompilationProblemHandler implements CompilationProblemHandler { + + private final static Log log = LogFactory.getLog(TemplateCompilationProblemHandler.class); + + private int errors; + private int warnings; + private List problems = new ArrayList(); + private TemplateProcessor processor; + private String template = "org/apache/ti/devmode/compilationProblems.vm"; + + public void setTemplateProcessor(TemplateProcessor p) { + this.processor = p; + } + + public void handle( final CompilationProblem pProblem ) { + problems.add(pProblem); + if (pProblem.isError()) { + errors++; + } else { + warnings++; + } + + log.debug(pProblem); + } + + public String getResultPage() { + Map ctx = new HashMap(); + ctx.put("problems", problems); + ctx.put("errorCount", new Integer(errors)); + ctx.put("warningCount", new Integer(warnings)); + String page = processor.process(template, ctx); + return page; + } + + + public int getErrorCount() { + return errors; + } + public int getWarningCount() { + return warnings; + } + + public void clear() { + log.info(getResultPage()); + errors = 0; + warnings = 0; + problems.clear(); + } +} Propchange: struts/sandbox/trunk/ti/core/src/java/org/apache/ti/devmode/TemplateCompilationProblemHandler.java ------------------------------------------------------------------------------ svn:executable = * Added: struts/sandbox/trunk/ti/core/src/java/org/apache/ti/devmode/compilationProblems.vm URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/ti/core/src/java/org/apache/ti/devmode/compilationProblems.vm?rev=234006&view=auto ============================================================================== --- struts/sandbox/trunk/ti/core/src/java/org/apache/ti/devmode/compilationProblems.vm (added) +++ struts/sandbox/trunk/ti/core/src/java/org/apache/ti/devmode/compilationProblems.vm Sat Aug 20 01:17:03 2005 @@ -0,0 +1,34 @@ +<h2>Compilation problems</h2> +<ul> + <li>Errors - $errorCount</li> + <li>Warnings - $warningCount</li> +</ul> + +<h3>Errors</h3> +#foreach ($err in $problems) + #if ($err.isError()) + <p> + <code>${err.fileName}:${err.getStartLine}</code> - $err.message + <br /> + Start line:$err.startLine column:${err.startColumn} + <br /> + End line:$err.endLine column:${err.endColumn} + </p> + <hr /> + #end +#end + +<h3>Warnings</h3> +#foreach ($err in $problems) + #if (!$err.isError()) + <p> + <code>${err.fileName}:${err.startLine}</code> - $err.message + <br /> + Start line:$err.startLine column:${err.startColumn} + <br /> + End line:$err.endLine column:${err.endColumn} + </p> + <hr /> + #end +#end + Propchange: struts/sandbox/trunk/ti/core/src/java/org/apache/ti/devmode/compilationProblems.vm ------------------------------------------------------------------------------ svn:executable = * Modified: struts/sandbox/trunk/ti/core/src/java/org/apache/ti/processor/CompilingObjectFactory.java URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/ti/core/src/java/org/apache/ti/processor/CompilingObjectFactory.java?rev=234006&r1=234005&r2=234006&view=diff ============================================================================== --- struts/sandbox/trunk/ti/core/src/java/org/apache/ti/processor/CompilingObjectFactory.java (original) +++ struts/sandbox/trunk/ti/core/src/java/org/apache/ti/processor/CompilingObjectFactory.java Sat Aug 20 01:17:03 2005 @@ -26,7 +26,9 @@ import java.io.File; -import org.apache.commons.jci.CompilingClassLoader; +import org.apache.commons.jci.*; +import org.apache.commons.jci.stores.*; +import org.apache.commons.jci.problems.*; import org.apache.commons.jci.compilers.JavaCompiler; import org.apache.commons.logging.*; @@ -40,20 +42,36 @@ private static final Log log = LogFactory.getLog(CompilingObjectFactory.class); private CompilingClassLoader cl; private JavaCompiler compiler; + private CompilationProblemHandler problemHandler; public void setJavaCompiler(JavaCompiler jc) { this.compiler = jc; - } + } + + public void setCompilationProblemHandler(CompilationProblemHandler handler) { + this.problemHandler = handler; + } public void setSrcPath(String src) { if (src != null && src.length() > 0) { File file = new File(src); if (file.exists()) { + TransactionalResourceStore store = new TransactionalResourceStore( + new MemoryResourceStore()) { + public void onStart() { + }; + public void onStop() { + }; + } + ; cl = new CompilingClassLoader( Thread.currentThread().getContextClassLoader(), file, - compiler); + store, + compiler, + problemHandler); + cl.start(); } else { log.error("Specified source directory, "+src+" doesn't exist"); } Added: struts/sandbox/trunk/ti/core/src/java/org/apache/ti/util/TemplateProcessor.java URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/ti/core/src/java/org/apache/ti/util/TemplateProcessor.java?rev=234006&view=auto ============================================================================== --- struts/sandbox/trunk/ti/core/src/java/org/apache/ti/util/TemplateProcessor.java (added) +++ struts/sandbox/trunk/ti/core/src/java/org/apache/ti/util/TemplateProcessor.java Sat Aug 20 01:17:03 2005 @@ -0,0 +1,31 @@ +/* + * $Id: SourceResolver.java 230400 2005-08-05 05:13:54Z martinc $ + * + * Copyright 2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ti.util; + +import java.util.Map; +import java.io.Writer; + +/** + * Processes a template and generates text output + */ +public interface TemplateProcessor { + + public String process(String path, Map context); + + public void process(String path, Map context, Writer writer); +} Propchange: struts/sandbox/trunk/ti/core/src/java/org/apache/ti/util/TemplateProcessor.java ------------------------------------------------------------------------------ svn:executable = * Added: struts/sandbox/trunk/ti/core/src/java/org/apache/ti/util/VelocityTemplateProcessor.java URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/ti/core/src/java/org/apache/ti/util/VelocityTemplateProcessor.java?rev=234006&view=auto ============================================================================== --- struts/sandbox/trunk/ti/core/src/java/org/apache/ti/util/VelocityTemplateProcessor.java (added) +++ struts/sandbox/trunk/ti/core/src/java/org/apache/ti/util/VelocityTemplateProcessor.java Sat Aug 20 01:17:03 2005 @@ -0,0 +1,81 @@ +/* + * $Id: SourceResolver.java 230400 2005-08-05 05:13:54Z martinc $ + * + * Copyright 2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ti.util; + +import java.io.IOException; +import java.util.*; +import java.io.*; + +import org.apache.commons.chain.web.WebContext; +import org.apache.velocity.*; +import org.apache.velocity.app.VelocityEngine; +import org.apache.commons.logging.*; + +/** + * Resovles resources + */ +public class VelocityTemplateProcessor implements TemplateProcessor { + + private static final Log log = LogFactory.getLog(VelocityTemplateProcessor.class); + + private VelocityEngine velocity = null; + private Map templateCache = new HashMap(); + + public void init() { + velocity = new VelocityEngine(); + + Properties props = new Properties(); + try { + props.load(getClass().getResourceAsStream("velocity.properties")); + velocity.init(props); + } catch (Exception ex) { + log.error("Unable to intialize velocity", ex); + } + + } + + public String process(String path, Map context) { + StringWriter writer = new StringWriter(); + process(path, context, writer); + return writer.toString(); + } + + public void process(String path, Map contextMap, Writer writer) { + VelocityContext context = new VelocityContext(contextMap); + + Template template = null;; + try { + template = velocity.getTemplate(path); + } catch (Exception ex) { + log.error("Unable to locate or parse template: "+path, ex); + return; + } + try { + template.merge(context, writer); + } catch (Exception ex) { + log.error("Unable to generate output", ex); + } finally { + try { + writer.close(); + } catch (IOException ex) { + // ignore + } + } + } + +} Propchange: struts/sandbox/trunk/ti/core/src/java/org/apache/ti/util/VelocityTemplateProcessor.java ------------------------------------------------------------------------------ svn:executable = * Modified: struts/sandbox/trunk/ti/core/src/test/org/apache/ti/config/TestXDocletParser.java URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/ti/core/src/test/org/apache/ti/config/TestXDocletParser.java?rev=234006&r1=234005&r2=234006&view=diff ============================================================================== --- struts/sandbox/trunk/ti/core/src/test/org/apache/ti/config/TestXDocletParser.java (original) +++ struts/sandbox/trunk/ti/core/src/test/org/apache/ti/config/TestXDocletParser.java Sat Aug 20 01:17:03 2005 @@ -29,6 +29,7 @@ import java.io.*; import java.util.*; import org.apache.velocity.*; +import org.apache.ti.util.*; import org.jdom.Document; import org.jdom.input.SAXBuilder; @@ -71,7 +72,9 @@ public void testGenerateSimple() throws Exception { XDocletParser p = new XDocletParser(); - p.init(); + VelocityTemplateProcessor proc = new VelocityTemplateProcessor(); + proc.init(); + p.setTemplateProcessor(proc); StringOutputType out = new StringOutputType("org/apache/ti/config/test.vm"); List outputs = new ArrayList(); @@ -90,7 +93,9 @@ public void testGenerateTag() throws Exception { XDocletParser p = new XDocletParser(); - p.init(); + VelocityTemplateProcessor proc = new VelocityTemplateProcessor(); + proc.init(); + p.setTemplateProcessor(proc); StringOutputType out = new StringOutputType("org/apache/ti/config/testTag.vm"); List outputs = new ArrayList(); Modified: struts/sandbox/trunk/ti/core/src/test/org/apache/ti/config/XDocletTestBase.java URL: http://svn.apache.org/viewcvs/struts/sandbox/trunk/ti/core/src/test/org/apache/ti/config/XDocletTestBase.java?rev=234006&r1=234005&r2=234006&view=diff ============================================================================== --- struts/sandbox/trunk/ti/core/src/test/org/apache/ti/config/XDocletTestBase.java (original) +++ struts/sandbox/trunk/ti/core/src/test/org/apache/ti/config/XDocletTestBase.java Sat Aug 20 01:17:03 2005 @@ -35,6 +35,7 @@ import org.jdom.xpath.XPath; import org.apache.ti.*; +import org.apache.ti.util.*; /** * Unit tests for the <code>org.apache.ti.config.XDocletvalidations</code> class. @@ -48,7 +49,9 @@ public void setUp() throws Exception { p = new XDocletParser(); - p.init(); + VelocityTemplateProcessor proc = new VelocityTemplateProcessor(); + proc.init(); + p.setTemplateProcessor(proc); src = makeDir("strutsti-src"); } @@ -112,6 +115,10 @@ public InputSource resolveEntity (String publicId, String systemId) { return null; } + }); + builder.setDTDHandler(new DTDHandler() { + public void notationDecl(String name, String publicId, String systemId) {} + public void unparsedEntityDecl(String name, String publicId, String systemId, String notationName) {} }); Document doc = builder.build(new StringReader(out)); return doc; --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]