001/**
002 *
003 * Copyright (c) 2014, the Railo Company Ltd. All rights reserved.
004 *
005 * This library is free software; you can redistribute it and/or
006 * modify it under the terms of the GNU Lesser General Public
007 * License as published by the Free Software Foundation; either 
008 * version 2.1 of the License, or (at your option) any later version.
009 * 
010 * This library is distributed in the hope that it will be useful,
011 * but WITHOUT ANY WARRANTY; without even the implied warranty of
012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
013 * Lesser General Public License for more details.
014 * 
015 * You should have received a copy of the GNU Lesser General Public 
016 * License along with this library.  If not, see <http://www.gnu.org/licenses/>.
017 * 
018 **/
019package lucee.transformer.cfml.evaluator;
020
021import java.util.Vector;
022
023import lucee.commons.lang.ExceptionUtil;
024import lucee.runtime.exp.TemplateException;
025import lucee.transformer.bytecode.statement.tag.Tag;
026import lucee.transformer.library.function.FunctionLib;
027import lucee.transformer.library.tag.TagLibTag;
028import lucee.transformer.util.CFMLString;
029
030/**
031 *
032 * Wenn der CFML Transformer waehrend des Uebersetzungsprozess auf einen Tag stoesst, 
033 * prueft er mithilfe der passenden TagLib, 
034 * ob dieses Tag eine Evaluator definiert hat. 
035 * Wenn ein Evaluator definiert ist, kann der CFML Transformer diesen aber nicht sofort aufrufen, 
036 * da zuerst das komplette Dokument uebersetzt werden muss, 
037 * bevor ein Evaluator aufgerufen werden kann.
038 * Hier kommt der EvaluatorPool zum Einsatz, 
039 * der CFMLTransfomer uebergibt den Evaluator den er von der TagLib erhalten hat, 
040 * an den EvaluatorPool weiter. 
041 * Sobald der CFMLTransfomer den Uebersetzungsprozess abgeschlossen hat, 
042 * ruft er dann den EvaluatorPool auf und dieser ruft dann alle Evaluatoren auf die im uebergeben wurden. 
043
044 */
045public final class EvaluatorPool {
046        
047        Vector v=new Vector();
048        
049        /**
050         * Diese Methode wird aufgerufen um eine neue Methode in den Pool zu spielen.
051         * @param libTag  Die Definition des Tag aus der TLD.
052         * @param cfxdTag Das konkrete Tag innerhalb der kompletten CFXD.
053         * @param flibs Saemtliche Function Library Deskriptoren des aktuellen Tag Libray Deskriptors.
054         * @param cfml CFMLString des aktuellen Uebersetzungsprozess.
055         */
056        public void add(TagLibTag libTag,Tag tag, FunctionLib[] flibs, CFMLString cfml) {
057                v.add(new EvaluatorData(libTag,tag,flibs,cfml));
058        }
059
060        /**
061         * Die Methode run wird aufgerufen sobald, der CFML Transformer den Uebersetzungsprozess angeschlossen hat.
062         * Die metode run rauft darauf alle Evaluatoren auf die intern gespeicher wurden und loescht den internen Speicher.
063         * @throws TemplateException
064         */
065        public void run() throws TemplateException  {
066                int size=v.size();
067                for(int i=0;i<size;i++) {
068                        EvaluatorData ec=(EvaluatorData)v.elementAt(i);
069                        CFMLString cfml=ec.getCfml();
070                        cfml.setPos(ec.getPos());
071                        try {
072                                if(ec.getLibTag().getEvaluator()!=null)ec.getLibTag().getEvaluator().evaluate(
073                                                ec.getTag(),
074                                                ec.getLibTag(),
075                                                ec.getFlibs());
076                        } catch (EvaluatorException e) {
077                            v.clear();//print.printST(e);
078                                throw new TemplateException(cfml,e);
079                        }catch (Throwable e) {
080                                ExceptionUtil.rethrowIfNecessary(e);
081                            v.clear();
082                                throw new TemplateException(cfml,e);
083                        }
084                        
085                }
086                v.clear();
087        }
088
089        /**
090         *
091         *
092         * Die interne Klasse EvaluatorData dient zum Zwischenspeichern aller Daten 
093         * die benoetigt werden einen einzelnen Evaluator aufzurufen. 
094         */
095        class EvaluatorData {
096                TagLibTag libTag;
097                Tag tag; 
098                FunctionLib[] flibs; 
099                CFMLString cfml;
100                int pos;
101                
102                /**
103                * Konstruktor von EvaluatorData.
104                * @param libTag  Die Definition des Tag aus der TLD.
105                * @param cfxdTag Das konkrete Tag innerhalb der kompletten CFXD.
106                * @param flibs Saemtliche Function Library Deskriptoren des aktuellen Tag Libray Deskriptors.
107                * @param cfml CFMLString des aktuellen Uebersetzungsprozess.
108                */
109                public EvaluatorData(TagLibTag libTag,Tag tag, FunctionLib[] flibs, CFMLString cfml) {
110                        this.libTag=libTag;
111                        this.tag=tag;
112                        this.flibs=flibs;
113                        this.cfml=cfml;
114                        this.pos=cfml.getPos();
115                }
116                
117                /**
118                 * Gibt den aktuellen CFMLString zurueck.
119                 * @return CFMLString des aktuellen Uebersetzungsprozess.
120                 */
121                public CFMLString getCfml() {
122                        return cfml;
123                }
124
125                /**
126                 * Gibt den zu verarbeitenden Tag zurueck.
127                 * @return Das konkrete Tag innerhalb der kompletten CFXD.
128                 */
129                public Tag getTag() {
130                        return tag;
131                }
132
133                /**
134                 * Gibt saemtliche Function Library Deskriptoren des aktuellen Tag Libray Deskriptors zurueck. 
135                 * @return Saemtliche Function Library Deskriptoren.
136                 */
137                public FunctionLib[] getFlibs() {
138                        return flibs;
139                }
140
141                /**
142                 * Die Definition des aktuellen tags aus der TLD
143                 * @return den aktuellen TagLibTag.
144                 */
145                public TagLibTag getLibTag() {
146                        return libTag;
147                }
148
149                /**
150                 * Die Position des zu verarbeitenden Tag innerhalb der CFML Seite.
151                 * @return Position des Tag.
152                 */
153                public int getPos() {
154                        return pos;
155                }
156
157        }
158
159    /**
160     * clears the ppol
161     */
162    public void clear() {
163        v.clear();
164    }
165
166        /*public static void getPool() {
167                // TODO Auto-generated method stub
168                
169        }*/
170
171}