Changeset 412:00b45abceb6c in livinglogic.java.ul4

Show
Ignore:
Timestamp:
07/20/11 17:29:57 (8 years ago)
Author:
Walter Doerwald <walter@…>
Branch:
default
Tags:
rel-0-42
Message:

Updated to match the implementation in XIST 3.23 (i.e. names for templates).

Files:
15 modified

Legend:

Unmodified
Added
Removed
  • makejar.sh

    r406 r412  
    11cp jython.jar ul4jython.jar 
    2 zip ul4jython.jar Lib/spark.py Lib/ul4c.py 
     2zip ul4jython.jar src/main/resources/spark.py src/main/resources/ul4c.py 
  • pom.xml

    r411 r412  
    44    <groupId>com.livinglogic</groupId> 
    55    <artifactId>ul4</artifactId> 
    6     <version>0.41</version> 
     6    <version>0.42</version> 
    77    <name>UL4</name> 
    88    <build> 
  • src/main/java/com/livinglogic/ul4/Compiler.java

    r411 r412  
    2121    public static InterpretedTemplate compile(String source) 
    2222    { 
    23         return compile(source, "<?", "?>"); 
     23        return compile(source, "unnamed", "<?", "?>"); 
     24    } 
     25 
     26    public static InterpretedTemplate compile(String source, String name) 
     27    { 
     28        return compile(source, name, "<?", "?>"); 
    2429    } 
    2530 
    2631    public static InterpretedTemplate compile(String source, String startdelim, String enddelim) 
    2732    { 
    28         List<Location> tags = InterpretedTemplate.tokenizeTags(source, startdelim, enddelim); 
    29         return compiler.compile(source, tags, startdelim, enddelim); 
     33        return compile(source, "unnamed", startdelim, enddelim); 
     34    } 
     35 
     36    public static InterpretedTemplate compile(String source, String name, String startdelim, String enddelim) 
     37    { 
     38        List<Location> tags = InterpretedTemplate.tokenizeTags(source, name, startdelim, enddelim); 
     39        return compiler.compile(source, name, tags, startdelim, enddelim); 
    3040    } 
    3141} 
  • src/main/java/com/livinglogic/ul4/CompilerType.java

    r406 r412  
    55public interface CompilerType 
    66{ 
    7     public InterpretedTemplate compile(String source, List tags, String startdelim, String enddelim); 
     7    public InterpretedTemplate compile(String source, String name, List tags, String startdelim, String enddelim); 
    88} 
  • src/main/java/com/livinglogic/ul4/InterpretedTemplate.java

    r406 r412  
    1717import java.util.regex.Pattern; 
    1818import java.util.regex.Matcher; 
     19import java.lang.reflect.InvocationTargetException; 
    1920import org.apache.commons.lang.ObjectUtils; 
     21import org.apache.commons.lang.StringEscapeUtils; 
    2022 
    2123public class InterpretedTemplate implements Template 
     
    109111     * The version number used in the compiled format of the template. 
    110112     */ 
    111     public static final String VERSION = "15"; 
     113    public static final String VERSION = "16"; 
     114 
     115    /** 
     116     * The name of the template (defaults to <code>unnamed</code>) 
     117     */ 
     118    public String name; 
    112119 
    113120    /** 
     
    158165    { 
    159166        this.source = null; 
     167        this.name = null; 
    160168        this.opcodes = new LinkedList<Opcode>(); 
    161169        this.defaultLocale = Locale.ENGLISH; 
     
    165173     * Creates an template object for a source string and a list of opcodes. 
    166174     */ 
    167     public InterpretedTemplate(String source, List<Opcode> opcodes, String startdelim, String enddelim) 
     175    public InterpretedTemplate(String source, String name, List<Opcode> opcodes, String startdelim, String enddelim) 
    168176    { 
    169177        this.source = source; 
     178        this.name = name; 
    170179        this.startdelim = startdelim; 
    171180        this.enddelim = enddelim; 
     
    181190     * Creates an template object as a subtemplate of another template. 
    182191     */ 
    183     public InterpretedTemplate(InterpretedTemplate parent, int sourceStartIndex, int sourceEndIndex, int opcodeStartIndex, int opcodeEndIndex) 
     192    public InterpretedTemplate(InterpretedTemplate parent, String name, int sourceStartIndex, int sourceEndIndex, int opcodeStartIndex, int opcodeEndIndex) 
    184193    { 
    185194        this.source = parent.source; 
     195        this.name = name; 
    186196        this.startdelim = parent.startdelim; 
    187197        this.enddelim = parent.enddelim; 
     
    192202        this.opcodeEndIndex = opcodeEndIndex; 
    193203        this.defaultLocale = Locale.ENGLISH; 
     204    } 
     205 
     206    public String getName() 
     207    { 
     208        return name; 
     209    } 
     210 
     211    public void setName(String name) 
     212    { 
     213        this.name = name; 
    194214    } 
    195215 
     
    428448        bufferedReader.readLine(); // skip header (without checking) 
    429449        bufferedReader.readLine(); // skip version number (with checking) 
     450        readstr(bufferedReader, "N"); // skip name 
     451        readchar(bufferedReader, '\n'); 
    430452        readstr(bufferedReader, "SD"); // skip start delimiter 
    431453        readchar(bufferedReader, '\n'); 
     
    473495            throw new RuntimeException("Invalid version, expected " + VERSION + ", got " + version); 
    474496        } 
     497        retVal.name = readstr(bufferedReader, "N"); 
     498        readchar(bufferedReader, '\n'); 
    475499        retVal.startdelim = readstr(bufferedReader, "SD"); 
    476500        readchar(bufferedReader, '\n'); 
     
    511535                        throw new RuntimeException("Invalid location spec " + charValue + charValue2); 
    512536                    } 
    513                     location = new Location(retVal.source, readstr(bufferedReader, "T"), 
     537                    // Use null for the name, this will be fixed by annotate() 
     538                    location = new Location(retVal.source, null, 
     539                        readstr(bufferedReader, "T"), 
    514540                        readint(bufferedReader, "st"), readint(bufferedReader, "et"), 
    515541                        readint(bufferedReader, "sc"), readint(bufferedReader, "ec")); 
     
    606632        writer.write("\n"); 
    607633        writer.write(VERSION); 
     634        writer.write("\n"); 
     635        writestr(writer, "N", name); 
    608636        writer.write("\n"); 
    609637        writestr(writer, "SD", startdelim); 
     
    663691 
    664692    /** 
    665      * Annotates all control flow opcodes in the template with a jump location. 
     693     * Annotates all control flow opcodes in the template with a jump location and 
     694     * fixes the template name in the location objects. 
    666695     * <ul> 
    667696     * <li>(a <code>for</code> opcode gets annotated with the location of the 
     
    676705     * opcode after the associated <code>endfor</code> opcode.</li> 
    677706     * <li>a <code>continue</code> opcode gets annotated with the location of next 
    678      * opcode after the associated ENDFOR opcode.</li> 
     707     * opcode after the associated <code>endfor</code> opcode.</li> 
    679708     * </ul> 
    680709     */ 
     
    687716            { 
    688717                Opcode opcode = opcodes.get(i); 
     718                opcode.location.fixName(name); 
    689719                switch (opcode.name) 
    690720                { 
    691721                    case Opcode.OC_IF: 
    692                         i = annotateIf(i, 0); 
     722                        i = annotateIf(i, 0, name); 
    693723                        break; 
    694724                    case Opcode.OC_FOR: 
    695                         i = annotateFor(i, 0); 
     725                        i = annotateFor(i, 0, name); 
    696726                        break; 
    697727                    case Opcode.OC_DEF: 
    698                         i = annotateDef(i, 0); 
     728                        i = annotateDef(i, 0, name); 
    699729                        break; 
    700730                    case Opcode.OC_ELSE: 
     
    716746    } 
    717747 
    718     protected int annotateIf(int ifStart, int forDepth) 
     748    protected int annotateIf(int ifStart, int forDepth, String name) 
    719749    { 
    720750        int jump = ifStart; 
     
    723753        { 
    724754            Opcode opcode = opcodes.get(i); 
     755            opcode.location.fixName(name); 
    725756            switch (opcode.name) 
    726757            { 
    727758                case Opcode.OC_IF: 
    728                     i = annotateIf(i, forDepth); 
     759                    i = annotateIf(i, forDepth, name); 
    729760                    break; 
    730761                case Opcode.OC_FOR: 
    731                     i = annotateFor(i, forDepth); 
     762                    i = annotateFor(i, forDepth, name); 
    732763                    break; 
    733764                case Opcode.OC_DEF: 
    734                     i = annotateDef(i, forDepth); 
     765                    i = annotateDef(i, forDepth, name); 
    735766                    break; 
    736767                case Opcode.OC_ELSE: 
     
    758789    } 
    759790 
    760     protected int annotateDef(int defStart, int forDepth) 
     791    protected int annotateDef(int defStart, int forDepth, String name) 
    761792    { 
    762793        int jump = defStart; 
    763794        int size = opcodes.size(); 
     795        String defName = opcodes.get(defStart).arg; 
    764796        for (int i = defStart+1; i < size; ++i) 
    765797        { 
    766798            Opcode opcode = opcodes.get(i); 
     799            opcode.location.fixName(opcode.name == Opcode.OC_ENDDEF ? name : defName); 
    767800            switch (opcode.name) 
    768801            { 
    769802                case Opcode.OC_IF: 
    770                     i = annotateIf(i, forDepth); 
     803                    i = annotateIf(i, forDepth, defName); 
    771804                    break; 
    772805                case Opcode.OC_FOR: 
    773                     i = annotateFor(i, forDepth); 
     806                    i = annotateFor(i, forDepth, defName); 
    774807                    break; 
    775808                case Opcode.OC_DEF: 
    776                     i = annotateDef(i, forDepth); 
     809                    i = annotateDef(i, forDepth, defName); 
    777810                    break; 
    778811                case Opcode.OC_ELSE: 
     
    794827    } 
    795828 
    796     protected int annotateFor(int loopStart, int forDepth) 
     829    protected int annotateFor(int loopStart, int forDepth, String name) 
    797830    { 
    798831        ++forDepth; 
     
    804837        { 
    805838            Opcode opcode = opcodes.get(i); 
     839            opcode.location.fixName(name); 
    806840            switch (opcode.name) 
    807841            { 
    808842                case Opcode.OC_IF: 
    809                     i = annotateIf(i, forDepth); 
     843                    i = annotateIf(i, forDepth, name); 
    810844                    break; 
    811845                case Opcode.OC_FOR: 
    812                     i = annotateFor(i, forDepth); 
     846                    i = annotateFor(i, forDepth, name); 
    813847                    break; 
    814848                case Opcode.OC_DEF: 
    815                     i = annotateDef(i, forDepth); 
     849                    i = annotateDef(i, forDepth, name); 
    816850                    break; 
    817851                case Opcode.OC_ELSE: 
     
    9761010            if (subTemplateIterator != null) 
    9771011            { 
    978                 if (subTemplateIterator.hasNext()) 
    979                 { 
    980                     nextChunk = subTemplateIterator.next(); 
    981                     return; 
    982                 } 
    983                 else 
    984                 { 
    985                     subTemplateIterator = null; 
     1012                try 
     1013                { 
     1014                    if (subTemplateIterator.hasNext()) 
     1015                    { 
     1016                        nextChunk = subTemplateIterator.next(); 
     1017                        return; 
     1018                    } 
     1019                    else 
     1020                    { 
     1021                        subTemplateIterator = null; 
     1022                    } 
     1023                } 
     1024                catch (Exception ex) 
     1025                { 
     1026                    throw new LocationException(ex, opcodes.get(pc).location); 
    9861027                } 
    9871028            } 
     
    16051646                            } 
    16061647                        case Opcode.OC_DEF: 
    1607                             variables.put(code.arg, new InterpretedTemplate(InterpretedTemplate.this, code.location.endtag, opcodes.get(code.jump).location.starttag, pc+1, code.jump)); 
     1648                            variables.put(code.arg, new InterpretedTemplate(InterpretedTemplate.this, code.arg, code.location.endtag, opcodes.get(code.jump).location.starttag, pc+1, code.jump)); 
    16081649                            pc = code.jump+1; 
    16091650                            continue; 
     
    16611702    } 
    16621703 
    1663     public static List<Location> tokenizeTags(String source, String startdelim, String enddelim) 
     1704    public static List<Location> tokenizeTags(String source, String name, String startdelim, String enddelim) 
    16641705    { 
    16651706        Pattern tagPattern = Pattern.compile(escapeREchars(startdelim) + "(printx|print|code|for|if|elif|else|end|break|continue|render|def|note)(\\s*(.*?)\\s*)?" + escapeREchars(enddelim), Pattern.DOTALL); 
     
    16771718                end = start + matcher.group().length(); 
    16781719                if (pos != start) 
    1679                     tags.add(new Location(source, null, pos, start, pos, start)); 
     1720                    tags.add(new Location(source, name, null, pos, start, pos, start)); 
    16801721                int codestart = matcher.start(3); 
    16811722                int codeend = codestart + matcher.group(3).length(); 
    16821723                String type = matcher.group(1); 
    16831724                if (!type.equals("note")) 
    1684                     tags.add(new Location(source, matcher.group(1), start, end, codestart, codeend)); 
     1725                    tags.add(new Location(source, name, matcher.group(1), start, end, codestart, codeend)); 
    16851726                pos = end; 
    16861727            } 
    16871728            end = source.length(); 
    16881729            if (pos != end) 
    1689                 tags.add(new Location(source, null, pos, end, pos, end)); 
     1730                tags.add(new Location(source, name, null, pos, end, pos, end)); 
    16901731        } 
    16911732        return tags; 
     
    19541995    { 
    19551996        StringBuffer source = new StringBuffer(); 
    1956         source.append("\tpublic void render(java.io.Writer out, java.util.Map<String, Object> variables) throws java.io.IOException"); 
    1957         source.append("\t{"); 
     1997        source.append("\tpublic String getName()\n"); 
     1998        source.append("\t{\n"); 
     1999        source.append("\t\treturn \"" + StringEscapeUtils.escapeJava(name) + "\";\n"); 
     2000        source.append("\t}\n"); 
     2001        source.append("\n"); 
     2002        source.append("\tpublic void render(java.io.Writer out, java.util.Map<String, Object> variables) throws java.io.IOException\n"); 
     2003        source.append("\t{\n"); 
    19582004        source.append(javaSource()); 
    1959         source.append("\t}"); 
    1960  
    1961         return (JSPTemplate)Utils.compileToJava(source.toString(), "com.livinglogic.ul4.JSPTemplate", null); 
     2005        source.append("\t}\n"); 
     2006 
     2007        Class clazz = Utils.compileToJava(source.toString(), "com.livinglogic.ul4.JSPTemplate", null); 
     2008        try 
     2009        { 
     2010            return (JSPTemplate)clazz.newInstance(); 
     2011        } 
     2012        catch (InstantiationException ex) 
     2013        { 
     2014            // Can't happen 
     2015            throw new RuntimeException(ex); 
     2016        } 
     2017        catch (IllegalAccessException ex) 
     2018        { 
     2019            // Can't happen 
     2020            throw new RuntimeException(ex); 
     2021        } 
    19622022    } 
    19632023 
     
    19652025    { 
    19662026        StringBuffer buffer = new StringBuffer(); 
    1967         int indent = 0; 
    1968  
     2027        int indent = 1; 
     2028 
     2029        buffer.append("def " + name + " {\n"); 
    19692030        int size = opcodes.size(); 
    19702031        for (int i = 0; i < size; ++i) 
     
    19902051                ++indent; 
    19912052        } 
     2053        buffer.append("}\n"); 
    19922054        return buffer.toString(); 
    19932055    } 
  • src/main/java/com/livinglogic/ul4/JSPTemplate.java

    r406 r412  
    77 
    88/** 
    9  * Copyright 2009-2010 by LivingLogic AG, Bayreuth/Germany 
     9 * Copyright 2009-2011 by LivingLogic AG, Bayreuth/Germany 
    1010 * 
    1111 * All Rights Reserved 
     
    1313 * See LICENSE for the license 
    1414 * 
    15  * Base class for template code that has been converted to JSP. 
     15 * Base class for template code that has been converted to Java source code. 
    1616 * 
    1717 * @author W. Doerwald 
     
    2121public abstract class JSPTemplate implements Template 
    2222{ 
     23    public String getName() 
     24    { 
     25        return "unnamed"; 
     26    } 
     27 
    2328    public String renders(Map<String, Object> variables) 
    2429    { 
     
    3136        catch (IOException ex) 
    3237        { 
    33             // does not happen! 
     38            // Can't happen with a StringWriter! 
    3439        } 
    3540        return out.toString(); 
  • src/main/java/com/livinglogic/ul4/JavaCompileServer.java

    r406 r412  
    5757            inputBuffer.append("\t}\n"); 
    5858            System.out.println("INPUT: " + Utils.repr(inputBuffer.toString())); 
    59             Executor executor = (Executor)Utils.compileToJava(inputBuffer.toString(), null, "com.livinglogic.ul4.Executor"); 
     59            Executor executor = (Executor)Utils.compileToJava(inputBuffer.toString(), null, "com.livinglogic.ul4.Executor").newInstance(); 
    6060            String output; 
    6161            String status; 
  • src/main/java/com/livinglogic/ul4/JavaSource4Template.java

    r406 r412  
    200200                    code("{"); 
    201201                    indent++; 
     202                    code("public String getName()"); 
     203                    code("{"); 
     204                    indent++; 
     205                    code("return \"" + StringEscapeUtils.escapeJava(opcode.arg) + "\";"); 
     206                    indent--; 
     207                    code("}"); 
     208                    code("{"); 
    202209                    code("public void render(java.io.Writer out, java.util.Map<String, Object> variables) throws java.io.IOException"); 
    203210                    code("{"); 
  • src/main/java/com/livinglogic/ul4/Location.java

    r406 r412  
    44{ 
    55    public String source; 
     6    public String name; 
    67    protected String type; 
    78    public int starttag; 
     
    1011    public int endcode; 
    1112 
    12     public Location(String source, String type, int starttag, int endtag, int startcode, int endcode) 
     13    public Location(String source, String name, String type, int starttag, int endtag, int startcode, int endcode) 
    1314    { 
    1415        this.source = source; 
     16        this.name = name; 
    1517        this.type = type; 
    1618        this.starttag = starttag; 
     
    5860            } 
    5961        } 
    60         return "<?" + type + "?> tag at " + (starttag+1) + " (line " + line + ", col " + col + ")"; 
     62        return "<?" + type + "?> tag at position " + (starttag+1) + " (line " + line + ", col " + col + ", template " + name + ")"; 
     63    } 
    6164 
     65    public void fixName(String name) 
     66    { 
     67        this.name = name; 
    6268    } 
    6369} 
  • src/main/java/com/livinglogic/ul4/LocationException.java

    r406 r412  
    1313    public String toString() 
    1414    { 
    15         return "in " + location + ": " + super.toString(); 
     15        return "com.livinglogic.ul4.LocationException: in " + location; 
    1616    } 
    1717} 
  • src/main/java/com/livinglogic/ul4/Main.java

    r406 r412  
    4444        Timer timer = new Timer(); 
    4545        timer.start(); 
    46         InterpretedTemplate tmpl = Compiler.compile("<?code langs = ['Python', 'Java', 'C']?><ul><?for l in langs?><li><?printx l?></li><?end for?></ul>"); 
     46        InterpretedTemplate tmpl = Compiler.compile("<?def x?><?def y?><?print z2?><?end def?><?render y(z=z)?><?end def?><?render x(z=2)?>"); 
     47        // InterpretedTemplate tmpl = Compiler.compile("<?code langs = ['Python', 'Java', 'C']?><ul><?for l in langs?><li><?printx l?></li><?end for?></ul>"); 
    4748        timer.stop("Compiled template to UL4 bytecode once"); 
    4849        timer.start(); 
    49         tmpl = Compiler.compile("<?code langs = ['Python', 'Java', 'C']?><ul><?for l in langs?><li><?printx l?></li><?end for?></ul>"); 
     50        // tmpl = Compiler.compile("<?code langs = ['Python', 'Java', 'C']?><ul><?for l in langs?><li><?printx l?></li><?end for?></ul>"); 
     51        tmpl = Compiler.compile("<?def x?><?def y?><?print z2?><?end def?><?render y(z=z)?><?end def?><?render x(z=2)?>", "recursionTest"); 
    5052        timer.stop("Compiled template to UL4 bytecode twice"); 
    5153 
  • src/main/java/com/livinglogic/ul4/Template.java

    r406 r412  
    66 
    77/** 
    8  * Copyright 2009-2010 by LivingLogic AG, Bayreuth/Germany 
     8 * Copyright 2009-2011 by LivingLogic AG, Bayreuth/Germany 
    99 * 
    1010 * All Rights Reserved 
  • src/main/java/com/livinglogic/ul4/Utils.java

    r409 r412  
    29502950 
    29512951    /** 
    2952      * Compile Java source code of a Java class and return a new instance of it 
     2952     * Compile Java source code of a Java class and return the class object 
    29532953     * @param source The source of the body of the class 
    29542954     * @param extendsSpec Name of base class (or null) 
    29552955     * @param implementsSpec Comma serated list of implemented interfaces (or null) 
    2956      * @return A Map containing the variables 
     2956     * @return The Class object that contains the compiled Java code 
    29572957     */ 
    2958     public static Object compileToJava(String source, String extendsSpec, String implementsSpec) throws java.io.IOException 
    2959     { 
    2960         File file = File.createTempFile("jav", ".java", new File(System.getProperty("user.dir"))); 
     2958    public static Class compileToJava(String source, String extendsSpec, String implementsSpec) throws java.io.IOException 
     2959    { 
     2960        String dirname = System.getProperty("user.dir"); 
     2961        File file = File.createTempFile("jav", ".java", new File(dirname)); 
    29612962        file.deleteOnExit(); // Set the file to delete on exit 
    29622963        // Get the file name and extract a class name from it 
     
    30023003 
    30033004        // TODO add ul4.jar to java.class.path in a more generic way 
    3004         System.setProperty("java.class.path", "/home/andreas/LivingLogic/cms/install/xist4c/WEB-INF/lib/ul4.jar:" + System.getProperty("java.class.path")); 
    3005         int status = javac.compile(args, new PrintWriter(System.out)); 
    3006  
     3005        System.setProperty("java.class.path", "/Users/walter/.m2/repository/com/livinglogic/ul4/0.42/ul4-0.42.jar:/home/andreas/LivingLogic/cms/install/xist4c/WEB-INF/lib/ul4.jar:" + System.getProperty("user.dir") + ":" + System.getProperty("java.class.path") + ":/Users/walter/apache-tomcat-6.0.18/lib/naming-resources.jar:/Users/walter/apache-tomcat-6.0.18/lib/servlet-api.jar:/Users/walter/apache-tomcat-6.0.18/lib/jsp-api.jar:/Users/walter/.m2/repository/commons-lang/commons-lang/2.6/commons-lang-2.6.jar:/Users/walter/checkouts/LivingLogic.Java.ul4/ul4jython.jar:."); 
     3006        int status = javac.compile(args, new PrintWriter(System.err)); 
     3007        System.err.flush(); 
    30073008        switch (status) 
    30083009        { 
     
    30143015                try 
    30153016                { 
    3016                     Class clazz = Class.forName(classname); 
    3017                     return clazz.newInstance(); 
     3017                    return Class.forName(classname); 
    30183018                } 
    30193019                catch (ClassNotFoundException ex) 
    30203020                { 
    30213021                    // Can't happen 
    3022                     return null; 
    3023                 } 
    3024                 catch (InstantiationException ex) 
    3025                 { 
    3026                     // Can't happen 
    3027                     return null; 
    3028                 } 
    3029                 catch (IllegalAccessException ex) 
    3030                 { 
    3031                     // Can't happen 
    3032                     return null; 
     3022                    throw new RuntimeException(ex); 
    30333023                } 
    30343024            case 1: 
  • src/main/resources/ul4c.py

    r411 r412  
    590590 
    591591class Compiler(ul4.CompilerType): 
    592     def compile(self, source, tags, startdelim, enddelim): 
     592    def compile(self, source, name, tags, startdelim, enddelim): 
    593593        template = ul4.InterpretedTemplate() 
     594        template.name = name 
    594595        template.startdelim = startdelim 
    595596        template.enddelim = enddelim 
  • src/main/resources/versiondoc.txt

    r406 r412  
    1 HEAD: 
    2 ------- 
    3 Comments: 
    4 * Moved to maven for building. 
     1exp-42: 
     2------- 
     3Comments: 
     4* Updated to match the implementation in XIST 3.23 (i.e. names for templates). 
     5 
    56 
    67exp-40: