001 /**
002 *
003 * Copyright 2004 The Apache Software Foundation
004 *
005 * Licensed under the Apache License, Version 2.0 (the "License");
006 * you may not use this file except in compliance with the License.
007 * You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017 package org.apache.geronimo.webservices;
018
019 import java.io.IOException;
020 import java.io.InputStream;
021 import java.io.OutputStream;
022 import java.net.URISyntaxException;
023 import java.util.HashMap;
024 import java.util.Map;
025 import javax.servlet.Servlet;
026 import javax.servlet.ServletConfig;
027 import javax.servlet.ServletContext;
028 import javax.servlet.ServletException;
029 import javax.servlet.ServletRequest;
030 import javax.servlet.ServletResponse;
031 import javax.servlet.http.HttpServletRequest;
032 import javax.servlet.http.HttpServletResponse;
033
034 /**
035 * @version $Rev: 355877 $ $Date: 2005-12-10 18:48:27 -0800 (Sat, 10 Dec 2005) $
036 */
037 public class WebServiceContainerInvoker implements Servlet {
038
039 public static final String WEBSERVICE_CONTAINER = WebServiceContainerInvoker.class.getName()+"@WebServiceContainer";
040
041 private final Object pojo;
042 private WebServiceContainer service;
043
044 public WebServiceContainerInvoker(Object pojo) {
045 this.pojo = pojo;
046 }
047
048 public void init(ServletConfig config) throws ServletException {
049 ServletContext context = config.getServletContext();
050 String webServiceContainerID = config.getInitParameter(WEBSERVICE_CONTAINER);
051 service = (WebServiceContainer) context.getAttribute(webServiceContainerID);
052 }
053
054 public ServletConfig getServletConfig() {
055 return null;
056 }
057
058 public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
059 res.setContentType("text/xml");
060 RequestAdapter request = new RequestAdapter((HttpServletRequest) req);
061 ResponseAdapter response = new ResponseAdapter((HttpServletResponse) res);
062
063 // This is the guy the WebServiceContainer should invoke
064 req.setAttribute(WebServiceContainer.POJO_INSTANCE, pojo);
065
066 if (req.getParameter("wsdl") != null || req.getParameter("WSDL") != null) {
067 try {
068 service.getWsdl(request, response);
069 } catch (IOException e) {
070 throw e;
071 } catch (ServletException e) {
072 throw e;
073 } catch (Exception e) {
074 throw new ServletException("Could not fetch wsdl!", e);
075 }
076 } else {
077 try {
078 service.invoke(request, response);
079 } catch (IOException e) {
080 throw e;
081 } catch (ServletException e) {
082 throw e;
083 } catch (Exception e) {
084 throw new ServletException("Could not process message!", e);
085 }
086 }
087 }
088
089 public String getServletInfo() {
090 return null;
091 }
092
093 public void destroy() {
094 }
095
096 private static class RequestAdapter implements WebServiceContainer.Request {
097 private final HttpServletRequest request;
098
099 public RequestAdapter(HttpServletRequest request) {
100 this.request = request;
101 }
102
103 public String getHeader(String name) {
104 return request.getHeader(name);
105 }
106
107 public java.net.URI getURI() {
108 try {
109 return new java.net.URI(request.getScheme(), null, request.getServerName(), request.getServerPort(), request.getRequestURI(), request.getQueryString(), null);
110 } catch (URISyntaxException e) {
111 throw new IllegalStateException(e.getMessage());
112 }
113 }
114
115 public int getContentLength() {
116 return request.getContentLength();
117 }
118
119 public String getContentType() {
120 return request.getContentType();
121 }
122
123 public InputStream getInputStream() throws IOException {
124 return request.getInputStream();
125 }
126
127 public int getMethod() {
128 Integer method = (Integer) methods.get(request.getMethod());
129 return method == null ? UNSUPPORTED : method.intValue();
130 }
131
132 public String getParameter(String name) {
133 return request.getParameter(name);
134 }
135
136 public Map getParameters() {
137 return request.getParameterMap();
138 }
139
140
141 private static final Map methods = new HashMap();
142
143 static {
144 methods.put("OPTIONS", new Integer(OPTIONS));
145 methods.put("GET", new Integer(GET));
146 methods.put("HEAD", new Integer(HEAD));
147 methods.put("POST", new Integer(POST));
148 methods.put("PUT", new Integer(PUT));
149 methods.put("DELETE", new Integer(DELETE));
150 methods.put("TRACE", new Integer(TRACE));
151 methods.put("CONNECT", new Integer(CONNECT));
152 }
153
154 public Object getAttribute(String s) {
155 return request.getAttribute(s);
156 }
157
158 public void setAttribute(String s, Object o) {
159 request.setAttribute(s, o);
160 }
161
162 }
163
164 private static class ResponseAdapter implements WebServiceContainer.Response {
165 private final HttpServletResponse response;
166
167 public ResponseAdapter(HttpServletResponse response) {
168 this.response = response;
169 }
170
171 public void setHeader(String name, String value) {
172 response.setHeader(name, value);
173 }
174
175 public String getHeader(String name) {
176 throw new UnsupportedOperationException("Not possible to implement");
177 }
178
179 public OutputStream getOutputStream() {
180 try {
181 return response.getOutputStream();
182 } catch (IOException e) {
183 throw (IllegalStateException) new IllegalStateException().initCause(e);
184 }
185 }
186
187 public void setStatusCode(int code) {
188 response.setStatus(code);
189 }
190
191 public int getStatusCode() {
192 throw new UnsupportedOperationException("Not possible to implement");
193 }
194
195 public void setContentType(String type) {
196 response.setContentType(type);
197 }
198
199 public String getContentType() {
200 return response.getContentType();
201 }
202
203 public void setStatusMessage(String responseString) {
204 response.setStatus(getStatusCode(), responseString);
205 }
206 }
207 }