[tor-commits] [exonerator/master] Make ExoneraTor work from an embedded Jetty.

karsten at torproject.org karsten at torproject.org
Tue Nov 14 20:28:23 UTC 2017


commit c2731e580b2cd2a638cfe7bdb3b31aa7d0b08767
Author: iwakeh <iwakeh at torproject.org>
Date:   Thu Nov 2 12:47:35 2017 +0000

    Make ExoneraTor work from an embedded Jetty.
    
    The default port is 8080 and can be changed by setting system property
    'exonerator.jetty.port', e.g. `-Dexonerator.jetty.port=8888`.
    
    Also added ant task 'smoke-test-war' for creating a dummy war.  This dummy
    war file can be used for smoke-tests not depending on the database resource.
    
    Implements task-24174.
---
 .gitignore                                         |   7 +-
 CHANGELOG.md                                       |   5 +
 build.xml                                          | 112 ++++++++++++++++++---
 .../java/org/torproject/exonerator/ServerMain.java |  32 ++++++
 src/main/resources/context.xml                     |  13 ---
 src/main/resources/jetty.xml                       |  91 +++++++++++++++++
 src/main/resources/logback.xml                     |  57 +++++++++++
 src/main/resources/logging.properties              |   6 --
 src/main/resources/test-web.xml                    |  67 ++++++++++++
 src/main/resources/web.xml                         |  43 ++++++--
 10 files changed, 392 insertions(+), 41 deletions(-)

diff --git a/.gitignore b/.gitignore
index e93ccb8..48cf962 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,9 +1,10 @@
-# Eclipse files
-.classpath
-.project
+# hidden files
+.*
 
 # Generated stuff
 generated/
+LOGBASE_IS_UNDEFINED/
+cobertura.ser
 
 # library folder
 lib/
diff --git a/CHANGELOG.md b/CHANGELOG.md
index edfd429..b699ba9 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,8 @@
+# Changes in version 2.0.0 - 2017-11-??
+
+ * Major changes
+   - Use an embedded Jetty.
+
 # Changes in version 1.0.3 - 2017-10-16
 
  * Major changes
diff --git a/build.xml b/build.xml
index ee04e1b..ec861b5 100644
--- a/build.xml
+++ b/build.xml
@@ -10,6 +10,7 @@
   <property name="implementation-title" value="ExoneraTor" />
   <property name="release.version" value="1.0.0-dev" />
   <property name="metricslibversion" value="2.1.1" />
+  <property name="jetty.version" value="-9.2.21.v20170120" />
   <property name="warfile"
             value="exonerator-${release.version}.war"/>
 
@@ -34,6 +35,8 @@
     <include name="commons-codec-1.10.jar"/>
     <include name="commons-lang3-3.5.jar"/>
     <include name="gson-2.4.jar" />
+    <include name="logback-core-1.1.9.jar" />
+    <include name="logback-classic-1.1.9.jar" />
     <include name="postgresql-9.4.1212.jar"/>
     <include name="slf4j-api-1.7.22.jar"/>
   </patternset>
@@ -42,43 +45,126 @@
     <patternset refid="common" />
     <include name="metrics-lib-${metricslibversion}.jar"/>
     <include name="commons-compress-1.13.jar"/>
-    <include name="servlet-api-3.0.jar"/>
-    <include name="logback-core-1.1.9.jar" />
-    <include name="logback-classic-1.1.9.jar" />
+    <include name="servlet-api-3.1.jar"/>
     <include name="xz-1.6.jar"/>
   </patternset>
 
   <patternset id="web" >
-    <patternset refid="common" />
+    <include name="jetty9-annotations${jetty.version}.jar"/>
+    <include name="jetty9-server${jetty.version}.jar"/>
+    <include name="jetty9-servlet${jetty.version}.jar"/>
+    <include name="jetty9-util${jetty.version}.jar"/>
+    <include name="jetty9-http${jetty.version}.jar"/>
+    <include name="jetty9-io${jetty.version}.jar"/>
+    <include name="jetty9-xml${jetty.version}.jar"/>
+    <include name="jetty9-webapp${jetty.version}.jar"/>
+    <include name="jetty9-continuation${jetty.version}.jar"/>
+    <include name="jetty9-security${jetty.version}.jar"/>
+  </patternset>
+
+  <patternset id="webruntime" >
+    <include name="asm-5.2.jar" />
+    <include name="asm-commons-5.2.jar" />
+    <include name="jetty9-plus${jetty.version}.jar"/>
+    <include name="jetty9-jndi${jetty.version}.jar"/>
+    <include name="jetty9-apache-jsp${jetty.version}-tweaked.jar" />
+    <include name="tomcat8-embed-jasper-8.5.14.jar" />
+    <include name="tomcat8-embed-el-8.5.14.jar" />
+    <include name="tomcat8-embed-core-8.5.14.jar" />
+    <include name="eclipse-ecj-3.11.1.jar" />
   </patternset>
 
   <patternset id="runtime" >
     <patternset refid="library" />
+    <patternset refid="web" />
   </patternset>
 
   <!-- Create a .war file for deployment. -->
   <target name="war"
           depends="compile">
+    <echo message="Removing problematic service definitions from"/>
+    <echo message="${libs}/jetty9-apache-jsp${jetty.version}.jar and using "/>
+    <echo message="${libs}/jetty9-apache-jsp${jetty.version}-tweaked.jar below." />
+    <delete file="${libs}/jetty9-apache-jsp${jetty.version}-tweaked.jar"
+            quiet="true" />
+    <jar destfile="${libs}/jetty9-apache-jsp${jetty.version}-tweaked.jar">
+      <zipfileset src="${libs}/jetty9-apache-jsp${jetty.version}.jar" >
+        <exclude name="**/javax.servlet.ServletContainerInitializer"/>
+      </zipfileset>
+    </jar>
     <war destfile="${dist}/${warfile}"
-         webxml="${resources}/web.xml">
+         duplicate="fail"
+         webxml="${resources}/web.xml"
+	       basedir="${classes}">
+      <restrict>
+        <not>
+          <and>
+            <name name="META-INF/*" />
+            <not>
+              <name name="META-INF/services/*" />
+            </not>
+          </and>
+        </not>
+        <archives>
+          <zips>
+            <fileset dir="${libs}">
+              <patternset refid="common" />
+              <patternset refid="web" />
+              <patternset refid="webruntime" />
+            </fileset>
+          </zips>
+        </archives>
+      </restrict>
+      <exclude name="**/Test*.class" />
+      <zipfileset dir="${resources}"
+                  prefix=""
+                  includes="logback.xml" />
       <zipfileset dir="${resources}/web"
                   prefix=""
-                  includes="css/* images/*"/>
+                  includes="css/* images/*" />
       <zipfileset dir="${resources}/web/jsps"
                   prefix="WEB-INF"
                   includes="*.jsp"/>
-      <lib dir="${libs}">
-        <patternset refid="web" />
-      </lib>
-      <classes dir="${classes}"/>
       <zipfileset dir="${resources}"
-                  prefix="WEB-INF/classes"
                   includes="*.properties" />
-      <metainf dir="${resources}"
-               includes="context.xml"/>
+      <fileset dir="${resources}" includes="jetty.xml" />
+      <manifest>
+        <attribute name="Implemented-By" value="The Tor Project" />
+        <attribute name="Implementation-Title" value="Exonerator Server"/>
+        <attribute name="Implementation-Version"
+                   value="${release.version}-${git.revision}"/>
+        <attribute name="Main-Class"
+                   value="org.torproject.exonerator.ServerMain" />
+      </manifest>
     </war>
   </target>
 
+  <!-- Create a test .war file for basic start w/o db resources. -->
+  <target name="smoke-test-war"
+          depends="war">
+
+    <delete file="${generated}/${name}-dummy-test.war"
+            quiet="true" />
+    <copy overwrite="true"
+          file="${resources}/test-web.xml"
+          tofile="${generated}/web.xml"/>
+    <jar destfile="${generated}/${name}-dummy-test.war">
+      <zipfileset src="${dist}/${warfile}" >
+        <exclude name="WEB-INF/web.xml"/>
+      </zipfileset>
+      <zipfileset dir="${generated}"
+                  prefix="WEB-INF"
+                  includes="web.xml" />
+      <manifest>
+        <attribute name="Implemented-By" value="The Tor Project" />
+        <attribute name="Implementation-Title" value="Test Exonerator Server"/>
+        <attribute name="Implementation-Version"
+                   value="${release.version}-${git.revision}"/>
+        <attribute name="Main-Class"
+                   value="org.torproject.exonerator.ServerMain" />
+      </manifest>
+    </jar>
+  </target>
 
   <!-- The following line adds the common targets and properties
        for Metrics' Java Projects.
diff --git a/src/main/java/org/torproject/exonerator/ServerMain.java b/src/main/java/org/torproject/exonerator/ServerMain.java
new file mode 100644
index 0000000..704c7a5
--- /dev/null
+++ b/src/main/java/org/torproject/exonerator/ServerMain.java
@@ -0,0 +1,32 @@
+/* Copyright 2017 The Tor Project
+ * See LICENSE for licensing information */
+
+package org.torproject.exonerator;
+
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.util.resource.Resource;
+import org.eclipse.jetty.xml.XmlConfiguration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ServerMain {
+
+  private static final Logger log = LoggerFactory.getLogger(ServerMain.class);
+
+  /** Starts the web server listening for incoming client connections. */
+  public static void main(String[] args) {
+    try {
+      Resource jettyXml = Resource.newSystemResource("jetty.xml");
+      log.info("Reading configuration from '{}'.", jettyXml);
+      XmlConfiguration configuration
+          = new XmlConfiguration(jettyXml.getInputStream());
+      Server server = (Server) configuration.configure();
+      server.start();
+      server.join();
+    } catch (Exception ex) {
+      log.error("Exiting, because of: {}.", ex.getMessage(), ex);
+      System.exit(1);
+    }
+  }
+}
+
diff --git a/src/main/resources/context.xml b/src/main/resources/context.xml
deleted file mode 100644
index 1cf53c5..0000000
--- a/src/main/resources/context.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<Context cookies="false">
-  <Resource name="jdbc/exonerator"
-            type="javax.sql.DataSource"
-            auth="Container"
-            username="metrics"
-            password="password"
-            driverClassName="org.postgresql.Driver"
-            url="jdbc:postgresql://localhost/exonerator"
-            maxActive="8"
-            maxIdle="4"
-            maxWait="15000"/>
-</Context>
-
diff --git a/src/main/resources/jetty.xml b/src/main/resources/jetty.xml
new file mode 100644
index 0000000..ba15c61
--- /dev/null
+++ b/src/main/resources/jetty.xml
@@ -0,0 +1,91 @@
+<?xml version="1.0"?>
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN"
+  "http://www.eclipse.org/jetty/configure.dtd">
+
+<Configure id="server" class="org.eclipse.jetty.server.Server" >
+  <Set name="dumpAfterStart">false</Set>
+
+  <New class="org.eclipse.jetty.util.thread.QueuedThreadPool">
+    <Set name="minThreads">25</Set>
+    <Set name="maxThreads">250</Set>
+    <Set name="detailedDump">false</Set>
+  </New>
+
+  <New id="webAppContext" class="org.eclipse.jetty.webapp.WebAppContext">
+    <Set name="logUrlOnStart">true</Set>
+    <Set name="contextPath">/</Set>
+    <Set name="war">
+      <SystemProperty name="java.class.path" />
+    </Set>
+    <Call name="setAttribute" >
+      <Arg>org.apache.tomcat.JarScanner</Arg>
+      <Arg>
+        <New class="org.apache.tomcat.util.scan.StandardJarScanner" />
+      </Arg>
+    </Call>
+    <New class="org.eclipse.jetty.plus.jndi.Resource">
+      <Arg><Ref refid="webAppContext" /></Arg>
+      <Arg>jdbc/exonerator</Arg>
+      <Arg>
+        <New class="org.postgresql.ds.PGPoolingDataSource">
+          <Set name="user">dummydatabaseuser</Set>
+          <Set name="password">dummypassword</Set>
+          <Set name="databaseName">exonerator</Set>
+          <Set name="serverName">localhost</Set>
+          <Set name="dataSourceName">exonerator</Set>
+          <Set name="initialConnections">2</Set>
+          <Set name="maxConnections">8</Set>
+          <Call name="initialize" />
+        </New>
+      </Arg>
+    </New>
+  </New>
+
+  <Call class="org.eclipse.jetty.webapp.Configuration$ClassList" name="setServerDefault">
+    <Arg><Ref refid="server" /></Arg>
+    <Call name="addBefore">
+      <Arg name="beforeClass">org.eclipse.jetty.webapp.JettyWebXmlConfiguration</Arg>
+      <Arg>
+        <Array type="String">
+          <Item>org.eclipse.jetty.annotations.AnnotationConfiguration</Item>
+        </Array>
+      </Arg>
+    </Call>
+    <Call name="addAfter">
+      <Arg name="afterClass">org.eclipse.jetty.webapp.FragmentConfiguration</Arg>
+      <Arg>
+        <Array type="String">
+          <Item>org.eclipse.jetty.plus.webapp.EnvConfiguration</Item>
+          <Item>org.eclipse.jetty.plus.webapp.PlusConfiguration</Item>
+        </Array>
+      </Arg>
+    </Call>
+  </Call>
+
+  <Call name="addConnector">
+    <Arg>
+      <New class="org.eclipse.jetty.server.ServerConnector">
+        <Arg>
+          <Ref id="server"/>
+        </Arg>
+        <Set name="port">
+          <SystemProperty name="exonerator.jetty.port" default="8080" />
+        </Set>
+        <Set name="host">127.0.0.1</Set>
+      </New>
+    </Arg>
+  </Call>
+
+  <Set name="handler">
+    <!-- maybe add more handlers (statistics, logging, etc.) later -->
+    <New class="org.eclipse.jetty.server.handler.ContextHandlerCollection">
+      <Call name="addHandler">
+        <Arg>
+          <Ref id="webAppContext"/>
+        </Arg>
+      </Call>
+    </New>
+  </Set>
+
+</Configure>
+
diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml
new file mode 100644
index 0000000..c29c057
--- /dev/null
+++ b/src/main/resources/logback.xml
@@ -0,0 +1,57 @@
+<configuration debug="false">
+
+  <!-- a path and a prefix -->
+  <property name="logfile-base" value="${LOGBASE}/exonerator-" />
+
+  <!-- log file names -->
+  <property name="fileall-logname" value="${logfile-base}all" />
+  <property name="fileerr-logname" value="${logfile-base}err" />
+  <property name="filestatistics-logname" value="${logfile-base}statistics" />
+
+  <!-- date pattern -->
+  <property name="utc-date-pattern" value="%date{ISO8601, UTC}" />
+
+  <!-- appender section -->
+  <appender name="FILEALL" class="ch.qos.logback.core.rolling.RollingFileAppender">
+    <file>${fileall-logname}.log</file>
+    <encoder>
+      <pattern>${utc-date-pattern} %level %logger{20}:%line %msg%n</pattern>
+    </encoder>
+    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+      <!-- rollover daily -->
+      <FileNamePattern>${fileall-logname}.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
+      <maxHistory>10</maxHistory>
+      <timeBasedFileNamingAndTriggeringPolicy
+            class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+        <!-- or whenever the file size reaches 1MB -->
+        <maxFileSize>1MB</maxFileSize>
+      </timeBasedFileNamingAndTriggeringPolicy>
+    </rollingPolicy>
+  </appender>
+
+  <appender name="FILEERR" class="ch.qos.logback.core.FileAppender">
+    <file>${fileerr-logname}.log</file>
+    <encoder>
+      <pattern>${utc-date-pattern} %level %logger{20}:%line %msg%n</pattern>
+    </encoder>
+
+    <!-- ERROR or worse -->
+    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+      <level>ERROR</level>
+    </filter>
+  </appender>
+
+  <!-- logger section -->
+  <logger name="org.torproject" >
+    <appender-ref ref="FILEERR" />
+  </logger>
+
+  <logger name="org.eclipse" level="INFO" />
+  <logger name="org.apache" level="INFO" />
+
+  <root level="INFO">
+    <appender-ref ref="FILEALL" />
+  </root>
+
+</configuration>
+
diff --git a/src/main/resources/logging.properties b/src/main/resources/logging.properties
deleted file mode 100644
index 44fbbbe..0000000
--- a/src/main/resources/logging.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-handlers = org.apache.juli.FileHandler
-
-org.apache.juli.FileHandler.level = FINE
-org.apache.juli.FileHandler.directory = ${catalina.base}/logs
-org.apache.juli.FileHandler.prefix = exonerator.
-
diff --git a/src/main/resources/test-web.xml b/src/main/resources/test-web.xml
new file mode 100644
index 0000000..04107f1
--- /dev/null
+++ b/src/main/resources/test-web.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<web-app version="3.1"
+   xmlns="http://xmlns.jcp.org/xml/ns/javaee"
+   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+   xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
+       http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
+   metadata-complete="false" >
+
+  <servlet>
+    <servlet-name>ExoneraTor</servlet-name>
+    <servlet-class>
+      org.torproject.exonerator.ExoneraTorServlet
+    </servlet-class>
+  </servlet>
+  <servlet-mapping>
+    <servlet-name>ExoneraTor</servlet-name>
+    <url-pattern>/index.html</url-pattern>
+  </servlet-mapping>
+
+  <servlet>
+    <servlet-name>Default</servlet-name>
+    <servlet-class>
+      org.eclipse.jetty.servlet.DefaultServlet
+    </servlet-class>
+    <init-param>
+      <param-name>aliases</param-name>
+      <param-value>false</param-value>
+    </init-param>
+    <init-param>
+      <param-name>acceptRanges</param-name>
+      <param-value>true</param-value>
+    </init-param>
+    <init-param>
+      <param-name>dirAllowed</param-name>
+      <param-value>false</param-value>
+    </init-param>
+    <init-param>
+      <param-name>welcomeServlets</param-name>
+      <param-value>true</param-value>
+    </init-param>
+    <init-param>
+      <param-name>redirectWelcome</param-name>
+      <param-value>false</param-value>
+    </init-param>
+  </servlet>
+  <servlet-mapping>
+    <servlet-name>Default</servlet-name>
+    <url-pattern>/</url-pattern>
+  </servlet-mapping>
+
+  <servlet>
+    <servlet-name>Query</servlet-name>
+    <servlet-class>
+      org.torproject.exonerator.QueryServlet
+    </servlet-class>
+  </servlet>
+  <servlet-mapping>
+    <servlet-name>Query</servlet-name>
+    <url-pattern>/query.json</url-pattern>
+  </servlet-mapping>
+
+  <welcome-file-list>
+    <welcome-file>index.html</welcome-file>
+  </welcome-file-list>
+
+</web-app>
+
diff --git a/src/main/resources/web.xml b/src/main/resources/web.xml
index 881a613..78ededd 100644
--- a/src/main/resources/web.xml
+++ b/src/main/resources/web.xml
@@ -1,10 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
-
-<web-app version="2.4"
-  xmlns="http://java.sun.com/xml/ns/j2ee"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
-  http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" >
+<web-app version="3.1"
+   xmlns="http://xmlns.jcp.org/xml/ns/javaee"
+   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+   xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
+       http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
+   metadata-complete="false" >
 
   <servlet>
     <servlet-name>ExoneraTor</servlet-name>
@@ -18,6 +18,37 @@
   </servlet-mapping>
 
   <servlet>
+    <servlet-name>Default</servlet-name>
+    <servlet-class>
+      org.eclipse.jetty.servlet.DefaultServlet
+    </servlet-class>
+    <init-param>
+      <param-name>aliases</param-name>
+      <param-value>false</param-value>
+    </init-param>
+    <init-param>
+      <param-name>acceptRanges</param-name>
+      <param-value>true</param-value>
+    </init-param>
+    <init-param>
+      <param-name>dirAllowed</param-name>
+      <param-value>false</param-value>
+    </init-param>
+    <init-param>
+      <param-name>welcomeServlets</param-name>
+      <param-value>true</param-value>
+    </init-param>
+    <init-param>
+      <param-name>redirectWelcome</param-name>
+      <param-value>false</param-value>
+    </init-param>
+  </servlet>
+  <servlet-mapping>
+    <servlet-name>Default</servlet-name>
+    <url-pattern>/</url-pattern>
+  </servlet-mapping>
+
+  <servlet>
     <servlet-name>Query</servlet-name>
     <servlet-class>
       org.torproject.exonerator.QueryServlet





More information about the tor-commits mailing list