use of freemarker.template.TemplateModel in project be5 by DevelopmentOnTheEdge.
the class Environment method getNodeProcessor.
private TemplateModel getNodeProcessor(final String nodeName, final String nsURI, int startIndex) throws TemplateException {
TemplateModel result = null;
int i;
for (i = startIndex; i < nodeNamespaces.size(); i++) {
Namespace ns = null;
try {
ns = (Namespace) nodeNamespaces.get(i);
} catch (ClassCastException cce) {
throw new _MiscTemplateException(this, "A \"using\" clause should contain a sequence of namespaces or strings that indicate the " + "location of importable macro libraries.");
}
result = getNodeProcessor(ns, nodeName, nsURI);
if (result != null)
break;
}
if (result != null) {
this.nodeNamespaceIndex = i + 1;
this.currentNodeName = nodeName;
this.currentNodeNS = nsURI;
}
return result;
}
use of freemarker.template.TemplateModel in project be5 by DevelopmentOnTheEdge.
the class Environment method visit.
/**
* "visit" a macro.
*/
void visit(Macro macro, Map namedArgs, List positionalArgs, List bodyParameterNames, TemplateElement nestedBlock) throws TemplateException, IOException {
if (macro == Macro.DO_NOTHING_MACRO) {
return;
}
pushElement(macro);
try {
Macro.Context previousMacroContext = currentMacroContext;
Macro.Context mc = macro.new Context(this, nestedBlock, bodyParameterNames);
String catchAll = macro.getCatchAll();
TemplateModel unknownVars = null;
if (namedArgs != null) {
if (catchAll != null)
unknownVars = new SimpleHash();
for (Iterator it = namedArgs.entrySet().iterator(); it.hasNext(); ) {
Map.Entry entry = (Map.Entry) it.next();
String varName = (String) entry.getKey();
boolean hasVar = macro.hasArgNamed(varName);
if (hasVar || catchAll != null) {
Expression arg = (Expression) entry.getValue();
TemplateModel value = arg.eval(this);
if (hasVar) {
mc.setLocalVar(varName, value);
} else {
((SimpleHash) unknownVars).put(varName, value);
}
} else {
throw new _MiscTemplateException(this, new Object[] { "Macro ", new _DelayedJQuote(macro.getName()), " has no such argument: ", varName });
}
}
} else if (positionalArgs != null) {
if (catchAll != null)
unknownVars = new SimpleSequence();
String[] argumentNames = macro.getArgumentNamesInternal();
int size = positionalArgs.size();
if (argumentNames.length < size && catchAll == null) {
throw new _MiscTemplateException(this, new Object[] { "Macro " + StringUtil.jQuote(macro.getName()) + " only accepts " + argumentNames.length + " parameters." });
}
for (int i = 0; i < size; i++) {
Expression argExp = (Expression) positionalArgs.get(i);
TemplateModel argModel = argExp.eval(this);
try {
if (i < argumentNames.length) {
String argName = argumentNames[i];
mc.setLocalVar(argName, argModel);
} else {
((SimpleSequence) unknownVars).add(argModel);
}
} catch (RuntimeException re) {
throw new _MiscTemplateException(re, this);
}
}
}
if (catchAll != null) {
mc.setLocalVar(catchAll, unknownVars);
}
ArrayList prevLocalContextStack = localContextStack;
localContextStack = null;
Namespace prevNamespace = currentNamespace;
Configurable prevParent = getParent();
currentNamespace = (Namespace) macroToNamespaceLookup.get(macro);
currentMacroContext = mc;
try {
mc.runMacro(this);
} catch (ReturnInstruction.Return re) {
} catch (TemplateException te) {
handleTemplateException(te);
} finally {
currentMacroContext = previousMacroContext;
localContextStack = prevLocalContextStack;
currentNamespace = prevNamespace;
setParent(prevParent);
}
} finally {
popElement();
}
}
use of freemarker.template.TemplateModel in project be5 by DevelopmentOnTheEdge.
the class Environment method visit.
/**
* "Visit" A TemplateNodeModel
*/
void visit(TemplateNodeModel node, TemplateSequenceModel namespaces) throws TemplateException, IOException {
if (nodeNamespaces == null) {
SimpleSequence ss = new SimpleSequence(1);
ss.add(currentNamespace);
nodeNamespaces = ss;
}
int prevNodeNamespaceIndex = this.nodeNamespaceIndex;
String prevNodeName = this.currentNodeName;
String prevNodeNS = this.currentNodeNS;
TemplateSequenceModel prevNodeNamespaces = nodeNamespaces;
TemplateNodeModel prevVisitorNode = currentVisitorNode;
currentVisitorNode = node;
if (namespaces != null) {
this.nodeNamespaces = namespaces;
}
try {
TemplateModel macroOrTransform = getNodeProcessor(node);
if (macroOrTransform instanceof Macro) {
visit((Macro) macroOrTransform, null, null, null, null);
} else if (macroOrTransform instanceof TemplateTransformModel) {
visitAndTransform(null, (TemplateTransformModel) macroOrTransform, null);
} else {
String nodeType = node.getNodeType();
if (nodeType != null) {
// If the node's type is 'text', we just output it.
if ((nodeType.equals("text") && node instanceof TemplateScalarModel)) {
out.write(((TemplateScalarModel) node).getAsString());
} else if (nodeType.equals("document")) {
recurse(node, namespaces);
} else // we just ignore it.
if (!nodeType.equals("pi") && !nodeType.equals("comment") && !nodeType.equals("document_type")) {
throw new _MiscTemplateException(this, noNodeHandlerDefinedDescription(node, node.getNodeNamespace(), nodeType));
}
} else {
throw new _MiscTemplateException(this, noNodeHandlerDefinedDescription(node, node.getNodeNamespace(), "default"));
}
}
} finally {
this.currentVisitorNode = prevVisitorNode;
this.nodeNamespaceIndex = prevNodeNamespaceIndex;
this.currentNodeName = prevNodeName;
this.currentNodeNS = prevNodeNS;
this.nodeNamespaces = prevNodeNamespaces;
}
}
use of freemarker.template.TemplateModel in project ma-core-public by infiniteautomation.
the class MessageFormatDirective method execute.
@Override
public void execute(Environment env, @SuppressWarnings("rawtypes") Map params, TemplateModel[] loopVars, TemplateDirectiveBody body) throws TemplateException, IOException {
TemplateModel key = (TemplateModel) params.get("key");
String out;
if (key == null) {
// No key. Look for a message.
BeanModel model = (BeanModel) params.get("message");
if (model == null) {
if (params.containsKey("message"))
// The parameter is there, but the value is null.
out = "";
else
// The parameter wasn't given
throw new TemplateModelException("One of key or message must be provided");
} else {
TranslatableMessage message = (TranslatableMessage) model.getWrappedObject();
if (message == null)
out = "";
else
out = message.translate(translations);
}
} else {
if (key instanceof TemplateScalarModel)
out = translations.translate(((TemplateScalarModel) key).getAsString());
else
throw new TemplateModelException("key must be a string");
}
env.getOut().write(out);
}
use of freemarker.template.TemplateModel in project ma-core-public by infiniteautomation.
the class UsedImagesDirective method execute.
@Override
public void execute(Environment env, @SuppressWarnings("rawtypes") Map params, TemplateModel[] loopVars, TemplateDirectiveBody body) throws TemplateException, IOException {
boolean writeLogo = false;
TemplateModel logo = (TemplateModel) params.get("logo");
if (logo instanceof TemplateScalarModel) {
String s = ((TemplateScalarModel) logo).getAsString();
if (Boolean.parseBoolean(s)) {
writeLogo = true;
if (!imageList.contains(Common.applicationLogo))
imageList.add(Common.applicationLogo);
env.getOut().write(Common.applicationLogo);
}
}
if (!writeLogo) {
TemplateModel src = (TemplateModel) params.get("src");
if (src instanceof TemplateScalarModel) {
String s = "images/" + ((TemplateScalarModel) src).getAsString();
if (!imageList.contains(s))
imageList.add(s);
env.getOut().write(s);
} else
throw new TemplateModelException("key must be a string");
}
}
Aggregations