From aa4ad63e7fe04c50a6e0681db9a947542d6d0deb Mon Sep 17 00:00:00 2001 From: antelder Date: Thu, 27 May 2010 10:36:07 +0000 Subject: Move module to contrib as its not in the build or being actively worked on git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@948772 13f79535-47bb-0310-9956-ffa450edef68 --- sca-java-2.x/contrib/modules/host-jetty7/LICENSE | 205 ++++++++ .../modules/host-jetty7/META-INF/MANIFEST.MF | 27 ++ sca-java-2.x/contrib/modules/host-jetty7/NOTICE | 6 + sca-java-2.x/contrib/modules/host-jetty7/pom.xml | 57 +++ .../sca/http/jetty7/JettyDefaultServlet.java | 90 ++++ .../tuscany/sca/http/jetty7/JettyServer.java | 520 +++++++++++++++++++++ .../org.apache.tuscany.sca.host.http.ServletHost | 18 + .../sca/http/jetty7/JettyServerTestCase.java | 335 +++++++++++++ .../src/test/resources/content/test.html | 21 + .../src/test/resources/tuscany.keyStore | Bin 0 -> 1265 bytes sca-java-2.x/trunk/modules/host-jetty7/LICENSE | 205 -------- .../trunk/modules/host-jetty7/META-INF/MANIFEST.MF | 27 -- sca-java-2.x/trunk/modules/host-jetty7/NOTICE | 6 - sca-java-2.x/trunk/modules/host-jetty7/pom.xml | 57 --- .../sca/http/jetty7/JettyDefaultServlet.java | 90 ---- .../tuscany/sca/http/jetty7/JettyServer.java | 520 --------------------- .../org.apache.tuscany.sca.host.http.ServletHost | 18 - .../sca/http/jetty7/JettyServerTestCase.java | 335 ------------- .../src/test/resources/content/test.html | 21 - .../src/test/resources/tuscany.keyStore | Bin 1265 -> 0 bytes 20 files changed, 1279 insertions(+), 1279 deletions(-) create mode 100644 sca-java-2.x/contrib/modules/host-jetty7/LICENSE create mode 100644 sca-java-2.x/contrib/modules/host-jetty7/META-INF/MANIFEST.MF create mode 100644 sca-java-2.x/contrib/modules/host-jetty7/NOTICE create mode 100644 sca-java-2.x/contrib/modules/host-jetty7/pom.xml create mode 100644 sca-java-2.x/contrib/modules/host-jetty7/src/main/java/org/apache/tuscany/sca/http/jetty7/JettyDefaultServlet.java create mode 100644 sca-java-2.x/contrib/modules/host-jetty7/src/main/java/org/apache/tuscany/sca/http/jetty7/JettyServer.java create mode 100644 sca-java-2.x/contrib/modules/host-jetty7/src/main/resources/META-INF/services/org.apache.tuscany.sca.host.http.ServletHost create mode 100644 sca-java-2.x/contrib/modules/host-jetty7/src/test/java/org/apache/tuscany/sca/http/jetty7/JettyServerTestCase.java create mode 100644 sca-java-2.x/contrib/modules/host-jetty7/src/test/resources/content/test.html create mode 100644 sca-java-2.x/contrib/modules/host-jetty7/src/test/resources/tuscany.keyStore delete mode 100644 sca-java-2.x/trunk/modules/host-jetty7/LICENSE delete mode 100644 sca-java-2.x/trunk/modules/host-jetty7/META-INF/MANIFEST.MF delete mode 100644 sca-java-2.x/trunk/modules/host-jetty7/NOTICE delete mode 100644 sca-java-2.x/trunk/modules/host-jetty7/pom.xml delete mode 100644 sca-java-2.x/trunk/modules/host-jetty7/src/main/java/org/apache/tuscany/sca/http/jetty7/JettyDefaultServlet.java delete mode 100644 sca-java-2.x/trunk/modules/host-jetty7/src/main/java/org/apache/tuscany/sca/http/jetty7/JettyServer.java delete mode 100644 sca-java-2.x/trunk/modules/host-jetty7/src/main/resources/META-INF/services/org.apache.tuscany.sca.host.http.ServletHost delete mode 100644 sca-java-2.x/trunk/modules/host-jetty7/src/test/java/org/apache/tuscany/sca/http/jetty7/JettyServerTestCase.java delete mode 100644 sca-java-2.x/trunk/modules/host-jetty7/src/test/resources/content/test.html delete mode 100644 sca-java-2.x/trunk/modules/host-jetty7/src/test/resources/tuscany.keyStore diff --git a/sca-java-2.x/contrib/modules/host-jetty7/LICENSE b/sca-java-2.x/contrib/modules/host-jetty7/LICENSE new file mode 100644 index 0000000000..8aa906c321 --- /dev/null +++ b/sca-java-2.x/contrib/modules/host-jetty7/LICENSE @@ -0,0 +1,205 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed 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. + + + diff --git a/sca-java-2.x/contrib/modules/host-jetty7/META-INF/MANIFEST.MF b/sca-java-2.x/contrib/modules/host-jetty7/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..91863113ea --- /dev/null +++ b/sca-java-2.x/contrib/modules/host-jetty7/META-INF/MANIFEST.MF @@ -0,0 +1,27 @@ +Manifest-Version: 1.0 +Private-Package: org.apache.tuscany.sca.http.jetty;version="2.0.0" +SCA-Version: 1.1 +Bundle-Name: Apache Tuscany SCA Jetty7 Servlet Host Extension +Bundle-Vendor: The Apache Software Foundation +Bundle-Version: 2.0.0 +Bundle-ManifestVersion: 2 +Bundle-License: http://www.apache.org/licenses/LICENSE-2.0.txt +Bundle-Description: Apache Tuscany SCA Jetty Servlet Host Extension +Import-Package: javax.net.ssl;resolution:=optional, + javax.servlet, + javax.servlet.http;resolution:=optional, + org.apache.tuscany.sca.core;version="2.0.0", + org.apache.tuscany.sca.host.http;version="2.0.0", + org.apache.tuscany.sca.work;version="2.0.0", + org.eclipse.jetty.util.component;version="7.0.0.v20091005", + org.eclipse.jetty;version="7.0.0.v20091005", + org.eclipse.jetty.handler;version="7.0.0.v20091005", + org.eclipse.jetty.nio;version="7.0.0.v20091005", + org.eclipse.jetty.security;version="7.0.0.v20091005", + org.eclipse.jetty.servlet;version="7.0.0.v20091005", + org.eclipse.jetty.util.log;version="7.0.0.v20091005", + org.eclipse.jetty.util.resource;version="7.0.0.v20091005", + org.eclipse.jetty.util.thread;version="7.0.0.v20091005" +Bundle-SymbolicName: org.apache.tuscany.sca.host.jetty7 +Bundle-DocURL: http://www.apache.org/ +Bundle-RequiredExecutionEnvironment: J2SE-1.5,JavaSE-1.6 diff --git a/sca-java-2.x/contrib/modules/host-jetty7/NOTICE b/sca-java-2.x/contrib/modules/host-jetty7/NOTICE new file mode 100644 index 0000000000..ad2ba40961 --- /dev/null +++ b/sca-java-2.x/contrib/modules/host-jetty7/NOTICE @@ -0,0 +1,6 @@ +${pom.name} +Copyright (c) 2005 - 2010 The Apache Software Foundation + +This product includes software developed by +The Apache Software Foundation (http://www.apache.org/). + diff --git a/sca-java-2.x/contrib/modules/host-jetty7/pom.xml b/sca-java-2.x/contrib/modules/host-jetty7/pom.xml new file mode 100644 index 0000000000..eb2f926e97 --- /dev/null +++ b/sca-java-2.x/contrib/modules/host-jetty7/pom.xml @@ -0,0 +1,57 @@ + + + + 4.0.0 + + org.apache.tuscany.sca + tuscany-modules + 2.0-SNAPSHOT + ../pom.xml + + tuscany-host-jetty7 + Apache Tuscany SCA Jetty7 Servlet Host Extension + + + + org.apache.tuscany.sca + tuscany-host-http + 2.0-SNAPSHOT + + + + org.eclipse.jetty + jetty-server + 7.0.0.v20091005 + + + + org.eclipse.jetty + jetty-servlet + 7.0.0.v20091005 + + + + javax.servlet + servlet-api + 2.5 + + + + diff --git a/sca-java-2.x/contrib/modules/host-jetty7/src/main/java/org/apache/tuscany/sca/http/jetty7/JettyDefaultServlet.java b/sca-java-2.x/contrib/modules/host-jetty7/src/main/java/org/apache/tuscany/sca/http/jetty7/JettyDefaultServlet.java new file mode 100644 index 0000000000..dc6f155f80 --- /dev/null +++ b/sca-java-2.x/contrib/modules/host-jetty7/src/main/java/org/apache/tuscany/sca/http/jetty7/JettyDefaultServlet.java @@ -0,0 +1,90 @@ +/* + * 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.tuscany.sca.http.jetty7; + +import java.io.File; +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; + +import org.eclipse.jetty.servlet.DefaultServlet; +import org.eclipse.jetty.util.resource.Resource; +import org.eclipse.jetty.util.resource.URLResource; + +/** + * Customizes the Jetty default Servlet. + * + * @version $Rev$ $Date$ + */ +public class JettyDefaultServlet extends DefaultServlet { + private static final long serialVersionUID = 7000218247190209353L; + + private String documentRoot; + private String servletPath; + + public JettyDefaultServlet(String servletPath, String documentRoot) { + this.servletPath = servletPath + '/'; + this.documentRoot = documentRoot; + } + + @Override + public Resource getResource(String pathInContext) { + if (pathInContext.startsWith(servletPath)) { + if (pathInContext.length() > servletPath.length()) { + pathInContext = pathInContext.substring(servletPath.length()); + } else { + pathInContext = ""; + } + } else { + if ((pathInContext + "/").equals(servletPath)) { + pathInContext = ""; + } + } + + try { + URL url = new URL(documentRoot + "/" + pathInContext); + return new URLResource(url, url.openConnection()) { + private static final long serialVersionUID = 8560952113883507717L; + + @Override + public File getFile() throws IOException { + return null; + } + + }; + } catch (MalformedURLException e) { + return null; + } catch (IOException e) { + return null; + } + } + + @Override + public String getInitParameter(String name) { + if ("resourceBase".equals(name)) { + return documentRoot; + } else if ("redirectWelcome".equals(name)) { + return "true"; + } else { + return super.getInitParameter(name); + } + } + +} diff --git a/sca-java-2.x/contrib/modules/host-jetty7/src/main/java/org/apache/tuscany/sca/http/jetty7/JettyServer.java b/sca-java-2.x/contrib/modules/host-jetty7/src/main/java/org/apache/tuscany/sca/http/jetty7/JettyServer.java new file mode 100644 index 0000000000..ae8e196147 --- /dev/null +++ b/sca-java-2.x/contrib/modules/host-jetty7/src/main/java/org/apache/tuscany/sca/http/jetty7/JettyServer.java @@ -0,0 +1,520 @@ +/* + * 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.tuscany.sca.http.jetty7; + +import java.net.InetAddress; +import java.net.MalformedURLException; +import java.net.URI; +import java.net.URL; +import java.net.UnknownHostException; +import java.security.AccessController; +import java.security.KeyStore; +import java.security.PrivilegedAction; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.Map.Entry; + +import javax.servlet.RequestDispatcher; +import javax.servlet.Servlet; +import javax.servlet.ServletException; + +import org.apache.tuscany.sca.core.ExtensionPointRegistry; +import org.apache.tuscany.sca.core.LifeCycleListener; +import org.apache.tuscany.sca.core.UtilityExtensionPoint; +import org.apache.tuscany.sca.host.http.DefaultResourceServlet; +import org.apache.tuscany.sca.host.http.ServletHost; +import org.apache.tuscany.sca.host.http.ServletMappingException; +import org.apache.tuscany.sca.work.WorkScheduler; +import org.eclipse.jetty.server.Connector; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.server.handler.ContextHandler; +import org.eclipse.jetty.server.nio.SelectChannelConnector; +import org.eclipse.jetty.server.session.SessionHandler; +import org.eclipse.jetty.server.ssl.SslSocketConnector; +import org.eclipse.jetty.servlet.DefaultServlet; +import org.eclipse.jetty.servlet.ServletHandler; +import org.eclipse.jetty.servlet.ServletHolder; +import org.eclipse.jetty.servlet.ServletMapping; +import org.eclipse.jetty.util.log.JavaUtilLog; +import org.eclipse.jetty.util.log.Log; +import org.eclipse.jetty.util.log.Logger; +import org.eclipse.jetty.util.thread.ThreadPool; + +/** + * Implements an HTTP transport service using Jetty. + * + * @version $Rev$ $Date$ + */ +public class JettyServer implements ServletHost, LifeCycleListener { + private static final java.util.logging.Logger logger = java.util.logging.Logger.getLogger(JettyServer.class.getName()); + + private final Object joinLock = new Object(); + private String trustStore; + private String truststorePassword; + private String keyStore; + private String keyStorePassword; + + private String keyStoreType; + private String trustStoreType; + + private boolean sendServerVersion; + private WorkScheduler workScheduler; + private int defaultPort = portDefault; + public static int portDefault = 8080; + + /** + * Represents a port and the server that serves it. + */ + private class Port { + private Server server; + private ServletHandler servletHandler; + + private Port(Server server, ServletHandler servletHandler) { + this.server = server; + this.servletHandler = servletHandler; + } + + public Server getServer() { + return server; + } + + public ServletHandler getServletHandler() { + return servletHandler; + } + } + + private Map ports = new HashMap(); + + private String contextPath = "/"; + private Logger jettyLogger; + + public JettyServer(ExtensionPointRegistry registry) { + this(registry.getExtensionPoint(UtilityExtensionPoint.class).getUtility(WorkScheduler.class)); + } + + protected JettyServer(WorkScheduler workScheduler) { + this.workScheduler = workScheduler; + AccessController.doPrivileged(new PrivilegedAction() { + public Object run() { + trustStore = System.getProperty("javax.net.ssl.trustStore"); + truststorePassword = System.getProperty("javax.net.ssl.trustStorePassword"); + keyStore = System.getProperty("javax.net.ssl.keyStore"); + keyStorePassword = System.getProperty("javax.net.ssl.keyStorePassword"); + + keyStoreType = System.getProperty("javax.net.ssl.keyStoreType", KeyStore.getDefaultType()); + trustStoreType = System.getProperty("javax.net.ssl.trustStoreType", KeyStore.getDefaultType()); + return null; + } + }); + } + + public String getName() { + return "jetty"; + } + + public void setDefaultPort(int port) { + defaultPort = port; + } + + public int getDefaultPort() { + return defaultPort; + } + + public void setSendServerVersion(boolean sendServerVersion) { + this.sendServerVersion = sendServerVersion; + } + + /** + * Stop all the started servers. + */ + public void stop() { + synchronized (joinLock) { + joinLock.notifyAll(); + } + try { + Set> entries = new HashSet>(ports.entrySet()); + for (Entry entry : entries) { + Port port = entry.getValue(); + Server server = port.getServer(); + server.stop(); + server.setStopAtShutdown(false); + ports.remove(entry.getKey()); + } + } catch (Exception e) { + throw new ServletMappingException(e); + } finally { + if (jettyLogger != null) { + Log.setLog(jettyLogger); + jettyLogger = null; + } + } + } + + private void configureSSL(SslSocketConnector connector) { + connector.setProtocol("TLS"); + connector.setKeystore(keyStore); + connector.setKeyPassword(keyStorePassword); + connector.setKeystoreType(keyStoreType); + + connector.setTruststore(trustStore); + connector.setTrustPassword(truststorePassword); + connector.setTruststoreType(trustStoreType); + + connector.setPassword(keyStorePassword); + if (trustStore != null) { + connector.setNeedClientAuth(true); + } + + } + + public void addServletMapping(String suri, Servlet servlet) throws ServletMappingException { + URI uri = URI.create(suri); + + // Get the URI scheme and port + String scheme = uri.getScheme(); + if (scheme == null) { + scheme = "http"; + } + int portNumber = uri.getPort(); + if (portNumber == -1) { + portNumber = defaultPort; + } + + // Get the port object associated with the given port number + Port port = ports.get(portNumber); + if (port == null) { + + // Create and start a new server + try { + Server server = new Server(); + server.setThreadPool(new WorkSchedulerThreadPool()); + if ("https".equals(scheme)) { + // Connector httpConnector = new SelectChannelConnector(); + // httpConnector.setPort(portNumber); + SslSocketConnector sslConnector = new SslSocketConnector(); + sslConnector.setPort(portNumber); + configureSSL(sslConnector); + server.setConnectors(new Connector[] {sslConnector}); + } else { + SelectChannelConnector selectConnector = new SelectChannelConnector(); + selectConnector.setPort(portNumber); + server.setConnectors(new Connector[] {selectConnector}); + } + + ContextHandler contextHandler = new ContextHandler(); + //contextHandler.setContextPath(contextPath); + contextHandler.setContextPath("/"); + server.setHandler(contextHandler); + + SessionHandler sessionHandler = new SessionHandler(); + ServletHandler servletHandler = new ServletHandler(); + sessionHandler.setHandler(servletHandler); + + contextHandler.setHandler(sessionHandler); + + server.setStopAtShutdown(true); + server.setSendServerVersion(sendServerVersion); + server.start(); + + // Keep track of the new server and Servlet handler + port = new Port(server, servletHandler); + ports.put(portNumber, port); + + } catch (Exception e) { + throw new ServletMappingException(e); + } + } + + // Register the Servlet mapping + ServletHandler servletHandler = port.getServletHandler(); + ServletHolder holder; + if (servlet instanceof DefaultResourceServlet) { + + // Optimize the handling of resource requests, use the Jetty default Servlet + // instead of our default resource Servlet + String servletPath = uri.getPath(); + if (servletPath.endsWith("*")) { + servletPath = servletPath.substring(0, servletPath.length() - 1); + } + if (servletPath.endsWith("/")) { + servletPath = servletPath.substring(0, servletPath.length() - 1); + } + if (!servletPath.startsWith("/")) { + servletPath = '/' + servletPath; + } + + DefaultResourceServlet resourceServlet = (DefaultResourceServlet)servlet; + DefaultServlet defaultServlet = new JettyDefaultServlet(servletPath, resourceServlet.getDocumentRoot()); + holder = new ServletHolder(defaultServlet); + + } else { + holder = new ServletHolder(servlet); + } + servletHandler.addServlet(holder); + + ServletMapping mapping = new ServletMapping(); + mapping.setServletName(holder.getName()); + String path = uri.getPath(); + + if (!path.startsWith("/")) { + path = '/' + path; + } + + if (!path.startsWith(contextPath)) { + path = contextPath + path; + } + + mapping.setPathSpec(path); + servletHandler.addServletMapping(mapping); + + // Compute the complete URL + String host; + try { + host = InetAddress.getLocalHost().getHostName(); + } catch (UnknownHostException e) { + host = "localhost"; + } + URL addedURL; + try { + addedURL = new URL(scheme, host, portNumber, path); + } catch (MalformedURLException e) { + throw new ServletMappingException(e); + } + logger.info("Added Servlet mapping: " + addedURL); + } + + public URL getURLMapping(String suri) throws ServletMappingException { + URI uri = URI.create(suri); + + // Get the URI scheme and port + String scheme = uri.getScheme(); + if (scheme == null) { + scheme = "http"; + } + int portNumber = uri.getPort(); + if (portNumber == -1) { + portNumber = defaultPort; + } + + // Get the host + String host; + try { + host = InetAddress.getLocalHost().getHostName(); + } catch (UnknownHostException e) { + host = "localhost"; + } + + // Construct the URL + String path = uri.getPath(); + + if (!path.startsWith("/")) { + path = '/' + path; + } + + if (!path.startsWith(contextPath)) { + path = contextPath + path; + } + + URL url; + try { + url = new URL(scheme, host, portNumber, path); + } catch (MalformedURLException e) { + throw new ServletMappingException(e); + } + return url; + } + + public Servlet getServletMapping(String suri) throws ServletMappingException { + + if (suri == null) { + return null; + } + + URI uri = URI.create(suri); + + // Get the URI port + int portNumber = uri.getPort(); + if (portNumber == -1) { + portNumber = defaultPort; + } + + // Get the port object associated with the given port number + Port port = ports.get(portNumber); + if (port == null) { + return null; + } + + // Remove the Servlet mapping for the given Servlet + ServletHandler servletHandler = port.getServletHandler(); + Servlet servlet = null; + List mappings = + new ArrayList(Arrays.asList(servletHandler.getServletMappings())); + String path = uri.getPath(); + + if (!path.startsWith("/")) { + path = '/' + path; + } + + if (!path.startsWith(contextPath)) { + path = contextPath + path; + } + + for (ServletMapping mapping : mappings) { + if (Arrays.asList(mapping.getPathSpecs()).contains(path)) { + try { + servlet = servletHandler.getServlet(mapping.getServletName()).getServlet(); + } catch (ServletException e) { + throw new IllegalStateException(e); + } + break; + } + } + return servlet; + } + + public Servlet removeServletMapping(String suri) { + URI uri = URI.create(suri); + + // Get the URI port + int portNumber = uri.getPort(); + if (portNumber == -1) { + portNumber = defaultPort; + } + + // Get the port object associated with the given port number + Port port = ports.get(portNumber); + if (port == null) { + // TODO - EPR - SL commented out exception temporarily as the runtime is shared + // between multiple nodes in a VM and shutting down one node blows + // up any other nodes when they shut down. + //throw new IllegalStateException("No servlet registered at this URI: " + suri); + logger.warning("No servlet registered at this URI: " + suri); + return null; + } + + // Remove the Servlet mapping for the given Servlet + ServletHandler servletHandler = port.getServletHandler(); + Servlet removedServlet = null; + List mappings = + new ArrayList(Arrays.asList(servletHandler.getServletMappings())); + String path = uri.getPath(); + + if (!path.startsWith("/")) { + path = '/' + path; + } + + if (!path.startsWith(contextPath)) { + path = contextPath + path; + } + + for (ServletMapping mapping : mappings) { + if (Arrays.asList(mapping.getPathSpecs()).contains(path)) { + try { + removedServlet = servletHandler.getServlet(mapping.getServletName()).getServlet(); + } catch (ServletException e) { + throw new IllegalStateException(e); + } + mappings.remove(mapping); + logger.info("Removed Servlet mapping: " + path); + break; + } + } + if (removedServlet != null) { + servletHandler.setServletMappings(mappings.toArray(new ServletMapping[mappings.size()])); + + // Stop the port if there are no servlet mappings on it anymore + if (mappings.size() == 0) { + try { + Server server = port.getServer(); + server.stop(); + server.setStopAtShutdown(false); + } catch (Exception e) { + throw new IllegalStateException(e); + } + ports.remove(portNumber); + } + + } else { + logger.warning("Trying to Remove servlet mapping: " + path + " where mapping is not registered"); + } + + return removedServlet; + } + + public RequestDispatcher getRequestDispatcher(String suri) throws ServletMappingException { + //FIXME implement this later + return null; + } + + public String getContextPath() { + return contextPath; + } + + public void setContextPath(String path) { + this.contextPath = path; + } + + /** + * A wrapper to enable use of a WorkScheduler with Jetty + */ + private class WorkSchedulerThreadPool implements ThreadPool { + + public boolean dispatch(Runnable work) { + workScheduler.scheduleWork(work); + return true; + } + + public void join() throws InterruptedException { + synchronized (joinLock) { + joinLock.wait(); + } + } + + public int getThreads() { + throw new UnsupportedOperationException(); + } + + public int getIdleThreads() { + throw new UnsupportedOperationException(); + } + + public boolean isLowOnThreads() { + return false; + } + } + + public void setAttribute(String name, Object value) { + throw new UnsupportedOperationException(); + } + + public void start() { + try { + jettyLogger = new JavaUtilLog(JettyServer.class.getName()); + Log.setLog(jettyLogger); + } catch (Throwable e) { + // Ignore + } + } + +} diff --git a/sca-java-2.x/contrib/modules/host-jetty7/src/main/resources/META-INF/services/org.apache.tuscany.sca.host.http.ServletHost b/sca-java-2.x/contrib/modules/host-jetty7/src/main/resources/META-INF/services/org.apache.tuscany.sca.host.http.ServletHost new file mode 100644 index 0000000000..99278c123b --- /dev/null +++ b/sca-java-2.x/contrib/modules/host-jetty7/src/main/resources/META-INF/services/org.apache.tuscany.sca.host.http.ServletHost @@ -0,0 +1,18 @@ +# 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. +# Implementation class for the ServletHost +org.apache.tuscany.sca.http.jetty7.JettyServer;name=jetty7,ranking=50 diff --git a/sca-java-2.x/contrib/modules/host-jetty7/src/test/java/org/apache/tuscany/sca/http/jetty7/JettyServerTestCase.java b/sca-java-2.x/contrib/modules/host-jetty7/src/test/java/org/apache/tuscany/sca/http/jetty7/JettyServerTestCase.java new file mode 100644 index 0000000000..ff6894e858 --- /dev/null +++ b/sca-java-2.x/contrib/modules/host-jetty7/src/test/java/org/apache/tuscany/sca/http/jetty7/JettyServerTestCase.java @@ -0,0 +1,335 @@ +/* + * 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.tuscany.sca.http.jetty7; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.ConnectException; +import java.net.Socket; +import java.net.URL; + +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLSession; +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import junit.framework.TestCase; + +import org.apache.tuscany.sca.host.http.DefaultResourceServlet; +import org.apache.tuscany.sca.http.jetty7.JettyServer; +import org.apache.tuscany.sca.work.NotificationListener; +import org.apache.tuscany.sca.work.WorkScheduler; + +/** + * @version $Rev$ $Date$ + */ +public class JettyServerTestCase extends TestCase { + + private static final String REQUEST1_HEADER = + "GET / HTTP/1.0\n" + "Host: localhost\n" + + "Content-Type: text/xml\n" + + "Connection: close\n" + + "Content-Length: "; + private static final String REQUEST1_CONTENT = ""; + private static final String REQUEST1 = + REQUEST1_HEADER + REQUEST1_CONTENT.getBytes().length + "\n\n" + REQUEST1_CONTENT; + + private static final String REQUEST2_HEADER = + "GET /webcontent/test.html HTTP/1.0\n" + "Host: localhost\n" + + "Content-Type: text/xml\n" + + "Connection: close\n" + + "Content-Length: "; + private static final String REQUEST2_CONTENT = ""; + private static final String REQUEST2 = + REQUEST2_HEADER + REQUEST2_CONTENT.getBytes().length + "\n\n" + REQUEST2_CONTENT; + + private static final int HTTP_PORT = 8085; + + private WorkScheduler workScheduler = new WorkScheduler() { + + public void scheduleWork(T work) { + Thread thread = new Thread(work); + thread.start(); + } + + public void scheduleWork(T work, NotificationListener listener) { + scheduleWork(work); + } + + public void destroy() { + } + }; + + /** + * Verifies requests are properly routed according to the Servlet mapping + */ + public void testRegisterServletMapping() throws Exception { + JettyServer service = new JettyServer(workScheduler); + service.start(); + TestServlet servlet = new TestServlet(); + service.addServletMapping("http://127.0.0.1:" + HTTP_PORT + "/", servlet); + Socket client = new Socket("127.0.0.1", HTTP_PORT); + OutputStream os = client.getOutputStream(); + os.write(REQUEST1.getBytes()); + os.flush(); + read(client); + service.stop(); + assertTrue(servlet.invoked); + } + + public void testRegisterServletMappingSSL() throws Exception { + System.setProperty("javax.net.ssl.keyStore", "target/test-classes/tuscany.keyStore"); + System.setProperty("javax.net.ssl.keyStorePassword", "apache"); + System.setProperty("jetty.ssl.password", "apache"); + System.setProperty("org.eclipse.jetty.ssl.password", "apache"); + JettyServer service = new JettyServer(workScheduler); + service.start(); + TestServlet servlet = new TestServlet(); + try { + service.addServletMapping("https://127.0.0.1:" + HTTP_PORT + "/foo", servlet); + } finally { + System.clearProperty("javax.net.ssl.keyStore"); + System.clearProperty("javax.net.ssl.keyStorePassword"); + System.clearProperty("jetty.ssl.password"); + System.clearProperty("org.eclipse.jetty.ssl.password"); + } + System.setProperty("javax.net.ssl.trustStore", "target/test-classes/tuscany.keyStore"); + System.setProperty("javax.net.ssl.trustStorePassword", "apache"); + URL url = new URL("https://127.0.0.1:8085/foo"); + HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); + conn.setHostnameVerifier(new HostnameVerifier() { + public boolean verify(String hostname, SSLSession session) { + return true; + }} + ); + + conn.connect(); + read(conn.getInputStream()); + + service.stop(); + assertTrue(servlet.invoked); + + } + + /** + * Verifies that Servlets can be registered with multiple ports + */ + public void testRegisterMultiplePorts() throws Exception { + JettyServer service = new JettyServer(workScheduler); + service.start(); + TestServlet servlet = new TestServlet(); + service.addServletMapping("http://127.0.0.1:" + HTTP_PORT + "/", servlet); + TestServlet servlet2 = new TestServlet(); + service.addServletMapping("http://127.0.0.1:" + (HTTP_PORT + 1) + "/", servlet2); + { + Socket client = new Socket("127.0.0.1", HTTP_PORT); + OutputStream os = client.getOutputStream(); + os.write(REQUEST1.getBytes()); + os.flush(); + read(client); + } + { + Socket client = new Socket("127.0.0.1", HTTP_PORT + 1); + OutputStream os = client.getOutputStream(); + os.write(REQUEST1.getBytes()); + os.flush(); + read(client); + } + + service.stop(); + assertTrue(servlet.invoked); + assertTrue(servlet2.invoked); + } + + public void testUnregisterMapping() throws Exception { + JettyServer service = new JettyServer(workScheduler); + service.start(); + TestServlet servlet = new TestServlet(); + String uri = "http://127.0.0.1:" + HTTP_PORT + "/foo"; + service.addServletMapping(uri, servlet); + service.removeServletMapping(uri); + try { + Socket client = new Socket("127.0.0.1", HTTP_PORT); + OutputStream os = client.getOutputStream(); + os.write(REQUEST1.getBytes()); + os.flush(); + read(client); + fail("Server still bound to port"); + } catch (ConnectException e) { + } + service.stop(); + assertFalse(servlet.invoked); + } + + public void testRequestSession() throws Exception { + JettyServer service = new JettyServer(workScheduler); + service.start(); + TestServlet servlet = new TestServlet(); + service.addServletMapping("http://127.0.0.1:" + HTTP_PORT + "/", servlet); + Socket client = new Socket("127.0.0.1", HTTP_PORT); + OutputStream os = client.getOutputStream(); + os.write(REQUEST1.getBytes()); + os.flush(); + read(client); + service.stop(); + assertTrue(servlet.invoked); + assertNotNull(servlet.sessionId); + } + + public void testRestart() throws Exception { + JettyServer service = new JettyServer(workScheduler); + service.start(); + service.stop(); + service.stop(); + } + + public void testNoMappings() throws Exception { + JettyServer service = new JettyServer(workScheduler); + service.start(); + Exception ex = null; + try { + new Socket("127.0.0.1", HTTP_PORT); + } catch (ConnectException e) { + ex = e; + } + assertNotNull(ex); + service.stop(); + } + + public void testResourceServlet() throws Exception { + JettyServer service = new JettyServer(workScheduler); + service.start(); + + String documentRoot = getClass().getClassLoader().getResource("content/test.html").toString(); + documentRoot = documentRoot.substring(0, documentRoot.lastIndexOf('/')); + DefaultResourceServlet resourceServlet = new DefaultResourceServlet(documentRoot); + TestResourceServlet servlet = new TestResourceServlet(resourceServlet); + service.addServletMapping("http://127.0.0.1:" + HTTP_PORT + "/webcontent/*", servlet); + + Socket client = new Socket("127.0.0.1", HTTP_PORT); + OutputStream os = client.getOutputStream(); + os.write(REQUEST2.getBytes()); + os.flush(); + + String document = read(client); + assertTrue(document.indexOf("

hello") != -1); + + service.stop(); + } + + public void testDefaultServlet() throws Exception { + JettyServer service = new JettyServer(workScheduler); + service.start(); + + String documentRoot = getClass().getClassLoader().getResource("content/test.html").toString(); + documentRoot = documentRoot.substring(0, documentRoot.lastIndexOf('/')); + DefaultResourceServlet resourceServlet = new DefaultResourceServlet(documentRoot); + service.addServletMapping("http://127.0.0.1:" + HTTP_PORT + "/webcontent/*", resourceServlet); + + Socket client = new Socket("127.0.0.1", HTTP_PORT); + OutputStream os = client.getOutputStream(); + os.write(REQUEST2.getBytes()); + os.flush(); + + String document = read(client); + assertTrue(document.indexOf("

hello") != -1); + + service.stop(); + } + + private static String read(Socket socket) throws IOException { + InputStream is = socket.getInputStream(); + return read(is); + } + + private static String read(InputStream is) throws IOException { + BufferedReader reader = null; + try { + reader = new BufferedReader(new InputStreamReader(is)); + StringBuffer sb = new StringBuffer(); + String str; + while ((str = reader.readLine()) != null) { + sb.append(str); + } + return sb.toString(); + } finally { + if (reader != null) { + reader.close(); + } + } + } + + private class TestServlet extends HttpServlet { + private static final long serialVersionUID = 1L; + boolean invoked; + String sessionId; + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + invoked = true; + sessionId = req.getSession().getId(); + OutputStream writer = resp.getOutputStream(); + try { + writer.write("result".getBytes()); + } finally { + writer.close(); + } + } + + } + + private class TestResourceServlet extends HttpServlet { + private static final long serialVersionUID = 1L; + private HttpServlet delegate; + + public TestResourceServlet(HttpServlet delegate) { + this.delegate = delegate; + } + + @Override + public void init() throws ServletException { + super.init(); + delegate.init(); + } + + @Override + public void init(ServletConfig config) throws ServletException { + super.init(); + delegate.init(config); + } + + @Override + protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + delegate.service(req, resp); + } + + @Override + public void destroy() { + super.destroy(); + delegate.destroy(); + } + } +} diff --git a/sca-java-2.x/contrib/modules/host-jetty7/src/test/resources/content/test.html b/sca-java-2.x/contrib/modules/host-jetty7/src/test/resources/content/test.html new file mode 100644 index 0000000000..f4b79d7f01 --- /dev/null +++ b/sca-java-2.x/contrib/modules/host-jetty7/src/test/resources/content/test.html @@ -0,0 +1,21 @@ + + +

hello + \ No newline at end of file diff --git a/sca-java-2.x/contrib/modules/host-jetty7/src/test/resources/tuscany.keyStore b/sca-java-2.x/contrib/modules/host-jetty7/src/test/resources/tuscany.keyStore new file mode 100644 index 0000000000..7ea23f7ff4 Binary files /dev/null and b/sca-java-2.x/contrib/modules/host-jetty7/src/test/resources/tuscany.keyStore differ diff --git a/sca-java-2.x/trunk/modules/host-jetty7/LICENSE b/sca-java-2.x/trunk/modules/host-jetty7/LICENSE deleted file mode 100644 index 8aa906c321..0000000000 --- a/sca-java-2.x/trunk/modules/host-jetty7/LICENSE +++ /dev/null @@ -1,205 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed 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. - - - diff --git a/sca-java-2.x/trunk/modules/host-jetty7/META-INF/MANIFEST.MF b/sca-java-2.x/trunk/modules/host-jetty7/META-INF/MANIFEST.MF deleted file mode 100644 index 91863113ea..0000000000 --- a/sca-java-2.x/trunk/modules/host-jetty7/META-INF/MANIFEST.MF +++ /dev/null @@ -1,27 +0,0 @@ -Manifest-Version: 1.0 -Private-Package: org.apache.tuscany.sca.http.jetty;version="2.0.0" -SCA-Version: 1.1 -Bundle-Name: Apache Tuscany SCA Jetty7 Servlet Host Extension -Bundle-Vendor: The Apache Software Foundation -Bundle-Version: 2.0.0 -Bundle-ManifestVersion: 2 -Bundle-License: http://www.apache.org/licenses/LICENSE-2.0.txt -Bundle-Description: Apache Tuscany SCA Jetty Servlet Host Extension -Import-Package: javax.net.ssl;resolution:=optional, - javax.servlet, - javax.servlet.http;resolution:=optional, - org.apache.tuscany.sca.core;version="2.0.0", - org.apache.tuscany.sca.host.http;version="2.0.0", - org.apache.tuscany.sca.work;version="2.0.0", - org.eclipse.jetty.util.component;version="7.0.0.v20091005", - org.eclipse.jetty;version="7.0.0.v20091005", - org.eclipse.jetty.handler;version="7.0.0.v20091005", - org.eclipse.jetty.nio;version="7.0.0.v20091005", - org.eclipse.jetty.security;version="7.0.0.v20091005", - org.eclipse.jetty.servlet;version="7.0.0.v20091005", - org.eclipse.jetty.util.log;version="7.0.0.v20091005", - org.eclipse.jetty.util.resource;version="7.0.0.v20091005", - org.eclipse.jetty.util.thread;version="7.0.0.v20091005" -Bundle-SymbolicName: org.apache.tuscany.sca.host.jetty7 -Bundle-DocURL: http://www.apache.org/ -Bundle-RequiredExecutionEnvironment: J2SE-1.5,JavaSE-1.6 diff --git a/sca-java-2.x/trunk/modules/host-jetty7/NOTICE b/sca-java-2.x/trunk/modules/host-jetty7/NOTICE deleted file mode 100644 index ad2ba40961..0000000000 --- a/sca-java-2.x/trunk/modules/host-jetty7/NOTICE +++ /dev/null @@ -1,6 +0,0 @@ -${pom.name} -Copyright (c) 2005 - 2010 The Apache Software Foundation - -This product includes software developed by -The Apache Software Foundation (http://www.apache.org/). - diff --git a/sca-java-2.x/trunk/modules/host-jetty7/pom.xml b/sca-java-2.x/trunk/modules/host-jetty7/pom.xml deleted file mode 100644 index eb2f926e97..0000000000 --- a/sca-java-2.x/trunk/modules/host-jetty7/pom.xml +++ /dev/null @@ -1,57 +0,0 @@ - - - - 4.0.0 - - org.apache.tuscany.sca - tuscany-modules - 2.0-SNAPSHOT - ../pom.xml - - tuscany-host-jetty7 - Apache Tuscany SCA Jetty7 Servlet Host Extension - - - - org.apache.tuscany.sca - tuscany-host-http - 2.0-SNAPSHOT - - - - org.eclipse.jetty - jetty-server - 7.0.0.v20091005 - - - - org.eclipse.jetty - jetty-servlet - 7.0.0.v20091005 - - - - javax.servlet - servlet-api - 2.5 - - - - diff --git a/sca-java-2.x/trunk/modules/host-jetty7/src/main/java/org/apache/tuscany/sca/http/jetty7/JettyDefaultServlet.java b/sca-java-2.x/trunk/modules/host-jetty7/src/main/java/org/apache/tuscany/sca/http/jetty7/JettyDefaultServlet.java deleted file mode 100644 index dc6f155f80..0000000000 --- a/sca-java-2.x/trunk/modules/host-jetty7/src/main/java/org/apache/tuscany/sca/http/jetty7/JettyDefaultServlet.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * 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.tuscany.sca.http.jetty7; - -import java.io.File; -import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URL; - -import org.eclipse.jetty.servlet.DefaultServlet; -import org.eclipse.jetty.util.resource.Resource; -import org.eclipse.jetty.util.resource.URLResource; - -/** - * Customizes the Jetty default Servlet. - * - * @version $Rev$ $Date$ - */ -public class JettyDefaultServlet extends DefaultServlet { - private static final long serialVersionUID = 7000218247190209353L; - - private String documentRoot; - private String servletPath; - - public JettyDefaultServlet(String servletPath, String documentRoot) { - this.servletPath = servletPath + '/'; - this.documentRoot = documentRoot; - } - - @Override - public Resource getResource(String pathInContext) { - if (pathInContext.startsWith(servletPath)) { - if (pathInContext.length() > servletPath.length()) { - pathInContext = pathInContext.substring(servletPath.length()); - } else { - pathInContext = ""; - } - } else { - if ((pathInContext + "/").equals(servletPath)) { - pathInContext = ""; - } - } - - try { - URL url = new URL(documentRoot + "/" + pathInContext); - return new URLResource(url, url.openConnection()) { - private static final long serialVersionUID = 8560952113883507717L; - - @Override - public File getFile() throws IOException { - return null; - } - - }; - } catch (MalformedURLException e) { - return null; - } catch (IOException e) { - return null; - } - } - - @Override - public String getInitParameter(String name) { - if ("resourceBase".equals(name)) { - return documentRoot; - } else if ("redirectWelcome".equals(name)) { - return "true"; - } else { - return super.getInitParameter(name); - } - } - -} diff --git a/sca-java-2.x/trunk/modules/host-jetty7/src/main/java/org/apache/tuscany/sca/http/jetty7/JettyServer.java b/sca-java-2.x/trunk/modules/host-jetty7/src/main/java/org/apache/tuscany/sca/http/jetty7/JettyServer.java deleted file mode 100644 index ae8e196147..0000000000 --- a/sca-java-2.x/trunk/modules/host-jetty7/src/main/java/org/apache/tuscany/sca/http/jetty7/JettyServer.java +++ /dev/null @@ -1,520 +0,0 @@ -/* - * 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.tuscany.sca.http.jetty7; - -import java.net.InetAddress; -import java.net.MalformedURLException; -import java.net.URI; -import java.net.URL; -import java.net.UnknownHostException; -import java.security.AccessController; -import java.security.KeyStore; -import java.security.PrivilegedAction; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.Map.Entry; - -import javax.servlet.RequestDispatcher; -import javax.servlet.Servlet; -import javax.servlet.ServletException; - -import org.apache.tuscany.sca.core.ExtensionPointRegistry; -import org.apache.tuscany.sca.core.LifeCycleListener; -import org.apache.tuscany.sca.core.UtilityExtensionPoint; -import org.apache.tuscany.sca.host.http.DefaultResourceServlet; -import org.apache.tuscany.sca.host.http.ServletHost; -import org.apache.tuscany.sca.host.http.ServletMappingException; -import org.apache.tuscany.sca.work.WorkScheduler; -import org.eclipse.jetty.server.Connector; -import org.eclipse.jetty.server.Server; -import org.eclipse.jetty.server.handler.ContextHandler; -import org.eclipse.jetty.server.nio.SelectChannelConnector; -import org.eclipse.jetty.server.session.SessionHandler; -import org.eclipse.jetty.server.ssl.SslSocketConnector; -import org.eclipse.jetty.servlet.DefaultServlet; -import org.eclipse.jetty.servlet.ServletHandler; -import org.eclipse.jetty.servlet.ServletHolder; -import org.eclipse.jetty.servlet.ServletMapping; -import org.eclipse.jetty.util.log.JavaUtilLog; -import org.eclipse.jetty.util.log.Log; -import org.eclipse.jetty.util.log.Logger; -import org.eclipse.jetty.util.thread.ThreadPool; - -/** - * Implements an HTTP transport service using Jetty. - * - * @version $Rev$ $Date$ - */ -public class JettyServer implements ServletHost, LifeCycleListener { - private static final java.util.logging.Logger logger = java.util.logging.Logger.getLogger(JettyServer.class.getName()); - - private final Object joinLock = new Object(); - private String trustStore; - private String truststorePassword; - private String keyStore; - private String keyStorePassword; - - private String keyStoreType; - private String trustStoreType; - - private boolean sendServerVersion; - private WorkScheduler workScheduler; - private int defaultPort = portDefault; - public static int portDefault = 8080; - - /** - * Represents a port and the server that serves it. - */ - private class Port { - private Server server; - private ServletHandler servletHandler; - - private Port(Server server, ServletHandler servletHandler) { - this.server = server; - this.servletHandler = servletHandler; - } - - public Server getServer() { - return server; - } - - public ServletHandler getServletHandler() { - return servletHandler; - } - } - - private Map ports = new HashMap(); - - private String contextPath = "/"; - private Logger jettyLogger; - - public JettyServer(ExtensionPointRegistry registry) { - this(registry.getExtensionPoint(UtilityExtensionPoint.class).getUtility(WorkScheduler.class)); - } - - protected JettyServer(WorkScheduler workScheduler) { - this.workScheduler = workScheduler; - AccessController.doPrivileged(new PrivilegedAction() { - public Object run() { - trustStore = System.getProperty("javax.net.ssl.trustStore"); - truststorePassword = System.getProperty("javax.net.ssl.trustStorePassword"); - keyStore = System.getProperty("javax.net.ssl.keyStore"); - keyStorePassword = System.getProperty("javax.net.ssl.keyStorePassword"); - - keyStoreType = System.getProperty("javax.net.ssl.keyStoreType", KeyStore.getDefaultType()); - trustStoreType = System.getProperty("javax.net.ssl.trustStoreType", KeyStore.getDefaultType()); - return null; - } - }); - } - - public String getName() { - return "jetty"; - } - - public void setDefaultPort(int port) { - defaultPort = port; - } - - public int getDefaultPort() { - return defaultPort; - } - - public void setSendServerVersion(boolean sendServerVersion) { - this.sendServerVersion = sendServerVersion; - } - - /** - * Stop all the started servers. - */ - public void stop() { - synchronized (joinLock) { - joinLock.notifyAll(); - } - try { - Set> entries = new HashSet>(ports.entrySet()); - for (Entry entry : entries) { - Port port = entry.getValue(); - Server server = port.getServer(); - server.stop(); - server.setStopAtShutdown(false); - ports.remove(entry.getKey()); - } - } catch (Exception e) { - throw new ServletMappingException(e); - } finally { - if (jettyLogger != null) { - Log.setLog(jettyLogger); - jettyLogger = null; - } - } - } - - private void configureSSL(SslSocketConnector connector) { - connector.setProtocol("TLS"); - connector.setKeystore(keyStore); - connector.setKeyPassword(keyStorePassword); - connector.setKeystoreType(keyStoreType); - - connector.setTruststore(trustStore); - connector.setTrustPassword(truststorePassword); - connector.setTruststoreType(trustStoreType); - - connector.setPassword(keyStorePassword); - if (trustStore != null) { - connector.setNeedClientAuth(true); - } - - } - - public void addServletMapping(String suri, Servlet servlet) throws ServletMappingException { - URI uri = URI.create(suri); - - // Get the URI scheme and port - String scheme = uri.getScheme(); - if (scheme == null) { - scheme = "http"; - } - int portNumber = uri.getPort(); - if (portNumber == -1) { - portNumber = defaultPort; - } - - // Get the port object associated with the given port number - Port port = ports.get(portNumber); - if (port == null) { - - // Create and start a new server - try { - Server server = new Server(); - server.setThreadPool(new WorkSchedulerThreadPool()); - if ("https".equals(scheme)) { - // Connector httpConnector = new SelectChannelConnector(); - // httpConnector.setPort(portNumber); - SslSocketConnector sslConnector = new SslSocketConnector(); - sslConnector.setPort(portNumber); - configureSSL(sslConnector); - server.setConnectors(new Connector[] {sslConnector}); - } else { - SelectChannelConnector selectConnector = new SelectChannelConnector(); - selectConnector.setPort(portNumber); - server.setConnectors(new Connector[] {selectConnector}); - } - - ContextHandler contextHandler = new ContextHandler(); - //contextHandler.setContextPath(contextPath); - contextHandler.setContextPath("/"); - server.setHandler(contextHandler); - - SessionHandler sessionHandler = new SessionHandler(); - ServletHandler servletHandler = new ServletHandler(); - sessionHandler.setHandler(servletHandler); - - contextHandler.setHandler(sessionHandler); - - server.setStopAtShutdown(true); - server.setSendServerVersion(sendServerVersion); - server.start(); - - // Keep track of the new server and Servlet handler - port = new Port(server, servletHandler); - ports.put(portNumber, port); - - } catch (Exception e) { - throw new ServletMappingException(e); - } - } - - // Register the Servlet mapping - ServletHandler servletHandler = port.getServletHandler(); - ServletHolder holder; - if (servlet instanceof DefaultResourceServlet) { - - // Optimize the handling of resource requests, use the Jetty default Servlet - // instead of our default resource Servlet - String servletPath = uri.getPath(); - if (servletPath.endsWith("*")) { - servletPath = servletPath.substring(0, servletPath.length() - 1); - } - if (servletPath.endsWith("/")) { - servletPath = servletPath.substring(0, servletPath.length() - 1); - } - if (!servletPath.startsWith("/")) { - servletPath = '/' + servletPath; - } - - DefaultResourceServlet resourceServlet = (DefaultResourceServlet)servlet; - DefaultServlet defaultServlet = new JettyDefaultServlet(servletPath, resourceServlet.getDocumentRoot()); - holder = new ServletHolder(defaultServlet); - - } else { - holder = new ServletHolder(servlet); - } - servletHandler.addServlet(holder); - - ServletMapping mapping = new ServletMapping(); - mapping.setServletName(holder.getName()); - String path = uri.getPath(); - - if (!path.startsWith("/")) { - path = '/' + path; - } - - if (!path.startsWith(contextPath)) { - path = contextPath + path; - } - - mapping.setPathSpec(path); - servletHandler.addServletMapping(mapping); - - // Compute the complete URL - String host; - try { - host = InetAddress.getLocalHost().getHostName(); - } catch (UnknownHostException e) { - host = "localhost"; - } - URL addedURL; - try { - addedURL = new URL(scheme, host, portNumber, path); - } catch (MalformedURLException e) { - throw new ServletMappingException(e); - } - logger.info("Added Servlet mapping: " + addedURL); - } - - public URL getURLMapping(String suri) throws ServletMappingException { - URI uri = URI.create(suri); - - // Get the URI scheme and port - String scheme = uri.getScheme(); - if (scheme == null) { - scheme = "http"; - } - int portNumber = uri.getPort(); - if (portNumber == -1) { - portNumber = defaultPort; - } - - // Get the host - String host; - try { - host = InetAddress.getLocalHost().getHostName(); - } catch (UnknownHostException e) { - host = "localhost"; - } - - // Construct the URL - String path = uri.getPath(); - - if (!path.startsWith("/")) { - path = '/' + path; - } - - if (!path.startsWith(contextPath)) { - path = contextPath + path; - } - - URL url; - try { - url = new URL(scheme, host, portNumber, path); - } catch (MalformedURLException e) { - throw new ServletMappingException(e); - } - return url; - } - - public Servlet getServletMapping(String suri) throws ServletMappingException { - - if (suri == null) { - return null; - } - - URI uri = URI.create(suri); - - // Get the URI port - int portNumber = uri.getPort(); - if (portNumber == -1) { - portNumber = defaultPort; - } - - // Get the port object associated with the given port number - Port port = ports.get(portNumber); - if (port == null) { - return null; - } - - // Remove the Servlet mapping for the given Servlet - ServletHandler servletHandler = port.getServletHandler(); - Servlet servlet = null; - List mappings = - new ArrayList(Arrays.asList(servletHandler.getServletMappings())); - String path = uri.getPath(); - - if (!path.startsWith("/")) { - path = '/' + path; - } - - if (!path.startsWith(contextPath)) { - path = contextPath + path; - } - - for (ServletMapping mapping : mappings) { - if (Arrays.asList(mapping.getPathSpecs()).contains(path)) { - try { - servlet = servletHandler.getServlet(mapping.getServletName()).getServlet(); - } catch (ServletException e) { - throw new IllegalStateException(e); - } - break; - } - } - return servlet; - } - - public Servlet removeServletMapping(String suri) { - URI uri = URI.create(suri); - - // Get the URI port - int portNumber = uri.getPort(); - if (portNumber == -1) { - portNumber = defaultPort; - } - - // Get the port object associated with the given port number - Port port = ports.get(portNumber); - if (port == null) { - // TODO - EPR - SL commented out exception temporarily as the runtime is shared - // between multiple nodes in a VM and shutting down one node blows - // up any other nodes when they shut down. - //throw new IllegalStateException("No servlet registered at this URI: " + suri); - logger.warning("No servlet registered at this URI: " + suri); - return null; - } - - // Remove the Servlet mapping for the given Servlet - ServletHandler servletHandler = port.getServletHandler(); - Servlet removedServlet = null; - List mappings = - new ArrayList(Arrays.asList(servletHandler.getServletMappings())); - String path = uri.getPath(); - - if (!path.startsWith("/")) { - path = '/' + path; - } - - if (!path.startsWith(contextPath)) { - path = contextPath + path; - } - - for (ServletMapping mapping : mappings) { - if (Arrays.asList(mapping.getPathSpecs()).contains(path)) { - try { - removedServlet = servletHandler.getServlet(mapping.getServletName()).getServlet(); - } catch (ServletException e) { - throw new IllegalStateException(e); - } - mappings.remove(mapping); - logger.info("Removed Servlet mapping: " + path); - break; - } - } - if (removedServlet != null) { - servletHandler.setServletMappings(mappings.toArray(new ServletMapping[mappings.size()])); - - // Stop the port if there are no servlet mappings on it anymore - if (mappings.size() == 0) { - try { - Server server = port.getServer(); - server.stop(); - server.setStopAtShutdown(false); - } catch (Exception e) { - throw new IllegalStateException(e); - } - ports.remove(portNumber); - } - - } else { - logger.warning("Trying to Remove servlet mapping: " + path + " where mapping is not registered"); - } - - return removedServlet; - } - - public RequestDispatcher getRequestDispatcher(String suri) throws ServletMappingException { - //FIXME implement this later - return null; - } - - public String getContextPath() { - return contextPath; - } - - public void setContextPath(String path) { - this.contextPath = path; - } - - /** - * A wrapper to enable use of a WorkScheduler with Jetty - */ - private class WorkSchedulerThreadPool implements ThreadPool { - - public boolean dispatch(Runnable work) { - workScheduler.scheduleWork(work); - return true; - } - - public void join() throws InterruptedException { - synchronized (joinLock) { - joinLock.wait(); - } - } - - public int getThreads() { - throw new UnsupportedOperationException(); - } - - public int getIdleThreads() { - throw new UnsupportedOperationException(); - } - - public boolean isLowOnThreads() { - return false; - } - } - - public void setAttribute(String name, Object value) { - throw new UnsupportedOperationException(); - } - - public void start() { - try { - jettyLogger = new JavaUtilLog(JettyServer.class.getName()); - Log.setLog(jettyLogger); - } catch (Throwable e) { - // Ignore - } - } - -} diff --git a/sca-java-2.x/trunk/modules/host-jetty7/src/main/resources/META-INF/services/org.apache.tuscany.sca.host.http.ServletHost b/sca-java-2.x/trunk/modules/host-jetty7/src/main/resources/META-INF/services/org.apache.tuscany.sca.host.http.ServletHost deleted file mode 100644 index 99278c123b..0000000000 --- a/sca-java-2.x/trunk/modules/host-jetty7/src/main/resources/META-INF/services/org.apache.tuscany.sca.host.http.ServletHost +++ /dev/null @@ -1,18 +0,0 @@ -# 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. -# Implementation class for the ServletHost -org.apache.tuscany.sca.http.jetty7.JettyServer;name=jetty7,ranking=50 diff --git a/sca-java-2.x/trunk/modules/host-jetty7/src/test/java/org/apache/tuscany/sca/http/jetty7/JettyServerTestCase.java b/sca-java-2.x/trunk/modules/host-jetty7/src/test/java/org/apache/tuscany/sca/http/jetty7/JettyServerTestCase.java deleted file mode 100644 index ff6894e858..0000000000 --- a/sca-java-2.x/trunk/modules/host-jetty7/src/test/java/org/apache/tuscany/sca/http/jetty7/JettyServerTestCase.java +++ /dev/null @@ -1,335 +0,0 @@ -/* - * 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.tuscany.sca.http.jetty7; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.net.ConnectException; -import java.net.Socket; -import java.net.URL; - -import javax.net.ssl.HostnameVerifier; -import javax.net.ssl.HttpsURLConnection; -import javax.net.ssl.SSLSession; -import javax.servlet.ServletConfig; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import junit.framework.TestCase; - -import org.apache.tuscany.sca.host.http.DefaultResourceServlet; -import org.apache.tuscany.sca.http.jetty7.JettyServer; -import org.apache.tuscany.sca.work.NotificationListener; -import org.apache.tuscany.sca.work.WorkScheduler; - -/** - * @version $Rev$ $Date$ - */ -public class JettyServerTestCase extends TestCase { - - private static final String REQUEST1_HEADER = - "GET / HTTP/1.0\n" + "Host: localhost\n" - + "Content-Type: text/xml\n" - + "Connection: close\n" - + "Content-Length: "; - private static final String REQUEST1_CONTENT = ""; - private static final String REQUEST1 = - REQUEST1_HEADER + REQUEST1_CONTENT.getBytes().length + "\n\n" + REQUEST1_CONTENT; - - private static final String REQUEST2_HEADER = - "GET /webcontent/test.html HTTP/1.0\n" + "Host: localhost\n" - + "Content-Type: text/xml\n" - + "Connection: close\n" - + "Content-Length: "; - private static final String REQUEST2_CONTENT = ""; - private static final String REQUEST2 = - REQUEST2_HEADER + REQUEST2_CONTENT.getBytes().length + "\n\n" + REQUEST2_CONTENT; - - private static final int HTTP_PORT = 8085; - - private WorkScheduler workScheduler = new WorkScheduler() { - - public void scheduleWork(T work) { - Thread thread = new Thread(work); - thread.start(); - } - - public void scheduleWork(T work, NotificationListener listener) { - scheduleWork(work); - } - - public void destroy() { - } - }; - - /** - * Verifies requests are properly routed according to the Servlet mapping - */ - public void testRegisterServletMapping() throws Exception { - JettyServer service = new JettyServer(workScheduler); - service.start(); - TestServlet servlet = new TestServlet(); - service.addServletMapping("http://127.0.0.1:" + HTTP_PORT + "/", servlet); - Socket client = new Socket("127.0.0.1", HTTP_PORT); - OutputStream os = client.getOutputStream(); - os.write(REQUEST1.getBytes()); - os.flush(); - read(client); - service.stop(); - assertTrue(servlet.invoked); - } - - public void testRegisterServletMappingSSL() throws Exception { - System.setProperty("javax.net.ssl.keyStore", "target/test-classes/tuscany.keyStore"); - System.setProperty("javax.net.ssl.keyStorePassword", "apache"); - System.setProperty("jetty.ssl.password", "apache"); - System.setProperty("org.eclipse.jetty.ssl.password", "apache"); - JettyServer service = new JettyServer(workScheduler); - service.start(); - TestServlet servlet = new TestServlet(); - try { - service.addServletMapping("https://127.0.0.1:" + HTTP_PORT + "/foo", servlet); - } finally { - System.clearProperty("javax.net.ssl.keyStore"); - System.clearProperty("javax.net.ssl.keyStorePassword"); - System.clearProperty("jetty.ssl.password"); - System.clearProperty("org.eclipse.jetty.ssl.password"); - } - System.setProperty("javax.net.ssl.trustStore", "target/test-classes/tuscany.keyStore"); - System.setProperty("javax.net.ssl.trustStorePassword", "apache"); - URL url = new URL("https://127.0.0.1:8085/foo"); - HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); - conn.setHostnameVerifier(new HostnameVerifier() { - public boolean verify(String hostname, SSLSession session) { - return true; - }} - ); - - conn.connect(); - read(conn.getInputStream()); - - service.stop(); - assertTrue(servlet.invoked); - - } - - /** - * Verifies that Servlets can be registered with multiple ports - */ - public void testRegisterMultiplePorts() throws Exception { - JettyServer service = new JettyServer(workScheduler); - service.start(); - TestServlet servlet = new TestServlet(); - service.addServletMapping("http://127.0.0.1:" + HTTP_PORT + "/", servlet); - TestServlet servlet2 = new TestServlet(); - service.addServletMapping("http://127.0.0.1:" + (HTTP_PORT + 1) + "/", servlet2); - { - Socket client = new Socket("127.0.0.1", HTTP_PORT); - OutputStream os = client.getOutputStream(); - os.write(REQUEST1.getBytes()); - os.flush(); - read(client); - } - { - Socket client = new Socket("127.0.0.1", HTTP_PORT + 1); - OutputStream os = client.getOutputStream(); - os.write(REQUEST1.getBytes()); - os.flush(); - read(client); - } - - service.stop(); - assertTrue(servlet.invoked); - assertTrue(servlet2.invoked); - } - - public void testUnregisterMapping() throws Exception { - JettyServer service = new JettyServer(workScheduler); - service.start(); - TestServlet servlet = new TestServlet(); - String uri = "http://127.0.0.1:" + HTTP_PORT + "/foo"; - service.addServletMapping(uri, servlet); - service.removeServletMapping(uri); - try { - Socket client = new Socket("127.0.0.1", HTTP_PORT); - OutputStream os = client.getOutputStream(); - os.write(REQUEST1.getBytes()); - os.flush(); - read(client); - fail("Server still bound to port"); - } catch (ConnectException e) { - } - service.stop(); - assertFalse(servlet.invoked); - } - - public void testRequestSession() throws Exception { - JettyServer service = new JettyServer(workScheduler); - service.start(); - TestServlet servlet = new TestServlet(); - service.addServletMapping("http://127.0.0.1:" + HTTP_PORT + "/", servlet); - Socket client = new Socket("127.0.0.1", HTTP_PORT); - OutputStream os = client.getOutputStream(); - os.write(REQUEST1.getBytes()); - os.flush(); - read(client); - service.stop(); - assertTrue(servlet.invoked); - assertNotNull(servlet.sessionId); - } - - public void testRestart() throws Exception { - JettyServer service = new JettyServer(workScheduler); - service.start(); - service.stop(); - service.stop(); - } - - public void testNoMappings() throws Exception { - JettyServer service = new JettyServer(workScheduler); - service.start(); - Exception ex = null; - try { - new Socket("127.0.0.1", HTTP_PORT); - } catch (ConnectException e) { - ex = e; - } - assertNotNull(ex); - service.stop(); - } - - public void testResourceServlet() throws Exception { - JettyServer service = new JettyServer(workScheduler); - service.start(); - - String documentRoot = getClass().getClassLoader().getResource("content/test.html").toString(); - documentRoot = documentRoot.substring(0, documentRoot.lastIndexOf('/')); - DefaultResourceServlet resourceServlet = new DefaultResourceServlet(documentRoot); - TestResourceServlet servlet = new TestResourceServlet(resourceServlet); - service.addServletMapping("http://127.0.0.1:" + HTTP_PORT + "/webcontent/*", servlet); - - Socket client = new Socket("127.0.0.1", HTTP_PORT); - OutputStream os = client.getOutputStream(); - os.write(REQUEST2.getBytes()); - os.flush(); - - String document = read(client); - assertTrue(document.indexOf("

hello") != -1); - - service.stop(); - } - - public void testDefaultServlet() throws Exception { - JettyServer service = new JettyServer(workScheduler); - service.start(); - - String documentRoot = getClass().getClassLoader().getResource("content/test.html").toString(); - documentRoot = documentRoot.substring(0, documentRoot.lastIndexOf('/')); - DefaultResourceServlet resourceServlet = new DefaultResourceServlet(documentRoot); - service.addServletMapping("http://127.0.0.1:" + HTTP_PORT + "/webcontent/*", resourceServlet); - - Socket client = new Socket("127.0.0.1", HTTP_PORT); - OutputStream os = client.getOutputStream(); - os.write(REQUEST2.getBytes()); - os.flush(); - - String document = read(client); - assertTrue(document.indexOf("

hello") != -1); - - service.stop(); - } - - private static String read(Socket socket) throws IOException { - InputStream is = socket.getInputStream(); - return read(is); - } - - private static String read(InputStream is) throws IOException { - BufferedReader reader = null; - try { - reader = new BufferedReader(new InputStreamReader(is)); - StringBuffer sb = new StringBuffer(); - String str; - while ((str = reader.readLine()) != null) { - sb.append(str); - } - return sb.toString(); - } finally { - if (reader != null) { - reader.close(); - } - } - } - - private class TestServlet extends HttpServlet { - private static final long serialVersionUID = 1L; - boolean invoked; - String sessionId; - - @Override - protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - invoked = true; - sessionId = req.getSession().getId(); - OutputStream writer = resp.getOutputStream(); - try { - writer.write("result".getBytes()); - } finally { - writer.close(); - } - } - - } - - private class TestResourceServlet extends HttpServlet { - private static final long serialVersionUID = 1L; - private HttpServlet delegate; - - public TestResourceServlet(HttpServlet delegate) { - this.delegate = delegate; - } - - @Override - public void init() throws ServletException { - super.init(); - delegate.init(); - } - - @Override - public void init(ServletConfig config) throws ServletException { - super.init(); - delegate.init(config); - } - - @Override - protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - delegate.service(req, resp); - } - - @Override - public void destroy() { - super.destroy(); - delegate.destroy(); - } - } -} diff --git a/sca-java-2.x/trunk/modules/host-jetty7/src/test/resources/content/test.html b/sca-java-2.x/trunk/modules/host-jetty7/src/test/resources/content/test.html deleted file mode 100644 index f4b79d7f01..0000000000 --- a/sca-java-2.x/trunk/modules/host-jetty7/src/test/resources/content/test.html +++ /dev/null @@ -1,21 +0,0 @@ - - -

hello - \ No newline at end of file diff --git a/sca-java-2.x/trunk/modules/host-jetty7/src/test/resources/tuscany.keyStore b/sca-java-2.x/trunk/modules/host-jetty7/src/test/resources/tuscany.keyStore deleted file mode 100644 index 7ea23f7ff4..0000000000 Binary files a/sca-java-2.x/trunk/modules/host-jetty7/src/test/resources/tuscany.keyStore and /dev/null differ -- cgit v1.2.3