001 package railo.transformer.bytecode.statement.tag; 002 003 import java.util.HashMap; 004 import java.util.LinkedHashMap; 005 import java.util.Map; 006 007 import railo.runtime.op.Caster; 008 import railo.transformer.bytecode.Body; 009 import railo.transformer.bytecode.BytecodeContext; 010 import railo.transformer.bytecode.BytecodeException; 011 import railo.transformer.bytecode.Position; 012 import railo.transformer.bytecode.statement.FlowControlFinal; 013 import railo.transformer.bytecode.statement.StatementBase; 014 import railo.transformer.bytecode.visitor.ParseBodyVisitor; 015 import railo.transformer.library.tag.TagLibTag; 016 017 /** 018 * 019 */ 020 public abstract class TagBase extends StatementBase implements Tag { 021 022 private Body body=null; 023 private String appendix; 024 private String fullname; 025 private TagLibTag tagLibTag; 026 Map<String,Attribute> attributes=new LinkedHashMap<String,Attribute>(); 027 Map<String,String> missingAttributes=new HashMap<String,String>(); 028 private boolean scriptBase=false; 029 030 private Map<String, Attribute> metadata; 031 //private Label finallyLabel; 032 033 034 public TagBase(Position start, Position end) { 035 super(start,end); 036 } 037 038 039 /** 040 * @see railo.transformer.bytecode.statement.tag.Tag#getAppendix() 041 */ 042 public String getAppendix() { 043 return appendix; 044 } 045 046 @Override 047 public Map getAttributes() { 048 return attributes; 049 } 050 051 @Override 052 public String getFullname() { 053 return fullname; 054 } 055 056 @Override 057 public TagLibTag getTagLibTag() { 058 return tagLibTag; 059 } 060 061 @Override 062 public void setAppendix(String appendix) { 063 this.appendix=appendix; 064 } 065 066 @Override 067 public void setFullname(String fullname) { 068 this.fullname=fullname; 069 } 070 071 @Override 072 public void setTagLibTag(TagLibTag tagLibTag) { 073 this.tagLibTag=tagLibTag; 074 } 075 076 @Override 077 public void addAttribute(Attribute attribute) { 078 attributes.put(attribute.getName().toLowerCase(), attribute); 079 } 080 081 @Override 082 public boolean containsAttribute(String name) { 083 return attributes.containsKey(name.toLowerCase()); 084 } 085 086 @Override 087 public Body getBody() { 088 return body; 089 } 090 091 @Override 092 public void setBody(Body body) { 093 this.body = body; 094 body.setParent(this); 095 } 096 097 @Override 098 public void _writeOut(BytecodeContext bc) throws BytecodeException { 099 _writeOut(bc,true,null); 100 } 101 102 public void _writeOut(BytecodeContext bc, boolean doReuse) throws BytecodeException { 103 _writeOut(bc,doReuse,null); 104 } 105 106 protected void _writeOut(BytecodeContext bc, boolean doReuse, final FlowControlFinal fcf) throws BytecodeException { 107 //_writeOut(bc, true); 108 boolean output=tagLibTag.getParseBody() || Caster.toBooleanValue(getAttribute("output"), false); 109 110 if(output) { 111 ParseBodyVisitor pbv=new ParseBodyVisitor(); 112 pbv.visitBegin(bc); 113 TagHelper.writeOut(this,bc, doReuse,fcf); 114 pbv.visitEnd(bc); 115 } 116 else TagHelper.writeOut(this,bc, doReuse,fcf); 117 } 118 119 @Override 120 public Attribute getAttribute(String name) { 121 return attributes.get(name.toLowerCase()); 122 } 123 124 @Override 125 public Attribute removeAttribute(String name) { 126 return attributes.remove(name); 127 } 128 129 @Override 130 public String toString() { 131 return appendix+":"+fullname+":"+super.toString(); 132 } 133 134 @Override 135 public boolean isScriptBase() { 136 return scriptBase; 137 } 138 139 @Override 140 public void setScriptBase(boolean scriptBase) { 141 this.scriptBase = scriptBase; 142 } 143 144 @Override 145 public void addMissingAttribute(String name, String type) { 146 missingAttributes.put(name, type); 147 } 148 149 @Override 150 public Map getMissingAttributes() { 151 return missingAttributes; 152 } 153 154 @Override 155 public void addMetaData(Attribute metadata) { 156 if(this.metadata==null) this.metadata=new HashMap<String, Attribute>(); 157 this.metadata.put(metadata.getName(), metadata); 158 } 159 160 @Override 161 public Map<String, Attribute> getMetaData() { 162 return metadata; 163 } 164 }