You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by nt...@apache.org on 2017/08/16 15:36:58 UTC

[06/13] cayenne git commit: Own template render implementation: cleanup

Own template render implementation: cleanup


Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/e45f41f4
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/e45f41f4
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/e45f41f4

Branch: refs/heads/master
Commit: e45f41f4c56a958763ac89bb5e21f70689a37a96
Parents: 040bfbc
Author: Nikita Timofeev <st...@gmail.com>
Authored: Tue Aug 8 19:08:25 2017 +0300
Committer: Nikita Timofeev <st...@gmail.com>
Committed: Wed Aug 16 18:29:45 2017 +0300

----------------------------------------------------------------------
 .../parser/JJTSQLTemplateParserState.java       | 239 +++++++-------
 .../cayenne/template/parser/ParseException.java | 313 +++++++++----------
 .../parser/SQLTemplateParserTokenManager.java   |   4 +-
 .../apache/cayenne/template/parser/Token.java   | 241 +++++++-------
 .../cayenne/template/parser/TokenMgrError.java  | 258 +++++++--------
 .../template/parser/SQLTemplateParser.jjt       |   4 +-
 6 files changed, 534 insertions(+), 525 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/e45f41f4/cayenne-server/src/main/java/org/apache/cayenne/template/parser/JJTSQLTemplateParserState.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/template/parser/JJTSQLTemplateParserState.java b/cayenne-server/src/main/java/org/apache/cayenne/template/parser/JJTSQLTemplateParserState.java
index 955cfcb..667462e 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/template/parser/JJTSQLTemplateParserState.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/template/parser/JJTSQLTemplateParserState.java
@@ -1,123 +1,140 @@
-/* Generated By:JavaCC: Do not edit this line. JJTSQLTemplateParserState.java Version 5.0 */
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+
 package org.apache.cayenne.template.parser;
 
 public class JJTSQLTemplateParserState {
-  private java.util.List<Node> nodes;
-  private java.util.List<Integer> marks;
-
-  private int sp;        // number of nodes on stack
-  private int mk;        // current mark
-  private boolean node_created;
-
-  public JJTSQLTemplateParserState() {
-    nodes = new java.util.ArrayList<Node>();
-    marks = new java.util.ArrayList<Integer>();
-    sp = 0;
-    mk = 0;
-  }
-
-  /* Determines whether the current node was actually closed and
-     pushed.  This should only be called in the final user action of a
-     node scope.  */
-  public boolean nodeCreated() {
-    return node_created;
-  }
-
-  /* Call this to reinitialize the node stack.  It is called
-     automatically by the parser's ReInit() method. */
-  public void reset() {
-    nodes.clear();
-    marks.clear();
-    sp = 0;
-    mk = 0;
-  }
-
-  /* Returns the root node of the AST.  It only makes sense to call
-     this after a successful parse. */
-  public Node rootNode() {
-    return nodes.get(0);
-  }
-
-  /* Pushes a node on to the stack. */
-  public void pushNode(Node n) {
-    nodes.add(n);
-    ++sp;
-  }
-
-  /* Returns the node on the top of the stack, and remove it from the
-     stack.  */
-  public Node popNode() {
-    if (--sp < mk) {
-      mk = marks.remove(marks.size()-1);
+    private java.util.List<Node> nodes;
+    private java.util.List<Integer> marks;
+
+    private int sp;        // number of nodes on stack
+    private int mk;        // current mark
+    private boolean node_created;
+
+    public JJTSQLTemplateParserState() {
+        nodes = new java.util.ArrayList<>();
+        marks = new java.util.ArrayList<>();
+        sp = 0;
+        mk = 0;
+    }
+
+    /* Determines whether the current node was actually closed and
+       pushed.  This should only be called in the final user action of a
+       node scope.  */
+    public boolean nodeCreated() {
+        return node_created;
+    }
+
+    /* Call this to reinitialize the node stack.  It is called
+       automatically by the parser's ReInit() method. */
+    public void reset() {
+        nodes.clear();
+        marks.clear();
+        sp = 0;
+        mk = 0;
+    }
+
+    /* Returns the root node of the AST.  It only makes sense to call
+       this after a successful parse. */
+    public Node rootNode() {
+        return nodes.get(0);
+    }
+
+    /* Pushes a node on to the stack. */
+    public void pushNode(Node n) {
+        nodes.add(n);
+        ++sp;
+    }
+
+    /* Returns the node on the top of the stack, and remove it from the
+       stack.  */
+    public Node popNode() {
+        if (--sp < mk) {
+            mk = marks.remove(marks.size() - 1);
+        }
+        return nodes.remove(nodes.size() - 1);
+    }
+
+    /* Returns the node currently on the top of the stack. */
+    public Node peekNode() {
+        return nodes.get(nodes.size() - 1);
+    }
+
+    /* Returns the number of children on the stack in the current node
+       scope. */
+    public int nodeArity() {
+        return sp - mk;
     }
-    return nodes.remove(nodes.size()-1);
-  }
 
-  /* Returns the node currently on the top of the stack. */
-  public Node peekNode() {
-    return nodes.get(nodes.size()-1);
-  }
 
-  /* Returns the number of children on the stack in the current node
-     scope. */
-  public int nodeArity() {
-    return sp - mk;
-  }
+    public void clearNodeScope(Node n) {
+        while (sp > mk) {
+            popNode();
+        }
+        mk = marks.remove(marks.size() - 1);
+    }
 
 
-  public void clearNodeScope(Node n) {
-    while (sp > mk) {
-      popNode();
+    public void openNodeScope(Node n) {
+        marks.add(mk);
+        mk = sp;
+        n.jjtOpen();
     }
-    mk = marks.remove(marks.size()-1);
-  }
-
-
-  public void openNodeScope(Node n) {
-    marks.add(mk);
-    mk = sp;
-    n.jjtOpen();
-  }
-
-
-  /* A definite node is constructed from a specified number of
-     children.  That number of nodes are popped from the stack and
-     made the children of the definite node.  Then the definite node
-     is pushed on to the stack. */
-  public void closeNodeScope(Node n, int num) {
-    mk = marks.remove(marks.size()-1);
-    while (num-- > 0) {
-      Node c = popNode();
-      c.jjtSetParent(n);
-      n.jjtAddChild(c, num);
+
+
+    /* A definite node is constructed from a specified number of
+       children.  That number of nodes are popped from the stack and
+       made the children of the definite node.  Then the definite node
+       is pushed on to the stack. */
+    public void closeNodeScope(Node n, int num) {
+        mk = marks.remove(marks.size() - 1);
+        while (num-- > 0) {
+            Node c = popNode();
+            c.jjtSetParent(n);
+            n.jjtAddChild(c, num);
+        }
+        n.jjtClose();
+        pushNode(n);
+        node_created = true;
     }
-    n.jjtClose();
-    pushNode(n);
-    node_created = true;
-  }
-
-
-  /* A conditional node is constructed if its condition is true.  All
-     the nodes that have been pushed since the node was opened are
-     made children of the conditional node, which is then pushed
-     on to the stack.  If the condition is false the node is not
-     constructed and they are left on the stack. */
-  public void closeNodeScope(Node n, boolean condition) {
-    if (condition) {
-      int a = nodeArity();
-      mk = marks.remove(marks.size()-1);
-      while (a-- > 0) {
-        Node c = popNode();
-        c.jjtSetParent(n);
-        n.jjtAddChild(c, a);
-      }
-      n.jjtClose();
-      pushNode(n);
-      node_created = true;
-    } else {
-      mk = marks.remove(marks.size()-1);
-      node_created = false;
+
+
+    /* A conditional node is constructed if its condition is true.  All
+       the nodes that have been pushed since the node was opened are
+       made children of the conditional node, which is then pushed
+       on to the stack.  If the condition is false the node is not
+       constructed and they are left on the stack. */
+    public void closeNodeScope(Node n, boolean condition) {
+        if (condition) {
+            int a = nodeArity();
+            mk = marks.remove(marks.size() - 1);
+            while (a-- > 0) {
+                Node c = popNode();
+                c.jjtSetParent(n);
+                n.jjtAddChild(c, a);
+            }
+            n.jjtClose();
+            pushNode(n);
+            node_created = true;
+        } else {
+            mk = marks.remove(marks.size() - 1);
+            node_created = false;
+        }
     }
-  }
 }
-/* JavaCC - OriginalChecksum=1706cef4cf4b627318940a448e5ee9ea (do not edit this line) */

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e45f41f4/cayenne-server/src/main/java/org/apache/cayenne/template/parser/ParseException.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/template/parser/ParseException.java b/cayenne-server/src/main/java/org/apache/cayenne/template/parser/ParseException.java
index 6aeb7b6..d82accb 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/template/parser/ParseException.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/template/parser/ParseException.java
@@ -1,5 +1,3 @@
-/* Generated By:JavaCC: Do not edit this line. ParseException.java Version 5.0 */
-/* JavaCCOptions:KEEP_LINE_COL=null */
 /*****************************************************************
  *   Licensed to the Apache Software Foundation (ASF) under one
  *  or more contributor license agreements.  See the NOTICE file
@@ -26,181 +24,172 @@ package org.apache.cayenne.template.parser;
  * You can explicitly create objects of this exception type by
  * calling the method generateParseException in the generated
  * parser.
- *
+ * <p>
  * You can modify this class to customize your error reporting
  * mechanisms so long as you retain the public fields.
  */
 public class ParseException extends Exception {
 
-  /**
-   * The version identifier for this Serializable class.
-   * Increment only if the <i>serialized</i> form of the
-   * class changes.
-   */
-  private static final long serialVersionUID = 1L;
+    /**
+     * The version identifier for this Serializable class.
+     * Increment only if the <i>serialized</i> form of the
+     * class changes.
+     */
+    private static final long serialVersionUID = 1L;
 
-  /**
-   * This constructor is used by the method "generateParseException"
-   * in the generated parser.  Calling this constructor generates
-   * a new object of this type with the fields "currentToken",
-   * "expectedTokenSequences", and "tokenImage" set.
-   */
-  public ParseException(Token currentTokenVal,
-                        int[][] expectedTokenSequencesVal,
-                        String[] tokenImageVal
-                       )
-  {
-    super(initialise(currentTokenVal, expectedTokenSequencesVal, tokenImageVal));
-    currentToken = currentTokenVal;
-    expectedTokenSequences = expectedTokenSequencesVal;
-    tokenImage = tokenImageVal;
-  }
+    /**
+     * This constructor is used by the method "generateParseException"
+     * in the generated parser.  Calling this constructor generates
+     * a new object of this type with the fields "currentToken",
+     * "expectedTokenSequences", and "tokenImage" set.
+     */
+    public ParseException(Token currentTokenVal,
+                          int[][] expectedTokenSequencesVal,
+                          String[] tokenImageVal) {
+        super(initialise(currentTokenVal, expectedTokenSequencesVal, tokenImageVal));
+        currentToken = currentTokenVal;
+        expectedTokenSequences = expectedTokenSequencesVal;
+        tokenImage = tokenImageVal;
+    }
 
-  /**
-   * The following constructors are for use by you for whatever
-   * purpose you can think of.  Constructing the exception in this
-   * manner makes the exception behave in the normal way - i.e., as
-   * documented in the class "Throwable".  The fields "errorToken",
-   * "expectedTokenSequences", and "tokenImage" do not contain
-   * relevant information.  The JavaCC generated code does not use
-   * these constructors.
-   */
+    /**
+     * The following constructors are for use by you for whatever
+     * purpose you can think of.  Constructing the exception in this
+     * manner makes the exception behave in the normal way - i.e., as
+     * documented in the class "Throwable".  The fields "errorToken",
+     * "expectedTokenSequences", and "tokenImage" do not contain
+     * relevant information.  The JavaCC generated code does not use
+     * these constructors.
+     */
 
-  public ParseException() {
-    super();
-  }
+    public ParseException() {
+        super();
+    }
 
-  /** Constructor with message. */
-  public ParseException(String message) {
-    super(message);
-  }
+    /**
+     * Constructor with message.
+     */
+    public ParseException(String message) {
+        super(message);
+    }
 
 
-  /**
-   * This is the last token that has been consumed successfully.  If
-   * this object has been created due to a parse error, the token
-   * followng this token will (therefore) be the first error token.
-   */
-  public Token currentToken;
+    /**
+     * This is the last token that has been consumed successfully.  If
+     * this object has been created due to a parse error, the token
+     * followng this token will (therefore) be the first error token.
+     */
+    public Token currentToken;
 
-  /**
-   * Each entry in this array is an array of integers.  Each array
-   * of integers represents a sequence of tokens (by their ordinal
-   * values) that is expected at this point of the parse.
-   */
-  public int[][] expectedTokenSequences;
+    /**
+     * Each entry in this array is an array of integers.  Each array
+     * of integers represents a sequence of tokens (by their ordinal
+     * values) that is expected at this point of the parse.
+     */
+    public int[][] expectedTokenSequences;
 
-  /**
-   * This is a reference to the "tokenImage" array of the generated
-   * parser within which the parse error occurred.  This array is
-   * defined in the generated ...Constants interface.
-   */
-  public String[] tokenImage;
+    /**
+     * This is a reference to the "tokenImage" array of the generated
+     * parser within which the parse error occurred.  This array is
+     * defined in the generated ...Constants interface.
+     */
+    public String[] tokenImage;
 
-  /**
-   * It uses "currentToken" and "expectedTokenSequences" to generate a parse
-   * error message and returns it.  If this object has been created
-   * due to a parse error, and you do not catch it (it gets thrown
-   * from the parser) the correct error message
-   * gets displayed.
-   */
-  private static String initialise(Token currentToken,
-                           int[][] expectedTokenSequences,
-                           String[] tokenImage) {
-    String eol = System.getProperty("line.separator", "\n");
-    StringBuffer expected = new StringBuffer();
-    int maxSize = 0;
-    for (int i = 0; i < expectedTokenSequences.length; i++) {
-      if (maxSize < expectedTokenSequences[i].length) {
-        maxSize = expectedTokenSequences[i].length;
-      }
-      for (int j = 0; j < expectedTokenSequences[i].length; j++) {
-        expected.append(tokenImage[expectedTokenSequences[i][j]]).append(' ');
-      }
-      if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) {
-        expected.append("...");
-      }
-      expected.append(eol).append("    ");
-    }
-    String retval = "Encountered \"";
-    Token tok = currentToken.next;
-    for (int i = 0; i < maxSize; i++) {
-      if (i != 0) retval += " ";
-      if (tok.kind == 0) {
-        retval += tokenImage[0];
-        break;
-      }
-      retval += " " + tokenImage[tok.kind];
-      retval += " \"";
-      retval += add_escapes(tok.image);
-      retval += " \"";
-      tok = tok.next;
-    }
-    retval += "\" at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn;
-    retval += "." + eol;
-    if (expectedTokenSequences.length == 1) {
-      retval += "Was expecting:" + eol + "    ";
-    } else {
-      retval += "Was expecting one of:" + eol + "    ";
+    /**
+     * It uses "currentToken" and "expectedTokenSequences" to generate a parse
+     * error message and returns it.  If this object has been created
+     * due to a parse error, and you do not catch it (it gets thrown
+     * from the parser) the correct error message
+     * gets displayed.
+     */
+    private static String initialise(Token currentToken,
+                                     int[][] expectedTokenSequences,
+                                     String[] tokenImage) {
+        String eol = System.getProperty("line.separator", "\n");
+        StringBuilder expected = new StringBuilder();
+        int maxSize = 0;
+        for (int[] expectedTokenSequence : expectedTokenSequences) {
+            if (maxSize < expectedTokenSequence.length) {
+                maxSize = expectedTokenSequence.length;
+            }
+            for (int anExpectedTokenSequence : expectedTokenSequence) {
+                expected.append(tokenImage[anExpectedTokenSequence]).append(' ');
+            }
+            if (expectedTokenSequence[expectedTokenSequence.length - 1] != 0) {
+                expected.append("...");
+            }
+            expected.append(eol).append("    ");
+        }
+        StringBuilder retval = new StringBuilder("Encountered \"");
+        Token tok = currentToken.next;
+        for (int i = 0; i < maxSize; i++) {
+            if (i != 0) retval.append(" ");
+            if (tok.kind == 0) {
+                retval.append(tokenImage[0]);
+                break;
+            }
+            retval.append(" ").append(tokenImage[tok.kind]);
+            retval.append(" \"");
+            retval.append(add_escapes(tok.image));
+            retval.append(" \"");
+            tok = tok.next;
+        }
+        retval.append("\" at line ").append(currentToken.next.beginLine).append(", column ").append(currentToken.next.beginColumn);
+        retval.append(".").append(eol);
+        if (expectedTokenSequences.length == 1) {
+            retval.append("Was expecting:").append(eol).append("    ");
+        } else {
+            retval.append("Was expecting one of:").append(eol).append("    ");
+        }
+        retval.append(expected.toString());
+        return retval.toString();
     }
-    retval += expected.toString();
-    return retval;
-  }
 
-  /**
-   * The end of line string for this machine.
-   */
-  protected String eol = System.getProperty("line.separator", "\n");
-
-  /**
-   * Used to convert raw characters to their escaped version
-   * when these raw version cannot be used as part of an ASCII
-   * string literal.
-   */
-  static String add_escapes(String str) {
-      StringBuffer retval = new StringBuffer();
-      char ch;
-      for (int i = 0; i < str.length(); i++) {
-        switch (str.charAt(i))
-        {
-           case 0 :
-              continue;
-           case '\b':
-              retval.append("\\b");
-              continue;
-           case '\t':
-              retval.append("\\t");
-              continue;
-           case '\n':
-              retval.append("\\n");
-              continue;
-           case '\f':
-              retval.append("\\f");
-              continue;
-           case '\r':
-              retval.append("\\r");
-              continue;
-           case '\"':
-              retval.append("\\\"");
-              continue;
-           case '\'':
-              retval.append("\\\'");
-              continue;
-           case '\\':
-              retval.append("\\\\");
-              continue;
-           default:
-              if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
-                 String s = "0000" + Integer.toString(ch, 16);
-                 retval.append("\\u" + s.substring(s.length() - 4, s.length()));
-              } else {
-                 retval.append(ch);
-              }
-              continue;
+    /**
+     * Used to convert raw characters to their escaped version
+     * when these raw version cannot be used as part of an ASCII
+     * string literal.
+     */
+    static String add_escapes(String str) {
+        StringBuilder retval = new StringBuilder();
+        char ch;
+        for (int i = 0; i < str.length(); i++) {
+            switch (str.charAt(i)) {
+                case 0:
+                    continue;
+                case '\b':
+                    retval.append("\\b");
+                    continue;
+                case '\t':
+                    retval.append("\\t");
+                    continue;
+                case '\n':
+                    retval.append("\\n");
+                    continue;
+                case '\f':
+                    retval.append("\\f");
+                    continue;
+                case '\r':
+                    retval.append("\\r");
+                    continue;
+                case '\"':
+                    retval.append("\\\"");
+                    continue;
+                case '\'':
+                    retval.append("\\\'");
+                    continue;
+                case '\\':
+                    retval.append("\\\\");
+                    continue;
+                default:
+                    if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
+                        String s = "0000" + Integer.toString(ch, 16);
+                        retval.append("\\u").append(s.substring(s.length() - 4, s.length()));
+                    } else {
+                        retval.append(ch);
+                    }
+            }
         }
-      }
-      return retval.toString();
-   }
-
+        return retval.toString();
+    }
 }
-/* JavaCC - OriginalChecksum=d5a90975d310c159e7a6a6335d8bf131 (do not edit this line) */

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e45f41f4/cayenne-server/src/main/java/org/apache/cayenne/template/parser/SQLTemplateParserTokenManager.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/template/parser/SQLTemplateParserTokenManager.java b/cayenne-server/src/main/java/org/apache/cayenne/template/parser/SQLTemplateParserTokenManager.java
index 57ac76c..3bbf6f2 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/template/parser/SQLTemplateParserTokenManager.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/template/parser/SQLTemplateParserTokenManager.java
@@ -77,7 +77,7 @@ public class SQLTemplateParserTokenManager implements SQLTemplateParserConstants
     }
 
     private Object makeInt() {
-        Object  result;
+        long result;
         String  s = image.toString();
         int     base = 10;
         boolean negate = false;
@@ -105,7 +105,7 @@ public class SQLTemplateParserTokenManager implements SQLTemplateParserConstants
                 result = Long.valueOf( s, base );
                 break;
         }
-        return result;
+        return negate ? -result : result;
     }
 
     private Object makeFloat() {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e45f41f4/cayenne-server/src/main/java/org/apache/cayenne/template/parser/Token.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/template/parser/Token.java b/cayenne-server/src/main/java/org/apache/cayenne/template/parser/Token.java
index fe53fe9..cfaec2a 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/template/parser/Token.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/template/parser/Token.java
@@ -1,5 +1,3 @@
-/* Generated By:JavaCC: Do not edit this line. Token.java Version 5.0 */
-/* JavaCCOptions:TOKEN_EXTENDS=,KEEP_LINE_COL=null,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */
 /*****************************************************************
  *   Licensed to the Apache Software Foundation (ASF) under one
  *  or more contributor license agreements.  See the NOTICE file
@@ -23,128 +21,131 @@ package org.apache.cayenne.template.parser;
 
 /**
  * Describes the input token stream.
+ * @since 4.1
  */
-
 public class Token implements java.io.Serializable {
 
-  /**
-   * The version identifier for this Serializable class.
-   * Increment only if the <i>serialized</i> form of the
-   * class changes.
-   */
-  private static final long serialVersionUID = 1L;
-
-  /**
-   * An integer that describes the kind of this token.  This numbering
-   * system is determined by JavaCCParser, and a table of these numbers is
-   * stored in the file ...Constants.java.
-   */
-  public int kind;
-
-  /** The line number of the first character of this Token. */
-  public int beginLine;
-  /** The column number of the first character of this Token. */
-  public int beginColumn;
-  /** The line number of the last character of this Token. */
-  public int endLine;
-  /** The column number of the last character of this Token. */
-  public int endColumn;
-
-  /**
-   * The string image of the token.
-   */
-  public String image;
-
-  /**
-   * A reference to the next regular (non-special) token from the input
-   * stream.  If this is the last token from the input stream, or if the
-   * token manager has not read tokens beyond this one, this field is
-   * set to null.  This is true only if this token is also a regular
-   * token.  Otherwise, see below for a description of the contents of
-   * this field.
-   */
-  public Token next;
-
-  /**
-   * This field is used to access special tokens that occur prior to this
-   * token, but after the immediately preceding regular (non-special) token.
-   * If there are no such special tokens, this field is set to null.
-   * When there are more than one such special token, this field refers
-   * to the last of these special tokens, which in turn refers to the next
-   * previous special token through its specialToken field, and so on
-   * until the first special token (whose specialToken field is null).
-   * The next fields of special tokens refer to other special tokens that
-   * immediately follow it (without an intervening regular token).  If there
-   * is no such token, this field is null.
-   */
-  public Token specialToken;
-
-  /**
-   * An optional attribute value of the Token.
-   * Tokens which are not used as syntactic sugar will often contain
-   * meaningful values that will be used later on by the compiler or
-   * interpreter. This attribute value is often different from the image.
-   * Any subclass of Token that actually wants to return a non-null value can
-   * override this method as appropriate.
-   */
-  public Object getValue() {
-    return null;
-  }
-
-  /**
-   * No-argument constructor
-   */
-  public Token() {}
-
-  /**
-   * Constructs a new token for the specified Image.
-   */
-  public Token(int kind)
-  {
-    this(kind, null);
-  }
-
-  /**
-   * Constructs a new token for the specified Image and Kind.
-   */
-  public Token(int kind, String image)
-  {
-    this.kind = kind;
-    this.image = image;
-  }
-
-  /**
-   * Returns the image.
-   */
-  public String toString()
-  {
-    return image;
-  }
-
-  /**
-   * Returns a new Token object, by default. However, if you want, you
-   * can create and return subclass objects based on the value of ofKind.
-   * Simply add the cases to the switch for all those special cases.
-   * For example, if you have a subclass of Token called IDToken that
-   * you want to create if ofKind is ID, simply add something like :
-   *
-   *    case MyParserConstants.ID : return new IDToken(ofKind, image);
-   *
-   * to the following switch statement. Then you can cast matchedToken
-   * variable to the appropriate type and use sit in your lexical actions.
-   */
-  public static Token newToken(int ofKind, String image)
-  {
-    switch(ofKind)
-    {
-      default : return new Token(ofKind, image);
+    /**
+     * The version identifier for this Serializable class.
+     * Increment only if the <i>serialized</i> form of the
+     * class changes.
+     */
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * An integer that describes the kind of this token.  This numbering
+     * system is determined by JavaCCParser, and a table of these numbers is
+     * stored in the file ...Constants.java.
+     */
+    public int kind;
+
+    /**
+     * The line number of the first character of this Token.
+     */
+    public int beginLine;
+    /**
+     * The column number of the first character of this Token.
+     */
+    public int beginColumn;
+    /**
+     * The line number of the last character of this Token.
+     */
+    public int endLine;
+    /**
+     * The column number of the last character of this Token.
+     */
+    public int endColumn;
+
+    /**
+     * The string image of the token.
+     */
+    public String image;
+
+    /**
+     * A reference to the next regular (non-special) token from the input
+     * stream.  If this is the last token from the input stream, or if the
+     * token manager has not read tokens beyond this one, this field is
+     * set to null.  This is true only if this token is also a regular
+     * token.  Otherwise, see below for a description of the contents of
+     * this field.
+     */
+    public Token next;
+
+    /**
+     * This field is used to access special tokens that occur prior to this
+     * token, but after the immediately preceding regular (non-special) token.
+     * If there are no such special tokens, this field is set to null.
+     * When there are more than one such special token, this field refers
+     * to the last of these special tokens, which in turn refers to the next
+     * previous special token through its specialToken field, and so on
+     * until the first special token (whose specialToken field is null).
+     * The next fields of special tokens refer to other special tokens that
+     * immediately follow it (without an intervening regular token).  If there
+     * is no such token, this field is null.
+     */
+    public Token specialToken;
+
+    /**
+     * An optional attribute value of the Token.
+     * Tokens which are not used as syntactic sugar will often contain
+     * meaningful values that will be used later on by the compiler or
+     * interpreter. This attribute value is often different from the image.
+     * Any subclass of Token that actually wants to return a non-null value can
+     * override this method as appropriate.
+     */
+    public Object getValue() {
+        return null;
+    }
+
+    /**
+     * No-argument constructor
+     */
+    public Token() {
+    }
+
+    /**
+     * Constructs a new token for the specified Image.
+     */
+    public Token(int kind) {
+        this(kind, null);
+    }
+
+    /**
+     * Constructs a new token for the specified Image and Kind.
+     */
+    public Token(int kind, String image) {
+        this.kind = kind;
+        this.image = image;
+    }
+
+    /**
+     * Returns the image.
+     */
+    public String toString() {
+        return image;
     }
-  }
 
-  public static Token newToken(int ofKind)
-  {
-    return newToken(ofKind, null);
-  }
+    /**
+     * Returns a new Token object, by default. However, if you want, you
+     * can create and return subclass objects based on the value of ofKind.
+     * Simply add the cases to the switch for all those special cases.
+     * For example, if you have a subclass of Token called IDToken that
+     * you want to create if ofKind is ID, simply add something like :
+     * <p>
+     * case MyParserConstants.ID : return new IDToken(ofKind, image);
+     * <p>
+     * to the following switch statement. Then you can cast matchedToken
+     * variable to the appropriate type and use sit in your lexical actions.
+     */
+    public static Token newToken(int ofKind, String image) {
+        switch (ofKind) {
+            default:
+                return new Token(ofKind, image);
+        }
+    }
+
+    public static Token newToken(int ofKind) {
+        return newToken(ofKind, null);
+    }
 
 }
-/* JavaCC - OriginalChecksum=4a50f271eb81ec98d46be4c7c6402564 (do not edit this line) */

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e45f41f4/cayenne-server/src/main/java/org/apache/cayenne/template/parser/TokenMgrError.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/template/parser/TokenMgrError.java b/cayenne-server/src/main/java/org/apache/cayenne/template/parser/TokenMgrError.java
index 573fa18..027577d 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/template/parser/TokenMgrError.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/template/parser/TokenMgrError.java
@@ -1,5 +1,3 @@
-/* Generated By:JavaCC: Do not edit this line. TokenMgrError.java Version 5.0 */
-/* JavaCCOptions: */
 /*****************************************************************
  *   Licensed to the Apache Software Foundation (ASF) under one
  *  or more contributor license agreements.  See the NOTICE file
@@ -21,146 +19,150 @@
 
 package org.apache.cayenne.template.parser;
 
-/** Token Manager Error. */
-public class TokenMgrError extends Error
-{
+/**
+ * Token Manager Error.
+ */
+public class TokenMgrError extends Error {
 
-  /**
-   * The version identifier for this Serializable class.
-   * Increment only if the <i>serialized</i> form of the
-   * class changes.
-   */
-  private static final long serialVersionUID = 1L;
+    /**
+     * The version identifier for this Serializable class.
+     * Increment only if the <i>serialized</i> form of the
+     * class changes.
+     */
+    private static final long serialVersionUID = 1L;
 
   /*
    * Ordinals for various reasons why an Error of this type can be thrown.
    */
 
-  /**
-   * Lexical error occurred.
-   */
-  static final int LEXICAL_ERROR = 0;
-
-  /**
-   * An attempt was made to create a second instance of a static token manager.
-   */
-  static final int STATIC_LEXER_ERROR = 1;
-
-  /**
-   * Tried to change to an invalid lexical state.
-   */
-  static final int INVALID_LEXICAL_STATE = 2;
-
-  /**
-   * Detected (and bailed out of) an infinite loop in the token manager.
-   */
-  static final int LOOP_DETECTED = 3;
+    /**
+     * Lexical error occurred.
+     */
+    static final int LEXICAL_ERROR = 0;
+
+    /**
+     * An attempt was made to create a second instance of a static token manager.
+     */
+    static final int STATIC_LEXER_ERROR = 1;
+
+    /**
+     * Tried to change to an invalid lexical state.
+     */
+    static final int INVALID_LEXICAL_STATE = 2;
+
+    /**
+     * Detected (and bailed out of) an infinite loop in the token manager.
+     */
+    static final int LOOP_DETECTED = 3;
+
+    /**
+     * Indicates the reason why the exception is thrown. It will have
+     * one of the above 4 values.
+     */
+    int errorCode;
+
+    /**
+     * Replaces unprintable characters by their escaped (or unicode escaped)
+     * equivalents in the given string
+     */
+    protected static String addEscapes(String str) {
+        StringBuilder retval = new StringBuilder();
+        char ch;
+        for (int i = 0; i < str.length(); i++) {
+            switch (str.charAt(i)) {
+                case 0:
+                    continue;
+                case '\b':
+                    retval.append("\\b");
+                    continue;
+                case '\t':
+                    retval.append("\\t");
+                    continue;
+                case '\n':
+                    retval.append("\\n");
+                    continue;
+                case '\f':
+                    retval.append("\\f");
+                    continue;
+                case '\r':
+                    retval.append("\\r");
+                    continue;
+                case '\"':
+                    retval.append("\\\"");
+                    continue;
+                case '\'':
+                    retval.append("\\\'");
+                    continue;
+                case '\\':
+                    retval.append("\\\\");
+                    continue;
+                default:
+                    if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
+                        String s = "0000" + Integer.toString(ch, 16);
+                        retval.append("\\u").append(s.substring(s.length() - 4, s.length()));
+                    } else {
+                        retval.append(ch);
+                    }
+            }
+        }
+        return retval.toString();
+    }
 
-  /**
-   * Indicates the reason why the exception is thrown. It will have
-   * one of the above 4 values.
-   */
-  int errorCode;
+    /**
+     * Returns a detailed message for the Error when it is thrown by the
+     * token manager to indicate a lexical error.
+     * Parameters :
+     * EOFSeen     : indicates if EOF caused the lexical error
+     * curLexState : lexical state in which this error occurred
+     * errorLine   : line number when the error occurred
+     * errorColumn : column number when the error occurred
+     * errorAfter  : prefix that was seen before this error occurred
+     * curchar     : the offending character
+     * Note: You can customize the lexical error message by modifying this method.
+     */
+    protected static String LexicalError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar) {
+        return ("Lexical error at line " +
+                errorLine + ", column " +
+                errorColumn + ".  Encountered: " +
+                (EOFSeen ? "<EOF> " : ("\"" + addEscapes(String.valueOf(curChar)) + "\"") + " (" + (int) curChar + "), ") +
+                "after : \"" + addEscapes(errorAfter) + "\"");
+    }
 
-  /**
-   * Replaces unprintable characters by their escaped (or unicode escaped)
-   * equivalents in the given string
-   */
-  protected static final String addEscapes(String str) {
-    StringBuffer retval = new StringBuffer();
-    char ch;
-    for (int i = 0; i < str.length(); i++) {
-      switch (str.charAt(i))
-      {
-        case 0 :
-          continue;
-        case '\b':
-          retval.append("\\b");
-          continue;
-        case '\t':
-          retval.append("\\t");
-          continue;
-        case '\n':
-          retval.append("\\n");
-          continue;
-        case '\f':
-          retval.append("\\f");
-          continue;
-        case '\r':
-          retval.append("\\r");
-          continue;
-        case '\"':
-          retval.append("\\\"");
-          continue;
-        case '\'':
-          retval.append("\\\'");
-          continue;
-        case '\\':
-          retval.append("\\\\");
-          continue;
-        default:
-          if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
-            String s = "0000" + Integer.toString(ch, 16);
-            retval.append("\\u" + s.substring(s.length() - 4, s.length()));
-          } else {
-            retval.append(ch);
-          }
-          continue;
-      }
+    /**
+     * You can also modify the body of this method to customize your error messages.
+     * For example, cases like LOOP_DETECTED and INVALID_LEXICAL_STATE are not
+     * of end-users concern, so you can return something like :
+     * <p>
+     * "Internal Error : Please file a bug report .... "
+     * <p>
+     * from this method for such cases in the release version of your parser.
+     */
+    public String getMessage() {
+        return super.getMessage();
     }
-    return retval.toString();
-  }
-
-  /**
-   * Returns a detailed message for the Error when it is thrown by the
-   * token manager to indicate a lexical error.
-   * Parameters :
-   *    EOFSeen     : indicates if EOF caused the lexical error
-   *    curLexState : lexical state in which this error occurred
-   *    errorLine   : line number when the error occurred
-   *    errorColumn : column number when the error occurred
-   *    errorAfter  : prefix that was seen before this error occurred
-   *    curchar     : the offending character
-   * Note: You can customize the lexical error message by modifying this method.
-   */
-  protected static String LexicalError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar) {
-    return("Lexical error at line " +
-          errorLine + ", column " +
-          errorColumn + ".  Encountered: " +
-          (EOFSeen ? "<EOF> " : ("\"" + addEscapes(String.valueOf(curChar)) + "\"") + " (" + (int)curChar + "), ") +
-          "after : \"" + addEscapes(errorAfter) + "\"");
-  }
-
-  /**
-   * You can also modify the body of this method to customize your error messages.
-   * For example, cases like LOOP_DETECTED and INVALID_LEXICAL_STATE are not
-   * of end-users concern, so you can return something like :
-   *
-   *     "Internal Error : Please file a bug report .... "
-   *
-   * from this method for such cases in the release version of your parser.
-   */
-  public String getMessage() {
-    return super.getMessage();
-  }
 
   /*
    * Constructors of various flavors follow.
    */
 
-  /** No arg constructor. */
-  public TokenMgrError() {
-  }
+    /**
+     * No arg constructor.
+     */
+    public TokenMgrError() {
+    }
 
-  /** Constructor with message and reason. */
-  public TokenMgrError(String message, int reason) {
-    super(message);
-    errorCode = reason;
-  }
+    /**
+     * Constructor with message and reason.
+     */
+    public TokenMgrError(String message, int reason) {
+        super(message);
+        errorCode = reason;
+    }
 
-  /** Full Constructor. */
-  public TokenMgrError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar, int reason) {
-    this(LexicalError(EOFSeen, lexState, errorLine, errorColumn, errorAfter, curChar), reason);
-  }
+    /**
+     * Full Constructor.
+     */
+    public TokenMgrError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar, int reason) {
+        this(LexicalError(EOFSeen, lexState, errorLine, errorColumn, errorAfter, curChar), reason);
+    }
 }
-/* JavaCC - OriginalChecksum=1cf443bf553d015a7d546cad69ee7aaa (do not edit this line) */

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e45f41f4/cayenne-server/src/main/jjtree/org/apache/cayenne/template/parser/SQLTemplateParser.jjt
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/jjtree/org/apache/cayenne/template/parser/SQLTemplateParser.jjt b/cayenne-server/src/main/jjtree/org/apache/cayenne/template/parser/SQLTemplateParser.jjt
index 2ccfa45..ceeb0f4 100644
--- a/cayenne-server/src/main/jjtree/org/apache/cayenne/template/parser/SQLTemplateParser.jjt
+++ b/cayenne-server/src/main/jjtree/org/apache/cayenne/template/parser/SQLTemplateParser.jjt
@@ -288,7 +288,7 @@ TOKEN_MGR_DECLS:
     }
 
     private Object makeInt() {
-        Object  result;
+        long result;
         String  s = image.toString();
         int     base = 10;
         boolean negate = false;
@@ -316,7 +316,7 @@ TOKEN_MGR_DECLS:
                 result = Long.valueOf( s, base );
                 break;
         }
-        return result;
+        return negate ? -result : result;
     }
 
     private Object makeFloat() {