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-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org