Mark1234
Mark1234

Reputation: 619

dynamic template generation and formatting using freemarker

My goal is to format a collection of java map to a string (basically a csv) using free marker or anything else that would do smartly. I want to generate the template using a configuration data stored in database and managed from an admin application. The configuration will tell me at what position a given data (key in hash map) need to go and also if any script need to run on this data before applying it at a given position. Several positions may be blank if the data in not in map. I am thinking to use free-marker to build this generic tool and would appreciate if you could share how I should go about this.

Also would like to know if there is any built is support in spring-integration for building such process as the application is a SI application.

Upvotes: 1

Views: 2536

Answers (1)

Gary Russell
Gary Russell

Reputation: 174504

I am no freemarker expert, but a quick look at their quick start docs led me here...

public class FreemarkerTransformerPojo {

    private final Configuration configuration;

    private final Template template;

    public FreemarkerTransformerPojo(String ftl) throws Exception {
        this.configuration = new Configuration(Configuration.VERSION_2_3_23);
        this.configuration.setDirectoryForTemplateLoading(new File("/"));
        this.configuration.setDefaultEncoding("UTF-8");
        this.template = this.configuration.getTemplate(ftl);
    }

    public String transform(Map<?, ?> map) throws Exception {
        StringWriter writer = new StringWriter();
        this.template.process(map, writer);
        return writer.toString();
    }

}

and

public class FreemarkerTransformerPojoTests {

    @Test
    public void test() throws Exception {
        String template = System.getProperty("user.home") + "/Development/tmp/test.ftl";
        OutputStream os = new FileOutputStream(new File(template));
        os.write("foo=${foo}, bar=${bar}".getBytes());
        os.close();

        FreemarkerTransformerPojo transformer = new FreemarkerTransformerPojo(template);
        Map<String, String> map = new HashMap<String, String>();
        map.put("foo", "baz");
        map.put("bar", "qux");
        String result = transformer.transform(map);
        assertEquals("foo=baz, bar=qux", result);
    }

}

From a Spring Integration flow, send a message with a Map payload to

<int:transformer ... ref="fmTransformer" method="transform" />

Or you could do it with a groovy script (or other supported scripting language) using Spring Integration's existing scripting support without writing any code (except the script).

Upvotes: 3

Related Questions