001 package railo.transformer.cfml.script; 002 003 import japa.parser.JavaParser; 004 import japa.parser.ast.CompilationUnit; 005 006 import java.io.ByteArrayInputStream; 007 008 import org.objectweb.asm.Label; 009 010 import railo.commons.lang.StringUtil; 011 import railo.runtime.config.Config; 012 import railo.runtime.exp.TemplateException; 013 import railo.transformer.bytecode.ScriptBody; 014 import railo.transformer.bytecode.statement.java.DataBag; 015 import railo.transformer.bytecode.statement.java.JavaParserVisitor; 016 import railo.transformer.bytecode.statement.tag.Tag; 017 import railo.transformer.cfml.evaluator.EvaluatorPool; 018 import railo.transformer.cfml.expression.CFMLExprTransformer; 019 import railo.transformer.cfml.tag.CFMLTransformer; 020 import railo.transformer.cfml.tag.TagDependentBodyTransformer; 021 import railo.transformer.library.function.FunctionLib; 022 import railo.transformer.library.tag.TagLibTag; 023 import railo.transformer.util.CFMLString; 024 025 026 /** 027 * Innerhalb des Tag script kann in Cold Fusion eine eigene Scriptsprache verwendet werden, 028 * welche sich an Javascript orientiert. 029 * Da der data.cfml Transformer keine Spezialf�lle zul�sst, 030 * also Tags einfach anhand der eingegeben TLD einliest und transformiert, 031 * aus diesem Grund wird der Inhalt des Tag script einfach als Zeichenkette eingelesen. 032 * Erst durch den Evaluator (siehe 3.3), der f�r das Tag script definiert ist, 033 * wird der Inhalt des Tag script �bersetzt. 034 * 035 */ 036 public final class JavaScriptTransformer extends CFMLExprTransformer implements TagDependentBodyTransformer { 037 038 public void transform(Config config,CFMLTransformer parent, EvaluatorPool ep, 039 FunctionLib[] flibs, Tag tag, TagLibTag tagLibTag, CFMLString cfml) 040 throws TemplateException { 041 042 StringBuilder sb=new StringBuilder(); 043 int startline=cfml.getLine(); 044 while(!cfml.isAfterLast() && !cfml.isCurrent("</",tagLibTag.getFullName())){ 045 sb.append(cfml.getCurrent()); 046 cfml.next(); 047 } 048 int endline=cfml.getLine(); 049 if(cfml.isAfterLast()) 050 throw new TemplateException(cfml,"missing end tag"); // TODO better error message 051 052 053 054 String dummyStart="public class Susi {public static void code(){"+StringUtil.repeatString("\n", startline-1); 055 056 String dummyEnd="}}"; 057 String src=dummyStart+sb+dummyEnd; 058 Label start=new Label(); 059 Label end=new Label(); 060 061 ByteArrayInputStream bais = new ByteArrayInputStream(src.getBytes()); 062 063 try { 064 CompilationUnit cu = JavaParser.parse(bais); 065 DataBag db = new DataBag(); 066 ScriptBody body=new ScriptBody(); 067 tag.setBody(body); 068 new JavaParserVisitor(body,start,end).visit(cu, db); 069 070 } 071 catch (Exception e) { 072 throw new TemplateException(cfml,e); 073 } 074 } 075 }