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    }