Ok just wanted to explain the 2 nice tools that have been useful to us.
ContextAware and VelocityParser Allow me show a small piece of end code that shows why this is nice.

 /***********************************************************************/
 public MyJavaDocs implements ContextAware
 {
    private Class clazz;
    public MyJavaDocs(Class clazz)
   {
       this.clazz = clazz;
   }

   public String generateHtml()
   {
       return VelocityParser.parseString("someFile.html", this);
   }
   public String generateXml()
   {
       return VelocityParser.parseString("someFile.xml", this);
   }
   public void setupContext(Context context)
   {
       context.put("time", new Date());
       context.put("class", clazz);
   }
 }
 /***********************************************************************/


1) ContextAware

public interface ContextAware
{
 public void setupContext(Context context);
}


The basic idea here is to allow for both a call back from your utility VelocityParser. And to allow for cascading. Imagine an overRidesuch as this.
 /***********************************************************************/
 public MyCopywritedJavaDocs extends MyJavaDocs
 {
   public void setupContext(Context context)
   {
       super.setupContext(context);
       context.put("writer", "Copywrite");
       new SomeUtils().setupContext(context);
   }
}

 /***********************************************************************/


   2) VelocityParser

this boils down to settingUp properties and commons and callbacks for given senariors. it would be generally overridden (it's static but...) per your implementation.

   mine right now has the following functions.
   parseJarFile(String template, ContextAware process)
   parseFile(String template, ContextAware process)
   parseString(String template, ContextAware process)
   parseFile(String template, Properties props , ContextAware process)


here's my full current implementation. My project "WebSiteProject" tends to call WebSiteProjectParser which has simular functions. and i have written ones that have a setup configuration, but either way this stuff is light, merely have an implemation is what counts.

package com.spun.util.velocity;

import java.io.File;
import java.io.StringWriter;
import java.util.Properties;

import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;

import com.spun.facilitate.util.Commons;
import com.spun.facilitate.util.Config;
import com.spun.util.ObjectUtils;



public class VelocityParser
{

 /***********************************************************************/

 public static String parseJarFile(String template, ContextAware process)
 {
   Properties props = new Properties();
   if (Config.FORCE_ACTUAL_FILE_INSTEAD_OF_JAR)
   {
props.put("file.resource.loader.path", Config.ALTERNATIVE_TEMPLATE_DIRECTORY + ", " + Config.TEMPLATE_DIRECTORY);
     props.put("file.resource.cache", "" + true);
   }
   else
   {
     props.put("resource.loader", "class");
props.put("class.resource.loader.description", "Velocity Classpath Resource Loader"); props.put("class.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
     props.put("class.resource.cache", "" + true);
   }
props.put("runtime.introspector.uberspect", "com.spun.util.velocity.TestableUberspect");
   props.put("velocimacro.context.localscope", "" + true);
props.put("velocimacro.permissions.allow.inline.local.scope", "" + true);
   return parseFile(template, props, process);
 }
 /***********************************************************************/
 public static String parseFile(String template, ContextAware process)
 {
   Properties props = new Properties();
   int pathBreak = template.lastIndexOf(File.separatorChar);
   pathBreak = pathBreak == -1 ? template.length() : pathBreak;
   String path = template.substring(0, pathBreak);
   String file = template.substring(pathBreak + 1);
props.put("runtime.introspector.uberspect", "com.spun.util.velocity.TestableUberspect");
   props.put("file.resource.loader.path", path);
   props.put("velocimacro.context.localscope", "" + true);
props.put("velocimacro.permissions.allow.inline.local.scope", "" + true);
   return parseFile(file, props, process);
 }
 /***********************************************************************/
 public static String parseString(String template, ContextAware process)
 {
   Properties props = new Properties();
   props.put("resource.loader", "class");
props.put("class.resource.loader.class", "com.spun.util.velocity.StringResourceLoader");
   props.put("velocimacro.context.localscope", "" + true);
props.put("runtime.introspector.uberspect", "com.spun.util.velocity.TestableUberspect"); props.put("velocimacro.permissions.allow.inline.local.scope", "" + true);
   return parseFile(template, props, process);
 }
  /***********************************************************************/
public static String parseFile(String template, Properties props , ContextAware process)
 {
   try
   {
   props.put("directive.foreach.counter.initial.value", "0");
 Velocity.init(props);
 VelocityContext context = new VelocityContext();
 Template velocityTemplate = Velocity.getTemplate(template);

 process.setupContext(context);
   context.put("config", Config.INSTANCE);
   context.put("commons", Commons.INSTANCE);

 StringWriter out = new StringWriter();
 velocityTemplate.merge(context, out);
   return out.toString();
   }
   catch (Exception e)
   {
     throw ObjectUtils.throwAsError(e);
   }
 }
 /***********************************************************************/
 /***********************************************************************/
}

   enjoy.

   Llewellyn.


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to