Search in sources :

Example 1 with Page

use of lucee.transformer.bytecode.Page in project Lucee by lucee.

the class Function method evaluate.

@Override
public void evaluate(Tag tag, TagLibTag libTag, FunctionLib[] flibs) throws EvaluatorException {
    // Body p=(Body) tag.getParent();
    // Statement pp = p.getParent();
    boolean isCI = true;
    try {
        isCI = ASMUtil.getAncestorPage(tag).isComponent() || ASMUtil.getAncestorPage(tag).isInterface();
    } catch (TransformerException e) {
    }
    Attribute attrName = tag.getAttribute("name");
    if (attrName != null) {
        Expression expr = attrName.getValue();
        PageSource ps = null;
        if (expr instanceof LitString && !isCI) {
            Page p = ASMUtil.getAncestorPage(tag, null);
            if (p != null) {
                SourceCode sc = p.getSourceCode();
                if (sc instanceof PageSourceCode) {
                    PageSourceCode psc = (PageSourceCode) sc;
                    ps = psc.getPageSource();
                }
            }
            checkFunctionName(((LitString) expr).getString(), flibs, ps);
        }
    }
    // attribute modifier
    boolean isStatic = false;
    {
        Attribute attrModifier = tag.getAttribute("modifier");
        if (attrModifier != null) {
            ExprString expr = tag.getFactory().toExprString(attrModifier.getValue());
            if (!(expr instanceof Literal))
                throw new EvaluatorException("Attribute modifier of the Tag Function, must be one of the following literal string values: [abstract,final,static]");
            String modifier = StringUtil.emptyIfNull(((Literal) expr).getString()).trim();
            if (!StringUtil.isEmpty(modifier) && !"abstract".equalsIgnoreCase(modifier) && !"final".equalsIgnoreCase(modifier) && !"static".equalsIgnoreCase(modifier))
                throw new EvaluatorException("Attribute modifier of the Tag Function, must be one of the following literal string values: [abstract,final,static]");
            isStatic = "static".equalsIgnoreCase(modifier);
            boolean abstr = "abstract".equalsIgnoreCase(modifier);
            if (abstr)
                throwIfNotEmpty(tag);
        }
    }
    // cachedWithin
    {
        Attribute attrCachedWithin = tag.getAttribute("cachedwithin");
        if (attrCachedWithin != null) {
            Expression val = attrCachedWithin.getValue();
            tag.addAttribute(new Attribute(attrCachedWithin.isDynamicType(), attrCachedWithin.getName(), ASMUtil.cachedWithinValue(val), attrCachedWithin.getType()));
        }
    }
    // Attribute localMode
    {
        Attribute attrLocalMode = tag.getAttribute("localmode");
        if (attrLocalMode != null) {
            Expression expr = attrLocalMode.getValue();
            String str = ASMUtil.toString(expr, null);
            if (!StringUtil.isEmpty(str) && AppListenerUtil.toLocalMode(str, -1) == -1)
                throw new EvaluatorException("Attribute localMode of the Tag Function, must be a literal value (modern, classic, true or false)");
        // boolean output = ((LitBoolean)expr).getBooleanValue();
        // if(!output) ASMUtil.removeLiterlChildren(tag, true);
        }
    }
    // Attribute Output
    {
        Attribute attrOutput = tag.getAttribute("output");
        if (attrOutput != null) {
            Expression expr = tag.getFactory().toExprBoolean(attrOutput.getValue());
            if (!(expr instanceof LitBoolean))
                throw new EvaluatorException("Attribute output of the Tag Function, must be a literal boolean value (true or false, yes or no)");
        }
    }
    // Buffer output
    {
        Attribute attrBufferOutput = tag.getAttribute("bufferoutput");
        if (attrBufferOutput != null) {
            Expression expr = tag.getFactory().toExprBoolean(attrBufferOutput.getValue());
            if (!(expr instanceof LitBoolean))
                throw new EvaluatorException("Attribute bufferOutput of the Tag Function, must be a literal boolean value (true or false, yes or no)");
        }
    }
    // check attribute values
    Map<String, Attribute> attrs = tag.getAttributes();
    Iterator<Attribute> it = attrs.values().iterator();
    while (it.hasNext()) {
        checkAttributeValue(tag, it.next());
    }
    // add to static scope
    if (isStatic) {
        // remove that tag from parent
        ASMUtil.remove(tag);
        Body body = (Body) tag.getParent();
        StaticBody sb = Static.getStaticBody(body);
        sb.addStatement(tag);
    }
}
Also used : SourceCode(lucee.transformer.util.SourceCode) PageSourceCode(lucee.transformer.util.PageSourceCode) PageSourceCode(lucee.transformer.util.PageSourceCode) Attribute(lucee.transformer.bytecode.statement.tag.Attribute) ExprString(lucee.transformer.expression.ExprString) StaticBody(lucee.transformer.bytecode.StaticBody) Page(lucee.transformer.bytecode.Page) LitBoolean(lucee.transformer.expression.literal.LitBoolean) LitString(lucee.transformer.expression.literal.LitString) ExprString(lucee.transformer.expression.ExprString) PageSource(lucee.runtime.PageSource) LitString(lucee.transformer.expression.literal.LitString) Expression(lucee.transformer.expression.Expression) EvaluatorException(lucee.transformer.cfml.evaluator.EvaluatorException) Literal(lucee.transformer.expression.literal.Literal) StaticBody(lucee.transformer.bytecode.StaticBody) Body(lucee.transformer.bytecode.Body) TransformerException(lucee.transformer.TransformerException)

Example 2 with Page

use of lucee.transformer.bytecode.Page in project Lucee by lucee.

the class Loop method evaluate.

@Override
public void evaluate(Tag tag, TagLibTag tagLibTag, FunctionLib[] flibs) throws EvaluatorException {
    TagLoop loop = (TagLoop) tag;
    // attribute maxrows and endrow not allowd at the same time
    if (tag.containsAttribute("maxrows") && tag.containsAttribute("endrow"))
        throw new EvaluatorException("Wrong Context, you cannot use attribute maxrows and endrow at the same time.");
    // file loop
    if (tag.containsAttribute("file")) {
        if (!tag.containsAttribute("index") && !tag.containsAttribute("item"))
            throw new EvaluatorException("Wrong Context, when you use attribute file you must also use attribute index and/or item");
        loop.setType(TagLoop.TYPE_FILE);
        return;
    }
    // list loop
    if (tag.containsAttribute("list")) {
        if (!tag.containsAttribute("index") && !tag.containsAttribute("item"))
            throw new EvaluatorException("Wrong Context, when you use attribute list,you must define attribute index and/or item");
        loop.setType(TagLoop.TYPE_LIST);
        return;
    }
    // array loop
    if (tag.containsAttribute("array")) {
        if (!tag.containsAttribute("index") && !tag.containsAttribute("item"))
            throw new EvaluatorException("Wrong Context, when you use attribute array, you must define attribute index and/or item");
        loop.setType(TagLoop.TYPE_ARRAY);
        return;
    }
    // array loop
    if (tag.containsAttribute("times")) {
        if (tag.getAttributes().size() > 1)
            throw new EvaluatorException("Wrong Context, when you use attribute times, no other attributes are allowed");
        loop.setType(TagLoop.TYPE_TIMES);
        return;
    }
    // struct loop
    if (tag.containsAttribute("struct")) {
        if (!tag.containsAttribute("index") && !tag.containsAttribute("item") && !tag.containsAttribute("key") && !tag.containsAttribute("value"))
            throw new EvaluatorException("Wrong Context, when you use attribute struct, you must define attribute index (alias key) and/or item (alias value)");
        loop.setType(TagLoop.TYPE_STRUCT);
        return;
    }
    // collection loop
    if (tag.containsAttribute("collection")) {
        if (!tag.containsAttribute("index") && !tag.containsAttribute("item") && !tag.containsAttribute("key") && !tag.containsAttribute("value"))
            throw new EvaluatorException("Wrong Context, when you use attribute struct, you must define attribute index (alias key) and/or item (alias value)");
        loop.setType(TagLoop.TYPE_COLLECTION);
        return;
    }
    /*if(tag.containsAttribute("index")) {
			if(!tag.containsAttribute("from") || !tag.containsAttribute("to"))
				throw new EvaluatorException("Wrong Context, when you use attribute index you must also use attribute from and to or list or file");
			loop.setType(TagLoop.TYPE_INDEX);
            return;
		}*/
    if (tag.containsAttribute("from") || tag.containsAttribute("to")) {
        if (!tag.containsAttribute("from"))
            throw new EvaluatorException("Wrong Context, when you use attribute to, you must also use attribute from.");
        if (!tag.containsAttribute("to"))
            throw new EvaluatorException("Wrong Context, when you use attribute from, you must also use attribute to.");
        if (!tag.containsAttribute("index") && !tag.containsAttribute("item"))
            throw new EvaluatorException("Wrong Context, when you use attribute from and to, you must define attribute index or item.");
        if (tag.containsAttribute("index") && tag.containsAttribute("item"))
            throw new EvaluatorException("For this type of loop, you cannot use attribute index and item at the same time.");
        loop.setType(TagLoop.TYPE_FROM_TO);
        return;
    }
    // condition loop
    if (tag.containsAttribute("condition")) {
        if (tag.isScriptBase())
            throw new EvaluatorException("tag loop-condition is not supported within cfscript, use instead a while statement.");
        TagLib tagLib = tagLibTag.getTagLib();
        ExprTransformer transformer;
        String text = ASMUtil.getAttributeString(tag, "condition");
        try {
            transformer = tagLib.getExprTransfomer();
            Page page = ASMUtil.getAncestorPage(tag);
            ConfigImpl config = (ConfigImpl) page.getConfig();
            Expression expr = transformer.transform(BytecodeFactory.getInstance(config), page, new EvaluatorPool(), null, flibs, config.getCoreTagLib(page.getSourceCode().getDialect()).getScriptTags(), new SourceCode(text, false, page.getSourceCode().getDialect()), new TransfomerSettings(page.getSourceCode().getDialect() == CFMLEngine.DIALECT_CFML && config.getDotNotationUpperCase(), page.getSourceCode().getDialect() == CFMLEngine.DIALECT_CFML && config.getHandleUnQuotedAttrValueAsString(), page.ignoreScopes));
            tag.addAttribute(new Attribute(false, "condition", page.getFactory().toExprBoolean(expr), "boolean"));
        } catch (Exception e) {
            throw new EvaluatorException(e.getMessage());
        }
        loop.setType(TagLoop.TYPE_CONDITION);
        return;
    }
    // query loop
    if (tag.containsAttribute("query")) {
        loop.setType(TagLoop.TYPE_QUERY);
        return;
    }
    Info info = getParentInfo(loop);
    // query group
    if (tag.containsAttribute("group") && info.hasParentWithQuery) {
        loop.setType(TagLoop.TYPE_GROUP);
        return;
    }
    if (info.hasParentWithQuery) {
        if (info.hasParentWithGroup)
            loop.setType(TagLoop.TYPE_INNER_GROUP);
        else
            loop.setType(TagLoop.TYPE_INNER_QUERY);
        return;
    }
    /*
         if(hasQuery) 
        	output.setType(TagOutput.TYPE_QUERY);
        
        else if(tag.containsAttribute("group") && hasParentWithQuery)
        	output.setType(TagOutput.TYPE_GROUP);
        
        else if(hasParentWithQuery) {
        	if(hasParentWithGroup) output.setType(TagOutput.TYPE_INNER_GROUP);
        	else output.setType(TagOutput.TYPE_INNER_QUERY);
        }
        else
        	 output.setType(TagOutput.TYPE_NORMAL);
        
       
         */
    loop.setType(TagLoop.TYPE_NOTHING);
// throw new EvaluatorException("Wrong Context, invalid attributes in tag cfloop");
}
Also used : SourceCode(lucee.transformer.util.SourceCode) Attribute(lucee.transformer.bytecode.statement.tag.Attribute) ExprTransformer(lucee.transformer.cfml.ExprTransformer) Page(lucee.transformer.bytecode.Page) LitString(lucee.transformer.expression.literal.LitString) EvaluatorException(lucee.transformer.cfml.evaluator.EvaluatorException) TemplateException(lucee.runtime.exp.TemplateException) TransfomerSettings(lucee.transformer.cfml.TransfomerSettings) EvaluatorPool(lucee.transformer.cfml.evaluator.EvaluatorPool) EvaluatorException(lucee.transformer.cfml.evaluator.EvaluatorException) Expression(lucee.transformer.expression.Expression) TagLib(lucee.transformer.library.tag.TagLib) ConfigImpl(lucee.runtime.config.ConfigImpl) TagLoop(lucee.transformer.bytecode.statement.tag.TagLoop)

Example 3 with Page

use of lucee.transformer.bytecode.Page in project Lucee by lucee.

the class Property method getComponentName.

public static String getComponentName(Tag tag) throws EvaluatorException {
    Page page;
    try {
        page = ASMUtil.getAncestorPage(tag);
    } catch (TransformerException e) {
        throw new EvaluatorException(e.getMessage());
    }
    String ns = tag.getTagLibTag().getTagLib().getNameSpaceAndSeparator();
    String compName = ns + (page.getSourceCode().getDialect() == CFMLEngine.DIALECT_CFML ? Constants.CFML_COMPONENT_TAG_NAME : Constants.LUCEE_COMPONENT_TAG_NAME);
    return compName;
}
Also used : EvaluatorException(lucee.transformer.cfml.evaluator.EvaluatorException) Page(lucee.transformer.bytecode.Page) TransformerException(lucee.transformer.TransformerException)

Example 4 with Page

use of lucee.transformer.bytecode.Page in project Lucee by lucee.

the class TagThread method init.

public void init() throws TransformerException {
    String action = ASMUtil.getAttributeString(this, "action", "run");
    // no body
    if (!"run".equalsIgnoreCase(action))
        return;
    Page page = ASMUtil.getAncestorPage(this);
    index = page.addThread(this);
}
Also used : Page(lucee.transformer.bytecode.Page)

Example 5 with Page

use of lucee.transformer.bytecode.Page in project Lucee by lucee.

the class CFMLTransformer method transform.

/**
 * Startmethode zum transfomieren einer CFMLString.
 * <br />
 * EBNF:<br />
 * <code>{body}</code>
 * @param config
 * @param sc CFMLString
 * @param tlibs Tag Library Deskriptoren, nach denen innerhalb der CFML Datei geprueft werden soll.
 * @param flibs Function Library Deskriptoren, nach denen innerhalb der Expressions der CFML Datei geprueft werden soll.
 * @param sourceLastModified
 * @param dotNotationUpperCase
 * @param returnValue if true the method returns the value of the last expression executed inside when you call the method "call"
 * @return uebersetztes CFXD Dokument Element.
 * @throws TemplateException
 */
public Page transform(Factory factory, ConfigImpl config, SourceCode sc, TagLib[] tlibs, FunctionLib[] flibs, long sourceLastModified, Boolean dotNotationUpperCase, boolean returnValue, boolean ignoreScope) throws TemplateException {
    boolean dnuc;
    if (dotNotationUpperCase == null) {
        if (sc instanceof PageSourceCode)
            dnuc = sc.getDialect() == CFMLEngine.DIALECT_CFML && ((MappingImpl) ((PageSourceCode) sc).getPageSource().getMapping()).getDotNotationUpperCase();
        else
            dnuc = sc.getDialect() == CFMLEngine.DIALECT_CFML && config.getDotNotationUpperCase();
    } else
        dnuc = dotNotationUpperCase;
    TagLib[][] _tlibs = new TagLib[][] { null, new TagLib[0] };
    _tlibs[TAG_LIB_GLOBAL] = tlibs;
    // reset page tlds
    if (_tlibs[TAG_LIB_PAGE].length > 0) {
        _tlibs[TAG_LIB_PAGE] = new TagLib[0];
    }
    Page page = new Page(factory, config, sc, null, ConfigWebUtil.getEngine(config).getInfo().getFullVersionInfo(), sourceLastModified, sc.getWriteLog(), sc.getDialect() == CFMLEngine.DIALECT_LUCEE || config.getSuppressWSBeforeArg(), config.getDefaultFunctionOutput(), returnValue, ignoreScope);
    TagData data = new TagData(factory, _tlibs, flibs, config.getCoreTagLib(sc.getDialect()).getScriptTags(), sc, page, dnuc, ignoreScope);
    // Body body=page;
    try {
        do {
            body(data, page, false, null);
            if (data.srcCode.isAfterLast())
                break;
            if (data.srcCode.forwardIfCurrent("</")) {
                int pos = data.srcCode.getPos();
                TagLib tagLib = nameSpace(data);
                if (tagLib == null) {
                    page.addPrintOut(data.factory, "</", null, null);
                } else {
                    String name = identifier(data.srcCode, true, true);
                    if (tagLib.getIgnoreUnknowTags()) {
                        TagLibTag tlt = tagLib.getTag(name);
                        if (tlt == null) {
                            data.srcCode.setPos(pos);
                            page.addPrintOut(data.factory, "</", null, null);
                        }
                    } else
                        throw new TemplateException(sc, "no matching start tag for end tag [" + tagLib.getNameSpaceAndSeparator() + name + "]");
                }
            } else
                throw new TemplateException(sc, "Error while transforming CFML File");
        } while (true);
        // call-back of evaluators
        data.ep.run();
        return page;
    } catch (TemplateException e) {
        data.ep.clear();
        throw e;
    }
}
Also used : TagLibTag(lucee.transformer.library.tag.TagLibTag) PageSourceCode(lucee.transformer.util.PageSourceCode) ComponentTemplateException(lucee.transformer.cfml.script.AbstrCFMLScriptTransformer.ComponentTemplateException) TemplateException(lucee.runtime.exp.TemplateException) TagLib(lucee.transformer.library.tag.TagLib) CustomTagLib(lucee.transformer.library.tag.CustomTagLib) Page(lucee.transformer.bytecode.Page) LitString(lucee.transformer.expression.literal.LitString)

Aggregations

Page (lucee.transformer.bytecode.Page)11 Expression (lucee.transformer.expression.Expression)5 LitString (lucee.transformer.expression.literal.LitString)5 TemplateException (lucee.runtime.exp.TemplateException)4 TransformerException (lucee.transformer.TransformerException)4 Attribute (lucee.transformer.bytecode.statement.tag.Attribute)4 EvaluatorException (lucee.transformer.cfml.evaluator.EvaluatorException)4 SourceCode (lucee.transformer.util.SourceCode)4 TagLibTag (lucee.transformer.library.tag.TagLibTag)3 PageSourceCode (lucee.transformer.util.PageSourceCode)3 ByteArrayInputStream (java.io.ByteArrayInputStream)2 Resource (lucee.commons.io.res.Resource)2 ConfigImpl (lucee.runtime.config.ConfigImpl)2 Statement (lucee.transformer.bytecode.Statement)2 ComponentTemplateException (lucee.transformer.cfml.script.AbstrCFMLScriptTransformer.ComponentTemplateException)2 LitBoolean (lucee.transformer.expression.literal.LitBoolean)2 TagLib (lucee.transformer.library.tag.TagLib)2 IOException (java.io.IOException)1 Charset (java.nio.charset.Charset)1 ArrayList (java.util.ArrayList)1