Custom directive's body not being read properly when the body has directives
srihari_ravi <[email protected]> Wed, 29 May 2013 04:50:36 -0700 (PDT)
| Newsgroups | gmane.comp.web.freemarker.user |
|---|---|
| Message-ID | <[email protected]> |
Hi, my requirement is to create an output HTML file using a freemarker
template such that the file name, content are specified in the template
itself. The code I am using is shown at the end. What my code does:
1. freemarker template: uses a new @file directive, wraps some HTML tags
2. FileDirective.java (implementation for @file): gets parameters filename
and filepath, simply gets directive's body (everything between <@file> and
</@file>) and writes to the file mentioned in parameters
*Current behavior:* When I include freemarker directives (example: #assign,
#list) in the directive body, the HTML output does not contain the whole
content. The content after the directive is only included. Without a
directive inside it (if body has only plain HTML tags), the output file
contains the complete body. I need the # directives inside the body to
dynamically create some content from the input datamodel.
*Current output:* (source of newFile.html)
Test heading...
Paragraph 1...
<P>
Paragraph 2...
</BODY>
</HTML>
*Expected behavior:* Everything inside the tags <@file> is the directive's
body, so it should be included in the output post resolution of freemarker
specific tags. Expected output is as shown below:
<HTML>
<HEAD>
<TITLE>My Page</TITLE>
</HEAD>
Test heading...
Paragraph 1...
<P>
Paragraph 2...
</BODY>
</HTML>
If in the template below, I move the <#assign> line after "Paragraph 2...",
what I get is this:
</BODY>
</HTML>
*CODE:
Template:*
<#include "ErrorDoc_Directives.ftl">
<@file name="newFile.html" path="${outputDirectoryPath}">
<HTML>
<HEAD>
<TITLE>My Page</TITLE>
</HEAD>
<#assign name="test">
Test heading...
Paragraph 1...
<P>
Paragraph 2...
</BODY>
</HTML>
</@file>
*Directive:*
public class FileDirective implements TemplateDirectiveModel {
private static final String PARAM_NAME_NAME = "name";
private static final String PARAM_NAME_PATH = "path";
@Override
public void execute(Environment environment, Map params, TemplateModel[]
templateModels,
TemplateDirectiveBody templateDirectiveBody) {
// Process parameters
Iterator paramIter = params.entrySet().iterator();
String fileName = null;
String filePath = null;
while (paramIter.hasNext()) {
Map.Entry ent = (Map.Entry)paramIter.next();
String paramName = (String)ent.getKey();
TemplateModel paramValue = (TemplateModel)ent.getValue();
switch (paramName) {
case PARAM_NAME_NAME:
fileName = ((SimpleScalar)paramValue).getAsString();
break;
case PARAM_NAME_PATH:
filePath = ((SimpleScalar)paramValue).getAsString();
break;
}
}
Writer fileWriter;
try {
fileWriter = new FileWriter(new File(fileName));
templateDirectiveBody.render(new OutputFileWriter(fileName,
filePath)); // use a custom writer to write to an external file defined by
fileName & filePath
} catch (Exception e) {
System.out.println("EXCEPTION RENDERING THE OUTPUT");
}
}
private static class OutputFileWriter extends Writer {
private final String fileName;
private final String filePath;
OutputFileWriter(String fileName, String filePath) {
this.fileName = fileName;
this.filePath = filePath;
}
@Override
public void write(char[] cbuf, int off, int len) {
File file = new File(filePath + "/" + fileName);
FileWriter fw;
BufferedWriter bw = null;
try {
fw = new FileWriter(file.getAbsoluteFile());
bw = new BufferedWriter(fw);
bw.write(cbuf);
bw.close();
} catch (IOException e) {
System.out.println("Exception caught while working with the
buffer writer...\n");
e.printStackTrace();
if (bw != null) {
try {
bw.close();
} catch (IOException f) {
System.out.println("Exception caught while closing
the buffer writer...");
}
}
}
}
}
}
PS: I apologize for the post being so long! :)
--
View this message in context: http://freemarker.624813.n4.nabble.com/Custom-directive-s-body-not-being-read-properly-when-the-body-has-directives-tp4654561.html
Sent from the freemarker-user mailing list archive at Nabble.com.
------------------------------------------------------------------------------
Introducing AppDynamics Lite, a free troubleshooting tool for Java/.NET
Get 100% visibility into your production application - at no cost.
Code-level diagnostics for performance bottlenecks with <2% overhead
Download for free and get started troubleshooting in minutes.
http://p.sf.net/sfu/appdyn_d2d_ap1