summaryrefslogtreecommitdiffstats
path: root/sca-java-2.x/tags/2.0.1-RC1/modules/node-launcher/src/main/java/org/apache/tuscany/sca/node/launcher/NodeServletFilter.java
blob: 5345363031c57040d8ca4094381a305aaf3dd4ac (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/*
 * 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.tuscany.sca.node.launcher;

import static org.apache.tuscany.sca.node.launcher.NodeLauncherUtil.webAppRuntimeClassLoader;

import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.servlet.Filter;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

/**
 * A Servlet filter that forwards service requests to the Servlets registered with
 * the Tuscany ServletHost.
 * 
 * @version $Rev$ $Date$
 */
public class NodeServletFilter implements Filter {
    private static final long serialVersionUID = 1L;

    private static final String NODE_WEB_APP_SERVLET_HOST = "org.apache.tuscany.sca.implementation.node.webapp.NodeWebAppServletHost";

    private static final Logger logger = Logger.getLogger(NodeServletFilter.class.getName());

    private ClassLoader runtimeClassLoader;
    private Class<?> servletHostClass;
    private Object servletHost;
    private Filter filter;

    public void init(FilterConfig filterConfig) throws ServletException {
        logger.info("Apache Tuscany SCA WebApp Node is starting...");

        try {
            // Get the Tuscany runtime ClassLoader
            ClassLoader tccl = Thread.currentThread().getContextClassLoader();
            runtimeClassLoader = webAppRuntimeClassLoader(getClass().getClassLoader());
            
            try {
                if (runtimeClassLoader != null) {
                    Thread.currentThread().setContextClassLoader(runtimeClassLoader);
                }
        
                // Load the Tuscany WebApp Servlet host and get the host instance
                // for the current webapp
                String className = NODE_WEB_APP_SERVLET_HOST; 
                if (runtimeClassLoader != null) {
                    servletHostClass = Class.forName(className, true, runtimeClassLoader);
                } else {
                    servletHostClass = Class.forName(className);
                }
                servletHost = servletHostClass.getMethod("servletHost").invoke(null);
        
                // Initialize the Servlet host
                servletHostClass.getMethod("init", FilterConfig.class).invoke(servletHost, filterConfig);
    
                // The Servlet host also implements the filter interface 
                filter = (Filter)servletHost;
                
            } finally {
                Thread.currentThread().setContextClassLoader(tccl);
            }
            
        } catch (Exception e) {
            logger.log(Level.SEVERE, "Error Starting SCA WebApp Node", e);
            throw new ServletException(e);
        }

        logger.info("SCA WebApp Node started.");
    }

    public void destroy() {
        logger.info("Apache Tuscany WebApp Node stopping...");
        if (servletHost != null) {
            ClassLoader tccl = Thread.currentThread().getContextClassLoader();
            try {
                if (runtimeClassLoader != null) {
                    Thread.currentThread().setContextClassLoader(runtimeClassLoader);
                }
                
                servletHostClass.getMethod("destroy").invoke(servletHost);
                
            } catch (Exception e) {
                logger.log(Level.SEVERE, "Error Stopping SCA WebApp Node", e);
            } finally {
                Thread.currentThread().setContextClassLoader(tccl);
            }
        }
        logger.info("SCA WebApp Node stopped.");
    }

    public void doFilter(ServletRequest request, ServletResponse response, javax.servlet.FilterChain chain)
        throws IOException, ServletException {

        // Delegate to the Servlet host filter
        ClassLoader tccl = Thread.currentThread().getContextClassLoader();
        try {
            if (runtimeClassLoader != null) {
                Thread.currentThread().setContextClassLoader(runtimeClassLoader);
            }
            
            filter.doFilter(request, response, chain);
            
        } finally {
            Thread.currentThread().setContextClassLoader(tccl);
        }
    }

}