use of lucee.transformer.bytecode.statement.tag.Attribute in project Lucee by lucee.
the class Break method evaluate.
@Override
public void evaluate(Tag tag, TagLibTag libTag) throws EvaluatorException {
String ns = libTag.getTagLib().getNameSpaceAndSeparator();
String loopName = ns + "loop";
String whileName = ns + "while";
// label
String label = null;
Attribute attrLabel = tag.getAttribute("label");
if (attrLabel != null) {
TagBreak tb = (TagBreak) tag;
label = variableToString(tag, attrLabel, null);
if (label != null) {
tb.setLabel(label = label.trim());
tag.removeAttribute("label");
} else if (ASMUtil.isLiteralAttribute(tag, attrLabel, ASMUtil.TYPE_STRING, false, true)) {
LitString ls = (LitString) tag.getFactory().toExprString(tag.getAttribute("label").getValue());
label = ls.getString();
if (!StringUtil.isEmpty(label, true)) {
tb.setLabel(label = label.trim());
tag.removeAttribute("label");
} else
label = null;
}
}
// no base tag found
if (!ASMUtil.hasAncestorBreakFCStatement(tag, label)) {
if (tag.isScriptBase()) {
if (StringUtil.isEmpty(label))
throw new EvaluatorException("Wrong Context, " + libTag.getName() + " must be inside a looping statement or tag");
throw new EvaluatorException("Wrong Context, " + libTag.getName() + " must be inside a looping statement or tag with the label [" + label + "]");
}
if (StringUtil.isEmpty(label))
throw new EvaluatorException("Wrong Context, tag " + libTag.getFullName() + " must be inside a " + loopName + " or " + whileName + " tag");
throw new EvaluatorException("Wrong Context, tag " + libTag.getFullName() + " must be inside a " + loopName + " or " + whileName + " tag with the label [" + label + "]");
}
}
use of lucee.transformer.bytecode.statement.tag.Attribute 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);
}
}
use of lucee.transformer.bytecode.statement.tag.Attribute in project Lucee by lucee.
the class Import method execute.
@Override
public TagLib execute(Config config, Tag tag, TagLibTag libTag, FunctionLib[] flibs, Data data) throws TemplateException {
TagImport ti = (TagImport) tag;
Attribute p = tag.getAttribute("prefix");
Attribute t = tag.getAttribute("taglib");
Attribute path = tag.getAttribute("path");
if (p != null || t != null) {
if (p == null)
throw new TemplateException(data.srcCode, "Wrong Context, missing attribute [prefix] for tag " + tag.getFullname());
if (t == null)
throw new TemplateException(data.srcCode, "Wrong Context, missing attribute [taglib] for tag " + tag.getFullname());
if (path != null)
throw new TemplateException(data.srcCode, "Wrong context, you have an invalid attributes constellation for the tag " + tag.getFullname() + ", " + "you cannot mix attribute [path] with attributes [taglib] and [prefix]");
return executePT(config, tag, libTag, flibs, data.srcCode);
}
if (path == null)
throw new TemplateException(data.srcCode, "Wrong context, you have an invalid attributes constellation for the tag " + tag.getFullname() + ", " + "you need to define the attributes [prefix] and [taglib], the attribute [path] or simply define a attribute value");
String strPath = ASMUtil.getAttributeString(tag, "path", null);
if (strPath == null)
throw new TemplateException(data.srcCode, "attribute [path] must be a constant value");
ti.setPath(strPath);
return null;
}
use of lucee.transformer.bytecode.statement.tag.Attribute in project Lucee by lucee.
the class Interface method evaluate.
@Override
public void evaluate(Tag tag, TagLibTag libTag) throws EvaluatorException {
super.evaluate(tag, libTag);
Body body = tag.getBody();
List<Statement> statments = body.getStatements();
Statement stat;
Iterator<Statement> it = statments.iterator();
Tag t;
while (it.hasNext()) {
stat = it.next();
if (stat instanceof PrintOut) {
// body.remove(stat);
} else if (stat instanceof Tag) {
t = (Tag) stat;
if (stat instanceof TagImport) {
// ignore
} else if (stat instanceof TagFunction) {
Function.throwIfNotEmpty(t);
Attribute attr = t.getAttribute("access");
if (attr != null) {
ExprString expr = t.getFactory().toExprString(attr.getValue());
if (!(expr instanceof LitString))
throw new EvaluatorException("the attribute access of the Tag function inside an interface must contain a constant value");
String access = ((LitString) expr).getString().trim();
if (!"public".equalsIgnoreCase(access))
throw new EvaluatorException("the attribute access of the tag function inside an interface definition can only have the value [public] not [" + access + "]");
} else
t.addAttribute(new Attribute(false, "access", stat.getFactory().createLitString("public"), "string"));
} else
throw new EvaluatorException("tag " + libTag.getFullName() + " can only contain function definitions.");
}
}
}
use of lucee.transformer.bytecode.statement.tag.Attribute 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");
}
Aggregations