package com.hundsun.jresplus.web.velocity.directive;
import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.velocity.context.InternalContextAdapter;
import org.apache.velocity.exception.MethodInvocationException;
import org.apache.velocity.exception.ParseErrorException;
import org.apache.velocity.exception.ResourceNotFoundException;
import org.apache.velocity.runtime.directive.Directive;
import org.apache.velocity.runtime.parser.node.Node;
import com.hundsun.jresplus.web.contain.async.AsynchronousContain;
import com.hundsun.jresplus.web.contain.pipeline.PipelineTask;
/**
*
* @author LeoHu copy sagahl
*
*/
public class JsCodeDirective extends Directive {
protected final Log logger = LogFactory.getLog(this.getClass());
/**
*/
@Override
public String getName() {
return "jscode";
}
/**
*/
@Override
public int getType() {
return BLOCK;
}
@Override
public boolean render(InternalContextAdapter context, Writer writer,
Node node) throws IOException, ResourceNotFoundException,
ParseErrorException, MethodInvocationException {
Node bodyNode = getBodyNode(context, node);
if (AsynchronousContain.isAsyncConext()) {
StringWriter sw = new StringWriter();
bodyNode.render(context, sw);
PipelineTask task = (PipelineTask) context
.get(PipelineTask.ATTR_KEY);
task.addJsCode(sw.toString());
} else {
writer.write("<script type=\"text/javascript\">\r\n");
bodyNode.render(context, writer);
writer.write("</script>\r\n");
}
return true;
}
protected Node getBodyNode(InternalContextAdapter context, Node node) {
int children = node.jjtGetNumChildren();
if (children == 1) {
return node.jjtGetChild(0);
} else {
return node.jjtGetChild(children - 1);
}
}
}