Hi,

It’s my first post of this year, after my first post concerning the library Apache Velocity Simple Presentation of Velocity, I would expose you an article about simple example of use of Velocity. A memo to use speedly Velocity.

First, our project needs the following jars to the classpath of your project:

  • velocity-1.7.jar
  • velocity-tools-2.0.jar

It is necessary to initialize Velocity, via the method Velocity.init(…) which allow to set the properties. To target this goal, we create a singleton class named VelocityInitializer:

/**
 * Singleton that initializes velocity (see Apache Velocity project)
 * 
 * @author huseyin
 *
 */
public class VelocityInitializer {
	
	private boolean isInitialized = false;
	
	
	// SINGLETON
	public static VelocityInitializer getInstance(){
		return SingletonHolder.instance;
	}
	
	// ---------------------------------------- INNER CLASS
	private static class SingletonHolder{
		private static final VelocityInitializer instance = new VelocityInitializer();
	}
	
	// ---------------------------------------- CONSTRUCTOR
	private VelocityInitializer(){ }

	// INITIALIZATION METHOD 
	
	/**
	 * Initialize Velocity (template engine library)
	 */
	public void initializeVelocity(){
		if(!isInitialized){
			// We configure Velocity to load template 
			//files from the classpath
			Properties velocityProps = new Properties();
			velocityProps.setProperty("resource.loader", "class");
			//File logging disabled
			velocityProps.setProperty("class.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
			velocityProps.setProperty("runtime.log", ""); 
			velocityProps.setProperty("directive.foreach.counter.initial.value", "0");
			try{
				Velocity.init(velocityProps);
			}catch(Exception e){
				throw new RuntimeException("Internal error : impossible to initialize velocity.",e);
			}
			isInitialized = true;
		}
	}
}

Then, this initialization of Velocity must be done – in a Spring-based application – after the loading of Spring context. For example, we could implement the ApplicationContextAware interface:

public class ContextUtil implements ApplicationContextAware{

	private static final Logger log = Logger.getLogger(ContextUtil.class);
	
	private static ApplicationContext context;
	
	@Override
	public void setApplicationContext(ApplicationContext context) throws BeansException{
		ContextUtil.context = context;
		log.info("Spring initialized");
		
		// Initiliaze Velocity
		VelocityInitializer.getInstance().initializeVelocity();
	}
	
	public static ApplicationContext getContext(){
		return context;
	}
	
	@SuppressWarnings("unchecked")
	public static<T> getBean(String name){
		return (T) context.getBean(name);
	}	
}

To use the Velocity templates, we create a Singleton VelocityUtil allowing the merge of template and data:

public class VelocityUtil {
	
	private VelocityUtil(){}
	
	private static VelocityUtil instance;
	
	
	public static VelocityUtil getInstance(){
		if(instance == null){
			instance = new VelocityUtil();
		}
		return instance;
	}
	
	
	public void render(String templatePath, Map<String, Object> context, Writer writer){
		try{
			VelocityContext velocityContext = new VelocityContext(context);
			Template template = null;
			try{
				template = Velocity.getTemplate(templatePath);
			}catch(Exception e){
				throw new RuntimeException("Internal error : impossible to load the Velocity template: "+ templatePath, e);
			}
			template.merge(velocityContext, writer);
		}catch(Throwable th) {
			th.printStackTrace();
		}
	}
	
	
	public CharSequence render(String templatePath, Map<String, Object> context){
		StringWriter writer = new StringWriter(1024);
		render(templatePath,context, writer);
		CharSequence ret = writer.getBuffer();
		return ret;
	}
}

So, for example, below a Template:

Hi,
It's a test of Apache Velocity on JAVABLOG.FR website.
#if ($myobj.code == "ID")
The object ID is $!{myobj.objectID}.
#else
The object name is $!{myobj.objectName}.
#end

…and a POJO class used for our example:

public class MyObject {
	
	private String objectName;
	private String objectID;
	private String code;
	private String label;
	
	
	// ----- CONSTRUCTOR
	public MyObject(){}

	
	// ----- SET / GETTERS
	public String getCode() {
		return code;
	}
//...
}

… and finally, the main class or JUNIT will be:

public class MainTest {
	
	private static final String TEMPLATE = "/src/com/ho/apache/velocity/test1/test1.vm";
	
	public static void main(String[] args) {
		{
			final Map<String, Object> context = new HashMap<String, Object>();
			MyObject aObject = new MyObject();
			aObject.setObjectID("Object id");
			aObject.setObjectName("Object name");
			aObject.setCode("ID");
			aObject.setLabel("Object created for Velocity tests");
			//
			context.put("myobj", aObject);
			context.put("name", "ozveren");
			context.put("firstname", "huseyin");
			//
			CharSequence result = VelocityUtil.getInstance().render(TEMPLATE, context);
			String resultStr = result.toString();
			System.out.println("Result :");
			System.out.println(resultStr);
		}
		System.out.println("-------------------------------");
		{
			final Map<String, Object> context = new HashMap<String, Object>();
			MyObject aObject = new MyObject();
			aObject.setObjectID("Object id");
			aObject.setObjectName("Object name");
			aObject.setCode("NAME");
			aObject.setLabel("Object created for Velocity tests");
			//
			context.put("myobj", aObject);
			context.put("name", "ozveren");
			context.put("firstname", "huseyin");
			//
			CharSequence result = VelocityUtil.getInstance().render(TEMPLATE, context);
			String resultStr = result.toString();
			System.out.println("Result :");
			System.out.println(resultStr);
		}	
	}
}

The outputs are:

Hi,
It's a test of Apache Velocity on JAVABLOG.FR website.
The object ID is Object id.
Result :
Hi,
It's a test of Apache Velocity on JAVABLOG.FR website.
The object name is Object name.

That’s all!!!!

Huseyin OZVEREN

Source : velocity-test1.zip