package railo.transformer.cfml.evaluator;
import java.util.Vector;
import railo.runtime.exp.TemplateException;
import railo.transformer.bytecode.statement.tag.Tag;
import railo.transformer.library.function.FunctionLib;
import railo.transformer.library.tag.TagLibTag;
import railo.transformer.util.CFMLString;
/**
*
* Wenn der CFML Transformer waehrend des �bersetzungsprozess auf einen Tag stoesst,
* prueft er mithilfe der passenden TagLib,
* ob dieses Tag eine Evaluator definiert hat.
* Wenn ein Evaluator definiert ist, kann der CFML Transformer diesen aber nicht sofort aufrufen,
* da zuerst das komplette Dokument uebersetzt werden muss,
* bevor ein Evaluator aufgerufen werden kann.
* Hier kommt der EvaluatorPool zum Einsatz,
* der CFMLTransfomer uebergibt den Evaluator den er von der TagLib erhalten hat,
* an den EvaluatorPool weiter.
* Sobald der CFMLTransfomer den �bersetzungsprozess abgeschlossen hat,
* ruft er dann den EvaluatorPool auf und dieser ruft dann alle Evaluatoren auf die im uebergeben wurden.
*/
public final class EvaluatorPool {
Vector v=new Vector();
/**
* Diese Methode wird aufgerufen um eine neue Methode in den Pool zu spielen.
* @param libTag Die Definition des Tag aus der TLD.
* @param cfxdTag Das konkrete Tag innerhalb der kompletten CFXD.
* @param flibs Saemtliche Function Library Deskriptoren des aktuellen Tag Libray Deskriptors.
* @param cfml CFMLString des aktuellen �bersetzungsprozess.
*/
public void add(TagLibTag libTag,Tag tag, FunctionLib[] flibs, CFMLString cfml) {
v.add(new EvaluatorData(libTag,tag,flibs,cfml));
}
/**
* Die Methode run wird aufgerufen sobald, der CFML Transformer den �bersetzungsprozess angeschlossen hat.
* Die metode run rauft darauf alle Evaluatoren auf die intern gespeicher wurden und loescht den internen Speicher.
* @throws TemplateException
*/
public void run() throws TemplateException {
int size=v.size();
for(int i=0;i<size;i++) {
EvaluatorData ec=(EvaluatorData)v.elementAt(i);
CFMLString cfml=ec.getCfml();
cfml.setPos(ec.getPos());
try {
if(ec.getLibTag().getEvaluator()!=null)ec.getLibTag().getEvaluator().evaluate(
ec.getTag(),
ec.getLibTag(),
ec.getFlibs());
} catch (EvaluatorException e) {
v.clear();//print.printST(e);
throw new TemplateException(cfml,e);
}catch (Throwable e) {
v.clear();
throw new TemplateException(cfml,e);
}
}
v.clear();
}
/**
*
*
* Die interne Klasse EvaluatorData dient zum Zwischenspeichern aller Daten
* die benoetigt werden einen einzelnen Evaluator aufzurufen.
*/
class EvaluatorData {
TagLibTag libTag;
Tag tag;
FunctionLib[] flibs;
CFMLString cfml;
int pos;
/**
* Konstruktor von EvaluatorData.
* @param libTag Die Definition des Tag aus der TLD.
* @param cfxdTag Das konkrete Tag innerhalb der kompletten CFXD.
* @param flibs Saemtliche Function Library Deskriptoren des aktuellen Tag Libray Deskriptors.
* @param cfml CFMLString des aktuellen �bersetzungsprozess.
*/
public EvaluatorData(TagLibTag libTag,Tag tag, FunctionLib[] flibs, CFMLString cfml) {
this.libTag=libTag;
this.tag=tag;
this.flibs=flibs;
this.cfml=cfml;
this.pos=cfml.getPos();
}
/**
* Gibt den aktuellen CFMLString zurueck.
* @return CFMLString des aktuellen �bersetzungsprozess.
*/
public CFMLString getCfml() {
return cfml;
}
/**
* Gibt den zu verarbeitenden Tag zurueck.
* @return Das konkrete Tag innerhalb der kompletten CFXD.
*/
public Tag getTag() {
return tag;
}
/**
* Gibt saemtliche Function Library Deskriptoren des aktuellen Tag Libray Deskriptors zurueck.
* @return Saemtliche Function Library Deskriptoren.
*/
public FunctionLib[] getFlibs() {
return flibs;
}
/**
* Die Definition des aktuellen tags aus der TLD
* @return den aktuellen TagLibTag.
*/
public TagLibTag getLibTag() {
return libTag;
}
/**
* Die Position des zu verarbeitenden Tag innerhalb der CFML Seite.
* @return Position des Tag.
*/
public int getPos() {
return pos;
}
}
/**
* clears the ppol
*/
public void clear() {
v.clear();
}
/*public static void getPool() {
// TODO Auto-generated method stub
}*/
}