001    package railo.transformer.cfml.evaluator;
002    
003    import java.util.Vector;
004    
005    import railo.runtime.exp.TemplateException;
006    import railo.transformer.bytecode.statement.tag.Tag;
007    import railo.transformer.library.function.FunctionLib;
008    import railo.transformer.library.tag.TagLibTag;
009    import railo.transformer.util.CFMLString;
010    
011    /**
012     *
013     * Wenn der CFML Transformer w�hrend des �bersetzungsprozess auf einen Tag st�sst, 
014     * pr�ft er mithilfe der passenden TagLib, 
015     * ob dieses Tag eine Evaluator definiert hat. 
016     * Wenn ein Evaluator definiert ist, kann der CFML Transformer diesen aber nicht sofort aufrufen, 
017     * da zuerst das komplette Dokument �bersetzt werden muss, 
018     * bevor ein Evaluator aufgerufen werden kann.
019     * Hier kommt der EvaluatorPool zum Einsatz, 
020     * der CFMLTransfomer �bergibt den Evaluator den er von der TagLib erhalten hat, 
021     * an den EvaluatorPool weiter. 
022     * Sobald der CFMLTransfomer den �bersetzungsprozess abgeschlossen hat, 
023     * ruft er dann den EvaluatorPool auf und dieser ruft dann alle Evaluatoren auf die im �bergeben wurden. 
024    
025     */
026    public final class EvaluatorPool {
027            
028            Vector v=new Vector();
029            
030            /**
031             * Diese Methode wird aufgerufen um eine neue Methode in den Pool zu spielen.
032             * @param libTag  Die Definition des Tag aus der TLD.
033             * @param cfxdTag Das konkrete Tag innerhalb der kompletten CFXD.
034             * @param flibs S�mtliche Function Library Deskriptoren des aktuellen Tag Libray Deskriptors.
035             * @param cfml CFMLString des aktuellen �bersetzungsprozess.
036             */
037            public void add(TagLibTag libTag,Tag tag, FunctionLib[] flibs, CFMLString cfml) {
038                    v.add(new EvaluatorData(libTag,tag,flibs,cfml));
039            }
040    
041            /**
042             * Die Methode run wird aufgerufen sobald, der CFML Transformer den �bersetzungsprozess angeschlossen hat.
043             * Die metode run rauft darauf alle Evaluatoren auf die intern gespeicher wurden und l�scht den internen Speicher.
044             * @throws TemplateException
045             */
046            public void run() throws TemplateException  {
047                    int size=v.size();
048                    for(int i=0;i<size;i++) {
049                            EvaluatorData ec=(EvaluatorData)v.elementAt(i);
050                            CFMLString cfml=ec.getCfml();
051                            cfml.setPos(ec.getPos());
052                            try {
053                                    if(ec.getLibTag().getEvaluator()!=null)ec.getLibTag().getEvaluator().evaluate(
054                                                    ec.getTag(),
055                                                    ec.getLibTag(),
056                                                    ec.getFlibs());
057                            } catch (EvaluatorException e) {
058                                v.clear();//print.printST(e);
059                                    throw new TemplateException(cfml,e);
060                            }catch (Throwable e) {
061                                v.clear();
062                                    throw new TemplateException(cfml,e);
063                            }
064                            
065                    }
066                    v.clear();
067            }
068    
069            /**
070             *
071             *
072             * Die interne Klasse EvaluatorData dient zum Zwischenspeichern aller Daten 
073             * die ben�tigt werden einen einzelnen Evaluator aufzurufen. 
074             */
075            class EvaluatorData {
076                    TagLibTag libTag;
077                    Tag tag; 
078                    FunctionLib[] flibs; 
079                    CFMLString cfml;
080                    int pos;
081                    
082                    /**
083                    * Konstruktor von EvaluatorData.
084                    * @param libTag  Die Definition des Tag aus der TLD.
085                    * @param cfxdTag Das konkrete Tag innerhalb der kompletten CFXD.
086                    * @param flibs S�mtliche Function Library Deskriptoren des aktuellen Tag Libray Deskriptors.
087                    * @param cfml CFMLString des aktuellen �bersetzungsprozess.
088                    */
089                    public EvaluatorData(TagLibTag libTag,Tag tag, FunctionLib[] flibs, CFMLString cfml) {
090                            this.libTag=libTag;
091                            this.tag=tag;
092                            this.flibs=flibs;
093                            this.cfml=cfml;
094                            this.pos=cfml.getPos();
095                    }
096                    
097                    /**
098                     * Gibt den aktuellen CFMLString zur�ck.
099                     * @return CFMLString des aktuellen �bersetzungsprozess.
100                     */
101                    public CFMLString getCfml() {
102                            return cfml;
103                    }
104    
105                    /**
106                     * Gibt den zu verarbeitenden Tag zur�ck.
107                     * @return Das konkrete Tag innerhalb der kompletten CFXD.
108                     */
109                    public Tag getTag() {
110                            return tag;
111                    }
112    
113                    /**
114                     * Gibt s�mtliche Function Library Deskriptoren des aktuellen Tag Libray Deskriptors zur�ck. 
115                     * @return S�mtliche Function Library Deskriptoren.
116                     */
117                    public FunctionLib[] getFlibs() {
118                            return flibs;
119                    }
120    
121                    /**
122                     * Die Definition des aktuellen tags aus der TLD
123                     * @return den aktuellen TagLibTag.
124                     */
125                    public TagLibTag getLibTag() {
126                            return libTag;
127                    }
128    
129                    /**
130                     * Die Position des zu verarbeitenden Tag innerhalb der CFML Seite.
131                     * @return Position des Tag.
132                     */
133                    public int getPos() {
134                            return pos;
135                    }
136    
137            }
138    
139        /**
140         * clears the ppol
141         */
142        public void clear() {
143            v.clear();
144        }
145    
146            /*public static void getPool() {
147                    // TODO Auto-generated method stub
148                    
149            }*/
150    
151    }