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}