package railo.transformer.bytecode.statement.tag;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import railo.runtime.op.Caster;
import railo.transformer.bytecode.Body;
import railo.transformer.bytecode.BytecodeContext;
import railo.transformer.bytecode.BytecodeException;
import railo.transformer.bytecode.Position;
import railo.transformer.bytecode.statement.FlowControlFinal;
import railo.transformer.bytecode.statement.StatementBase;
import railo.transformer.bytecode.visitor.ParseBodyVisitor;
import railo.transformer.library.tag.TagLibTag;
/**
*
*/
public abstract class TagBase extends StatementBase implements Tag {
private Body body=null;
private String appendix;
private String fullname;
private TagLibTag tagLibTag;
Map<String,Attribute> attributes=new LinkedHashMap<String,Attribute>();
Map<String,String> missingAttributes=new HashMap<String,String>();
private boolean scriptBase=false;
private Map<String, Attribute> metadata;
//private Label finallyLabel;
public TagBase(Position start, Position end) {
super(start,end);
}
/**
* @see railo.transformer.bytecode.statement.tag.Tag#getAppendix()
*/
public String getAppendix() {
return appendix;
}
@Override
public Map getAttributes() {
return attributes;
}
@Override
public String getFullname() {
return fullname;
}
@Override
public TagLibTag getTagLibTag() {
return tagLibTag;
}
@Override
public void setAppendix(String appendix) {
this.appendix=appendix;
}
@Override
public void setFullname(String fullname) {
this.fullname=fullname;
}
@Override
public void setTagLibTag(TagLibTag tagLibTag) {
this.tagLibTag=tagLibTag;
}
@Override
public void addAttribute(Attribute attribute) {
attributes.put(attribute.getName().toLowerCase(), attribute);
}
@Override
public boolean containsAttribute(String name) {
return attributes.containsKey(name.toLowerCase());
}
@Override
public Body getBody() {
return body;
}
@Override
public void setBody(Body body) {
this.body = body;
body.setParent(this);
}
@Override
public void _writeOut(BytecodeContext bc) throws BytecodeException {
_writeOut(bc,true,null);
}
public void _writeOut(BytecodeContext bc, boolean doReuse) throws BytecodeException {
_writeOut(bc,doReuse,null);
}
protected void _writeOut(BytecodeContext bc, boolean doReuse, final FlowControlFinal fcf) throws BytecodeException {
//_writeOut(bc, true);
boolean output=tagLibTag.getParseBody() || Caster.toBooleanValue(getAttribute("output"), false);
if(output) {
ParseBodyVisitor pbv=new ParseBodyVisitor();
pbv.visitBegin(bc);
TagHelper.writeOut(this,bc, doReuse,fcf);
pbv.visitEnd(bc);
}
else TagHelper.writeOut(this,bc, doReuse,fcf);
}
@Override
public Attribute getAttribute(String name) {
return attributes.get(name.toLowerCase());
}
@Override
public Attribute removeAttribute(String name) {
return attributes.remove(name);
}
@Override
public String toString() {
return appendix+":"+fullname+":"+super.toString();
}
@Override
public boolean isScriptBase() {
return scriptBase;
}
@Override
public void setScriptBase(boolean scriptBase) {
this.scriptBase = scriptBase;
}
@Override
public void addMissingAttribute(String name, String type) {
missingAttributes.put(name, type);
}
@Override
public Map getMissingAttributes() {
return missingAttributes;
}
@Override
public void addMetaData(Attribute metadata) {
if(this.metadata==null) this.metadata=new HashMap<String, Attribute>();
this.metadata.put(metadata.getName(), metadata);
}
@Override
public Map<String, Attribute> getMetaData() {
return metadata;
}
}