Skip to content

Commit

Permalink
Switch from Noggit to a javacc parser generated from a public domain …
Browse files Browse the repository at this point in the history
…json grammar.

git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@1843309 13f79535-47bb-0310-9956-ffa450edef68
  • Loading branch information
rmaucher committed Oct 9, 2018
1 parent 0c8dc87 commit 5597c24
Show file tree
Hide file tree
Showing 14 changed files with 3,189 additions and 179 deletions.
4 changes: 4 additions & 0 deletions NOTICE
Expand Up @@ -24,6 +24,10 @@ JDT Core Batch Compiler component, which is open source software.
The original software and related information is available at The original software and related information is available at
https://www.eclipse.org/jdt/core/. 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 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 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 are derivative work originating from the Netty project and the finagle-native
Expand Down
9 changes: 0 additions & 9 deletions build.properties.default
Expand Up @@ -283,15 +283,6 @@ saaj-api.home=${base.path}/saaj-api-${saaj-api.version}
saaj-api.jar=${saaj-api.home}/saaj-api-${saaj-api.version}.jar 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 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 ----- # ----- bnd & bndlib, version 4.0.0 or later -----
# ----- provides OSGI metadata for JARs ----- # ----- provides OSGI metadata for JARs -----
bnd.version=4.0.0 bnd.version=4.0.0
Expand Down
13 changes: 2 additions & 11 deletions build.xml
Expand Up @@ -213,7 +213,6 @@
<path id="compile.classpath"> <path id="compile.classpath">
<pathelement location="${jdt.jar}"/> <pathelement location="${jdt.jar}"/>
<pathelement location="${saaj-api.jar}"/> <pathelement location="${saaj-api.jar}"/>
<pathelement location="${noggit.jar}"/>
</path> </path>


<path id="tomcat.classpath"> <path id="tomcat.classpath">
Expand Down Expand Up @@ -390,6 +389,7 @@
<include name="org/apache/tomcat/util/res/**" /> <include name="org/apache/tomcat/util/res/**" />
<include name="org/apache/tomcat/util/security/**" /> <include name="org/apache/tomcat/util/security/**" />
<include name="org/apache/tomcat/util/threads/**" /> <include name="org/apache/tomcat/util/threads/**" />
<include name="org/apache/tomcat/util/json/**" />
<include name="org/apache/tomcat/util/*" /> <include name="org/apache/tomcat/util/*" />
<exclude name="org/apache/tomcat/util/bcel" /> <exclude name="org/apache/tomcat/util/bcel" />
<exclude name="org/apache/tomcat/util/descriptor" /> <exclude name="org/apache/tomcat/util/descriptor" />
Expand Down Expand Up @@ -596,6 +596,7 @@
<exclude name="java/org/apache/**/parser/ParseException.java" /> <exclude name="java/org/apache/**/parser/ParseException.java" />
<exclude name="java/org/apache/**/parser/SimpleCharStream.java" /> <exclude name="java/org/apache/**/parser/SimpleCharStream.java" />
<exclude name="java/org/apache/**/parser/Token*.java" /> <exclude name="java/org/apache/**/parser/Token*.java" />
<exclude name="java/org/apache/tomcat/util/json/*.java" />
<!-- Exclude simple test files --> <!-- Exclude simple test files -->
<exclude name="test/webapp/bug53257/**/*.txt"/> <exclude name="test/webapp/bug53257/**/*.txt"/>
<exclude name="test/webapp/bug49nnn/bug49464*"/> <exclude name="test/webapp/bug49nnn/bug49464*"/>
Expand Down Expand Up @@ -2718,16 +2719,6 @@ skip.installer property in build.properties" />
<param name="checksum.value" value="${saaj-api.checksum.value}"/> <param name="checksum.value" value="${saaj-api.checksum.value}"/>
</antcall> </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>


<target name="download-test-compile" <target name="download-test-compile"
Expand Down
Expand Up @@ -27,6 +27,7 @@
import java.time.Duration; import java.time.Duration;
import java.time.Instant; import java.time.Instant;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List; import java.util.List;


import org.apache.catalina.tribes.Member; import org.apache.catalina.tribes.Member;
Expand All @@ -35,7 +36,7 @@
import org.apache.juli.logging.Log; import org.apache.juli.logging.Log;
import org.apache.juli.logging.LogFactory; import org.apache.juli.logging.LogFactory;
import org.apache.tomcat.util.codec.binary.StringUtils; import org.apache.tomcat.util.codec.binary.StringUtils;
import org.noggit.JSONParser; import org.apache.tomcat.util.json.JSONParser;




public class KubernetesMembershipProvider extends CloudMembershipProvider { public class KubernetesMembershipProvider extends CloudMembershipProvider {
Expand Down Expand Up @@ -141,170 +142,48 @@ protected Member[] fetchMembers() {


protected void parsePods(Reader reader, List<MemberImpl> members) protected void parsePods(Reader reader, List<MemberImpl> members)
throws IOException{ throws IOException{

int event = 0;
JSONParser parser = new JSONParser(reader); JSONParser parser = new JSONParser(reader);
boolean parseItems = false; try {
for (;;) { LinkedHashMap<String, Object> json = parser.object();
event = parser.nextEvent(); @SuppressWarnings("unchecked")
switch (event) { List<Object> items = (List<Object>) json.get("items");
case JSONParser.STRING: for (Object podObject : items) {
String value = parser.getString(); @SuppressWarnings("unchecked")
if (parser.wasKey()) { LinkedHashMap<String, Object> pod = (LinkedHashMap<String, Object>) podObject;
if ("items".equals(value) && parser.nextEvent() == JSONParser.ARRAY_START) { if (!"Pod".equals(pod.get("kind"))) {
parseItems = true; continue;
}
} }
break; @SuppressWarnings("unchecked")
case JSONParser.ARRAY_END: LinkedHashMap<String, Object> metadata = (LinkedHashMap<String, Object>) pod.get("metadata");
parseItems = false; String name = metadata.get("name").toString();
break; String creationTimestamp = metadata.get("creationTimestamp").toString();
case JSONParser.OBJECT_START: @SuppressWarnings("unchecked")
if (parseItems) { LinkedHashMap<String, Object> status = (LinkedHashMap<String, Object>) pod.get("status");
parseItem(parser, members); if (!"Running".equals(status.get("phase"))) {
continue;
} }
break; String podIP = status.get("podIP").toString();
default:
break; // id = md5(hostname)
} byte[] id = md5.digest(name.getBytes());

long aliveTime = Duration.between(Instant.parse(creationTimestamp), startTime).getSeconds() * 1000; // aliveTime is in ms
if (event == JSONParser.EOF)
break; MemberImpl member = null;
} try {

member = new MemberImpl(podIP, port, aliveTime);
} } catch (IOException e) {

// Shouldn't happen:
private void parseItem(JSONParser parser, List<MemberImpl> members) // an exception is thrown if hostname can't be resolved to IP, but we already provide an IP
throws IOException { log.error(sm.getString("kubernetesMembershipProvider.memberError"), e);
int event = 0; continue;
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); member.setUniqueId(id);
members.add(member); members.add(member);
}
return;
default:
break;
} }

} catch (Exception e) {
if (event == JSONParser.EOF) throw new IOException(sm.getString("kubernetesMembershipProvider.jsonError"), e);
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();
}
}
}
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;
}

if (event == JSONParser.EOF)
break;
} }
return result;
} }


} }

0 comments on commit 5597c24

Please sign in to comment.