You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by re...@apache.org on 2018/10/09 16:36:54 UTC

svn commit: r1843309 [1/2] - in /tomcat/trunk: ./ java/org/apache/catalina/tribes/membership/cloud/ java/org/apache/tomcat/util/json/ res/checkstyle/ webapps/docs/

Author: remm
Date: Tue Oct  9 16:36:54 2018
New Revision: 1843309

URL: http://svn.apache.org/viewvc?rev=1843309&view=rev
Log:
Switch from Noggit to a javacc parser generated from a public domain json grammar.

Added:
    tomcat/trunk/java/org/apache/tomcat/util/json/
    tomcat/trunk/java/org/apache/tomcat/util/json/JSONParser.java   (with props)
    tomcat/trunk/java/org/apache/tomcat/util/json/JSONParser.jj   (with props)
    tomcat/trunk/java/org/apache/tomcat/util/json/JSONParserConstants.java   (with props)
    tomcat/trunk/java/org/apache/tomcat/util/json/JSONParserTokenManager.java   (with props)
    tomcat/trunk/java/org/apache/tomcat/util/json/JavaCharStream.java   (with props)
    tomcat/trunk/java/org/apache/tomcat/util/json/ParseException.java   (with props)
    tomcat/trunk/java/org/apache/tomcat/util/json/Token.java   (with props)
    tomcat/trunk/java/org/apache/tomcat/util/json/TokenMgrError.java   (with props)
Modified:
    tomcat/trunk/NOTICE
    tomcat/trunk/build.properties.default
    tomcat/trunk/build.xml
    tomcat/trunk/java/org/apache/catalina/tribes/membership/cloud/KubernetesMembershipProvider.java
    tomcat/trunk/res/checkstyle/org-import-control.xml
    tomcat/trunk/webapps/docs/changelog.xml

Modified: tomcat/trunk/NOTICE
URL: http://svn.apache.org/viewvc/tomcat/trunk/NOTICE?rev=1843309&r1=1843308&r2=1843309&view=diff
==============================================================================
--- tomcat/trunk/NOTICE (original)
+++ tomcat/trunk/NOTICE Tue Oct  9 16:36:54 2018
@@ -24,6 +24,10 @@ JDT Core Batch Compiler component, which
 The original software and related information is available at
 https://www.eclipse.org/jdt/core/.
 
+org.apache.tomcat.util.json.JSONParser.jj is a public domain javacc grammar
+for JSON written by Robert Fischer.
+https://github.com/RobertFischer/json-parser
+
 For portions of the Tomcat JNI OpenSSL API and the OpenSSL JSSE integration
 The org.apache.tomcat.jni and the org.apache.tomcat.net.openssl packages
 are derivative work originating from the Netty project and the finagle-native

Modified: tomcat/trunk/build.properties.default
URL: http://svn.apache.org/viewvc/tomcat/trunk/build.properties.default?rev=1843309&r1=1843308&r2=1843309&view=diff
==============================================================================
--- tomcat/trunk/build.properties.default (original)
+++ tomcat/trunk/build.properties.default Tue Oct  9 16:36:54 2018
@@ -283,15 +283,6 @@ saaj-api.home=${base.path}/saaj-api-${sa
 saaj-api.jar=${saaj-api.home}/saaj-api-${saaj-api.version}.jar
 saaj-api.loc=${base-maven.loc}/javax/xml/soap/saaj-api/${saaj-api.version}/saaj-api-${saaj-api.version}.jar
 
-# ----- Noggit, version 0.8 or later -----
-noggit.version=0.8
-noggit.checksum.enabled=true
-noggit.checksum.algorithm=MD5|SHA-1
-noggit.checksum.value=6856f2ceab2dd7128595e4659d22d581|ba4ad65a62d7dfcf97a8d42c82ae7d8824f9087f
-noggit.home=${base.path}/noggit-${noggit.version}
-noggit.jar=${noggit.home}/noggit-${noggit.version}.jar
-noggit.loc=${base-maven.loc}/org/noggit/noggit/${noggit.version}/noggit-${noggit.version}.jar
-
 # ----- bnd & bndlib, version 4.0.0 or later  -----
 # ----- provides OSGI metadata for JARs       -----
 bnd.version=4.0.0

Modified: tomcat/trunk/build.xml
URL: http://svn.apache.org/viewvc/tomcat/trunk/build.xml?rev=1843309&r1=1843308&r2=1843309&view=diff
==============================================================================
--- tomcat/trunk/build.xml (original)
+++ tomcat/trunk/build.xml Tue Oct  9 16:36:54 2018
@@ -213,7 +213,6 @@
   <path id="compile.classpath">
     <pathelement location="${jdt.jar}"/>
     <pathelement location="${saaj-api.jar}"/>
-    <pathelement location="${noggit.jar}"/>
   </path>
 
   <path id="tomcat.classpath">
@@ -390,6 +389,7 @@
     <include name="org/apache/tomcat/util/res/**" />
     <include name="org/apache/tomcat/util/security/**" />
     <include name="org/apache/tomcat/util/threads/**" />
+    <include name="org/apache/tomcat/util/json/**" />
     <include name="org/apache/tomcat/util/*" />
     <exclude name="org/apache/tomcat/util/bcel" />
     <exclude name="org/apache/tomcat/util/descriptor" />
@@ -596,6 +596,7 @@
         <exclude name="java/org/apache/**/parser/ParseException.java" />
         <exclude name="java/org/apache/**/parser/SimpleCharStream.java" />
         <exclude name="java/org/apache/**/parser/Token*.java" />
+        <exclude name="java/org/apache/tomcat/util/json/*.java" />
         <!-- Exclude simple test files -->
         <exclude name="test/webapp/bug53257/**/*.txt"/>
         <exclude name="test/webapp/bug49nnn/bug49464*"/>
@@ -2718,16 +2719,6 @@ skip.installer property in build.propert
       <param name="checksum.value" value="${saaj-api.checksum.value}"/>
     </antcall>
 
-    <!-- Download noggit -->
-    <antcall target="downloadfile">
-      <param name="sourcefile" value="${noggit.loc}"/>
-      <param name="destfile" value="${noggit.jar}"/>
-      <param name="destdir" value="${noggit.home}"/>
-      <param name="checksum.enabled" value="${noggit.checksum.enabled}"/>
-      <param name="checksum.algorithm" value="${noggit.checksum.algorithm}"/>
-      <param name="checksum.value" value="${noggit.checksum.value}"/>
-    </antcall>
-
  </target>
 
   <target name="download-test-compile"

Modified: tomcat/trunk/java/org/apache/catalina/tribes/membership/cloud/KubernetesMembershipProvider.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/tribes/membership/cloud/KubernetesMembershipProvider.java?rev=1843309&r1=1843308&r2=1843309&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/tribes/membership/cloud/KubernetesMembershipProvider.java (original)
+++ tomcat/trunk/java/org/apache/catalina/tribes/membership/cloud/KubernetesMembershipProvider.java Tue Oct  9 16:36:54 2018
@@ -27,6 +27,7 @@ import java.nio.file.Files;
 import java.time.Duration;
 import java.time.Instant;
 import java.util.ArrayList;
+import java.util.LinkedHashMap;
 import java.util.List;
 
 import org.apache.catalina.tribes.Member;
@@ -35,7 +36,7 @@ import org.apache.catalina.tribes.member
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
 import org.apache.tomcat.util.codec.binary.StringUtils;
-import org.noggit.JSONParser;
+import org.apache.tomcat.util.json.JSONParser;
 
 
 public class KubernetesMembershipProvider extends CloudMembershipProvider {
@@ -141,170 +142,48 @@ public class KubernetesMembershipProvide
 
     protected void parsePods(Reader reader, List<MemberImpl> members)
             throws IOException{
-
-        int event = 0;
         JSONParser parser = new JSONParser(reader);
-        boolean parseItems = false;
-        for (;;) {
-            event = parser.nextEvent();
-            switch (event) {
-            case JSONParser.STRING:
-                String value = parser.getString();
-                if (parser.wasKey()) {
-                    if ("items".equals(value) && parser.nextEvent() == JSONParser.ARRAY_START) {
-                        parseItems = true;
-                    }
-                }
-                break;
-            case JSONParser.ARRAY_END:
-                parseItems = false;
-                break;
-            case JSONParser.OBJECT_START:
-                if (parseItems) {
-                    parseItem(parser, members);
-                }
-                break;
-            default:
-                break;
-            }
-
-            if (event == JSONParser.EOF)
-                break;
-        }
-
-    }
-
-    private void parseItem(JSONParser parser, List<MemberImpl> members)
-            throws IOException {
-        int event = 0;
-        String podIP = null;
-        // Name in first position, creation in second
-        String[] nameAndCreationTimestamp = null;
-        for (;;) {
-            event = parser.nextEvent();
-            switch (event) {
-            case JSONParser.STRING:
-                String value = parser.getString();
-                if (parser.wasKey()) {
-                    if ("kind".equals(value)) {
-                        // Verify the item is a pod
-                        if (parser.nextEvent() != JSONParser.STRING && (!"Pod".equals(parser.getString()))) {
-                            throw new IllegalStateException();
-                        }
-                    } else if ("status".equals(value)) {
-                        // Verify the status is Running and return the podIP
-                        podIP = parseStatus(parser);
-                    } else if ("metadata".equals(value)) {
-                        nameAndCreationTimestamp = parseMetadata(parser);
-                    }
-                }
-                break;
-            case JSONParser.OBJECT_END:
-                // Done
-                if (podIP == null || nameAndCreationTimestamp == null
-                    || nameAndCreationTimestamp[0] == null
-                    || nameAndCreationTimestamp[1] == null) {
-                    throw new IOException(sm.getString("kubernetesMembershipProvider.jsonError"));
-                } else {
-                    // We found ourselves, ignore
-                    if (nameAndCreationTimestamp[0].equals(hostName))
-                        return;
-
-                    // id = md5(hostname)
-                    byte[] id = md5.digest(nameAndCreationTimestamp[0].getBytes());
-                    long aliveTime = Duration.between(Instant.parse(nameAndCreationTimestamp[1]), startTime).getSeconds() * 1000; // aliveTime is in ms
-
-                    MemberImpl member = null;
-                    try {
-                        member = new MemberImpl(podIP, port, aliveTime);
-                    } catch (IOException e) {
-                        // Shouldn't happen:
-                        // an exception is thrown if hostname can't be resolved to IP, but we already provide an IP
-                        log.error(sm.getString("kubernetesMembershipProvider.memberError"), e);
-                        continue;
-                    }
-
-                    member.setUniqueId(id);
-                    members.add(member);
-                }
-                return;
-            default:
-                break;
-            }
-
-            if (event == JSONParser.EOF)
-                break;
-        }
-
-    }
-
-    private String parseStatus(JSONParser parser)
-            throws IOException {
-        String result = null;
-        int event = 0;
-        for (;;) {
-            event = parser.nextEvent();
-            switch (event) {
-            case JSONParser.STRING:
-                String value = parser.getString();
-                if (parser.wasKey()) {
-                    if ("phase".equals(value)) {
-                        // Verify the item is a pod
-                        if (parser.nextEvent() != JSONParser.STRING && (!"Running".equals(parser.getString()))) {
-                            return null;
-                        }
-                    } else if ("podIP".equals(value)) {
-                        if (parser.nextEvent() == JSONParser.STRING) {
-                            result = parser.getString();
-                        }
-                    }
+        try {
+            LinkedHashMap<String, Object> json = parser.object();
+            @SuppressWarnings("unchecked")
+            List<Object> items = (List<Object>) json.get("items");
+            for (Object podObject : items) {
+                @SuppressWarnings("unchecked")
+                LinkedHashMap<String, Object> pod = (LinkedHashMap<String, Object>) podObject;
+                if (!"Pod".equals(pod.get("kind"))) {
+                    continue;
+                }
+                @SuppressWarnings("unchecked")
+                LinkedHashMap<String, Object> metadata = (LinkedHashMap<String, Object>) pod.get("metadata");
+                String name = metadata.get("name").toString();
+                String creationTimestamp = metadata.get("creationTimestamp").toString();
+                @SuppressWarnings("unchecked")
+                LinkedHashMap<String, Object> status = (LinkedHashMap<String, Object>) pod.get("status");
+                if (!"Running".equals(status.get("phase"))) {
+                    continue;
+                }
+                String podIP = status.get("podIP").toString();
+
+                // id = md5(hostname)
+                byte[] id = md5.digest(name.getBytes());
+                long aliveTime = Duration.between(Instant.parse(creationTimestamp), startTime).getSeconds() * 1000; // aliveTime is in ms
+
+                MemberImpl member = null;
+                try {
+                    member = new MemberImpl(podIP, port, aliveTime);
+                } catch (IOException e) {
+                    // Shouldn't happen:
+                    // an exception is thrown if hostname can't be resolved to IP, but we already provide an IP
+                    log.error(sm.getString("kubernetesMembershipProvider.memberError"), e);
+                    continue;
                 }
-                break;
-            case JSONParser.OBJECT_END:
-                // Done
-                return result;
-            default:
-                break;
-            }
-
-            if (event == JSONParser.EOF)
-                break;
-        }
-        return result;
-    }
 
-    private String[] parseMetadata(JSONParser parser)
-            throws IOException {
-        String[] result = new String[2];
-        int event = 0;
-        for (;;) {
-            event = parser.nextEvent();
-            switch (event) {
-            case JSONParser.STRING:
-                String value = parser.getString();
-                if (parser.wasKey()) {
-                    if ("name".equals(value)) {
-                        if (parser.nextEvent() == JSONParser.STRING) {
-                            result[0] = parser.getString();
-                        }
-                    } else if ("creationTimestamp".equals(value)) {
-                        if (parser.nextEvent() == JSONParser.STRING) {
-                            result[1] = parser.getString();
-                        }
-                    }
-                }
-                break;
-            case JSONParser.OBJECT_END:
-                // Done
-                return result;
-            default:
-                break;
+                member.setUniqueId(id);
+                members.add(member);
             }
-
-            if (event == JSONParser.EOF)
-                break;
+        } catch (Exception e) {
+            throw new IOException(sm.getString("kubernetesMembershipProvider.jsonError"), e);
         }
-        return result;
     }
 
 }

Added: tomcat/trunk/java/org/apache/tomcat/util/json/JSONParser.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/json/JSONParser.java?rev=1843309&view=auto
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/json/JSONParser.java (added)
+++ tomcat/trunk/java/org/apache/tomcat/util/json/JSONParser.java Tue Oct  9 16:36:54 2018
@@ -0,0 +1,616 @@
+/* JSONParser.java */
+/* Generated By:JavaCC: Do not edit this line. JSONParser.java */
+/*
+ * 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.tomcat.util.json;
+
+import java.io.*;
+import java.util.*;
+import java.math.*;
+
+/**
+* Basic JSON parser generated by JavaCC. It consumes the input provided through the constructor when 
+* {@code parseObject()}, {@code parseList()}, or {@code parse()} are called, and there is no way to directly
+* reset the state.
+* Set the {@code fallbackToString} property if you want to enable
+* unparsable constructs (such as unquoted strings) to be handled as Strings: otherwise, they are a parse
+* error.
+*
+* <p />
+*
+* This class makes no pretenses towards being thread safe.
+*/
+public class JSONParser implements JSONParserConstants {
+
+    private boolean nativeNumbers = false;
+
+    public JSONParser(String input) {
+    this(new StringReader(input));
+  }
+
+    /**
+    * Parses a JSON object into a Java {@code Map}.
+    */
+    public LinkedHashMap<String,Object> parseObject() throws ParseException {
+        LinkedHashMap<String,Object> toReturn = object();
+        if(!ensureEOF()) throw new IllegalStateException("Expected EOF, but still had content to parse");
+        return toReturn;
+    }
+
+    /**
+    * Parses a JSON array into a Java {@code List}.
+    */
+    public ArrayList<Object> parseArray() throws ParseException {
+        ArrayList<Object> toReturn = list();
+        if(!ensureEOF()) throw new IllegalStateException("Expected EOF, but still had content to parse");
+        return toReturn;
+    }
+
+    /**
+    * Parses any JSON-parseable object, returning the value. 
+    */
+    public Object parse() throws ParseException {
+        Object toReturn = anything();
+        if(!ensureEOF()) throw new IllegalStateException("Expected EOF, but still had content to parse");
+        return toReturn;
+    }
+
+    private static String substringBefore(String str, char delim) {
+        int pos = str.indexOf(delim);
+        if(pos == -1) return str;
+        return str.substring(0, pos);
+    }
+
+    public void setNativeNumbers(boolean value) {
+        this.nativeNumbers = value;
+    }
+
+    public boolean getNativeNumbers() {
+        return this.nativeNumbers;
+    }
+
+  final public boolean ensureEOF() throws ParseException {
+    jj_consume_token(0);
+{if ("" != null) return true;}
+    throw new Error("Missing return statement in function");
+}
+
+  final public Object anything() throws ParseException {Object x;
+    switch (jj_nt.kind) {
+    case BRACE_OPEN:{
+      x = object();
+      break;
+      }
+    case BRACKET_OPEN:{
+      x = list();
+      break;
+      }
+    case NUMBER_INTEGER:
+    case NUMBER_DECIMAL:
+    case TRUE:
+    case FALSE:
+    case NULL:
+    case STRING_SINGLE_EMPTY:
+    case STRING_DOUBLE_EMPTY:
+    case STRING_SINGLE_NONEMPTY:
+    case STRING_DOUBLE_NONEMPTY:
+    case RUBY_SYMBOL:{
+      x = value();
+      break;
+      }
+    default:
+      jj_la1[0] = jj_gen;
+      jj_consume_token(-1);
+      throw new ParseException();
+    }
+{if ("" != null) return x;}
+    throw new Error("Missing return statement in function");
+}
+
+  final public String objectKey() throws ParseException {Object o;
+    String key;
+    switch (jj_nt.kind) {
+    case STRING_SINGLE_EMPTY:
+    case STRING_DOUBLE_EMPTY:
+    case STRING_SINGLE_NONEMPTY:
+    case STRING_DOUBLE_NONEMPTY:
+    case RUBY_SYMBOL:{
+      key = string();
+      break;
+      }
+    case SYMBOL:{
+      key = symbol();
+      break;
+      }
+    case NULL:{
+      nullValue();
+key = null;
+      break;
+      }
+    case NUMBER_INTEGER:
+    case NUMBER_DECIMAL:
+    case TRUE:
+    case FALSE:{
+      switch (jj_nt.kind) {
+      case TRUE:
+      case FALSE:{
+        o = booleanValue();
+        break;
+        }
+      case NUMBER_INTEGER:
+      case NUMBER_DECIMAL:{
+        o = number();
+        break;
+        }
+      default:
+        jj_la1[1] = jj_gen;
+        jj_consume_token(-1);
+        throw new ParseException();
+      }
+key = o.toString();
+      break;
+      }
+    default:
+      jj_la1[2] = jj_gen;
+      jj_consume_token(-1);
+      throw new ParseException();
+    }
+{if ("" != null) return key;}
+    throw new Error("Missing return statement in function");
+}
+
+  final public LinkedHashMap<String,Object> object() throws ParseException {final LinkedHashMap<String,Object> map = new LinkedHashMap<String,Object>();
+    String key;
+    Object value;
+    jj_consume_token(BRACE_OPEN);
+    switch (jj_nt.kind) {
+    case NUMBER_INTEGER:
+    case NUMBER_DECIMAL:
+    case TRUE:
+    case FALSE:
+    case NULL:
+    case STRING_SINGLE_EMPTY:
+    case STRING_DOUBLE_EMPTY:
+    case STRING_SINGLE_NONEMPTY:
+    case STRING_DOUBLE_NONEMPTY:
+    case RUBY_SYMBOL:
+    case SYMBOL:{
+      key = objectKey();
+      jj_consume_token(COLON);
+      value = anything();
+map.put(key, value);
+key = null; value = null;
+      label_1:
+      while (true) {
+        switch (jj_nt.kind) {
+        case COMMA:{
+          ;
+          break;
+          }
+        default:
+          jj_la1[3] = jj_gen;
+          break label_1;
+        }
+        jj_consume_token(COMMA);
+        key = objectKey();
+        jj_consume_token(COLON);
+        value = anything();
+map.put(key, value);
+key = null; value = null;
+      }
+      break;
+      }
+    default:
+      jj_la1[4] = jj_gen;
+      ;
+    }
+    jj_consume_token(BRACE_CLOSE);
+{if ("" != null) return map;}
+    throw new Error("Missing return statement in function");
+}
+
+  final public ArrayList<Object> list() throws ParseException {final ArrayList<Object> list = new ArrayList<Object>();
+    Object value;
+    jj_consume_token(BRACKET_OPEN);
+    switch (jj_nt.kind) {
+    case BRACE_OPEN:
+    case BRACKET_OPEN:
+    case NUMBER_INTEGER:
+    case NUMBER_DECIMAL:
+    case TRUE:
+    case FALSE:
+    case NULL:
+    case STRING_SINGLE_EMPTY:
+    case STRING_DOUBLE_EMPTY:
+    case STRING_SINGLE_NONEMPTY:
+    case STRING_DOUBLE_NONEMPTY:
+    case RUBY_SYMBOL:{
+      value = anything();
+list.add(value);
+value = null;
+      label_2:
+      while (true) {
+        switch (jj_nt.kind) {
+        case COMMA:{
+          ;
+          break;
+          }
+        default:
+          jj_la1[5] = jj_gen;
+          break label_2;
+        }
+        jj_consume_token(COMMA);
+        value = anything();
+list.add(value);
+value = null;
+      }
+      break;
+      }
+    default:
+      jj_la1[6] = jj_gen;
+      ;
+    }
+    jj_consume_token(BRACKET_CLOSE);
+list.trimToSize();
+        {if ("" != null) return list;}
+    throw new Error("Missing return statement in function");
+}
+
+  final public Object value() throws ParseException {Object x;
+    switch (jj_nt.kind) {
+    case STRING_SINGLE_EMPTY:
+    case STRING_DOUBLE_EMPTY:
+    case STRING_SINGLE_NONEMPTY:
+    case STRING_DOUBLE_NONEMPTY:
+    case RUBY_SYMBOL:{
+      x = string();
+      break;
+      }
+    case NUMBER_INTEGER:
+    case NUMBER_DECIMAL:{
+      x = number();
+      break;
+      }
+    case TRUE:
+    case FALSE:{
+      x = booleanValue();
+      break;
+      }
+    case NULL:{
+      x = nullValue();
+      break;
+      }
+    default:
+      jj_la1[7] = jj_gen;
+      jj_consume_token(-1);
+      throw new ParseException();
+    }
+{if ("" != null) return x;}
+    throw new Error("Missing return statement in function");
+}
+
+  final public Object nullValue() throws ParseException {
+    jj_consume_token(NULL);
+{if ("" != null) return null;}
+    throw new Error("Missing return statement in function");
+}
+
+  final public Boolean booleanValue() throws ParseException {Boolean b;
+    switch (jj_nt.kind) {
+    case TRUE:{
+      jj_consume_token(TRUE);
+b = Boolean.TRUE;
+      break;
+      }
+    case FALSE:{
+      jj_consume_token(FALSE);
+b = Boolean.FALSE;
+      break;
+      }
+    default:
+      jj_la1[8] = jj_gen;
+      jj_consume_token(-1);
+      throw new ParseException();
+    }
+{if ("" != null) return b;}
+    throw new Error("Missing return statement in function");
+}
+
+  final public Number number() throws ParseException {Token t;
+    switch (jj_nt.kind) {
+    case NUMBER_DECIMAL:{
+      t = jj_consume_token(NUMBER_DECIMAL);
+if(nativeNumbers) {
+                {if ("" != null) return new Long(t.image);}
+            } else {
+                {if ("" != null) return new BigDecimal(t.image);}
+            }
+      break;
+      }
+    case NUMBER_INTEGER:{
+      t = jj_consume_token(NUMBER_INTEGER);
+if(nativeNumbers) {
+                {if ("" != null) return new Double(t.image);}
+            } else {
+                {if ("" != null) return new BigInteger(substringBefore(t.image, '.'));}
+            }
+      break;
+      }
+    default:
+      jj_la1[9] = jj_gen;
+      jj_consume_token(-1);
+      throw new ParseException();
+    }
+    throw new Error("Missing return statement in function");
+}
+
+  final public String string() throws ParseException {String s;
+    switch (jj_nt.kind) {
+    case STRING_DOUBLE_EMPTY:
+    case STRING_DOUBLE_NONEMPTY:{
+      s = doubleQuoteString();
+      break;
+      }
+    case STRING_SINGLE_EMPTY:
+    case STRING_SINGLE_NONEMPTY:{
+      s = singleQuoteString();
+      break;
+      }
+    case RUBY_SYMBOL:{
+      s = rubySymbol();
+      break;
+      }
+    default:
+      jj_la1[10] = jj_gen;
+      jj_consume_token(-1);
+      throw new ParseException();
+    }
+{if ("" != null) return s;}
+    throw new Error("Missing return statement in function");
+}
+
+  final public String rubySymbol() throws ParseException {
+    jj_consume_token(RUBY_SYMBOL);
+{if ("" != null) return token.image.substring(1);}
+    throw new Error("Missing return statement in function");
+}
+
+  final public String doubleQuoteString() throws ParseException {
+    switch (jj_nt.kind) {
+    case STRING_DOUBLE_EMPTY:{
+      jj_consume_token(STRING_DOUBLE_EMPTY);
+{if ("" != null) return "";}
+      break;
+      }
+    case STRING_DOUBLE_NONEMPTY:{
+      jj_consume_token(STRING_DOUBLE_NONEMPTY);
+String image = token.image;
+            {if ("" != null) return image.substring(1, image.length()-1);}
+      break;
+      }
+    default:
+      jj_la1[11] = jj_gen;
+      jj_consume_token(-1);
+      throw new ParseException();
+    }
+    throw new Error("Missing return statement in function");
+}
+
+  final public String singleQuoteString() throws ParseException {
+    switch (jj_nt.kind) {
+    case STRING_SINGLE_EMPTY:{
+      jj_consume_token(STRING_SINGLE_EMPTY);
+{if ("" != null) return "";}
+      break;
+      }
+    case STRING_SINGLE_NONEMPTY:{
+      jj_consume_token(STRING_SINGLE_NONEMPTY);
+String image = token.image;
+            {if ("" != null) return image.substring(1, image.length()-1);}
+      break;
+      }
+    default:
+      jj_la1[12] = jj_gen;
+      jj_consume_token(-1);
+      throw new ParseException();
+    }
+    throw new Error("Missing return statement in function");
+}
+
+  final public String symbol() throws ParseException {
+    jj_consume_token(SYMBOL);
+{if ("" != null) return token.image;}
+    throw new Error("Missing return statement in function");
+}
+
+  /** Generated Token Manager. */
+  public JSONParserTokenManager token_source;
+  JavaCharStream jj_input_stream;
+  /** Current token. */
+  public Token token;
+  /** Next token. */
+  public Token jj_nt;
+  private int jj_gen;
+  final private int[] jj_la1 = new int[13];
+  static private int[] jj_la1_0;
+  static {
+	   jj_la1_init_0();
+	}
+	private static void jj_la1_init_0() {
+	   jj_la1_0 = new int[] {0x1ccf8480,0x78000,0x3ccf8000,0x40,0x3ccf8000,0x40,0x1ccf8480,0x1ccf8000,0x60000,0x18000,0x1cc00000,0x8800000,0x4400000,};
+	}
+
+  /** Constructor with InputStream. */
+  public JSONParser(java.io.InputStream stream) {
+	  this(stream, null);
+  }
+  /** Constructor with InputStream and supplied encoding */
+  public JSONParser(java.io.InputStream stream, String encoding) {
+	 try { jj_input_stream = new JavaCharStream(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
+	 token_source = new JSONParserTokenManager(jj_input_stream);
+	 token = new Token();
+	 token.next = jj_nt = token_source.getNextToken();
+	 jj_gen = 0;
+	 for (int i = 0; i < 13; i++) jj_la1[i] = -1;
+  }
+
+  /** Reinitialise. */
+  public void ReInit(java.io.InputStream stream) {
+	  ReInit(stream, null);
+  }
+  /** Reinitialise. */
+  public void ReInit(java.io.InputStream stream, String encoding) {
+	 try { jj_input_stream.ReInit(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
+	 token_source.ReInit(jj_input_stream);
+	 token = new Token();
+	 token.next = jj_nt = token_source.getNextToken();
+	 jj_gen = 0;
+	 for (int i = 0; i < 13; i++) jj_la1[i] = -1;
+  }
+
+  /** Constructor. */
+  public JSONParser(java.io.Reader stream) {
+	 jj_input_stream = new JavaCharStream(stream, 1, 1);
+	 token_source = new JSONParserTokenManager(jj_input_stream);
+	 token = new Token();
+	 token.next = jj_nt = token_source.getNextToken();
+	 jj_gen = 0;
+	 for (int i = 0; i < 13; i++) jj_la1[i] = -1;
+  }
+
+  /** Reinitialise. */
+  public void ReInit(java.io.Reader stream) {
+	if (jj_input_stream == null) {
+	   jj_input_stream = new JavaCharStream(stream, 1, 1);
+	} else {
+	   jj_input_stream.ReInit(stream, 1, 1);
+	}
+	if (token_source == null) {
+ token_source = new JSONParserTokenManager(jj_input_stream);
+	}
+
+	 token_source.ReInit(jj_input_stream);
+	 token = new Token();
+	 token.next = jj_nt = token_source.getNextToken();
+	 jj_gen = 0;
+	 for (int i = 0; i < 13; i++) jj_la1[i] = -1;
+  }
+
+  /** Constructor with generated Token Manager. */
+  public JSONParser(JSONParserTokenManager tm) {
+	 token_source = tm;
+	 token = new Token();
+	 token.next = jj_nt = token_source.getNextToken();
+	 jj_gen = 0;
+	 for (int i = 0; i < 13; i++) jj_la1[i] = -1;
+  }
+
+  /** Reinitialise. */
+  public void ReInit(JSONParserTokenManager tm) {
+	 token_source = tm;
+	 token = new Token();
+	 token.next = jj_nt = token_source.getNextToken();
+	 jj_gen = 0;
+	 for (int i = 0; i < 13; i++) jj_la1[i] = -1;
+  }
+
+  private Token jj_consume_token(int kind) throws ParseException {
+	 Token oldToken = token;
+	 if ((token = jj_nt).next != null) jj_nt = jj_nt.next;
+	 else jj_nt = jj_nt.next = token_source.getNextToken();
+	 if (token.kind == kind) {
+	   jj_gen++;
+	   return token;
+	 }
+	 jj_nt = token;
+	 token = oldToken;
+	 jj_kind = kind;
+	 throw generateParseException();
+  }
+
+
+/** Get the next Token. */
+  final public Token getNextToken() {
+	 if ((token = jj_nt).next != null) jj_nt = jj_nt.next;
+	 else jj_nt = jj_nt.next = token_source.getNextToken();
+	 jj_gen++;
+	 return token;
+  }
+
+/** Get the specific Token. */
+  final public Token getToken(int index) {
+	 Token t = token;
+	 for (int i = 0; i < index; i++) {
+	   if (t.next != null) t = t.next;
+	   else t = t.next = token_source.getNextToken();
+	 }
+	 return t;
+  }
+
+  private java.util.List<int[]> jj_expentries = new java.util.ArrayList<int[]>();
+  private int[] jj_expentry;
+  private int jj_kind = -1;
+
+  /** Generate ParseException. */
+  public ParseException generateParseException() {
+	 jj_expentries.clear();
+	 boolean[] la1tokens = new boolean[30];
+	 if (jj_kind >= 0) {
+	   la1tokens[jj_kind] = true;
+	   jj_kind = -1;
+	 }
+	 for (int i = 0; i < 13; i++) {
+	   if (jj_la1[i] == jj_gen) {
+		 for (int j = 0; j < 32; j++) {
+		   if ((jj_la1_0[i] & (1<<j)) != 0) {
+			 la1tokens[j] = true;
+		   }
+		 }
+	   }
+	 }
+	 for (int i = 0; i < 30; i++) {
+	   if (la1tokens[i]) {
+		 jj_expentry = new int[1];
+		 jj_expentry[0] = i;
+		 jj_expentries.add(jj_expentry);
+	   }
+	 }
+	 int[][] exptokseq = new int[jj_expentries.size()][];
+	 for (int i = 0; i < jj_expentries.size(); i++) {
+	   exptokseq[i] = jj_expentries.get(i);
+	 }
+	 return new ParseException(token, exptokseq, tokenImage);
+  }
+
+  private int trace_indent = 0;
+  private boolean trace_enabled;
+
+/** Trace enabled. */
+  final public boolean trace_enabled() {
+	 return trace_enabled;
+  }
+
+  /** Enable tracing. */
+  final public void enable_tracing() {
+  }
+
+  /** Disable tracing. */
+  final public void disable_tracing() {
+  }
+
+}

Propchange: tomcat/trunk/java/org/apache/tomcat/util/json/JSONParser.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: tomcat/trunk/java/org/apache/tomcat/util/json/JSONParser.jj
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/json/JSONParser.jj?rev=1843309&view=auto
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/json/JSONParser.jj (added)
+++ tomcat/trunk/java/org/apache/tomcat/util/json/JSONParser.jj Tue Oct  9 16:36:54 2018
@@ -0,0 +1,394 @@
+/*
+ * 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.
+ */
+
+options {
+    CHOICE_AMBIGUITY_CHECK=3;
+    OTHER_AMBIGUITY_CHECK=2;
+    ERROR_REPORTING=true;
+    JAVA_UNICODE_ESCAPE=true;
+    UNICODE_INPUT=true;
+    IGNORE_CASE=true;
+    SUPPORT_CLASS_VISIBILITY_PUBLIC=true;
+    FORCE_LA_CHECK=true;
+    CACHE_TOKENS=true;
+    SANITY_CHECK = true;
+    STATIC=false;
+  //KEEP_LINE_COLUMN=true;
+}
+
+PARSER_BEGIN(JSONParser)
+
+/*
+ * 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.tomcat.util.json;
+
+import java.io.*;
+import java.util.*;
+import java.math.*;
+
+/**
+* Basic JSON parser generated by JavaCC. It consumes the input provided through the constructor when 
+* {@code parseObject()}, {@code parseList()}, or {@code parse()} are called, and there is no way to directly
+* reset the state.
+* Set the {@code fallbackToString} property if you want to enable
+* unparsable constructs (such as unquoted strings) to be handled as Strings: otherwise, they are a parse
+* error.
+*
+* <p />
+*
+* This class makes no pretenses towards being thread safe.
+*/
+public class JSONParser {
+
+    private boolean nativeNumbers = false;
+
+    public JSONParser(String input) {
+    this(new StringReader(input));
+  }
+
+    /**
+    * Parses a JSON object into a Java {@code Map}.
+    */
+    public LinkedHashMap<String,Object> parseObject() throws ParseException { 
+        LinkedHashMap<String,Object> toReturn = object(); 
+        if(!ensureEOF()) throw new IllegalStateException("Expected EOF, but still had content to parse");
+        return toReturn;
+    }
+
+    /**
+    * Parses a JSON array into a Java {@code List}.
+    */
+    public ArrayList<Object> parseArray() throws ParseException {   
+        ArrayList<Object> toReturn = list(); 
+        if(!ensureEOF()) throw new IllegalStateException("Expected EOF, but still had content to parse");
+        return toReturn;
+    }
+
+    /**
+    * Parses any JSON-parseable object, returning the value. 
+    */
+    public Object parse() throws ParseException { 
+        Object toReturn = anything(); 
+        if(!ensureEOF()) throw new IllegalStateException("Expected EOF, but still had content to parse");
+        return toReturn;
+    }
+
+    private static String substringBefore(String str, char delim) {
+        int pos = str.indexOf(delim);
+        if(pos == -1) return str;
+        return str.substring(0, pos);
+    }
+
+    public void setNativeNumbers(boolean value) {
+        this.nativeNumbers = value;
+    }
+
+    public boolean getNativeNumbers() {
+        return this.nativeNumbers;
+    }
+
+}
+
+PARSER_END(JSONParser)
+
+// Ignore comments
+SKIP: {
+    <C_SINGLE_COMMENT: "//" (~["\n","\r","\f"])* <EOL>>
+| <C_MULTILINE_COMMENT: "/*" (~[])* "*/">
+| <SH_SINGLE_COMMENT: "#" (~["\n","\r","\f"])* <EOL>>
+| <WHITESPACE: " " | "\t"> 
+| <EOL: "\n" | "\r" | "\f"> 
+}
+
+// Common tokens
+TOKEN: {
+    <COMMA: ",">
+}
+
+// Object tokens
+TOKEN:{
+    <BRACE_OPEN: "{">
+| <BRACE_CLOSE: "}">
+| <COLON: ":">
+}
+
+// Array tokens
+TOKEN:{
+    <BRACKET_OPEN: "[">
+| <BRACKET_CLOSE: "]">
+}
+
+// Number token
+TOKEN:{
+    <#ZERO: "0">
+| <#DIGIT_NONZERO: ["1"-"9"]>
+| <#DIGIT: (<DIGIT_NONZERO> | <ZERO>) >
+| <NUMBER_INTEGER:
+        ("-")?
+        ( (<ZERO>)+ | ( <DIGIT_NONZERO> (<DIGIT>)* ) ) 
+    >
+| <NUMBER_DECIMAL: 
+        ("-")?  
+        ( (<ZERO>)+ | ( <DIGIT_NONZERO> (<DIGIT>)* ) ) 
+        ("." 
+            (<DIGIT>)+  
+            (
+                ["e","E"]
+                ("+" | "-")?
+                (<DIGIT>)+
+            )?
+        )
+    >
+}
+
+// Boolean tokens
+TOKEN:{
+    <TRUE: "true">
+| <FALSE: "false">
+}
+
+// Null token
+TOKEN:{
+    <NULL: "null">
+}
+
+// String tokens
+TOKEN:{
+    <#QUOTE_DOUBLE: "\"">
+| <#QUOTE_SINGLE: "'">
+| <STRING_SINGLE_EMPTY: "''">
+| <STRING_DOUBLE_EMPTY: "\"\"">
+| <#STRING_SINGLE_BODY: (
+        (~["'","\\","\r","\n","\f","\t"]) |
+        ( "\\" ( "r" | "n" | "f" | "\\" | "/" | "'" | "b" | "t" ) )
+    )+>
+| <#STRING_DOUBLE_BODY: (
+        (~["\"","\\","\r","\n","\f","\t"]) |
+        ( "\\" ( "r" | "n" | "f" | "\\" | "/" | "\"" | "b" | "t" ) )
+    )+>
+| <STRING_SINGLE_NONEMPTY: <QUOTE_SINGLE> <STRING_SINGLE_BODY> <QUOTE_SINGLE>>
+| <STRING_DOUBLE_NONEMPTY: <QUOTE_DOUBLE> <STRING_DOUBLE_BODY> <QUOTE_DOUBLE>>
+| <RUBY_SYMBOL:  ":" (["a"-"z"] | ["A"-"Z"] | ["0"-"9"] | "_")+>
+}
+
+// Raw symbol tokens
+TOKEN:{
+    <SYMBOL: (["a"-"z", "A"-"Z", "0", "1"-"9"])+ >
+}
+
+
+boolean ensureEOF() : {}{
+    <EOF>
+    { return true; }
+}
+
+Object anything() : { 
+    Object x;
+}{
+    ( x = object()
+    | x = list()
+    | x = value()
+    )
+    { return x; }
+}
+
+String objectKey() : {
+    Object o;
+    String key;
+} {
+    (
+        key = string()
+    | key = symbol()
+    | ( 
+        nullValue()
+        { key = null; }
+        )
+    | (
+            ( o = booleanValue() | o = number() )
+            { key = o.toString(); }
+        )
+    )
+    { return key; }
+}
+
+LinkedHashMap<String,Object> object() : {
+    final LinkedHashMap<String,Object> map = new LinkedHashMap<String,Object>();
+    String key;
+    Object value;
+}{
+    <BRACE_OPEN>
+    [
+        key = objectKey() 
+        <COLON>
+        value = anything()
+        { map.put(key, value); }
+        { key = null; value = null; }
+        (
+            <COMMA>
+            key = objectKey()
+            <COLON>
+            value = anything()
+            { map.put(key, value); }
+            { key = null; value = null; }
+        )*
+    ]
+    <BRACE_CLOSE>
+    { return map; }
+}
+
+ArrayList<Object> list() : {
+    final ArrayList<Object> list = new ArrayList<Object>(); 
+    Object value;
+}{
+    <BRACKET_OPEN>
+    [
+        value = anything()
+        { list.add(value); }
+        { value = null; }
+        (
+            <COMMA>
+            value = anything()
+            { list.add(value); }
+            { value = null; }
+        )*
+    ]
+    <BRACKET_CLOSE>
+    { 
+        list.trimToSize();
+        return list; 
+    }
+}
+
+Object value() : {
+    Object x;
+}{
+    ( x = string()
+    | x = number()
+    | x = booleanValue()
+    | x = nullValue()
+    )
+    { return x; }
+}
+
+Object nullValue(): {}{
+    <NULL>
+    { return null; }
+}
+
+Boolean booleanValue(): {
+    Boolean b;
+}{
+    (
+        (
+            <TRUE>
+            { b = Boolean.TRUE; }
+        ) | (
+            <FALSE>
+            { b = Boolean.FALSE; }
+        )   
+    )
+    { return b; }
+}
+
+Number number(): {
+    Token t;
+}{ 
+    (
+        t = <NUMBER_DECIMAL>
+        { 
+            if(nativeNumbers) {
+                return new Long(t.image);
+            } else {
+                return new BigDecimal(t.image); 
+            }
+        }
+    ) | (
+        t = <NUMBER_INTEGER>
+        { 
+            if(nativeNumbers) {
+                return new Double(t.image);
+            } else {
+                return new BigInteger(substringBefore(t.image, '.')); 
+            }
+        }
+    )
+}
+
+String string() : {
+    String s;
+}{
+    ( s = doubleQuoteString() 
+    | s = singleQuoteString()
+    | s = rubySymbol()
+    )
+    { return s; }
+}
+
+String rubySymbol(): {
+}{
+    <RUBY_SYMBOL>
+    { return token.image.substring(1); }
+}
+
+String doubleQuoteString() : {
+}{
+    (
+        <STRING_DOUBLE_EMPTY>
+        { return ""; }
+    ) | (
+        <STRING_DOUBLE_NONEMPTY>
+        { 
+            String image = token.image;
+            return image.substring(1, image.length()-1); 
+        }
+    )
+}
+
+String singleQuoteString() : {
+}{
+    (
+        <STRING_SINGLE_EMPTY>
+        { return ""; }
+    ) | (
+        <STRING_SINGLE_NONEMPTY>
+        { 
+            String image = token.image;
+            return image.substring(1, image.length()-1); 
+        }
+    )
+}
+
+String symbol() : {
+}{
+    <SYMBOL>
+    { return token.image; }
+}

Propchange: tomcat/trunk/java/org/apache/tomcat/util/json/JSONParser.jj
------------------------------------------------------------------------------
    svn:eol-style = native

Added: tomcat/trunk/java/org/apache/tomcat/util/json/JSONParserConstants.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/json/JSONParserConstants.java?rev=1843309&view=auto
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/json/JSONParserConstants.java (added)
+++ tomcat/trunk/java/org/apache/tomcat/util/json/JSONParserConstants.java Tue Oct  9 16:36:54 2018
@@ -0,0 +1,126 @@
+/* Generated By:JavaCC: Do not edit this line. JSONParserConstants.java */
+/*
+ * 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.tomcat.util.json;
+
+
+/**
+ * Token literal values and constants.
+ * Generated by org.javacc.parser.OtherFilesGen#start()
+ */
+public interface JSONParserConstants {
+
+  /** End of File. */
+  int EOF = 0;
+  /** RegularExpression Id. */
+  int C_SINGLE_COMMENT = 1;
+  /** RegularExpression Id. */
+  int C_MULTILINE_COMMENT = 2;
+  /** RegularExpression Id. */
+  int SH_SINGLE_COMMENT = 3;
+  /** RegularExpression Id. */
+  int WHITESPACE = 4;
+  /** RegularExpression Id. */
+  int EOL = 5;
+  /** RegularExpression Id. */
+  int COMMA = 6;
+  /** RegularExpression Id. */
+  int BRACE_OPEN = 7;
+  /** RegularExpression Id. */
+  int BRACE_CLOSE = 8;
+  /** RegularExpression Id. */
+  int COLON = 9;
+  /** RegularExpression Id. */
+  int BRACKET_OPEN = 10;
+  /** RegularExpression Id. */
+  int BRACKET_CLOSE = 11;
+  /** RegularExpression Id. */
+  int ZERO = 12;
+  /** RegularExpression Id. */
+  int DIGIT_NONZERO = 13;
+  /** RegularExpression Id. */
+  int DIGIT = 14;
+  /** RegularExpression Id. */
+  int NUMBER_INTEGER = 15;
+  /** RegularExpression Id. */
+  int NUMBER_DECIMAL = 16;
+  /** RegularExpression Id. */
+  int TRUE = 17;
+  /** RegularExpression Id. */
+  int FALSE = 18;
+  /** RegularExpression Id. */
+  int NULL = 19;
+  /** RegularExpression Id. */
+  int QUOTE_DOUBLE = 20;
+  /** RegularExpression Id. */
+  int QUOTE_SINGLE = 21;
+  /** RegularExpression Id. */
+  int STRING_SINGLE_EMPTY = 22;
+  /** RegularExpression Id. */
+  int STRING_DOUBLE_EMPTY = 23;
+  /** RegularExpression Id. */
+  int STRING_SINGLE_BODY = 24;
+  /** RegularExpression Id. */
+  int STRING_DOUBLE_BODY = 25;
+  /** RegularExpression Id. */
+  int STRING_SINGLE_NONEMPTY = 26;
+  /** RegularExpression Id. */
+  int STRING_DOUBLE_NONEMPTY = 27;
+  /** RegularExpression Id. */
+  int RUBY_SYMBOL = 28;
+  /** RegularExpression Id. */
+  int SYMBOL = 29;
+
+  /** Lexical state. */
+  int DEFAULT = 0;
+
+  /** Literal token values. */
+  String[] tokenImage = {
+    "<EOF>",
+    "<C_SINGLE_COMMENT>",
+    "<C_MULTILINE_COMMENT>",
+    "<SH_SINGLE_COMMENT>",
+    "<WHITESPACE>",
+    "<EOL>",
+    "\",\"",
+    "\"{\"",
+    "\"}\"",
+    "\":\"",
+    "\"[\"",
+    "\"]\"",
+    "\"0\"",
+    "<DIGIT_NONZERO>",
+    "<DIGIT>",
+    "<NUMBER_INTEGER>",
+    "<NUMBER_DECIMAL>",
+    "\"true\"",
+    "\"false\"",
+    "\"null\"",
+    "\"\\\"\"",
+    "\"\\\'\"",
+    "\"\\\'\\\'\"",
+    "\"\\\"\\\"\"",
+    "<STRING_SINGLE_BODY>",
+    "<STRING_DOUBLE_BODY>",
+    "<STRING_SINGLE_NONEMPTY>",
+    "<STRING_DOUBLE_NONEMPTY>",
+    "<RUBY_SYMBOL>",
+    "<SYMBOL>",
+  };
+
+}

Propchange: tomcat/trunk/java/org/apache/tomcat/util/json/JSONParserConstants.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: tomcat/trunk/java/org/apache/tomcat/util/json/JSONParserTokenManager.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/json/JSONParserTokenManager.java?rev=1843309&view=auto
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/json/JSONParserTokenManager.java (added)
+++ tomcat/trunk/java/org/apache/tomcat/util/json/JSONParserTokenManager.java Tue Oct  9 16:36:54 2018
@@ -0,0 +1,847 @@
+/* JSONParserTokenManager.java */
+/* Generated By:JavaCC: Do not edit this line. JSONParserTokenManager.java */
+/*
+ * 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.tomcat.util.json;
+import java.io.*;
+import java.util.*;
+import java.math.*;
+
+/** Token Manager. */
+public class JSONParserTokenManager implements JSONParserConstants {
+
+  /** Debug output. */
+  public  java.io.PrintStream debugStream = System.out;
+  /** Set debug output. */
+  public  void setDebugStream(java.io.PrintStream ds) { debugStream = ds; }
+private final int jjStopStringLiteralDfa_0(int pos, long active0){
+   switch (pos)
+   {
+      case 0:
+         if ((active0 & 0xe0000L) != 0L)
+         {
+            jjmatchedKind = 29;
+            return 17;
+         }
+         if ((active0 & 0x200L) != 0L)
+            return 16;
+         if ((active0 & 0x400000L) != 0L)
+            return 40;
+         if ((active0 & 0x800000L) != 0L)
+            return 41;
+         return -1;
+      case 1:
+         if ((active0 & 0xe0000L) != 0L)
+         {
+            jjmatchedKind = 29;
+            jjmatchedPos = 1;
+            return 17;
+         }
+         return -1;
+      case 2:
+         if ((active0 & 0xe0000L) != 0L)
+         {
+            jjmatchedKind = 29;
+            jjmatchedPos = 2;
+            return 17;
+         }
+         return -1;
+      case 3:
+         if ((active0 & 0x40000L) != 0L)
+         {
+            jjmatchedKind = 29;
+            jjmatchedPos = 3;
+            return 17;
+         }
+         if ((active0 & 0xa0000L) != 0L)
+            return 17;
+         return -1;
+      default :
+         return -1;
+   }
+}
+private final int jjStartNfa_0(int pos, long active0){
+   return jjMoveNfa_0(jjStopStringLiteralDfa_0(pos, active0), pos + 1);
+}
+private int jjStopAtPos(int pos, int kind)
+{
+   jjmatchedKind = kind;
+   jjmatchedPos = pos;
+   return pos + 1;
+}
+private int jjMoveStringLiteralDfa0_0(){
+   switch(curChar)
+   {
+      case 34:
+         return jjMoveStringLiteralDfa1_0(0x800000L);
+      case 39:
+         return jjMoveStringLiteralDfa1_0(0x400000L);
+      case 44:
+         return jjStopAtPos(0, 6);
+      case 58:
+         return jjStartNfaWithStates_0(0, 9, 16);
+      case 91:
+         return jjStopAtPos(0, 10);
+      case 93:
+         return jjStopAtPos(0, 11);
+      case 70:
+      case 102:
+         return jjMoveStringLiteralDfa1_0(0x40000L);
+      case 78:
+      case 110:
+         return jjMoveStringLiteralDfa1_0(0x80000L);
+      case 84:
+      case 116:
+         return jjMoveStringLiteralDfa1_0(0x20000L);
+      case 123:
+         return jjStopAtPos(0, 7);
+      case 125:
+         return jjStopAtPos(0, 8);
+      default :
+         return jjMoveNfa_0(0, 0);
+   }
+}
+private int jjMoveStringLiteralDfa1_0(long active0){
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_0(0, active0);
+      return 1;
+   }
+   switch(curChar)
+   {
+      case 34:
+         if ((active0 & 0x800000L) != 0L)
+            return jjStopAtPos(1, 23);
+         break;
+      case 39:
+         if ((active0 & 0x400000L) != 0L)
+            return jjStopAtPos(1, 22);
+         break;
+      case 65:
+      case 97:
+         return jjMoveStringLiteralDfa2_0(active0, 0x40000L);
+      case 82:
+      case 114:
+         return jjMoveStringLiteralDfa2_0(active0, 0x20000L);
+      case 85:
+      case 117:
+         return jjMoveStringLiteralDfa2_0(active0, 0x80000L);
+      default :
+         break;
+   }
+   return jjStartNfa_0(0, active0);
+}
+private int jjMoveStringLiteralDfa2_0(long old0, long active0){
+   if (((active0 &= old0)) == 0L)
+      return jjStartNfa_0(0, old0);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_0(1, active0);
+      return 2;
+   }
+   switch(curChar)
+   {
+      case 76:
+      case 108:
+         return jjMoveStringLiteralDfa3_0(active0, 0xc0000L);
+      case 85:
+      case 117:
+         return jjMoveStringLiteralDfa3_0(active0, 0x20000L);
+      default :
+         break;
+   }
+   return jjStartNfa_0(1, active0);
+}
+private int jjMoveStringLiteralDfa3_0(long old0, long active0){
+   if (((active0 &= old0)) == 0L)
+      return jjStartNfa_0(1, old0);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_0(2, active0);
+      return 3;
+   }
+   switch(curChar)
+   {
+      case 69:
+      case 101:
+         if ((active0 & 0x20000L) != 0L)
+            return jjStartNfaWithStates_0(3, 17, 17);
+         break;
+      case 76:
+      case 108:
+         if ((active0 & 0x80000L) != 0L)
+            return jjStartNfaWithStates_0(3, 19, 17);
+         break;
+      case 83:
+      case 115:
+         return jjMoveStringLiteralDfa4_0(active0, 0x40000L);
+      default :
+         break;
+   }
+   return jjStartNfa_0(2, active0);
+}
+private int jjMoveStringLiteralDfa4_0(long old0, long active0){
+   if (((active0 &= old0)) == 0L)
+      return jjStartNfa_0(2, old0);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_0(3, active0);
+      return 4;
+   }
+   switch(curChar)
+   {
+      case 69:
+      case 101:
+         if ((active0 & 0x40000L) != 0L)
+            return jjStartNfaWithStates_0(4, 18, 17);
+         break;
+      default :
+         break;
+   }
+   return jjStartNfa_0(3, active0);
+}
+private int jjStartNfaWithStates_0(int pos, int kind, int state)
+{
+   jjmatchedKind = kind;
+   jjmatchedPos = pos;
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) { return pos + 1; }
+   return jjMoveNfa_0(state, pos + 1);
+}
+static final long[] jjbitVec0 = {
+   0xfffffffffffffffeL, 0xffffffffffffffffL, 0xffffffffffffffffL, 0xffffffffffffffffL
+};
+static final long[] jjbitVec2 = {
+   0x0L, 0x0L, 0xffffffffffffffffL, 0xffffffffffffffffL
+};
+private int jjMoveNfa_0(int startState, int curPos)
+{
+   int startsAt = 0;
+   jjnewStateCnt = 40;
+   int i = 1;
+   jjstateSet[0] = startState;
+   int kind = 0x7fffffff;
+   for (;;)
+   {
+      if (++jjround == 0x7fffffff)
+         ReInitRounds();
+      if (curChar < 64)
+      {
+         long l = 1L << curChar;
+         do
+         {
+            switch(jjstateSet[--i])
+            {
+               case 40:
+               case 6:
+                  if ((0xffffff7fffffc9ffL & l) != 0L)
+                     { jjCheckNAddStates(0, 2); }
+                  break;
+               case 0:
+                  if ((0x3ff000000000000L & l) != 0L)
+                  {
+                     if (kind > 29)
+                        kind = 29;
+                     { jjCheckNAdd(17); }
+                  }
+                  else if ((0x3400L & l) != 0L)
+                  {
+                     if (kind > 5)
+                        kind = 5;
+                  }
+                  else if ((0x100000200L & l) != 0L)
+                  {
+                     if (kind > 4)
+                        kind = 4;
+                  }
+                  else if (curChar == 45)
+                     { jjCheckNAddStates(3, 6); }
+                  else if (curChar == 47)
+                     { jjAddStates(7, 8); }
+                  else if (curChar == 58)
+                     { jjCheckNAdd(16); }
+                  else if (curChar == 34)
+                     { jjCheckNAddTwoStates(11, 12); }
+                  else if (curChar == 39)
+                     { jjCheckNAddTwoStates(6, 7); }
+                  else if (curChar == 35)
+                     { jjCheckNAddTwoStates(1, 2); }
+                  if ((0x3fe000000000000L & l) != 0L)
+                  {
+                     if (kind > 15)
+                        kind = 15;
+                     { jjCheckNAddStates(9, 11); }
+                  }
+                  else if (curChar == 48)
+                  {
+                     if (kind > 15)
+                        kind = 15;
+                     { jjCheckNAddStates(12, 14); }
+                  }
+                  break;
+               case 41:
+               case 11:
+                  if ((0xfffffffbffffc9ffL & l) != 0L)
+                     { jjCheckNAddStates(15, 17); }
+                  break;
+               case 1:
+                  if ((0xffffffffffffcbffL & l) != 0L)
+                     { jjCheckNAddTwoStates(1, 2); }
+                  break;
+               case 2:
+                  if ((0x3400L & l) != 0L && kind > 3)
+                     kind = 3;
+                  break;
+               case 3:
+                  if ((0x100000200L & l) != 0L && kind > 4)
+                     kind = 4;
+                  break;
+               case 4:
+                  if ((0x3400L & l) != 0L && kind > 5)
+                     kind = 5;
+                  break;
+               case 5:
+                  if (curChar == 39)
+                     { jjCheckNAddTwoStates(6, 7); }
+                  break;
+               case 8:
+                  if ((0x808000000000L & l) != 0L)
+                     { jjCheckNAddStates(0, 2); }
+                  break;
+               case 9:
+                  if (curChar == 39 && kind > 26)
+                     kind = 26;
+                  break;
+               case 10:
+                  if (curChar == 34)
+                     { jjCheckNAddTwoStates(11, 12); }
+                  break;
+               case 13:
+                  if ((0x800400000000L & l) != 0L)
+                     { jjCheckNAddStates(15, 17); }
+                  break;
+               case 14:
+                  if (curChar == 34 && kind > 27)
+                     kind = 27;
+                  break;
+               case 15:
+                  if (curChar == 58)
+                     { jjCheckNAdd(16); }
+                  break;
+               case 16:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 28)
+                     kind = 28;
+                  { jjCheckNAdd(16); }
+                  break;
+               case 17:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 29)
+                     kind = 29;
+                  { jjCheckNAdd(17); }
+                  break;
+               case 18:
+                  if (curChar == 47)
+                     { jjAddStates(7, 8); }
+                  break;
+               case 19:
+                  if (curChar == 47)
+                     { jjCheckNAddTwoStates(20, 21); }
+                  break;
+               case 20:
+                  if ((0xffffffffffffcbffL & l) != 0L)
+                     { jjCheckNAddTwoStates(20, 21); }
+                  break;
+               case 21:
+                  if ((0x3400L & l) != 0L && kind > 1)
+                     kind = 1;
+                  break;
+               case 22:
+                  if (curChar == 42)
+                     { jjCheckNAddTwoStates(23, 25); }
+                  break;
+               case 23:
+                  { jjCheckNAddTwoStates(23, 25); }
+                  break;
+               case 24:
+                  if (curChar == 47 && kind > 2)
+                     kind = 2;
+                  break;
+               case 25:
+                  if (curChar == 42)
+                     jjstateSet[jjnewStateCnt++] = 24;
+                  break;
+               case 26:
+                  if (curChar == 45)
+                     { jjCheckNAddStates(3, 6); }
+                  break;
+               case 27:
+                  if (curChar != 48)
+                     break;
+                  if (kind > 15)
+                     kind = 15;
+                  { jjCheckNAdd(27); }
+                  break;
+               case 28:
+                  if ((0x3fe000000000000L & l) == 0L)
+                     break;
+                  if (kind > 15)
+                     kind = 15;
+                  { jjCheckNAdd(29); }
+                  break;
+               case 29:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 15)
+                     kind = 15;
+                  { jjCheckNAdd(29); }
+                  break;
+               case 30:
+                  if (curChar == 48)
+                     { jjCheckNAddTwoStates(30, 31); }
+                  break;
+               case 31:
+                  if (curChar == 46)
+                     { jjCheckNAdd(32); }
+                  break;
+               case 32:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 16)
+                     kind = 16;
+                  { jjCheckNAddTwoStates(32, 33); }
+                  break;
+               case 34:
+                  if ((0x280000000000L & l) != 0L)
+                     { jjCheckNAdd(35); }
+                  break;
+               case 35:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 16)
+                     kind = 16;
+                  { jjCheckNAdd(35); }
+                  break;
+               case 36:
+                  if ((0x3fe000000000000L & l) != 0L)
+                     { jjCheckNAddTwoStates(37, 31); }
+                  break;
+               case 37:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     { jjCheckNAddTwoStates(37, 31); }
+                  break;
+               case 38:
+                  if (curChar != 48)
+                     break;
+                  if (kind > 15)
+                     kind = 15;
+                  { jjCheckNAddStates(12, 14); }
+                  break;
+               case 39:
+                  if ((0x3fe000000000000L & l) == 0L)
+                     break;
+                  if (kind > 15)
+                     kind = 15;
+                  { jjCheckNAddStates(9, 11); }
+                  break;
+               default : break;
+            }
+         } while(i != startsAt);
+      }
+      else if (curChar < 128)
+      {
+         long l = 1L << (curChar & 077);
+         do
+         {
+            switch(jjstateSet[--i])
+            {
+               case 40:
+                  if ((0xffffffffefffffffL & l) != 0L)
+                     { jjCheckNAddStates(0, 2); }
+                  else if (curChar == 92)
+                     jjstateSet[jjnewStateCnt++] = 8;
+                  break;
+               case 0:
+               case 17:
+                  if ((0x7fffffe07fffffeL & l) == 0L)
+                     break;
+                  if (kind > 29)
+                     kind = 29;
+                  { jjCheckNAdd(17); }
+                  break;
+               case 41:
+                  if ((0xffffffffefffffffL & l) != 0L)
+                     { jjCheckNAddStates(15, 17); }
+                  else if (curChar == 92)
+                     jjstateSet[jjnewStateCnt++] = 13;
+                  break;
+               case 1:
+                  { jjAddStates(18, 19); }
+                  break;
+               case 6:
+                  if ((0xffffffffefffffffL & l) != 0L)
+                     { jjCheckNAddStates(0, 2); }
+                  break;
+               case 7:
+                  if (curChar == 92)
+                     jjstateSet[jjnewStateCnt++] = 8;
+                  break;
+               case 8:
+                  if ((0x14404410144044L & l) != 0L)
+                     { jjCheckNAddStates(0, 2); }
+                  break;
+               case 11:
+                  if ((0xffffffffefffffffL & l) != 0L)
+                     { jjCheckNAddStates(15, 17); }
+                  break;
+               case 12:
+                  if (curChar == 92)
+                     jjstateSet[jjnewStateCnt++] = 13;
+                  break;
+               case 13:
+                  if ((0x14404410144044L & l) != 0L)
+                     { jjCheckNAddStates(15, 17); }
+                  break;
+               case 16:
+                  if ((0x7fffffe87fffffeL & l) == 0L)
+                     break;
+                  if (kind > 28)
+                     kind = 28;
+                  jjstateSet[jjnewStateCnt++] = 16;
+                  break;
+               case 20:
+                  { jjAddStates(20, 21); }
+                  break;
+               case 23:
+                  { jjAddStates(22, 23); }
+                  break;
+               case 33:
+                  if ((0x2000000020L & l) != 0L)
+                     { jjAddStates(24, 25); }
+                  break;
+               default : break;
+            }
+         } while(i != startsAt);
+      }
+      else
+      {
+         int hiByte = (curChar >> 8);
+         int i1 = hiByte >> 6;
+         long l1 = 1L << (hiByte & 077);
+         int i2 = (curChar & 0xff) >> 6;
+         long l2 = 1L << (curChar & 077);
+         do
+         {
+            switch(jjstateSet[--i])
+            {
+               case 40:
+               case 6:
+                  if (jjCanMove_0(hiByte, i1, i2, l1, l2))
+                     { jjCheckNAddStates(0, 2); }
+                  break;
+               case 41:
+               case 11:
+                  if (jjCanMove_0(hiByte, i1, i2, l1, l2))
+                     { jjCheckNAddStates(15, 17); }
+                  break;
+               case 1:
+                  if (jjCanMove_0(hiByte, i1, i2, l1, l2))
+                     { jjAddStates(18, 19); }
+                  break;
+               case 20:
+                  if (jjCanMove_0(hiByte, i1, i2, l1, l2))
+                     { jjAddStates(20, 21); }
+                  break;
+               case 23:
+                  if (jjCanMove_0(hiByte, i1, i2, l1, l2))
+                     { jjAddStates(22, 23); }
+                  break;
+               default : if (i1 == 0 || l1 == 0 || i2 == 0 ||  l2 == 0) break; else break;
+            }
+         } while(i != startsAt);
+      }
+      if (kind != 0x7fffffff)
+      {
+         jjmatchedKind = kind;
+         jjmatchedPos = curPos;
+         kind = 0x7fffffff;
+      }
+      ++curPos;
+      if ((i = jjnewStateCnt) == (startsAt = 40 - (jjnewStateCnt = startsAt)))
+         return curPos;
+      try { curChar = input_stream.readChar(); }
+      catch(java.io.IOException e) { return curPos; }
+   }
+}
+
+/** Token literal values. */
+public static final String[] jjstrLiteralImages = {
+"", null, null, null, null, null, "\54", "\173", "\175", "\72", "\133", 
+"\135", null, null, null, null, null, null, null, null, null, null, "\47\47", 
+"\42\42", null, null, null, null, null, null, };
+protected Token jjFillToken()
+{
+   final Token t;
+   final String curTokenImage;
+   final int beginLine;
+   final int endLine;
+   final int beginColumn;
+   final int endColumn;
+   String im = jjstrLiteralImages[jjmatchedKind];
+   curTokenImage = (im == null) ? input_stream.GetImage() : im;
+   beginLine = input_stream.getBeginLine();
+   beginColumn = input_stream.getBeginColumn();
+   endLine = input_stream.getEndLine();
+   endColumn = input_stream.getEndColumn();
+   t = Token.newToken(jjmatchedKind);
+   t.kind = jjmatchedKind;
+   t.image = curTokenImage;
+
+   t.beginLine = beginLine;
+   t.endLine = endLine;
+   t.beginColumn = beginColumn;
+   t.endColumn = endColumn;
+
+   return t;
+}
+static final int[] jjnextStates = {
+   6, 7, 9, 27, 28, 30, 36, 19, 22, 29, 37, 31, 27, 30, 31, 11, 
+   12, 14, 1, 2, 20, 21, 23, 25, 34, 35, 
+};
+private static final boolean jjCanMove_0(int hiByte, int i1, int i2, long l1, long l2)
+{
+   switch(hiByte)
+   {
+      case 0:
+         return ((jjbitVec2[i2] & l2) != 0L);
+      default :
+         if ((jjbitVec0[i1] & l1) != 0L)
+            return true;
+         return false;
+   }
+}
+
+int curLexState = 0;
+int defaultLexState = 0;
+int jjnewStateCnt;
+int jjround;
+int jjmatchedPos;
+int jjmatchedKind;
+
+/** Get the next Token. */
+public Token getNextToken() 
+{
+  Token matchedToken;
+  int curPos = 0;
+
+  EOFLoop :
+  for (;;)
+  {
+   try
+   {
+      curChar = input_stream.BeginToken();
+   }
+   catch(Exception e)
+   {
+      jjmatchedKind = 0;
+      jjmatchedPos = -1;
+      matchedToken = jjFillToken();
+      return matchedToken;
+   }
+
+   jjmatchedKind = 0x7fffffff;
+   jjmatchedPos = 0;
+   curPos = jjMoveStringLiteralDfa0_0();
+   if (jjmatchedKind != 0x7fffffff)
+   {
+      if (jjmatchedPos + 1 < curPos)
+         input_stream.backup(curPos - jjmatchedPos - 1);
+      if ((jjtoToken[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
+      {
+         matchedToken = jjFillToken();
+         return matchedToken;
+      }
+      else
+      {
+         continue EOFLoop;
+      }
+   }
+   int error_line = input_stream.getEndLine();
+   int error_column = input_stream.getEndColumn();
+   String error_after = null;
+   boolean EOFSeen = false;
+   try { input_stream.readChar(); input_stream.backup(1); }
+   catch (java.io.IOException e1) {
+      EOFSeen = true;
+      error_after = curPos <= 1 ? "" : input_stream.GetImage();
+      if (curChar == '\n' || curChar == '\r') {
+         error_line++;
+         error_column = 0;
+      }
+      else
+         error_column++;
+   }
+   if (!EOFSeen) {
+      input_stream.backup(1);
+      error_after = curPos <= 1 ? "" : input_stream.GetImage();
+   }
+   throw new TokenMgrError(EOFSeen, curLexState, error_line, error_column, error_after, curChar, TokenMgrError.LEXICAL_ERROR);
+  }
+}
+
+void SkipLexicalActions(Token matchedToken)
+{
+   switch(jjmatchedKind)
+   {
+      default :
+         break;
+   }
+}
+void MoreLexicalActions()
+{
+   jjimageLen += (lengthOfMatch = jjmatchedPos + 1);
+   switch(jjmatchedKind)
+   {
+      default :
+         break;
+   }
+}
+void TokenLexicalActions(Token matchedToken)
+{
+   switch(jjmatchedKind)
+   {
+      default :
+         break;
+   }
+}
+private void jjCheckNAdd(int state)
+{
+   if (jjrounds[state] != jjround)
+   {
+      jjstateSet[jjnewStateCnt++] = state;
+      jjrounds[state] = jjround;
+   }
+}
+private void jjAddStates(int start, int end)
+{
+   do {
+      jjstateSet[jjnewStateCnt++] = jjnextStates[start];
+   } while (start++ != end);
+}
+private void jjCheckNAddTwoStates(int state1, int state2)
+{
+   jjCheckNAdd(state1);
+   jjCheckNAdd(state2);
+}
+
+private void jjCheckNAddStates(int start, int end)
+{
+   do {
+      jjCheckNAdd(jjnextStates[start]);
+   } while (start++ != end);
+}
+
+    /** Constructor. */
+    public JSONParserTokenManager(JavaCharStream stream){
+
+      if (JavaCharStream.staticFlag)
+            throw new Error("ERROR: Cannot use a static CharStream class with a non-static lexical analyzer.");
+
+    input_stream = stream;
+  }
+
+  /** Constructor. */
+  public JSONParserTokenManager (JavaCharStream stream, int lexState){
+    ReInit(stream);
+    SwitchTo(lexState);
+  }
+
+  /** Reinitialise parser. */
+  
+  public void ReInit(JavaCharStream stream)
+  {
+
+
+    jjmatchedPos =
+    jjnewStateCnt =
+    0;
+    curLexState = defaultLexState;
+    input_stream = stream;
+    ReInitRounds();
+  }
+
+  private void ReInitRounds()
+  {
+    int i;
+    jjround = 0x80000001;
+    for (i = 40; i-- > 0;)
+      jjrounds[i] = 0x80000000;
+  }
+
+  /** Reinitialise parser. */
+  public void ReInit(JavaCharStream stream, int lexState)
+  
+  {
+    ReInit(stream);
+    SwitchTo(lexState);
+  }
+
+  /** Switch to specified lex state. */
+  public void SwitchTo(int lexState)
+  {
+    if (lexState >= 1 || lexState < 0)
+      throw new TokenMgrError("Error: Ignoring invalid lexical state : " + lexState + ". State unchanged.", TokenMgrError.INVALID_LEXICAL_STATE);
+    else
+      curLexState = lexState;
+  }
+
+
+/** Lexer state names. */
+public static final String[] lexStateNames = {
+   "DEFAULT",
+};
+
+/** Lex State array. */
+public static final int[] jjnewLexState = {
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
+   -1, -1, -1, -1, -1, 
+};
+static final long[] jjtoToken = {
+   0x3ccf8fc1L, 
+};
+static final long[] jjtoSkip = {
+   0x3eL, 
+};
+static final long[] jjtoSpecial = {
+   0x0L, 
+};
+static final long[] jjtoMore = {
+   0x0L, 
+};
+    protected JavaCharStream  input_stream;
+
+    private final int[] jjrounds = new int[40];
+    private final int[] jjstateSet = new int[2 * 40];
+    private final StringBuilder jjimage = new StringBuilder();
+    private StringBuilder image = jjimage;
+    private int jjimageLen;
+    private int lengthOfMatch;
+    protected int curChar;
+}

Propchange: tomcat/trunk/java/org/apache/tomcat/util/json/JSONParserTokenManager.java
------------------------------------------------------------------------------
    svn:eol-style = native



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org