Search in sources :

Example 96 with TemplateModel

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;
}
Also used : TemplateModel(freemarker.template.TemplateModel)

Example 97 with TemplateModel

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();
    }
}
Also used : TemplateException(freemarker.template.TemplateException) ArrayList(java.util.ArrayList) TemplateModel(freemarker.template.TemplateModel) SimpleSequence(freemarker.template.SimpleSequence) SimpleHash(freemarker.template.SimpleHash) Iterator(java.util.Iterator) TemplateModelIterator(freemarker.template.TemplateModelIterator) Map(java.util.Map) HashMap(java.util.HashMap)

Example 98 with TemplateModel

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;
    }
}
Also used : TemplateSequenceModel(freemarker.template.TemplateSequenceModel) TemplateNodeModel(freemarker.template.TemplateNodeModel) TemplateTransformModel(freemarker.template.TemplateTransformModel) TemplateScalarModel(freemarker.template.TemplateScalarModel) TemplateModel(freemarker.template.TemplateModel) SimpleSequence(freemarker.template.SimpleSequence)

Example 99 with TemplateModel

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);
}
Also used : TemplateModelException(freemarker.template.TemplateModelException) BeanModel(freemarker.ext.beans.BeanModel) TemplateScalarModel(freemarker.template.TemplateScalarModel) TemplateModel(freemarker.template.TemplateModel) TranslatableMessage(com.serotonin.m2m2.i18n.TranslatableMessage)

Example 100 with TemplateModel

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");
    }
}
Also used : TemplateModelException(freemarker.template.TemplateModelException) TemplateScalarModel(freemarker.template.TemplateScalarModel) TemplateModel(freemarker.template.TemplateModel)

Aggregations

TemplateModel (freemarker.template.TemplateModel)108 TemplateModelException (freemarker.template.TemplateModelException)26 Map (java.util.Map)23 TemplateScalarModel (freemarker.template.TemplateScalarModel)18 Test (org.junit.Test)17 ArrayList (java.util.ArrayList)15 TemplateException (freemarker.template.TemplateException)13 HashMap (java.util.HashMap)13 SimpleScalar (freemarker.template.SimpleScalar)11 IOException (java.io.IOException)11 List (java.util.List)11 Template (freemarker.template.Template)9 TemplateSequenceModel (freemarker.template.TemplateSequenceModel)8 TemplateTransformModel (freemarker.template.TemplateTransformModel)8 SimpleHash (freemarker.template.SimpleHash)7 SimpleSequence (freemarker.template.SimpleSequence)7 Writer (java.io.Writer)7 Iterator (java.util.Iterator)7 Environment (freemarker.core.Environment)6 TemplateHashModel (freemarker.template.TemplateHashModel)6