KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > geronimo > tomcat > listener > DispatchListener


1 /**
2  * Licensed to the Apache Software Foundation (ASF) under one or more
3  * contributor license agreements. See the NOTICE file distributed with
4  * this work for additional information regarding copyright ownership.
5  * The ASF licenses this file to You under the Apache License, Version 2.0
6  * (the "License"); you may not use this file except in compliance with
7  * the License. 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.tomcat.listener;
18
19 import java.util.Stack JavaDoc;
20
21 import javax.servlet.ServletRequest JavaDoc;
22 import javax.servlet.ServletResponse JavaDoc;
23
24 import org.apache.catalina.Container;
25 import org.apache.catalina.Globals;
26 import org.apache.catalina.InstanceEvent;
27 import org.apache.catalina.InstanceListener;
28 import org.apache.catalina.core.StandardWrapper;
29 import org.apache.geronimo.tomcat.GeronimoStandardContext;
30 import org.apache.geronimo.tomcat.interceptor.BeforeAfter;
31 import org.apache.geronimo.tomcat.realm.TomcatGeronimoRealm;
32 import org.apache.tomcat.util.buf.MessageBytes;
33 import org.apache.tomcat.util.http.mapper.Mapper;
34 import org.apache.tomcat.util.http.mapper.MappingData;
35 import org.apache.commons.logging.Log;
36 import org.apache.commons.logging.LogFactory;
37
38 public class DispatchListener implements InstanceListener {
39
40     private static final Log log = LogFactory.getLog(DispatchListener.class);
41
42     private static ThreadLocal JavaDoc currentContext = new ThreadLocal JavaDoc() {
43         protected Object JavaDoc initialValue() {
44             return new Stack JavaDoc();
45         }
46     };
47
48     public void instanceEvent(InstanceEvent event) {
49
50         if (event.getType().equals(InstanceEvent.BEFORE_DISPATCH_EVENT)) {
51
52             Container parent = event.getWrapper().getParent();
53             if (parent instanceof GeronimoStandardContext) {
54                 beforeDispatch((GeronimoStandardContext) parent, event
55                         .getRequest(), event.getResponse());
56             }
57         }
58
59         if (event.getType().equals(InstanceEvent.AFTER_DISPATCH_EVENT)) {
60             Container parent = event.getWrapper().getParent();
61             if (parent instanceof GeronimoStandardContext) {
62                 afterDispatch((GeronimoStandardContext) parent, event
63                         .getRequest(), event.getResponse());
64             }
65         }
66     }
67
68     private void beforeDispatch(GeronimoStandardContext webContext,
69                                 ServletRequest JavaDoc request, ServletResponse JavaDoc response) {
70
71         BeforeAfter beforeAfter = webContext.getBeforeAfter();
72         if (beforeAfter != null) {
73             Stack JavaDoc stack = (Stack JavaDoc) currentContext.get();
74             Object JavaDoc context[] = new Object JavaDoc[webContext.getContextCount() + 1];
75             String JavaDoc wrapperName = getWrapperName(request, webContext);
76             context[webContext.getContextCount()] = TomcatGeronimoRealm
77                     .setRequestWrapperName(wrapperName);
78
79             beforeAfter.before(context, request, response);
80             stack.push(context);
81         }
82     }
83
84     private void afterDispatch(GeronimoStandardContext webContext,
85                                ServletRequest JavaDoc request, ServletResponse JavaDoc response) {
86         BeforeAfter beforeAfter = webContext.getBeforeAfter();
87         if (beforeAfter != null) {
88             Stack JavaDoc stack = (Stack JavaDoc) currentContext.get();
89             Object JavaDoc context[] = (Object JavaDoc[]) stack.pop();
90             beforeAfter.after(context, request, response);
91             TomcatGeronimoRealm
92                     .setRequestWrapperName((String JavaDoc) context[webContext
93                             .getContextCount()]);
94
95         }
96     }
97
98     private String JavaDoc getWrapperName(ServletRequest JavaDoc request,
99                                   GeronimoStandardContext webContext) {
100
101         MappingData mappingData = new MappingData();
102         Mapper mapper = webContext.getMapper();
103         MessageBytes mb = MessageBytes.newInstance();
104
105         String JavaDoc dispatchPath =
106             (String JavaDoc) request.getAttribute(Globals.DISPATCHER_REQUEST_PATH_ATTR);
107         mb.setString(webContext.getName() + dispatchPath);
108
109         try {
110             mapper.map(mb, mappingData);
111             StandardWrapper wrapper = (StandardWrapper) mappingData.wrapper;
112             return wrapper.getName();
113         } catch (Exception JavaDoc e) {
114             log.error(e.getMessage(), e);
115         }
116
117         return null;
118     }
119
120 }
121
Popular Tags