1 /**
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one or more
4 * contributor license agreements. See the NOTICE file distributed with
5 * this work for additional information regarding copyright ownership.
6 * The ASF licenses this file to You under the Apache License, Version 2.0
7 * (the "License"); you may not use this file except in compliance with
8 * the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 */
18 package org.apache.geronimo.jetty.cluster.wadi;
19
20 import java.io.IOException;
21
22 import javax.servlet.FilterChain;
23 import javax.servlet.ServletException;
24 import javax.servlet.ServletRequest;
25 import javax.servlet.ServletResponse;
26
27 import org.apache.geronimo.clustering.ClusteredInvocation;
28 import org.apache.geronimo.clustering.ClusteredInvocationException;
29 import org.apache.geronimo.clustering.wadi.WADISessionManager;
30 import org.apache.geronimo.gbean.GBeanInfo;
31 import org.apache.geronimo.gbean.GBeanInfoBuilder;
32 import org.apache.geronimo.gbean.GBeanLifecycle;
33 import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory;
34 import org.apache.geronimo.jetty.HandleInterceptor;
35 import org.apache.geronimo.jetty.cluster.AbstractClusteredHandleInterceptor;
36 import org.codehaus.wadi.InvocationException;
37 import org.codehaus.wadi.impl.ClusteredManager;
38 import org.codehaus.wadi.web.impl.WebInvocation;
39 import org.mortbay.http.HttpRequest;
40 import org.mortbay.http.HttpResponse;
41 import org.mortbay.jetty.servlet.ServletHttpRequest;
42 import org.mortbay.jetty.servlet.ServletHttpResponse;
43
44
45 /**
46 *
47 * @version $Rev$ $Date$
48 */
49 public class WADIClusteredHandleInterceptor extends AbstractClusteredHandleInterceptor implements GBeanLifecycle {
50 private final WADISessionManager sessionManager;
51
52 private ClusteredManager wadiManager;
53
54 public WADIClusteredHandleInterceptor(WADISessionManager sessionManager) {
55 this.sessionManager = sessionManager;
56 }
57
58 public void doStart() throws Exception {
59 wadiManager = sessionManager.getManager();
60 }
61
62 public void doStop() throws Exception {
63 wadiManager = null;
64 }
65
66 public void doFail() {
67 wadiManager = null;
68 }
69
70 protected ClusteredInvocation newClusteredInvocation(String pathInContext, String pathParams, HttpRequest request,
71 HttpResponse response, HandleInterceptor end) {
72 return new WADIWebClusteredInvocation(pathInContext, pathParams, request, response, end);
73 }
74
75 protected class WADIWebClusteredInvocation extends WebClusteredInvocation {
76
77 public WADIWebClusteredInvocation(String pathInContext, String pathParams, HttpRequest request,
78 HttpResponse response, HandleInterceptor end) {
79 super(pathInContext, pathParams, request, response, end);
80 }
81
82 public void invoke() throws ClusteredInvocationException {
83 ServletHttpRequest servletHttpRequest = (ServletHttpRequest) request.getWrapper();
84 ServletHttpResponse servletHttpResponse = (ServletHttpResponse) response.getWrapper();
85
86 WebInvocation invocation = WebInvocation.getThreadLocalInstance();
87 FilterChain chainAdapter = new FilterChain() {
88 public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException {
89 try {
90 invokeLocally();
91 } catch (ClusteredInvocationException e) {
92 throw (IOException) new IOException().initCause(e);
93 }
94 }
95 };
96 invocation.init(servletHttpRequest, servletHttpResponse, chainAdapter);
97 try {
98 wadiManager.contextualise(invocation);
99 } catch (InvocationException e) {
100 Throwable throwable = e.getCause();
101 if (throwable instanceof IOException) {
102 throw new ClusteredInvocationException(throwable);
103 } else if (throwable instanceof ServletException) {
104 throw new ClusteredInvocationException(throwable);
105 } else {
106 throw new ClusteredInvocationException(e);
107 }
108 }
109 }
110 }
111
112 public static final GBeanInfo GBEAN_INFO;
113
114 public static final String GBEAN_REF_WADI_SESSION_MANAGER = "WADISessionManager";
115
116 static {
117 GBeanInfoBuilder infoBuilder = GBeanInfoBuilder.createStatic("WADI Clustered Handle Interceptor",
118 WADIClusteredHandleInterceptor.class, NameFactory.GERONIMO_SERVICE);
119
120 infoBuilder.addReference(GBEAN_REF_WADI_SESSION_MANAGER, WADISessionManager.class,
121 NameFactory.GERONIMO_SERVICE);
122
123 infoBuilder.setConstructor(new String[]{GBEAN_REF_WADI_SESSION_MANAGER});
124
125 GBEAN_INFO = infoBuilder.getBeanInfo();
126 }
127
128 public static GBeanInfo getGBeanInfo() {
129 return GBEAN_INFO;
130 }
131 }