View on GitHub

JLibs

Common Utilities for Java

Simple Template Engine

TemplateMatcher is a simple template engine provided with jlibs.

import jlibs.core.util.regex.TemplateMatcher;

String msg = "Hai ${user}, your mail to ${email} has been sent successfully.";
TemplateMatcher matcher = new TemplateMatcher("${", "}");
Map<String, String> vars = new HashMap<String, String>();
vars.put("user", "santhosh");
vars.put("email", "scott@gmail.com");
System.out.println(matcher.replace(msg, vars));

prints following:

Hai santhosh, your mail to scott@gmail.com has been sent successfully.

The two arguments to TemplateMatcher are leftBrace and rightBrace.

For example:

String msg = "Hai ___user___, your mail to ___email___ has been sent successfully.";
TemplateMatcher matcher = new TemplateMatcher("___", "___");
Map<String, String> vars = new HashMap<String, String>();
vars.put("user", "santhosh");
vars.put("email", "scott@gmail.com");
System.out.println(matcher.replace(msg, vars));

also prints the same output;

NOTE: if a variables resolves to null, then it appears as it is in result string

Right Brace is optional:

String msg = "Hai $user, your mail to $email has been sent successfully.";
TemplateMatcher matcher = new TemplateMatcher("$");
Map<String, String> vars = new HashMap<String, String>();
vars.put("user", "santhosh");
vars.put("email", "scott@gmail.com");
System.out.println(matcher.replace(msg, vars));

also prints the same output;

Variable Resolution

you can also define custom variable resolution:

String msg = "Hai ${user.name}, you are using JVM from ${java.vendor}.";
TemplateMatcher matcher = new TemplateMatcher("${", "}");<br>
String result = matcher.replace(msg, new TemplateMatcher.VariableResolver(){
    @Override
    public String resolve(String variable){
        return System.getProperty(variable);
    }
});

prints:

Hai santhosh, you are using JVM from Apple Inc..

VariableResolver interface contains single method:

public String resolve(String variable)

Using with writers

let us say you have file template.txt which contains:

Hai ${user},
    your mail to ${email} has been sent successfully.

running the following code:

TemplateMatcher matcher = new TemplateMatcher("${", "}");
Map<String, String> vars = new HashMap<String, String>();
vars.put("user", "santhosh");
vars.put("email", "scott@gmail.com");
matcher.replace(new FileReader("templte.txt"), new FileWriter("result.txt"), vars);

will creates file result.txt with following content:

Hai santhosh,
    your mail to scott@gmail.com has been sent successfully.

Copying Files/Directories

TemplateMatcher provides method to copy files/directories:

public void copyInto(File source, File targetDir, Map<String, String> variables) throws IOException;

Name of each file and directory is treated as a template.
If name of directory is ${xyz} after applying template, if resolves to a/b/c,
then it expands into the directory structure a/b/c.

for example we have following directory structure:

${root}
  |- ${class}.java

and content of ${class}.java file is:

package ${rootpackage};

public class ${class} extends Comparator{

}

now running following code:

TemplateMatcher matcher = new TemplateMatcher("${", "}");
Map<String, String> vars = new HashMap<String, String>();
vars.put("root", "org/example");
vars.put("rootpackage", "org.example");
vars.put("class", "MyClass");
matcher.copyInto(new File("${root}"), new File("."), vars);

creates:

org
 |-example
    |-MyClass.java

and content of MyClass.java will be:

package org.example;

public class MyClass extends Comparator{

}