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 waehrend des �bersetzungsprozess auf einen Tag stoesst, 014 * prueft 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 uebersetzt werden muss, 018 * bevor ein Evaluator aufgerufen werden kann. 019 * Hier kommt der EvaluatorPool zum Einsatz, 020 * der CFMLTransfomer uebergibt 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 uebergeben 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 Saemtliche 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 loescht 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 benoetigt 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 Saemtliche 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 zurueck. 099 * @return CFMLString des aktuellen �bersetzungsprozess. 100 */ 101 public CFMLString getCfml() { 102 return cfml; 103 } 104 105 /** 106 * Gibt den zu verarbeitenden Tag zurueck. 107 * @return Das konkrete Tag innerhalb der kompletten CFXD. 108 */ 109 public Tag getTag() { 110 return tag; 111 } 112 113 /** 114 * Gibt saemtliche Function Library Deskriptoren des aktuellen Tag Libray Deskriptors zurueck. 115 * @return Saemtliche 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 }