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    }