Added: openejb/trunk/openejb3/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/OpenEJBHttpWsRegistry.java URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/OpenEJBHttpWsRegistry.java?rev=605765&view=auto ============================================================================== --- openejb/trunk/openejb3/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/OpenEJBHttpWsRegistry.java (added) +++ openejb/trunk/openejb3/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/OpenEJBHttpWsRegistry.java Wed Dec 19 16:53:19 2007 @@ -0,0 +1,119 @@ +/** + * + * 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.openejb.server.webservices; + +import org.apache.openejb.assembler.classic.OpenEjbConfiguration; +import org.apache.openejb.assembler.classic.ServiceInfo; +import org.apache.openejb.loader.SystemInstance; +import org.apache.openejb.server.httpd.HttpEjbServer; +import org.apache.openejb.server.httpd.HttpListener; +import org.apache.openejb.server.httpd.HttpListenerRegistry; +import org.apache.openejb.server.httpd.HttpRequest; +import org.apache.openejb.server.httpd.HttpResponse; +import org.apache.openejb.util.LogCategory; +import org.apache.openejb.util.Logger; +import org.apache.xerces.util.URI; + +import java.net.InetAddress; +import java.util.ArrayList; +import java.util.List; + +public class OpenEJBHttpWsRegistry implements WsRegistry { + public static final Logger log = Logger.getInstance(LogCategory.OPENEJB_WS, WsService.class); + private final HttpListenerRegistry registry; + private final List<URI> baseUris = new ArrayList<URI>(); + + public OpenEJBHttpWsRegistry() { + try { + OpenEjbConfiguration configuration = SystemInstance.get().getComponent(OpenEjbConfiguration.class); + for (ServiceInfo service : configuration.facilities.services) { + if (service.className.equals(HttpEjbServer.class.getName())) { + int port = Integer.parseInt(service.properties.getProperty("port")); + String ip = service.properties.getProperty("bind"); + if ("0.0.0.0".equals(ip)) { + InetAddress[] addresses = InetAddress.getAllByName(ip); + for (InetAddress address : addresses) { + baseUris.add(new URI("http", null, address.getHostAddress(), port, null, null, null)); + } + } else { + baseUris.add(new URI("http", null, ip, port, null, null, null)); + } + break; + } + } + } catch (Exception e) { + log.error("Webservices Disabled: Unable to build base URIs for WebService registry", e); + } + registry = SystemInstance.get().getComponent(HttpListenerRegistry.class); + } + + public List<String> setWsContainer(String virtualHost, String contextRoot, String servletName, HttpListener wsContainer) throws Exception { + throw new UnsupportedOperationException("OpenEJB http server does not support POJO webservices"); + } + + public void clearWsContainer(String virtualHost, String contextRoot, String servletName) { + } + + public List<String> addWsContainer(String path, HttpListener httpListener, String virtualHost, // ignored + String realmName, // ignored + String transportGuarantee, // ignored + String authMethod, // ignored + ClassLoader classLoader) throws Exception { + + if (path == null) throw new NullPointerException("contextRoot is null"); + if (httpListener == null) throw new NullPointerException("httpListener is null"); + + // assure context root with a leading slash + if (!path.startsWith("/")) path = "/" + path; + + httpListener = new ClassLoaderHttpListener(httpListener, classLoader); + registry.addHttpListener(httpListener, path); + + // register wsdl locations for service-ref resolution + List<String> addresses = new ArrayList<String>(); + for (URI baseUri : baseUris) { + URI address = new URI(baseUri, path); + addresses.add(address.toString()); + } + return addresses; + } + + public void removeWsContainer(String path) { + registry.removeHttpListener(path); + } + + private static class ClassLoaderHttpListener implements HttpListener { + private final HttpListener delegate; + private final ClassLoader classLoader; + + private ClassLoaderHttpListener(HttpListener delegate, ClassLoader classLoader) { + this.delegate = delegate; + this.classLoader = classLoader; + } + + public void onMessage(HttpRequest request, HttpResponse response) throws Exception { + ClassLoader oldCl = Thread.currentThread().getContextClassLoader(); + Thread.currentThread().setContextClassLoader(classLoader); + try { + delegate.onMessage(request, response); + } finally { + Thread.currentThread().setContextClassLoader(oldCl); + } + } + } +}
Modified: openejb/trunk/openejb3/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/WsConstants.java URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/WsConstants.java?rev=605765&r1=605764&r2=605765&view=diff ============================================================================== --- openejb/trunk/openejb3/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/WsConstants.java (original) +++ openejb/trunk/openejb3/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/WsConstants.java Wed Dec 19 16:53:19 2007 @@ -32,21 +32,6 @@ public static final String MESSAGE_CONTEXT = WsConstants.class.getName() + "@MessageContext"; /** - * Used for JAX-WS MessageContext. MessageContext must expose HttpServletRequest. - */ - public static final String SERVLET_REQUEST = WsConstants.class.getName() + "@ServletRequest"; - - /** - * Used for JAX-WS MessageContext. MessageContext must expose HttpServletResponse. - */ - public static final String SERVLET_RESPONSE = WsConstants.class.getName() + "@ServletResponse"; - - /** - * Used for JAX-WS MessageContext. MessageContext must expose ServletContext. - */ - public static final String SERVLET_CONTEXT = WsConstants.class.getName() + "@ServletContext"; - - /** * Token inserted into wsdl where location should be replaced with the real location */ public static final String LOCATION_REPLACEMENT_TOKEN = "LOCATIONREPLACEMENTTOKEN"; Modified: openejb/trunk/openejb3/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/WsService.java URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/WsService.java?rev=605765&r1=605764&r2=605765&view=diff ============================================================================== --- openejb/trunk/openejb3/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/WsService.java (original) +++ openejb/trunk/openejb3/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/WsService.java Wed Dec 19 16:53:19 2007 @@ -21,6 +21,7 @@ import org.apache.openejb.server.SelfManaging; import org.apache.openejb.server.ServiceException; import org.apache.openejb.server.httpd.HttpListener; +import org.apache.openejb.server.httpd.HttpListenerRegistry; import org.apache.openejb.assembler.classic.DeploymentListener; import org.apache.openejb.assembler.classic.Assembler; import org.apache.openejb.assembler.classic.AppInfo; @@ -149,6 +150,10 @@ public void start() throws ServiceException { wsRegistry = SystemInstance.get().getComponent(WsRegistry.class); + if (wsRegistry == null && SystemInstance.get().getComponent(HttpListenerRegistry.class) != null) { + wsRegistry = new OpenEJBHttpWsRegistry(); + } + if (portAddressRegistry == null) { portAddressRegistry = new PortAddressRegistryImpl(); SystemInstance.get().setComponent(PortAddressRegistry.class, portAddressRegistry); Modified: openejb/trunk/openejb3/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/WsServlet.java URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/WsServlet.java?rev=605765&r1=605764&r2=605765&view=diff ============================================================================== --- openejb/trunk/openejb3/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/WsServlet.java (original) +++ openejb/trunk/openejb3/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/WsServlet.java Wed Dec 19 16:53:19 2007 @@ -16,9 +16,11 @@ */ package org.apache.openejb.server.webservices; +import org.apache.openejb.server.httpd.HttpListener; import org.apache.openejb.server.httpd.HttpRequest; import org.apache.openejb.server.httpd.HttpResponse; -import org.apache.openejb.server.httpd.HttpListener; +import org.apache.openejb.server.httpd.ServletRequestAdapter; +import org.apache.openejb.server.httpd.ServletResponseAdapter; import javax.servlet.Servlet; import javax.servlet.ServletConfig; @@ -34,13 +36,7 @@ import javax.xml.rpc.server.ServiceLifecycle; import javax.xml.rpc.server.ServletEndpointContext; import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.PrintWriter; -import java.net.URISyntaxException; import java.security.Principal; -import java.util.Map; -import java.util.TreeMap; public class WsServlet implements Servlet { public static final String POJO_CLASS = WsServlet.class.getName() + "@pojoClassName"; @@ -91,18 +87,15 @@ endpointContext.set(new InvocationContext((HttpServletRequest) req)); try { res.setContentType("text/xml"); - RequestAdapter request = new RequestAdapter((HttpServletRequest) req); - ResponseAdapter response = new ResponseAdapter((HttpServletResponse) res); + HttpRequest httpRequest = new ServletRequestAdapter((HttpServletRequest) req, (HttpServletResponse) res, config.getServletContext()); + HttpResponse httpResponse = new ServletResponseAdapter((HttpServletResponse) res); - req.setAttribute(WsConstants.SERVLET_REQUEST, req); - req.setAttribute(WsConstants.SERVLET_RESPONSE, res); - req.setAttribute(WsConstants.SERVLET_CONTEXT, config.getServletContext()); if (pojo != null) { req.setAttribute(WsConstants.POJO_INSTANCE, pojo); } try { - service.onMessage(request, response); + service.onMessage(httpRequest, httpResponse); } catch (IOException e) { throw e; } catch (ServletException e) { @@ -147,176 +140,6 @@ } } return service; - } - - private static class RequestAdapter implements HttpRequest { - private final HttpServletRequest request; - - public RequestAdapter(HttpServletRequest request) { - this.request = request; - } - - public org.apache.openejb.server.httpd.HttpSession getSession(boolean create) { - javax.servlet.http.HttpSession session = request.getSession(create); - if (session != null) { - return new HttpSessionAdapter(session); - } else { - return null; - } - } - - public org.apache.openejb.server.httpd.HttpSession getSession() { - javax.servlet.http.HttpSession session = request.getSession(); - if (session != null) { - return new HttpSessionAdapter(session); - } else { - return null; - } - } - - public String getHeader(String name) { - return request.getHeader(name); - } - - public java.net.URI getURI() { - try { - return new java.net.URI(request.getScheme(), null, request.getServerName(), request.getServerPort(), request.getRequestURI(), request.getQueryString(), null); - } catch (URISyntaxException e) { - throw new IllegalStateException(e.getMessage(), e); - } - } - - public int getContentLength() { - return request.getContentLength(); - } - - public String getContentType() { - return request.getContentType(); - } - - public String getContextPath() { - return request.getContextPath(); - } - - public InputStream getInputStream() throws IOException { - return request.getInputStream(); - } - - public int getMethod() { - Integer method = methods.get(request.getMethod()); - return method == null ? UNSUPPORTED : method.intValue(); - } - - public String getParameter(String name) { - return request.getParameter(name); - } - - public Map getParameters() { - return request.getParameterMap(); - } - - private static final Map<String, Integer> methods = new TreeMap<String, Integer>(); - - static { - methods.put("OPTIONS", new Integer(OPTIONS)); - methods.put("GET", new Integer(GET)); - methods.put("HEAD", new Integer(HEAD)); - methods.put("POST", new Integer(POST)); - methods.put("PUT", new Integer(PUT)); - methods.put("DELETE", new Integer(DELETE)); - methods.put("TRACE", new Integer(TRACE)); - methods.put("CONNECT", new Integer(CONNECT)); - } - - public Object getAttribute(String s) { - return request.getAttribute(s); - } - - public void setAttribute(String s, Object o) { - request.setAttribute(s, o); - } - - public String getRemoteAddr() { - return request.getRemoteAddr(); - } - - } - - private static class HttpSessionAdapter implements org.apache.openejb.server.httpd.HttpSession { - private final javax.servlet.http.HttpSession session; - - public HttpSessionAdapter(javax.servlet.http.HttpSession session) { - this.session = session; - } - - public String getId() { - return session.getId(); - } - - public Object getAttribute(String name) { - return getAttribute(name); - } - - public void setAttribute(String name, Object value) { - session.setAttribute(name, value); - } - - public void removeAttribute(String name) { - session.removeAttribute(name); - } - } - - private static class ResponseAdapter implements HttpResponse { - private final HttpServletResponse response; - - public ResponseAdapter(HttpServletResponse response) { - this.response = response; - } - - public PrintWriter getPrintWriter() throws IOException { - return response.getWriter(); - } - - public void setHeader(String name, String value) { - response.setHeader(name, value); - } - - public String getHeader(String name) { - throw new UnsupportedOperationException("Not possible to implement"); - } - - public OutputStream getOutputStream() { - try { - return response.getOutputStream(); - } catch (IOException e) { - throw (IllegalStateException) new IllegalStateException().initCause(e); - } - } - - public void setStatusCode(int code) { - response.setStatus(code); - } - - public int getStatusCode() { - throw new UnsupportedOperationException("Not possible to implement"); - } - - public void setContentType(String type) { - response.setContentType(type); - } - - public String getContentType() { - return response.getContentType(); - } - - @SuppressWarnings({"deprecation"}) - public void setStatusMessage(String responseString) { - response.setStatus(getStatusCode(), responseString); - } - - public void flushBuffer() throws java.io.IOException { - response.flushBuffer(); - } } private static ServletEndpointContext getContext() {
