1 /**
2 *
3 * Copyright 2005 The Apache Software Foundation
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17 package org.apache.geronimo.webservices;
18
19 import java.io.IOException;
20 import java.security.Principal;
21 import javax.servlet.Servlet;
22 import javax.servlet.ServletConfig;
23 import javax.servlet.ServletException;
24 import javax.servlet.ServletRequest;
25 import javax.servlet.ServletResponse;
26 import javax.servlet.ServletContext;
27 import javax.servlet.http.HttpServletRequest;
28 import javax.servlet.http.HttpSession;
29 import javax.xml.rpc.server.ServiceLifecycle;
30 import javax.xml.rpc.server.ServletEndpointContext;
31 import javax.xml.rpc.ServiceException;
32 import javax.xml.rpc.handler.MessageContext;
33
34 /**
35 * @version $Rev: 355877 $ $Date: 2005-12-10 18:48:27 -0800 (Sat, 10 Dec 2005) $
36 */
37 public class ServiceLifecycleManager implements Servlet {
38
39 private final ServiceLifecycle managedService;
40 private final Servlet next;
41
42 public ServiceLifecycleManager(Servlet next, ServiceLifecycle managedService) {
43 this.next = next;
44 this.managedService = managedService;
45 }
46
47 public void init(ServletConfig config) throws ServletException {
48 next.init(config);
49 try {
50 managedService.init(new InstanceContext(config.getServletContext()));
51 } catch (ServiceException e) {
52 throw new ServletException("Unable to initialize ServiceEndpoint", e);
53 }
54 }
55
56 public ServletConfig getServletConfig() {
57 return next.getServletConfig();
58 }
59
60 public String getServletInfo() {
61 return next.getServletInfo();
62 }
63
64 public void destroy() {
65 managedService.destroy();
66 next.destroy();
67 }
68
69 public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
70 ServletEndpointContext context = getContext();
71 try {
72 endpointContext.set(new InvocationContext((HttpServletRequest) req));
73 next.service(req, res);
74 } finally {
75 endpointContext.set(context);
76 }
77 }
78
79 private static final DefaultContext DEFAULT_CONTEXT = new DefaultContext();
80
81 private static final ThreadLocal endpointContext = new ThreadLocal();
82
83
84 private static ServletEndpointContext getContext() {
85 ServletEndpointContext context = (ServletEndpointContext) endpointContext.get();
86 return context != null ? context : DEFAULT_CONTEXT;
87 }
88
89 static class InstanceContext implements ServletEndpointContext {
90 private final ServletContext servletContext;
91
92 public InstanceContext(ServletContext servletContext) {
93 this.servletContext = servletContext;
94 }
95
96 public MessageContext getMessageContext() {
97 return getContext().getMessageContext();
98 }
99
100 public Principal getUserPrincipal() {
101 return getContext().getUserPrincipal();
102 }
103
104 public HttpSession getHttpSession() {
105 return getContext().getHttpSession();
106 }
107
108 public ServletContext getServletContext() {
109 return servletContext;
110 }
111
112 public boolean isUserInRole(String s) {
113 return getContext().isUserInRole(s);
114 }
115 }
116
117 static class InvocationContext implements ServletEndpointContext {
118
119 private final HttpServletRequest request;
120
121 public InvocationContext(HttpServletRequest request) {
122 this.request = request;
123 }
124
125 public MessageContext getMessageContext() {
126 return (MessageContext) request.getAttribute(WebServiceContainer.MESSAGE_CONTEXT);
127 }
128
129 public Principal getUserPrincipal() {
130 return request.getUserPrincipal();
131 }
132
133 public HttpSession getHttpSession() {
134 return request.getSession();
135 }
136
137 public ServletContext getServletContext() {
138 throw new IllegalAccessError("InstanceContext should never delegate this method.");
139 }
140
141 public boolean isUserInRole(String s) {
142 return request.isUserInRole(s);
143 }
144 }
145
146 static class DefaultContext implements ServletEndpointContext {
147
148 public MessageContext getMessageContext() {
149 throw new IllegalStateException("Method cannot be called outside a request context");
150 }
151
152 public Principal getUserPrincipal() {
153 throw new IllegalStateException("Method cannot be called outside a request context");
154 }
155
156 public HttpSession getHttpSession() {
157 throw new javax.xml.rpc.JAXRPCException("Method cannot be called outside an http request context");
158 }
159
160 public ServletContext getServletContext() {
161 throw new IllegalAccessError("InstanceContext should never delegate this method.");
162 }
163
164 public boolean isUserInRole(String s) {
165 throw new IllegalStateException("Method cannot be called outside a request context");
166 }
167 }
168 }