Author: cwiklik Date: Tue Jan 15 16:50:44 2019 New Revision: 1851398 URL: http://svn.apache.org/viewvc?rev=1851398&view=rev Log: UIMA-5743 Upgraded jetty to v 9.4.14.v20181114. Modified code to use new JSP engine (Apache Jasper). The Glassfish JSP engine is no longer supported
Modified: uima/uima-ducc/trunk/src/main/admin/ducc.py uima/uima-ducc/trunk/uima-ducc-parent/pom.xml uima/uima-ducc/trunk/uima-ducc-web/pom.xml uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebServer.java Modified: uima/uima-ducc/trunk/src/main/admin/ducc.py URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/src/main/admin/ducc.py?rev=1851398&r1=1851397&r2=1851398&view=diff ============================================================================== --- uima/uima-ducc/trunk/src/main/admin/ducc.py (original) +++ uima/uima-ducc/trunk/src/main/admin/ducc.py Tue Jan 15 16:50:44 2019 @@ -202,8 +202,10 @@ class Ducc(DuccUtil): if ( self.ws_jvm_args != None ): jvm_opts.append(self.ws_jvm_args) self.add_to_classpath(ducc_home + '/webserver/lib/*') - self.add_to_classpath(ducc_home + '/webserver/lib/jsp/*') - + self.add_to_classpath(ducc_home + '/webserver/lib/apache-jsp/*') + self.add_to_classpath(ducc_home + '/webserver/lib/apache-jstl/*') + self.add_to_classpath(ducc_home + '/webserver/lib/websocket/*') + if ( c == 'orchestrator' ): if ( or_parms != None ): args = '-' + or_parms Modified: uima/uima-ducc/trunk/uima-ducc-parent/pom.xml URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-parent/pom.xml?rev=1851398&r1=1851397&r2=1851398&view=diff ============================================================================== --- uima/uima-ducc/trunk/uima-ducc-parent/pom.xml (original) +++ uima/uima-ducc/trunk/uima-ducc-parent/pom.xml Tue Jan 15 16:50:44 2019 @@ -161,7 +161,7 @@ <libpam.version>1.7</libpam.version> <jna.version>4.2.2</jna.version> <datatables.version>1.9.1</datatables.version> - <jetty.version>9.2.22.v20170606</jetty.version> + <jetty.version>9.4.14.v20181114</jetty.version> <orbit-org-apache-jasper.version>2.1.0.v201110031002</orbit-org-apache-jasper.version> <servlet-api.version>2.5</servlet-api.version> Modified: uima/uima-ducc/trunk/uima-ducc-web/pom.xml URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-web/pom.xml?rev=1851398&r1=1851397&r2=1851398&view=diff ============================================================================== --- uima/uima-ducc/trunk/uima-ducc-web/pom.xml (original) +++ uima/uima-ducc/trunk/uima-ducc-web/pom.xml Tue Jan 15 16:50:44 2019 @@ -55,11 +55,23 @@ <dependencyManagement> <dependencies> - <dependency> + <!-- >dependency> <groupId>org.eclipse.jetty.orbit</groupId> <artifactId>org.apache.jasper.glassfish</artifactId> <version>${orbit-org-apache-jasper.version}</version> - </dependency> + </dependency--> + <dependency> + <groupId>org.eclipse.jetty</groupId> + <artifactId>apache-jsp</artifactId> + <version>9.3.25.v20180904</version> +</dependency> + + + <dependency> + <groupId>org.eclipse.jetty</groupId> + <artifactId>apache-jstl</artifactId> + <version>9.3.25.v20180904</version> +</dependency> <dependency> <groupId>org.eclipse.jetty</groupId> @@ -206,11 +218,16 @@ </dependency> <!-- For org.apache.jasper.servlet.JspServlet in DuccWebServer --> - <dependency> + <!-- >dependency> <groupId>org.eclipse.jetty.orbit</groupId> <artifactId>org.apache.jasper.glassfish</artifactId> - </dependency> + </dependency --> + <dependency> + <groupId>org.eclipse.jetty</groupId> + <artifactId>apache-jsp</artifactId> + </dependency> + <!-- Dependencies on other DUCC projects --> <dependency> <groupId>org.apache.uima</groupId> Modified: uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebServer.java URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebServer.java?rev=1851398&r1=1851397&r2=1851398&view=diff ============================================================================== --- uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebServer.java (original) +++ uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebServer.java Tue Jan 15 16:50:44 2019 @@ -19,18 +19,29 @@ package org.apache.uima.ducc.ws.server; import java.io.File; +import java.io.IOException; import java.io.PrintWriter; import java.net.InetAddress; +import java.net.URL; +import java.net.URLClassLoader; import java.util.ArrayList; +import java.util.List; import java.util.Properties; import org.apache.jasper.servlet.JspServlet; +import org.apache.tomcat.InstanceManager; +import org.apache.tomcat.SimpleInstanceManager; +import org.apache.tomcat.util.scan.StandardJarScanner; import org.apache.uima.ducc.common.config.CommonConfiguration; import org.apache.uima.ducc.common.internationalization.Messages; import org.apache.uima.ducc.common.utils.DuccLogger; import org.apache.uima.ducc.common.utils.DuccPropertiesResolver; import org.apache.uima.ducc.common.utils.id.DuccId; import org.apache.uima.ducc.ws.DuccPlugins; +import org.eclipse.jetty.annotations.ServletContainerInitializersStarter; +import org.eclipse.jetty.apache.jsp.JettyJasperInitializer; +import org.eclipse.jetty.jsp.JettyJspServlet; +import org.eclipse.jetty.plus.annotation.ContainerInitializer; import org.eclipse.jetty.server.Connector; import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.HttpConfiguration; @@ -48,6 +59,7 @@ import org.eclipse.jetty.server.session. import org.eclipse.jetty.servlet.DefaultServlet; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; +import org.eclipse.jetty.util.component.AbstractLifeCycle; import org.eclipse.jetty.util.ssl.SslContextFactory; import org.eclipse.jetty.util.thread.QueuedThreadPool; import org.eclipse.jetty.util.thread.ScheduledExecutorScheduler; @@ -67,6 +79,7 @@ public class DuccWebServer { PortHttp("42133"), PortHttps("42155"), WelcomePage("index.html"), + JavaVersion("1.8") ; private String defaultValue; private ConfigValue(String value) { @@ -168,7 +181,49 @@ public class DuccWebServer { public String getKeyManagerPassword() { return DuccWebServerHelper.getKeyManagerPassword(); } - + private static List<ContainerInitializer> jspInitializers() { + JettyJasperInitializer sci = new JettyJasperInitializer(); + ContainerInitializer initializer = new ContainerInitializer(sci, null); + List<ContainerInitializer> initializers = new ArrayList<ContainerInitializer>(); + initializers.add(initializer); + return initializers; + } + private void enableEmbeddedJspSupport(ServletContextHandler servletContextHandler) throws IOException + { + // Establish Scratch directory for the servlet context (used by JSP compilation) + File tempDir = new File(System.getProperty("java.io.tmpdir")); + File scratchDir = new File(tempDir.toString(), "embedded-jetty-jsp"); + + if (!scratchDir.exists()) + { + if (!scratchDir.mkdirs()) + { + throw new IOException("Unable to create scratch directory: " + scratchDir); + } + } + servletContextHandler.setAttribute("javax.servlet.context.tempdir", scratchDir); + + // Set Classloader of Context to be sane (needed for JSTL) + // JSP requires a non-System classloader, this simply wraps the + // embedded System classloader in a way that makes it suitable + // for JSP to use + ClassLoader jspClassLoader = new URLClassLoader(new URL[0], this.getClass().getClassLoader()); + servletContextHandler.setClassLoader(jspClassLoader); + + // Manually call JettyJasperInitializer on context startup + servletContextHandler.addBean(new JspStarter(servletContextHandler)); + + // Create / Register JSP Servlet (must be named "jsp" per spec) + ServletHolder holderJsp = new ServletHolder("jsp", JettyJspServlet.class); + holderJsp.setInitOrder(0); + holderJsp.setInitParameter("logVerbosityLevel", "ERROR"); + holderJsp.setInitParameter("fork", "false"); + holderJsp.setInitParameter("xpoweredBy", "false"); + holderJsp.setInitParameter("compilerTargetVM", ConfigValue.JavaVersion.toString()); + holderJsp.setInitParameter("compilerSourceVM", ConfigValue.JavaVersion.toString()); + holderJsp.setInitParameter("keepgenerated", "false"); + servletContextHandler.addServlet(holderJsp, "*.jsp"); + } private void init() { String methodName = "init"; logger.trace(methodName, null, messages.fetch("enter")); @@ -260,20 +315,25 @@ public class DuccWebServer { server.addConnector(https); // JSP - ServletContextHandler jspHandler = new ServletContextHandler(ServletContextHandler.SESSIONS); + jspHandler.setContextPath("/"); jspHandler.setResourceBase("root"); - jspHandler.setClassLoader(Thread.currentThread().getContextClassLoader()); + try { + enableEmbeddedJspSupport(jspHandler); + } catch( IOException e) { + logger.error(methodName, jobid, e); + } + jspHandler.addServlet(DefaultServlet.class, "/"); - ServletHolder jsp = jspHandler.addServlet(JspServlet.class, "*.jsp"); - jsp.setInitParameter("classpath", jspHandler.getClassPath()); - // + ResourceHandler resourceHandler = new ResourceHandler(); resourceHandler.setDirectoriesListed(true); rootDir = DuccWebServerHelper.getDuccWebRoot(); resourceHandler.setResourceBase(rootDir); - // + + jspHandler.setAttribute("org.eclipse.jetty.containerInitializers", jspInitializers()); + jspHandler.setAttribute(InstanceManager.class.getName(), new SimpleInstanceManager()); try { Properties properties = DuccWebProperties.get(); String ducc_runmode = properties.getProperty("ducc.runmode","Production"); @@ -369,5 +429,32 @@ public class DuccWebServer { public void stop() throws Exception { server.stop(); } + public static class JspStarter extends AbstractLifeCycle implements ServletContextHandler.ServletContainerInitializerCaller + { + JettyJasperInitializer sci; + ServletContextHandler context; + + public JspStarter (ServletContextHandler context) + { + this.sci = new JettyJasperInitializer(); + this.context = context; + this.context.setAttribute("org.apache.tomcat.JarScanner", new StandardJarScanner()); + } + @Override + protected void doStart() throws Exception + { + ClassLoader old = Thread.currentThread().getContextClassLoader(); + Thread.currentThread().setContextClassLoader(context.getClassLoader()); + try + { + sci.onStartup(null, context.getServletContext()); + super.doStart(); + } + finally + { + Thread.currentThread().setContextClassLoader(old); + } + } + } }