cocoon-cvs mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From anto...@apache.org
Subject cvs commit: cocoon-2.1/src/java/org/apache/cocoon/generation JXTemplateGenerator.java
Date Sun, 11 Jan 2004 02:53:08 GMT
antonio     2004/01/10 18:53:08

  Modified:    src/java/org/apache/cocoon/generation
                        JXTemplateGenerator.java
  Log:
  Formating code + some performance changes.
  
  Revision  Changes    Path
  1.30      +431 -552  cocoon-2.1/src/java/org/apache/cocoon/generation/JXTemplateGenerator.java
  
  Index: JXTemplateGenerator.java
  ===================================================================
  RCS file: /home/cvs//cocoon-2.1/src/java/org/apache/cocoon/generation/JXTemplateGenerator.java,v
  retrieving revision 1.29
  retrieving revision 1.30
  diff -u -r1.29 -r1.30
  --- JXTemplateGenerator.java	6 Jan 2004 12:41:39 -0000	1.29
  +++ JXTemplateGenerator.java	11 Jan 2004 02:53:08 -0000	1.30
  @@ -88,6 +88,7 @@
   import org.apache.cocoon.xml.dom.DOMStreamer;
   import org.apache.commons.jexl.ExpressionFactory;
   import org.apache.commons.jexl.JexlContext;
  +import org.apache.commons.jexl.util.Introspector;
   import org.apache.commons.jexl.util.introspection.Info;
   import org.apache.commons.jexl.util.introspection.UberspectImpl;
   import org.apache.commons.jexl.util.introspection.VelMethod;
  @@ -456,7 +457,8 @@
                       Object[] newArgs = null;
                       if (args != null) {
                           newArgs = new Object[args.length];
  -                        for (int i = 0; i < args.length; i++) {
  +                        int len = args.length;
  +                        for (int i = 0; i < len; i++) {
                               newArgs[i] = args[i];
                               if (args[i] != null && 
                                   !(args[i] instanceof Number) &&
  @@ -769,7 +771,8 @@
           }
   
           public boolean containsKey(Object key) {
  -            if (key.equals("this")) {
  +            return this.get(key) !=null;
  +            /* if (key.equals("this")) {
                   return true;
               }
               boolean result = super.containsKey(key);
  @@ -778,7 +781,7 @@
                       result = closure.containsKey(key);
                   }
               }
  -            return result;
  +            return result; */
           }
   
           public Object get(Object key) {
  @@ -793,7 +796,6 @@
               }
               return result;
           }
  -
       }
   
       static class MyVariables implements Variables {
  @@ -840,7 +842,8 @@
           }
   
           public boolean isDeclaredVariable(String varName) {
  -            for (int i = 0; i < VARIABLES.length; i++) {
  +            int len = VARIABLES.length;
  +            for (int i = 0; i < len; i++) {
                   if (varName.equals(VARIABLES[i])) {
                       return true;
                   }
  @@ -930,22 +933,23 @@
        */
   
       private static Expression compileExpr(String expr, String errorPrefix, 
  -                                          Locator location) 
  -        throws SAXParseException {
  +                                   Locator location) throws SAXParseException {
           try {
               return compileExpr(expr);
           } catch (Exception exc) {
               throw new SAXParseException(errorPrefix + exc.getMessage(),
  -                                        location, exc);
  +                                                            location, exc);
           } catch (Error err) {
               throw new SAXParseException(errorPrefix + err.getMessage(),
  -                                        location, null);
  +                                                            location, null);
           }
       }
   
       private static Expression compileExpr(String inStr) throws Exception {
           try {
  -            if (inStr == null) return null;
  +            if (inStr == null) {
  +                return null;
  +            }
               StringReader in = new StringReader(inStr.trim());
               int ch;
               boolean xpath = false;
  @@ -1001,28 +1005,32 @@
        * Compile an integer expression (returns either a Compiled Expression
        * or an Integer literal)
        */
  -    private static Expression compileInt(String val, String msg, Locator location) 
  -        throws SAXException {
  +    private static Expression compileInt(String val, String msg,
  +                                        Locator location) throws SAXException {
           Expression res = compileExpr(val, msg, location);
  -        if (res == null) return null;
  -        if (res.compiledExpression == null) {
  -            res.compiledExpression = Integer.valueOf(res.raw);
  +        if (res != null) {
  +            if (res.compiledExpression == null) {
  +                res.compiledExpression = Integer.valueOf(res.raw);
  +            }
  +            return res;    
           }
  -        return res;
  +        return null;
       }
   
  -    private static Expression compileBoolean(String val, String msg, Locator location) 
  -        throws SAXException {
  +    private static Expression compileBoolean(String val, String msg,
  +                                        Locator location) throws SAXException {
           Expression res = compileExpr(val, msg, location);
  -        if (res == null) return null;
  -        if (res.compiledExpression == null) {
  -            res.compiledExpression = Boolean.valueOf(res.raw);
  +        if (res != null) {
  +            if (res.compiledExpression == null) {
  +                res.compiledExpression = Boolean.valueOf(res.raw);
  +            }
  +            return res;    
           }
  -        return res;
  +        return null;
       }
   
       private static Expression compile(final String variable, boolean xpath) 
  -        throws Exception {
  +                throws Exception {
           Object compiled;
           if (xpath) {
               compiled = JXPathContext.compile(variable);
  @@ -1035,32 +1043,35 @@
       static private Object getValue(Expression expr, JexlContext jexlContext,
                               JXPathContext jxpathContext, Boolean lenient) 
           throws Exception {
  -        if (expr == null) return null;
  -        Object compiled = expr.compiledExpression;
  -        try {
  -            if (compiled instanceof CompiledExpression) {
  -                CompiledExpression e = (CompiledExpression)compiled;
  -                boolean oldLenient = jxpathContext.isLenient();
  -                if (lenient != null) {
  -                    jxpathContext.setLenient(lenient.booleanValue());
  -                }
  -                try {
  -                    return e.getValue(jxpathContext);
  -                } finally {
  -                    jxpathContext.setLenient(oldLenient);
  +        if (expr != null) {
  +            Object compiled = expr.compiledExpression;
  +            try {
  +                if (compiled instanceof CompiledExpression) {
  +                    CompiledExpression e = (CompiledExpression)compiled;
  +                    boolean oldLenient = jxpathContext.isLenient();
  +                    if (lenient != null) {
  +                        jxpathContext.setLenient(lenient.booleanValue());
  +                    }
  +                    try {
  +                        return e.getValue(jxpathContext);
  +                    } finally {
  +                        jxpathContext.setLenient(oldLenient);
  +                    }
  +                } else if (compiled instanceof org.apache.commons.jexl.Expression) {
  +                    org.apache.commons.jexl.Expression e = 
  +                        (org.apache.commons.jexl.Expression)compiled;
  +                    return e.evaluate(jexlContext);
  +                }
  +                return compiled;
  +            } catch (InvocationTargetException e) {
  +                Throwable t = e.getTargetException();
  +                if (t instanceof Exception) {
  +                    throw (Exception)t;
                   }
  -            } else if (compiled instanceof org.apache.commons.jexl.Expression) {
  -                org.apache.commons.jexl.Expression e = 
  -                    (org.apache.commons.jexl.Expression)compiled;
  -                return e.evaluate(jexlContext);
  -            }
  -            return compiled;
  -        } catch (InvocationTargetException e) {
  -            Throwable t = e.getTargetException();
  -            if (t instanceof Exception) {
  -                throw (Exception)t;
  +                throw (Error)t;
               }
  -            throw (Error)t;
  +        } else {
  +            return null;
           }
       }
       
  @@ -1069,8 +1080,7 @@
       }
   
       static private int getIntValue(Expression expr, JexlContext jexlContext,
  -                            JXPathContext jxpathContext) 
  -        throws Exception {
  +                                JXPathContext jxpathContext) throws Exception {
           Object res = getValue(expr, jexlContext, jxpathContext);
           if (res instanceof Number) {
               return ((Number)res).intValue();
  @@ -1079,21 +1089,19 @@
       }
   
       static private Number getNumberValue(Expression expr, JexlContext jexlContext,
  -                               JXPathContext jxpathContext) 
  -        throws Exception {
  +                               JXPathContext jxpathContext) throws Exception {
           Object res = getValue(expr, jexlContext, jxpathContext);
           if (res instanceof Number) {
               return (Number)res;
           }
  -        if (res == null) {
  -            return null;
  +        if (res != null) {
  +            return Double.valueOf(res.toString());
           }
  -        return Double.valueOf(res.toString());
  +        return null;
       }
   
       static private String getStringValue(Expression expr, JexlContext jexlContext,
  -                                  JXPathContext jxpathContext) 
  -        throws Exception {
  +                                JXPathContext jxpathContext) throws Exception {
           Object res = getValue(expr, jexlContext, jxpathContext);
           if (res != null) {
               return res.toString();
  @@ -1169,14 +1177,12 @@
               }
               return result;
           }
  -        
       }
   
   
       static class TextEvent extends Event {
  -        TextEvent(Locator location, 
  -                  char[] chars, int start, int length) 
  -            throws SAXException {
  +        TextEvent(Locator location, char[] chars, int start, int length) 
  +                                                          throws SAXException {
               super(location);
               StringBuffer buf = new StringBuffer();
               this.raw = new char[length];
  @@ -1195,7 +1201,6 @@
                           if (inExpr) {
                               if (c == '\\') {
                                   ch = in.read();
  -                                
                                   if (ch == -1) {
                                       buf.append('\\');
                                   } else {
  @@ -1289,12 +1294,10 @@
       }
   
       static class Characters extends TextEvent {
  -        Characters(Locator location, 
  -                   char[] chars, int start, int length) 
  -            throws SAXException {
  +        Characters(Locator location, char[] chars, int start, int length) 
  +                                                          throws SAXException {
               super(location, chars, start, length);
           }
  -
       }
   
       static class StartDocument extends Event {
  @@ -1312,8 +1315,7 @@
       }
   
       static class EndElement extends Event {
  -        EndElement(Locator location, 
  -                   StartElement startElement) {
  +        EndElement(Locator location, StartElement startElement) {
               super(location);
               this.startElement = startElement;
           }
  @@ -1329,16 +1331,14 @@
       }
       
       static class IgnorableWhitespace extends TextEvent {
  -        IgnorableWhitespace(Locator location, 
  -                            char[] chars, int start, int length) 
  -            throws SAXException {
  +        IgnorableWhitespace(Locator location, char[] chars,
  +                                   int start, int length) throws SAXException {
               super(location, chars, start, length);
           }
       }
   
       static class ProcessingInstruction extends Event {
  -        ProcessingInstruction(Locator location,
  -                              String target, String data) {
  +        ProcessingInstruction(Locator location, String target, String data) {
               super(location);
               this.target = target;
               this.data = data;
  @@ -1356,8 +1356,8 @@
       }
   
       abstract static class AttributeEvent {
  -        AttributeEvent(String namespaceURI, String localName, String raw,
  -                       String type) {
  +        AttributeEvent(String namespaceURI, String localName,
  +                                                     String raw, String type) {
               this.namespaceURI = namespaceURI;
               this.localName = localName;
               this.raw = raw;
  @@ -1370,10 +1370,8 @@
       }
       
       static class CopyAttribute extends AttributeEvent {
  -        CopyAttribute(String namespaceURI, 
  -                      String localName,
  -                      String raw,
  -                      String type, String value) {
  +        CopyAttribute(String namespaceURI, String localName, String raw,
  +                                                   String type, String value) {
               super(namespaceURI, localName, raw, type);
               this.value = value;
           }
  @@ -1400,10 +1398,8 @@
       }
   
       static class SubstituteAttribute extends AttributeEvent {
  -        SubstituteAttribute(String namespaceURI,
  -                            String localName,
  -                            String raw,
  -                            String type, List substs) {
  +        SubstituteAttribute(String namespaceURI, String localName, String raw,
  +                                                    String type, List substs) {
               super(namespaceURI, localName, raw, type);
               this.substitutions = substs;
           }
  @@ -1411,17 +1407,16 @@
       }
   
       static class StartElement extends Event {
  -        StartElement(Locator location, String namespaceURI,
  -                     String localName, String raw,
  -                     Attributes attrs) 
  -            throws SAXException {
  +        StartElement(Locator location, String namespaceURI, String localName,
  +                            String raw, Attributes attrs) throws SAXException {
               super(location);
               this.namespaceURI = namespaceURI;
               this.localName = localName;
               this.raw = raw;
               this.qname = "{"+namespaceURI+"}"+localName;
               StringBuffer buf = new StringBuffer();
  -            for (int i = 0, len = attrs.getLength(); i < len; i++) {
  +            int len = attrs.getLength();
  +            for (int i = 0; i < len; i++) {
                   String uri = attrs.getURI(i);
                   String local = attrs.getLocalName(i);
                   String qname = attrs.getQName(i);
  @@ -1452,14 +1447,13 @@
                                           compiledExpression =
                                               compile(str, xpath);
                                       } catch (Exception exc) {
  -                                        throw new SAXParseException(exc.getMessage(),
  -                                                                    location,
  -                                                                    exc);
  +                                        throw new SAXParseException(
  +                                                exc.getMessage(), location,
  +                                                exc);
                                       } catch (Error err) {
  -                                        throw new SAXParseException(err.getMessage(),
  -                                                                    location,
  -                                                                    null);
  -                                        
  +                                        throw new SAXParseException(
  +                                                err.getMessage(), location,
  +                                                null);
                                       } 
                                       substEvents.add(compiledExpression);
                                       buf.setLength(0);
  @@ -1514,30 +1508,20 @@
                   }
                   if (buf.length() > 0) {
                       if (substEvents.size() == 0) {
  -                        attributeEvents.add(new CopyAttribute(uri,
  -                                                              local,
  -                                                              qname,
  -                                                              type,
  -                                                              value));
  +                        attributeEvents.add(new CopyAttribute(uri, local,
  +                                                          qname, type, value));
                       } else {
                           substEvents.add(new Literal(buf.toString()));
  -                        attributeEvents.add(new SubstituteAttribute(uri,
  -                                                                    local,
  -                                                                    qname,
  -                                                                    type,
  -                                                                    substEvents));
  +                        attributeEvents.add(new SubstituteAttribute(uri, local,
  +                                                    qname, type, substEvents));
                       }
                   } else {
                       if (substEvents.size() > 0) {
  -                        attributeEvents.add(new SubstituteAttribute(uri,
  -                                                                    local,
  -                                                                    qname,
  -                                                                    type,
  -                                                                    substEvents));
  +                        attributeEvents.add(new SubstituteAttribute(uri, local,
  +                                                     qname, type, substEvents));
                       } else {
                           attributeEvents.add(new CopyAttribute(uri, local,
  -                                                              qname, type,
  -                                                               ""));
  +                                                     qname, type, ""));
                       }
                   }
               }
  @@ -1553,8 +1537,7 @@
       }
   
       static class StartPrefixMapping extends Event {
  -        StartPrefixMapping(Locator location, String prefix,
  -                           String uri) {
  +        StartPrefixMapping(Locator location, String prefix, String uri) {
               super(location);
               this.prefix = prefix;
               this.uri = uri;
  @@ -1564,9 +1547,8 @@
       }
   
       static class Comment extends TextEvent {
  -        Comment(Locator location, char[] chars,
  -                int start, int length)
  -            throws SAXException {
  +        Comment(Locator location, char[] chars, int start, int length)
  +                    throws SAXException {
               super(location, chars, start, length);
           }
       }
  @@ -1628,8 +1610,7 @@
       }
       
       static class EndInstruction extends Event {
  -        EndInstruction(Locator locator, 
  -                       StartInstruction startInstruction) {
  +        EndInstruction(Locator locator, StartInstruction startInstruction) {
               super(locator);
               this.startInstruction = startInstruction;
               startInstruction.endInstruction = this;
  @@ -1638,9 +1619,9 @@
       }
   
       static class StartForEach extends StartInstruction {
  -        StartForEach(StartElement raw,
  -                     Expression items, Expression var, Expression varStatus,
  -                     Expression begin, Expression end, Expression step, Boolean lenient) {
  +        StartForEach(StartElement raw, Expression items, Expression var,
  +                Expression varStatus, Expression begin, Expression end,
  +                Expression step, Boolean lenient) {
               super(raw);
               this.items = items;
               this.var = var;
  @@ -1667,7 +1648,6 @@
           final Expression test;
       }
   
  -
       static class StartChoose extends StartInstruction {
           StartChoose(StartElement raw) {
               super(raw);
  @@ -1702,8 +1682,7 @@
       }
   
       static class StartImport extends StartInstruction {
  -        StartImport(StartElement raw, AttributeEvent uri, 
  -                    Expression select) {
  +        StartImport(StartElement raw, AttributeEvent uri, Expression select) {
               super(raw);
               this.uri = uri;
               this.select = select;
  @@ -1764,7 +1743,8 @@
                   } else if (e instanceof Characters) {
                       // check for whitespace
                       char[] ch = ((TextEvent)e).raw;
  -                    for (int i = 0; i < ch.length; i++) {
  +                    int len = ch.length;
  +                    for (int i = 0; i < len; i++) {
                           if (!Character.isWhitespace(ch[i])) {
                               if (params) {
                                   params = false;
  @@ -1816,37 +1796,34 @@
       private static final char UNDERSCORE = '_';
   
       private static Locale parseLocale(String locale, String variant) {
  -
           Locale ret = null;
           String language = locale;
           String country = null;
           int index = -1;
   
  -        if (((index = locale.indexOf(HYPHEN)) > -1)
  -                || ((index = locale.indexOf(UNDERSCORE)) > -1)) {
  +        if ((index = locale.indexOf(HYPHEN)) > -1
  +                || (index = locale.indexOf(UNDERSCORE)) > -1) {
               language = locale.substring(0, index);
               country = locale.substring(index+1);
           }
  -
  -        if ((language == null) || (language.length() == 0)) {
  +        if (language == null || language.length() == 0) {
               throw new IllegalArgumentException("No language in locale");
           }
  -
           if (country == null) {
  -            if (variant != null)
  +            if (variant != null) {
                   ret = new Locale(language, "", variant);
  -            else
  +            } else {
                   ret = new Locale(language, "");
  +            }
           } else if (country.length() > 0) {
  -            if (variant != null)
  +            if (variant != null) {
                   ret = new Locale(language, country, variant);
  -            else
  +            } else {
                   ret = new Locale(language, country);
  +            }
           } else {
               throw new IllegalArgumentException("Empty country in locale");
  -
           }
  -
           return ret;
       }
   
  @@ -1931,10 +1908,10 @@
               String localeStr = getStringValue(this.locale,
                                                 jexl, jxp);
               Locale loc;
  -            if (localeStr == null) {
  -                loc = Locale.getDefault();
  -            } else {
  +            if (localeStr != null) {
                   loc = parseLocale(localeStr, null);
  +            } else {
  +                loc = Locale.getDefault();
               }
               String formatted;
               if (loc != null) {
  @@ -2051,21 +2028,21 @@
               if ((currencyCode == null) && (currencySymbol == null)) {
                   return;
               }
  -            
               if ((currencyCode != null) && (currencySymbol != null)) {
  -                if (currencyClass != null)
  +                if (currencyClass != null) {
                       code = currencyCode;
  -                else
  +                } else {
                       symbol = currencySymbol;
  +                }
               } else if (currencyCode == null) {
                   symbol = currencySymbol;
               } else {
  -                if (currencyClass != null)
  +                if (currencyClass != null) {
                       code = currencyCode;
  -                else
  +                } else {
                       symbol = currencyCode;
  +                }
               }
  -            
               if (code != null) {
                   Object[] methodArgs = new Object[1];
                   
  @@ -2179,7 +2156,7 @@
               // Set time zone
               TimeZone tz = null;
               if ((timeZone instanceof String)
  -                && ((String) timeZone).equals("")) {
  +                    && ((String) timeZone).equals("")) {
                   timeZone = null;
               }
               if (timeZone != null) {
  @@ -2390,18 +2367,12 @@
               lastEvent = startEvent;
               stack.push(lastEvent);
           }
  -        
   
  -
  -        public void startElement(String namespaceURI,
  -                                 String localName,
  -                                 String qname,
  -                                 Attributes attrs) 
  -            throws SAXException {
  +        public void startElement(String namespaceURI, String localName,
  +                          String qname, Attributes attrs) throws SAXException {
               Event newEvent = null;
  -            StartElement startElement = 
  -                new StartElement(locator, namespaceURI,
  -                                 localName, qname, attrs);
  +            StartElement startElement = new StartElement(locator, namespaceURI,
  +                                                     localName, qname, attrs);
               if (NS.equals(namespaceURI)) {
                   if (localName.equals(FOR_EACH)) {
                       String items = attrs.getValue("items");
  @@ -2414,11 +2385,10 @@
                                                    FOR_EACH,
                                                    locator);
                       Expression var =
  -                        compileExpr(attrs.getValue("var"), 
  -                                    null, locator);           
  +                        compileExpr(attrs.getValue("var"), null, locator);
                       Expression varStatus =
  -                        compileExpr(attrs.getValue("varStatus"), 
  -                                    null, locator);           
  +                        compileExpr(attrs.getValue("varStatus"),
  +                                null, locator);           
                       if (items == null) {
                           if (select == null && (begin == null || end == null)) {
                               throw new SAXParseException("forEach: \"select\", \"items\", or both \"begin\" and \"end\" must be specified", locator, null);
  @@ -2426,53 +2396,46 @@
                       } else if (select != null) {
                           throw new SAXParseException("forEach: only one of \"select\" or \"items\" may be specified", locator, null);
                       }
  -                    Expression expr;
  -                    expr = compileExpr(items == null ? select : items,
  -                                       null, locator);
  +                    Expression expr = 
  +                        compileExpr(items == null ? select : items,
  +                                null, locator);
                       String lenientValue = attrs.getValue("lenient");
                       Boolean lenient = (lenientValue == null) ? null : Boolean.valueOf(lenientValue);
  -                    StartForEach startForEach = 
  -                        new StartForEach(startElement, expr, 
  -                                         var, varStatus,
  -                                         begin, end, step,lenient);
  +                    StartForEach startForEach = new StartForEach(startElement,
  +                            expr, var, varStatus, begin, end, step,lenient);
                       newEvent = startForEach;
                   } else if (localName.equals(FORMAT_NUMBER)) {
  -                    Expression value = 
  -                        compileExpr(attrs.getValue("value"),
  +                    Expression value = compileExpr(attrs.getValue("value"),
                                       null, locator);
  -                    Expression type = 
  -                        compileExpr(attrs.getValue("type"),
  +                    Expression type = compileExpr(attrs.getValue("type"),
                                       null, locator);
  -                    Expression pattern = 
  -                        compileExpr(attrs.getValue("pattern"),
  +                    Expression pattern = compileExpr(attrs.getValue("pattern"),
                                       null, locator);
  -                    Expression currencyCode = 
  +                    Expression currencyCode =
                           compileExpr(attrs.getValue("currencyCode"),
                                       null, locator);
  -                    Expression currencySymbol = 
  +                    Expression currencySymbol =
                           compileExpr(attrs.getValue("currencySymbol"),
  -                                    null, locator);       
  -                    Expression isGroupingUsed =  
  -                        compileBoolean(attrs.getValue("isGroupingUsed"), 
  +                                    null, locator);
  +                    Expression isGroupingUsed =
  +                        compileBoolean(attrs.getValue("isGroupingUsed"),
                                          null, locator);
  -                    Expression maxIntegerDigits = 
  -                        compileInt(attrs.getValue("maxIntegerDigits"), 
  -                                   null, locator);           
  -                    Expression minIntegerDigits =            
  -                        compileInt(attrs.getValue("minIntegerDigits"), 
  -                                   null, locator);           
  -                    Expression maxFractionDigits =          
  -                        compileInt(attrs.getValue("maxFractionDigits"), 
  -                                   null, locator);           
  -                    Expression minFractionDigits =           
  -                        compileInt(attrs.getValue("minFractionDigits"), 
  -                                   null, locator);           
  -                    Expression var =
  -                        compileExpr(attrs.getValue("var"), 
  -                                    null, locator);           
  -                    Expression locale =
  -                        compileExpr(attrs.getValue("locale"), 
  -                                    null, locator);           
  +                    Expression maxIntegerDigits =
  +                        compileInt(attrs.getValue("maxIntegerDigits"),
  +                                   null, locator);
  +                    Expression minIntegerDigits =
  +                        compileInt(attrs.getValue("minIntegerDigits"),
  +                                   null, locator);
  +                    Expression maxFractionDigits =
  +                        compileInt(attrs.getValue("maxFractionDigits"),
  +                                   null, locator);
  +                    Expression minFractionDigits =
  +                        compileInt(attrs.getValue("minFractionDigits"),
  +                                   null, locator);
  +                    Expression var = compileExpr(attrs.getValue("var"),
  +                                    null, locator);
  +                    Expression locale = compileExpr(attrs.getValue("locale"),
  +                                    null, locator);
                       StartFormatNumber startFormatNumber = 
                           new StartFormatNumber(startElement,
                                                 var,
  @@ -2489,30 +2452,24 @@
                                                 locale);
                       newEvent = startFormatNumber;
                   } else if (localName.equals(FORMAT_DATE)) {
  -                    Expression var =
  -                        compileExpr(attrs.getValue("var"), 
  -                                    null, locator);           
  -                    Expression value = 
  -                        compileExpr(attrs.getValue("value"),
  +                    Expression var = compileExpr(attrs.getValue("var"), 
  +                                    null, locator);
  +                    Expression value = compileExpr(attrs.getValue("value"),
                                       null, locator);
  -                    Expression type = 
  -                        compileExpr(attrs.getValue("type"),
  +                    Expression type = compileExpr(attrs.getValue("type"),
                                       null, locator);
  -                    Expression pattern = 
  -                        compileExpr(attrs.getValue("pattern"),
  +                    Expression pattern = compileExpr(attrs.getValue("pattern"),
                                       null, locator);
                       Expression timeZone =
  -                        compileExpr(attrs.getValue("timeZone"), 
  -                                    null, locator);           
  +                        compileExpr(attrs.getValue("timeZone"), null, locator);
                       Expression dateStyle =
  -                        compileExpr(attrs.getValue("dateStyle"), 
  -                                    null, locator);           
  +                        compileExpr(attrs.getValue("dateStyle"),
  +                                    null, locator);
                       Expression timeStyle =
                           compileExpr(attrs.getValue("timeStyle"), 
  -                                    null, locator);           
  +                                    null, locator);
                       Expression locale =
  -                        compileExpr(attrs.getValue("locale"), 
  -                                    null, locator);           
  +                        compileExpr(attrs.getValue("locale"), null, locator);
                       StartFormatDate startFormatDate = 
                           new StartFormatDate(startElement,
                                               var,
  @@ -2529,46 +2486,55 @@
                       newEvent = startChoose;
                   } else if (localName.equals(WHEN)) {
                       if (stack.size() == 0 ||
  -                        !(stack.peek() instanceof StartChoose)) {
  -                        throw new SAXParseException("<when> must be within <choose>", locator, null);
  +                            !(stack.peek() instanceof StartChoose)) {
  +                        throw new SAXParseException(
  +                                "<when> must be within <choose>",
  +                                locator, null);
                       }
                       String test = attrs.getValue("test");
  -                    if (test == null) {
  +                    if (test != null) {
  +                        Expression expr =
  +                            compileExpr(test, "when: \"test\": ", locator);
  +                        StartWhen startWhen =
  +                            new StartWhen(startElement, expr);
  +                        newEvent = startWhen;
  +                    } else {
                           throw new SAXParseException("when: \"test\" is required", locator, null);
                       }
  -                    Expression expr;
  -                    expr = compileExpr(test, "when: \"test\": ", locator);
  -                    StartWhen startWhen = new StartWhen(startElement, expr);
  -                    newEvent = startWhen;
                   } else if (localName.equals(OUT)) {
                       String value = attrs.getValue("value");
  -                    if (value == null) {
  +                    if (value != null) {
  +                        Expression expr =
  +                            compileExpr(value, "out: \"value\": ", locator);
  +                        String lenientValue = attrs.getValue("lenient");
  +                        Boolean lenient = lenientValue == null ?
  +                                           null : Boolean.valueOf(lenientValue);
  +                        newEvent = new StartOut(startElement, expr, lenient);
  +                    } else {
                           throw new SAXParseException("out: \"value\" is required", locator, null);
                       }
  -                    Expression expr = compileExpr(value, 
  -                                              "out: \"value\": ", 
  -                                              locator);
  -                    String lenientValue = attrs.getValue("lenient");
  -                    Boolean lenient = lenientValue == null ? null: Boolean.valueOf(lenientValue);
  -                    newEvent = new StartOut(startElement, expr, lenient);
                   } else if (localName.equals(OTHERWISE)) {
  -                    if (stack.size() == 0 ||
  -                        !(stack.peek() instanceof StartChoose)) {
  -                        throw new SAXParseException("<otherwise> must be within <choose>", locator, null);
  +                    if (stack.size() != 0 &&
  +                            (stack.peek() instanceof StartChoose)) {
  +                        StartOtherwise startOtherwise = 
  +                            new StartOtherwise(startElement);
  +                        newEvent = startOtherwise;
  +                    } else {
  +                        throw new SAXParseException(
  +                                "<otherwise> must be within <choose>",
  +                                locator, null);
                       }
  -                    StartOtherwise startOtherwise = 
  -                        new StartOtherwise(startElement);
  -                    newEvent = startOtherwise;
                   } else if (localName.equals(IF)) {
                       String test = attrs.getValue("test");
  -                    if (test == null) {
  +                    if (test != null) {
  +                        Expression expr = 
  +                            compileExpr(test, "if: \"test\": ", locator);
  +                        StartIf startIf = 
  +                            new StartIf(startElement, expr);
  +                        newEvent = startIf;
  +                    } else {
                           throw new SAXParseException("if: \"test\" is required", locator, null);
                       }
  -                    Expression expr = 
  -                        compileExpr(test, "if: \"test\": ", locator);
  -                    StartIf startIf = 
  -                        new StartIf(startElement, expr);
  -                    newEvent = startIf;
                   } else if (localName.equals(MACRO)) {
                       // <macro name="myTag" targetNamespace="myNamespace">
                       // <parameter name="paramName" required="Boolean" default="value"/>
  @@ -2579,12 +2545,14 @@
                           namespace = "";
                       }
                       String name = attrs.getValue("name");
  -                    if (name == null) {
  -                        throw new SAXParseException("macro: \"name\" is required", locator, null);
  +                    if (name != null) {
  +                        StartDefine startDefine = 
  +                            new StartDefine(startElement, namespace, name); 
  +                        newEvent = startDefine;
  +                    } else {
  +                        throw new SAXParseException(
  +                                "macro: \"name\" is required", locator, null);
                       }
  -                    StartDefine startDefine = 
  -                        new StartDefine(startElement, namespace, name); 
  -                    newEvent = startDefine;
                   } else if (localName.equals(PARAMETER)) {
                       boolean syntaxErr = false;
                       if (stack.size() < 1 ||
  @@ -2594,13 +2562,13 @@
                           String name = attrs.getValue("name");
                           String optional = attrs.getValue("optional");
                           String default_ = attrs.getValue("default");
  -                        if (name == null) {
  +                        if (name != null) {
  +                            StartParameter startParameter = new StartParameter(
  +                                    startElement, name, optional, default_);
  +                            newEvent = startParameter;
  +                        } else {
                               throw new SAXParseException("parameter: \"name\" is required", locator, null);
                           }
  -                        StartParameter startParameter = 
  -                            new StartParameter(startElement, 
  -                                               name, optional, default_);
  -                        newEvent = startParameter;
                       }
                       if (syntaxErr) {
                           throw new SAXParseException("<parameter> not allowed here", locator, null);
  @@ -2612,8 +2580,7 @@
                   } else if (localName.equals(EVAL)) {
                       String value = attrs.getValue("select");
                       Expression valueExpr = 
  -                            compileExpr(value, "eval: \"select\":",
  -                                        locator);
  +                            compileExpr(value, "eval: \"select\":", locator);
                       StartEval startEval = 
                           new StartEval(startElement, valueExpr);
                       newEvent = startEval;
  @@ -2624,13 +2591,11 @@
                       Expression valueExpr = null;
                       if (var != null) {
                           varExpr = 
  -                            compileExpr(var, "set: \"var\":",
  -                                        locator);
  +                            compileExpr(var, "set: \"var\":", locator);
                       } 
                       if (value != null) {
                           valueExpr = 
  -                            compileExpr(value, "set: \"value\":",
  -                                        locator);
  +                            compileExpr(value, "set: \"value\":", locator);
                       } 
                       StartSet startSet = new StartSet(startElement, 
                                                        varExpr, valueExpr);
  @@ -2646,21 +2611,22 @@
                               break;
                           }
                       }
  -                    if (uri == null) {
  +                    if (uri != null) {
  +                        // If "context" is present then its value will be used
  +                        // as the context object in the imported template
  +                        String select = attrs.getValue("context");
  +                        Expression expr = null;
  +                        if (select != null) {
  +                            expr = 
  +                                compileExpr(select, "import: \"context\": ",
  +                                            locator);
  +                        }
  +                        StartImport startImport = 
  +                            new StartImport(startElement, uri, expr);
  +                        newEvent = startImport;
  +                    } else {
                           throw new SAXParseException("import: \"uri\" is required", locator, null);
                       }
  -                    // If "context" is present then its value will be used
  -                    // as the context object in the imported template
  -                    String select = attrs.getValue("context");
  -                    Expression expr = null;
  -                    if (select != null) {
  -                        expr = 
  -                            compileExpr(select, "import: \"context\": ",
  -                                        locator);
  -                    }
  -                    StartImport startImport = 
  -                        new StartImport(startElement, uri, expr);
  -                    newEvent = startImport;
                   } else if (localName.equals(TEMPLATE)) {
                       StartTemplate startTemplate =
                           new StartTemplate(startElement);
  @@ -2729,11 +2695,8 @@
   
               public void endDocument() throws SAXException {
                   super.endDocument();
  -                gen.performGeneration(gen.getConsumer(),
  -                                      gen.getJexlContext(),
  -                                      gen.getJXPathContext(),
  -                                      null,
  -                                      getStartEvent(), null);
  +                gen.performGeneration(gen.getConsumer(), gen.getJexlContext(),
  +                          gen.getJXPathContext(), null, getStartEvent(), null);
               }
   
               void setConsumer(XMLConsumer consumer) {
  @@ -2754,8 +2717,7 @@
                             String src, Parameters parameters)
               throws ProcessingException, SAXException, IOException {
               templateConsumer = new TemplateConsumer(resolver, objectModel,
  -                                                    src,
  -                                                    parameters);
  +                                                    src, parameters);
           }
   
           public void setConsumer(XMLConsumer xmlConsumer) {
  @@ -2807,7 +2769,8 @@
               try {
                   this.inputSource = resolver.resolveURI(src);
               } catch (SourceException se) {
  -                throw SourceUtil.handle("Error during resolving of '" + src + "'.", se);
  +                throw SourceUtil.handle(
  +                        "Error during resolving of '" + src + "'.", se);
               }
               final String uri = inputSource.getURI();
               synchronized (cache) {
  @@ -2826,53 +2789,53 @@
           }
           Object bean = FlowHelper.getContextObject(objectModel);
           WebContinuation kont = FlowHelper.getWebContinuation(objectModel);
  -        setContexts(bean, kont,
  -                    parameters,
  -                    objectModel);
  +        setContexts(bean, kont, parameters, objectModel);
           this.definitions = new HashMap();
       }
  -    
  +
       private void fillContext(Object contextObject, Map map) {
  -        if (contextObject == null) return;
  -        // Hack: I use jxpath to populate the context object's properties
  -        // in the jexl context
  -        final JXPathBeanInfo bi = 
  -            JXPathIntrospector.getBeanInfo(contextObject.getClass());
  -        if (bi.isDynamic()) {
  -            Class cl = bi.getDynamicPropertyHandlerClass();
  -            try {
  -                DynamicPropertyHandler h = (DynamicPropertyHandler) cl.newInstance();
  -                String[] result = h.getPropertyNames(contextObject);
  -                for (int i = 0; i < result.length; i++) {
  -                    try {
  -                        map.put(result[i], h.getProperty(contextObject, result[i]));
  -                    } catch (Exception exc) {
  -                        exc.printStackTrace();
  -                    }
  -                }
  -            } catch (Exception ignored) {
  -                ignored.printStackTrace();
  -            }
  -        } else {
  -            PropertyDescriptor[] props =  bi.getPropertyDescriptors();
  -            for (int i = 0; i < props.length; i++) {
  -                try {
  -                    Method read = props[i].getReadMethod();
  -                    if (read != null) {
  -                        map.put(props[i].getName(), 
  -                                read.invoke(contextObject, null));
  +        if (contextObject != null) {
  +            // Hack: I use jxpath to populate the context object's properties
  +            // in the jexl context
  +            final JXPathBeanInfo bi = 
  +                JXPathIntrospector.getBeanInfo(contextObject.getClass());
  +            if (bi.isDynamic()) {
  +                Class cl = bi.getDynamicPropertyHandlerClass();
  +                try {
  +                    DynamicPropertyHandler h =
  +                        (DynamicPropertyHandler) cl.newInstance();
  +                    String[] result = h.getPropertyNames(contextObject);
  +                    int len = result.length; 
  +                    for (int i = 0; i < len; i++) {
  +                        try {
  +                            map.put(result[i], h.getProperty(contextObject, result[i]));
  +                        } catch (Exception exc) {
  +                            exc.printStackTrace();
  +                        }
                       }
                   } catch (Exception ignored) {
                       ignored.printStackTrace();
                   }
  +            } else {
  +                PropertyDescriptor[] props =  bi.getPropertyDescriptors();
  +                int len = props.length;
  +                for (int i = 0; i < len; i++) {
  +                    try {
  +                        Method read = props[i].getReadMethod();
  +                        if (read != null) {
  +                            map.put(props[i].getName(), 
  +                                    read.invoke(contextObject, null));
  +                        }
  +                    } catch (Exception ignored) {
  +                        ignored.printStackTrace();
  +                    }
  +                }
               }
           }
       }
   
  -    private void setContexts(Object contextObject,
  -                             WebContinuation kont,
  -                             Parameters parameters,
  -                             Map objectModel) {
  +    private void setContexts(Object contextObject, WebContinuation kont,
  +                             Parameters parameters, Map objectModel) {
           final Request request = ObjectModelHelper.getRequest(objectModel);
           final Object session = request.getSession(false);
           final Object app =  ObjectModelHelper.getContext(objectModel);
  @@ -2887,13 +2850,8 @@
                      FOM_JavaScriptFlowHelper.getFOM_Context(objectModel));
           cocoon.put("continuation", kont);
           cocoon.put("parameters", Parameters.toProperties(parameters));
  -        this.variables = new MyVariables(cocoon,
  -                                         contextObject,
  -                                         kont,
  -                                         request,
  -                                         session,
  -                                         app,
  -                                         parameters);
  +        this.variables = new MyVariables(cocoon, contextObject, kont, request,
  +                                         session, app, parameters);
           Map map;
           if (contextObject instanceof Map) {
               map = (Map)contextObject;
  @@ -2903,7 +2861,8 @@
           }
           jxpathContext = jxpathContextFactory.newContext(null, contextObject);
           jxpathContext.setVariables(variables);
  -        jxpathContext.setLenient(parameters.getParameterAsBoolean("lenient-xpath", false));
  +        jxpathContext.setLenient(parameters.getParameterAsBoolean(
  +                "lenient-xpath", false));
           globalJexlContext = new MyJexlContext();
           globalJexlContext.setVars(map);
           map = globalJexlContext.getVars();
  @@ -2949,20 +2908,16 @@
                   cache.put(cacheKey, startEvent);
               }
           }
  -        performGeneration(this.xmlConsumer,
  -                          globalJexlContext, jxpathContext, null,
  -                          startEvent, null);
  +        performGeneration(this.xmlConsumer, globalJexlContext, jxpathContext,
  +                null, startEvent, null);
       }
       
       void performGeneration(final XMLConsumer consumer,
  -                           MyJexlContext jexlContext,
  -                           JXPathContext jxpathContext,
  -                           StartElement macroCall,
  -                           Event startEvent, Event endEvent) 
  -        throws SAXException {
  +                MyJexlContext jexlContext, JXPathContext jxpathContext,
  +                StartElement macroCall, Event startEvent, Event endEvent)
  +                throws SAXException {
           cocoon.put("consumer", consumer);
  -        execute(this.xmlConsumer,
  -                globalJexlContext, jxpathContext, null,
  +        execute(this.xmlConsumer, globalJexlContext, jxpathContext, null,
                   startEvent, null);
       }
   
  @@ -2972,8 +2927,7 @@
       }
   
       private void characters(JexlContext jexlContext,
  -                            JXPathContext jxpathContext, 
  -                            TextEvent event,
  +                            JXPathContext jxpathContext, TextEvent event,
                               CharHandler handler) throws SAXException {
           Iterator iter = event.substitutions.iterator();
           while (iter.hasNext()) {
  @@ -2992,12 +2946,10 @@
                       }
                   } catch (Exception e) {
                       throw new SAXParseException(e.getMessage(),
  -                                                event.location,
  -                                                e);
  +                                                    event.location, e);
                   } catch (Error err) {
                       throw new SAXParseException(err.getMessage(),
  -                                                event.location,
  -                                                null);
  +                                                    event.location, null);
                   }
               }
               handler.characters(chars, 0, chars.length);
  @@ -3093,28 +3045,22 @@
       } 
   */
       private void executeDOM(final XMLConsumer consumer,
  -                            MyJexlContext jexlContext,
  -                            JXPathContext jxpathContext,
  -                            Node node) throws SAXException {
  +            MyJexlContext jexlContext, JXPathContext jxpathContext,
  +            Node node) throws SAXException {
           DOMStreamer streamer = new DOMStreamer(consumer);
           streamer.stream(node);
      }
   
  -    private void call(Locator location,
  -                      StartElement macroCall,
  -                      final XMLConsumer consumer,
  -                      MyJexlContext jexlContext,
  -                      JXPathContext jxpathContext,
  -                      Event startEvent, Event endEvent) 
  -        throws SAXException {
  +    private void call(Locator location, StartElement macroCall,
  +            final XMLConsumer consumer, MyJexlContext jexlContext,
  +            JXPathContext jxpathContext, Event startEvent, Event endEvent) 
  +            throws SAXException {
           try {
  -            execute(consumer, jexlContext,
  -                    jxpathContext, macroCall,
  +            execute(consumer, jexlContext, jxpathContext, macroCall,
                       startEvent, endEvent);
           } catch (SAXParseException exc) {
  -            throw new SAXParseException(macroCall.localName +": " +exc.getMessage(),
  -                                        location, 
  -                                        exc);
  +            throw new SAXParseException(macroCall.localName + ": "
  +                    + exc.getMessage(), location, exc);
           }
       }
   
  @@ -3155,11 +3101,9 @@
       }
       
       private void execute(final XMLConsumer consumer,
  -                         MyJexlContext jexlContext,
  -                         JXPathContext jxpathContext,
  -                         StartElement macroCall,
  -                         Event startEvent, Event endEvent) 
  -    throws SAXException {
  +            MyJexlContext jexlContext, JXPathContext jxpathContext,
  +            StartElement macroCall, Event startEvent, Event endEvent)
  +            throws SAXException {
           Event ev = startEvent;
           LocatorFacade loc = new LocatorFacade(ev.location);
           consumer.setDocumentLocator(loc);
  @@ -3176,18 +3120,16 @@
                       } else {
                           Expression expr = (Expression)subst;
                           try {
  -                            Object val = 
  -                                getNode(expr, jexlContext, jxpathContext);
  +                            Object val = getNode(expr, jexlContext,
  +                                    jxpathContext);
                               if (val instanceof Node) {
  -                                executeDOM(consumer,
  -                                           jexlContext,
  -                                           jxpathContext,
  -                                           (Node)val);
  +                                executeDOM(consumer, jexlContext,
  +                                        jxpathContext, (Node)val);
                                   continue;
                               } else if (val instanceof NodeList) {
                                   NodeList nodeList = (NodeList)val;
  -                                for (int i = 0, len = nodeList.getLength();
  -                                     i < len; i++) {
  +                                int len = nodeList.getLength();
  +                                for (int i = 0; i < len; i++) {
                                       Node n = nodeList.item(i);
                                       executeDOM(consumer, jexlContext,
                                                  jxpathContext, n);
  @@ -3195,8 +3137,8 @@
                                   continue;
                               } else if (val instanceof Node[]) {
                                   Node[] nodeList = (Node[])val;
  -                                for (int i = 0, len = nodeList.length;
  -                                     i < len; i++) {
  +                                int len = nodeList.length;
  +                                for (int i = 0; i < len; i++) {
                                       Node n = nodeList[i];
                                       executeDOM(consumer, jexlContext,
                                                  jxpathContext, n);
  @@ -3210,12 +3152,10 @@
                               }
                           } catch (Exception e) {
                               throw new SAXParseException(e.getMessage(),
  -                                                        ev.location,
  -                                                        e);
  +                                                        ev.location, e);
                           } catch (Error err) {
                               throw new SAXParseException(err.getMessage(),
  -                                                        ev.location,
  -                                                        null);
  +                                                        ev.location, null);
                           }
                       }
                       consumer.characters(chars, 0, chars.length);
  @@ -3226,17 +3166,13 @@
                   EndElement endElement = (EndElement)ev;
                   StartElement startElement = endElement.startElement;
                   consumer.endElement(startElement.namespaceURI,
  -                                    startElement.localName,
  -                                    startElement.raw);
  +                                    startElement.localName, startElement.raw);
               } else if (ev instanceof EndPrefixMapping) {
  -                EndPrefixMapping endPrefixMapping = 
  -                    (EndPrefixMapping)ev;
  +                EndPrefixMapping endPrefixMapping = (EndPrefixMapping)ev;
                   consumer.endPrefixMapping(endPrefixMapping.prefix);
               } else if (ev instanceof IgnorableWhitespace) {
                   TextEvent text = (TextEvent)ev;
  -                characters(jexlContext, 
  -                           jxpathContext, 
  -                           text, 
  +                characters(jexlContext, jxpathContext, text, 
                              new CharHandler() {
                                  public void characters(char[] ch, int offset,
                                                         int len) 
  @@ -3260,15 +3196,14 @@
                   StartIf startIf = (StartIf)ev;
                   Object val;
                   try {
  -                    val = getValue(startIf.test, jexlContext, jxpathContext, Boolean.TRUE);
  +                    val = getValue(startIf.test, jexlContext,
  +                            jxpathContext, Boolean.TRUE);
                   } catch (Exception e) {
                       throw new SAXParseException(e.getMessage(),
  -                                                ev.location,
  -                                                e);
  +                                                ev.location, e);
                   } catch (Error err) {
                       throw new SAXParseException(err.getMessage(),
  -                                                ev.location,
  -                                                null);
  +                                                ev.location, null);
                   }
                   boolean result = false;
                   if (val instanceof Boolean) {
  @@ -3287,9 +3222,7 @@
                   int begin, end, step;
                   String var, varStatus;
                   try {
  -                    if (items == null) {
  -                        iter = NULL_ITER;
  -                    } else {
  +                    if (items != null) {
                           Expression expr = (Expression)items;
                           if (expr.compiledExpression instanceof CompiledExpression) {
                               CompiledExpression compiledExpression = 
  @@ -3308,10 +3241,11 @@
                                   (org.apache.commons.jexl.Expression)expr.compiledExpression;
                               Object result = e.evaluate(jexlContext);
                               if (result != null) {
  -                                iter =
  -                                    org.apache.commons.jexl.util.Introspector.getUberspect().getIterator(result, new Info(ev.location.getSystemId(),
  -                                                                                                                          ev.location.getLineNumber(),
  -                                                                                                                          ev.location.getColumnNumber()));
  +                                iter = Introspector.getUberspect().getIterator(
  +                                        result,
  +                                        new Info(ev.location.getSystemId(),
  +                                                ev.location.getLineNumber(),
  +                                                ev.location.getColumnNumber()));
                               }
                               if (iter == null) {
                                   iter = EMPTY_ITER;
  @@ -3319,54 +3253,53 @@
                           } else {
                               // literal value
                               iter = new Iterator() {
  -                                    
                                   Object val = items;
  -                                
  +
                                   public boolean hasNext() {
                                       return val != null;
                                   }
  -                                
  +
                                   public Object next() {
                                       Object res = val;
                                       val = null;
                                       return res;
                                   }
  -                                
  +
                                   public void remove() {
                                   }
                               };
                           }
  +                    } else {
  +                        iter = NULL_ITER;
                       }
                       begin = startForEach.begin == null ? 0 :
                           getIntValue(startForEach.begin, jexlContext, jxpathContext);
                       end = startForEach.end == null ? Integer.MAX_VALUE : 
  -                        getIntValue(startForEach.end, jexlContext, 
  +                            getIntValue(startForEach.end, jexlContext, 
                                       jxpathContext);
                       step = startForEach.step == null ? 1 : 
  -                        getIntValue(startForEach.step, jexlContext,
  +                            getIntValue(startForEach.step, jexlContext,
                                       jxpathContext);
                       var = getStringValue(startForEach.var, jexlContext, 
                                               jxpathContext);
                       varStatus = getStringValue(startForEach.varStatus, 
  -                                               jexlContext, 
  -                                               jxpathContext);
  +                                               jexlContext, jxpathContext);
                   } catch (Exception exc) {
                       throw new SAXParseException(exc.getMessage(),
  -                                                ev.location,
  -                                                exc);
  +                                                ev.location, exc);
                   } catch (Error err) {
                       throw new SAXParseException(err.getMessage(),
  -                                                ev.location,
  -                                                null);
  +                                                ev.location, null);
                   }
  -                int i;
                   MyJexlContext localJexlContext = 
                       new MyJexlContext(jexlContext);
                   MyVariables localJXPathVariables = 
                       new MyVariables((MyVariables)jxpathContext.getVariables());
  -                    
  -                for (i = 0; i < begin && iter.hasNext(); i++) {
  +                int i = 0;
  +                // Move to the begin row
  +                while (i < begin && iter.hasNext()) {
                       iter.next();
  +                    i++;
                   }
                   LoopTagStatus status = null;
                   if (varStatus != null) {
  @@ -3375,15 +3308,13 @@
                       status.end = end;
                       status.step = step;
                       status.first = true;
  -                    localJexlContext.put(varStatus,
  -                                         status);
  -                    localJXPathVariables.declareVariable(varStatus,
  -                                                         status);
  -                }
  -                for (int count = 1; i <= end && iter.hasNext(); i+=step, count++) {
  -                    Object value;
  -                    JXPathContext localJXPathContext = null;
  -                    value = iter.next();
  +                    localJexlContext.put(varStatus, status);
  +                    localJXPathVariables.declareVariable(varStatus, status);
  +                }
  +                int skipCounter, count = 1;
  +                JXPathContext localJXPathContext = null;
  +                while (i <= end && iter.hasNext()) {
  +                    Object value = iter.next();
                       if (value instanceof Pointer) {
                           Pointer ptr = (Pointer)value;
                           localJXPathContext = 
  @@ -3392,8 +3323,7 @@
                               value = ptr.getNode();
                           } catch (Exception exc) {
                               throw new SAXParseException(exc.getMessage(),
  -                                                        ev.location,
  -                                                        null);
  +                                                        ev.location, null);
                           }
                       } else {
                           localJXPathContext =
  @@ -3411,44 +3341,45 @@
                           status.current = value;
                           status.last = (i == end || !iter.hasNext());
                       }
  -                    execute(consumer,
  -                            localJexlContext,
  -                            localJXPathContext,
  -                            macroCall,
  -                            startForEach.next,
  +                    execute(consumer, localJexlContext, localJXPathContext,
  +                            macroCall, startForEach.next,
                               startForEach.endInstruction);
  -                    for (int skip = step-1; 
  -                         skip > 0 && iter.hasNext(); --skip) {
  +                    /* Skip rows */
  +                    skipCounter = step;
  +                    while (--skipCounter > 0 && iter.hasNext()) {
                           iter.next();
                       }
  +                    /* Increase index */
  +                    i += step;
  +                    count++;
                   }
                   ev = startForEach.endInstruction.next;
                   continue;
               } else if (ev instanceof StartChoose) {
                   StartChoose startChoose = (StartChoose)ev;
                   StartWhen startWhen = startChoose.firstChoice; 
  -                for (;startWhen != null; startWhen = startWhen.nextChoice) {
  +                while (startWhen != null) {
                       Object val;
                       try {
                           val = getValue(startWhen.test, jexlContext,
                                          jxpathContext, Boolean.TRUE);
                       } catch (Exception e) {
                           throw new SAXParseException(e.getMessage(),
  -                                                    ev.location,
  -                                                    e);
  +                                                    ev.location, e);
                       }
  -                    boolean result = false;
  +                    boolean result;
                       if (val instanceof Boolean) {
                           result = ((Boolean)val).booleanValue();
                       } else {
                           result = (val != null);
                       }
                       if (result) {
  -                        execute(consumer,
  -                                jexlContext, jxpathContext, macroCall,
  -                                startWhen.next, startWhen.endInstruction);
  +                        execute(consumer, jexlContext, jxpathContext,
  +                                macroCall, startWhen.next,
  +                                startWhen.endInstruction);
                           break;
                       }
  +                    startWhen = startWhen.nextChoice;
                   }
                   if (startWhen == null) {
                       if (startChoose.otherwise != null) {
  @@ -3470,26 +3401,20 @@
                                                jxpathContext);
                       }
                       if (startSet.value != null) {
  -                        value = getNode(startSet.value,
  -                                        jexlContext, jxpathContext);
  +                        value = getNode(startSet.value, jexlContext,
  +                                            jxpathContext);
                       }
                   } catch (Exception exc) {
                       throw new SAXParseException(exc.getMessage(),
  -                                                ev.location,
  -                                                exc);
  +                                                ev.location, exc);
                   }
                   if (value == null) {
                       DOMBuilder builder = new DOMBuilder();
                       builder.startDocument();
  -                    builder.startElement(NS,
  -                                         "set",
  -                                         "set",
  -                                         EMPTY_ATTRS);
  +                    builder.startElement(NS, "set", "set", EMPTY_ATTRS);
                       execute(builder, jexlContext, jxpathContext, macroCall,
                               startSet.next, startSet.endInstruction);
  -                    builder.endElement(NS,
  -                                       "set",
  -                                       "set");
  +                    builder.endElement(NS, "set", "set");
                       builder.endDocument();
                       Node node = builder.getDocument().getDocumentElement();
                       NodeList nodeList = node.getChildNodes();
  @@ -3518,32 +3443,27 @@
                       while (i.hasNext()) {
                           String attributeName;
                           Object attributeValue;
  -                        AttributeEvent attrEvent = (AttributeEvent)
  -                            i.next();
  +                        AttributeEvent attrEvent = (AttributeEvent) i.next();
                           attributeName = attrEvent.localName;
                           if (attrEvent instanceof CopyAttribute) {
  -                            CopyAttribute copy =
  -                                (CopyAttribute)attrEvent;
  +                            CopyAttribute copy = (CopyAttribute)attrEvent;
                               attributeValue = copy.value;
                           } else if (attrEvent instanceof 
                                      SubstituteAttribute) {
                               SubstituteAttribute substEvent =
                                   (SubstituteAttribute)attrEvent;
                               if (substEvent.substitutions.size() == 1 &&
  -                                substEvent.substitutions.get(0) instanceof 
  -                                Expression) {
  +                                    substEvent.substitutions.get(0) instanceof 
  +                                    Expression) {
                                   Expression expr = (Expression)
                                       substEvent.substitutions.get(0);
                                   Object val;
                                   try {
  -                                    val = 
  -                                        getNode(expr,
  -                                                jexlContext,
  -                                                jxpathContext);
  +                                    val = getNode(expr, jexlContext,
  +                                            jxpathContext);
                                   } catch (Exception e) {
                                       throw new SAXParseException(e.getMessage(),
  -                                                                ev.location,
  -                                                                e);
  +                                                                ev.location, e);
                                   }
                                   if (val == null) {
                                       val = "";
  @@ -3551,9 +3471,10 @@
                                   attributeValue = val;
                               } else {
                                   StringBuffer buf = new StringBuffer();
  -                                Iterator ii = substEvent.substitutions.iterator();
  -                                while (ii.hasNext()) {
  -                                    Subst subst = (Subst)ii.next();
  +                                Iterator iterSubst =
  +                                    substEvent.substitutions.iterator();
  +                                while (iterSubst.hasNext()) {
  +                                    Subst subst = (Subst)iterSubst.next();
                                       if (subst instanceof Literal) {
                                           Literal lit = (Literal)subst;
                                           buf.append(lit.value);
  @@ -3561,14 +3482,12 @@
                                           Expression expr = (Expression)subst;
                                           Object val;
                                           try {
  -                                            val = 
  -                                                getValue(expr,
  -                                                         jexlContext,
  +                                            val = getValue(expr, jexlContext,
                                                            jxpathContext);
                                           } catch (Exception e) {
  -                                            throw new SAXParseException(e.getMessage(),
  -                                                                        ev.location,
  -                                                                        e);
  +                                            throw new SAXParseException(
  +                                                    e.getMessage(),
  +                                                    ev.location, e);
                                           }
                                           if (val == null) {
                                               val = "";
  @@ -3608,13 +3527,11 @@
                           vars.declareVariable(key, val);
                       }
                       JXPathContext localJXPathContext =
  -                        jxpathContextFactory.newContext(null, jxpathContext.getContextBean());
  +                            jxpathContextFactory.newContext(null,
  +                                jxpathContext.getContextBean());
                       localJXPathContext.setVariables(vars);
  -                    call(ev.location,
  -                         startElement,
  -                         consumer, 
  -                         localJexlContext, localJXPathContext,
  -                         def.body, def.endInstruction);
  +                    call(ev.location, startElement, consumer, localJexlContext,
  +                            localJXPathContext, def.body, def.endInstruction);
                       ev = startElement.endElement.next;
                       continue;
                   }
  @@ -3624,21 +3541,17 @@
                       AttributeEvent attrEvent = (AttributeEvent)
                           i.next();
                       if (attrEvent instanceof CopyAttribute) {
  -                        CopyAttribute copy =
  -                            (CopyAttribute)attrEvent;
  -                        attrs.addAttribute(copy.namespaceURI,
  -                                           copy.localName,
  -                                           copy.raw,
  -                                           copy.type,
  -                                           copy.value);
  -                    } else if (attrEvent instanceof 
  -                               SubstituteAttribute) {
  +                        CopyAttribute copy = (CopyAttribute)attrEvent;
  +                        attrs.addAttribute(copy.namespaceURI, copy.localName,
  +                                           copy.raw, copy.type, copy.value);
  +                    } else if (attrEvent instanceof SubstituteAttribute) {
                           StringBuffer buf = new StringBuffer();
                           SubstituteAttribute substEvent =
                               (SubstituteAttribute)attrEvent;
  -                        Iterator ii = substEvent.substitutions.iterator();
  -                        while (ii.hasNext()) {
  -                            Subst subst = (Subst)ii.next();
  +                        Iterator iterSubst =
  +                            substEvent.substitutions.iterator();
  +                        while (iterSubst.hasNext()) {
  +                            Subst subst = (Subst)iterSubst.next();
                               if (subst instanceof Literal) {
                                   Literal lit = (Literal)subst;
                                   buf.append(lit.value);
  @@ -3646,14 +3559,11 @@
                                   Expression expr = (Expression)subst;
                                   Object val;
                                   try {
  -                                    val = 
  -                                        getValue(expr,
  -                                                 jexlContext,
  +                                    val = getValue(expr, jexlContext,
                                                    jxpathContext);
                                   } catch (Exception e) {
                                       throw new SAXParseException(e.getMessage(),
  -                                                                ev.location,
  -                                                                e); 
  +                                                                ev.location, e); 
                                  }
                                   if (val == null) {
                                       val = "";
  @@ -3662,64 +3572,50 @@
                               }
                           }
                           attrs.addAttribute(attrEvent.namespaceURI,
  -                                           attrEvent.localName,
  -                                           attrEvent.raw,
  -                                           attrEvent.type,
  -                                           buf.toString());
  +                               attrEvent.localName, attrEvent.raw,
  +                               attrEvent.type, buf.toString());
                       }
                   }
                   consumer.startElement(startElement.namespaceURI,
  -                                      startElement.localName,
  -                                      startElement.raw,
  -                                      attrs); 
  +                              startElement.localName, startElement.raw, attrs); 
                   
               } else if (ev instanceof StartFormatNumber) {
  -                StartFormatNumber startFormatNumber = 
  -                    (StartFormatNumber)ev;
  +                StartFormatNumber startFormatNumber = (StartFormatNumber)ev;
                   try {
                       String result =
  -                        startFormatNumber.format(jexlContext,
  -                                                 jxpathContext);
  +                        startFormatNumber.format(jexlContext, jxpathContext);
                       if (result != null) {
                           char[] chars = result.toCharArray();
                           consumer.characters(chars, 0, chars.length);
                       }
                   } catch (Exception e) {
                       throw new SAXParseException(e.getMessage(),
  -                                                ev.location,
  -                                                e);
  +                            ev.location, e);
                   }
               } else if (ev instanceof StartFormatDate) {
  -                StartFormatDate startFormatDate = 
  -                    (StartFormatDate)ev;
  +                StartFormatDate startFormatDate = (StartFormatDate)ev;
                   try {
                       String result =
  -                        startFormatDate.format(jexlContext,
  -                                               jxpathContext);
  +                        startFormatDate.format(jexlContext, jxpathContext);
                       if (result != null) {
                           char[] chars = result.toCharArray();
                           consumer.characters(chars, 0, chars.length);
                       }
                   } catch (Exception e) {
                       throw new SAXParseException(e.getMessage(),
  -                                                ev.location,
  -                                                e);
  +                                                ev.location, e);
                   }
               } else if (ev instanceof StartPrefixMapping) {
  -                StartPrefixMapping startPrefixMapping = 
  -                    (StartPrefixMapping)ev;
  -                consumer.startPrefixMapping(startPrefixMapping.prefix, 
  +                StartPrefixMapping startPrefixMapping = (StartPrefixMapping)ev;
  +                consumer.startPrefixMapping(startPrefixMapping.prefix,
                                               startPrefixMapping.uri);
               } else if (ev instanceof Comment) {
                   TextEvent text = (TextEvent)ev;
                   final StringBuffer buf = new StringBuffer();
  -                characters(jexlContext, 
  -                           jxpathContext, 
  -                           text, 
  +                characters(jexlContext, jxpathContext, text, 
                              new CharHandler() {
                                  public void characters(char[] ch, int offset,
  -                                                      int len) 
  -                                   throws SAXException {
  +                                              int len) throws SAXException {
                                      buf.append(ch, offset, len);
                                  }
                              });
  @@ -3736,36 +3632,31 @@
                   consumer.startCDATA();
               } else if (ev instanceof StartDTD) {
                   StartDTD startDTD = (StartDTD)ev;
  -                consumer.startDTD(startDTD.name,
  -                                  startDTD.publicId,
  -                                  startDTD.systemId);
  +                consumer.startDTD(startDTD.name, startDTD.publicId,
  +                        startDTD.systemId);
               } else if (ev instanceof StartEntity) {
                   consumer.startEntity(((StartEntity)ev).name);
               } else if (ev instanceof StartOut) {
                   StartOut startOut = (StartOut)ev;
                   Object val;
                   try {
  -                    val = getNode(startOut.compiledExpression,
  -                                  jexlContext,
  -                                  jxpathContext,
  -                                  startOut.lenient);
  +                    val = getNode(startOut.compiledExpression, jexlContext,
  +                                  jxpathContext, startOut.lenient);
                       if (val instanceof Node) {
  -                        executeDOM(consumer,
  -                                   jexlContext,
  -                                   jxpathContext,
  +                        executeDOM(consumer, jexlContext, jxpathContext,
                                      (Node)val);
                       } else if (val instanceof NodeList) {
                           NodeList nodeList = (NodeList)val;
  -                        for (int i = 0, len = nodeList.getLength();
  -                             i < len; i++) {
  +                        int len = nodeList.getLength();
  +                        for (int i = 0; i < len; i++) {
                               Node n = nodeList.item(i);
                               executeDOM(consumer, jexlContext,
                                          jxpathContext, n);
                           }
                       } else if (val instanceof Node[]) {
                           Node[] nodeList = (Node[])val;
  -                        for (int i = 0, len = nodeList.length;
  -                             i < len; i++) {
  +                        int len = nodeList.length;
  +                        for (int i = 0;i < len; i++) {
                               Node n = nodeList[i];
                               executeDOM(consumer, jexlContext,
                                          jxpathContext, n);
  @@ -3779,8 +3670,7 @@
                       }
                   } catch (Exception e) {
                       throw new SAXParseException(e.getMessage(),
  -                                                ev.location,
  -                                                e);
  +                                                ev.location, e);
                   }
               } else if (ev instanceof StartTemplate) {
               } else if (ev instanceof StartEval) {
  @@ -3792,8 +3682,7 @@
                           throw new Exception("macro invocation required instead of: " + val);
                       }
                       StartElement call = (StartElement)val;
  -                    execute(consumer, jexlContext,
  -                            jxpathContext, call,
  +                    execute(consumer, jexlContext, jxpathContext, call,
                               call.next, call.endElement);
                   } catch (Exception exc) {
                       throw new SAXParseException(exc.getMessage(),
  @@ -3804,8 +3693,7 @@
               } else if (ev instanceof StartEvalBody) {
                   StartEvalBody startEval = (StartEvalBody)ev;
                   try {
  -                    execute(consumer, jexlContext,
  -                            jxpathContext, null,
  +                    execute(consumer, jexlContext, jxpathContext, null,
                               macroCall.next, macroCall.endElement);
                   } catch (Exception exc) {
                       throw new SAXParseException(exc.getMessage(),
  @@ -3838,18 +3726,14 @@
                               Expression expr = (Expression)subst;
                               Object val;
                               try {
  -                                val = 
  -                                    getValue(expr,
  -                                             jexlContext,
  -                                             jxpathContext);
  +                                val = getValue(expr,
  +                                        jexlContext, jxpathContext);
                               } catch (Exception exc) {
                                   throw new SAXParseException(exc.getMessage(),
  -                                                            ev.location,
  -                                                            exc);
  +                                                            ev.location, exc);
                               } catch (Error err) {
                                   throw new SAXParseException(err.getMessage(),
  -                                                            ev.location,
  -                                                            null);
  +                                                            ev.location, null);
                               }
                               if (val == null) {
                                   val = "";
  @@ -3858,13 +3742,11 @@
                           }
                       }
                       uri = buf.toString();
  -                    
                   }
                   Source input = null;
                   StartDocument doc;
                   try {
                       input = resolver.resolveURI(uri);
  -                
                       SourceValidity validity = null;
                       synchronized (cache) {
                           doc = (StartDocument)cache.get(input.getURI());
  @@ -3913,8 +3795,7 @@
                   if (startImport.select != null) {
                       try {
                           Object obj = getValue(startImport.select,
  -                                              jexlContext,
  -                                              jxpathContext);
  +                                              jexlContext, jxpathContext);
                           selectJXPath = 
                               jxpathContextFactory.newContext(null, obj);
                           selectJXPath.setVariables(variables);
  @@ -3922,21 +3803,20 @@
                           fillContext(obj, selectJexl);
                       } catch (Exception exc) {
                           throw new SAXParseException(exc.getMessage(),
  -                                                    ev.location,
  -                                                    exc);
  +                                                    ev.location, exc);
                       } catch (Error err) {
                           throw new SAXParseException(err.getMessage(),
  -                                                    ev.location,
  -                                                    null);
  +                                                    ev.location, null);
                       }
                   }
                   try {
                       execute(consumer, selectJexl, selectJXPath, macroCall,
                               doc.next, doc.endDocument);
                   } catch (Exception exc) {
  -                        throw new SAXParseException("Exception occured in imported template " + uri + ": "+ exc.getMessage(),
  -                                                    ev.location,
  -                                                    exc);
  +                        throw new SAXParseException(
  +                                "Exception occured in imported template "
  +                                + uri + ": "+ exc.getMessage(),
  +                                ev.location, exc);
                   }
                   ev = startImport.endInstruction.next;
                   continue;
  @@ -3945,4 +3825,3 @@
           }
       }
   }
  -
  
  
  

Mime
View raw message