cleanup, add checks to arguments and responses, add log statements
[java-idp.git] / src / edu / internet2 / middleware / shibboleth / serviceprovider / ServletContextInitializer.java
1 /*
2  * Copyright [2005] [University Corporation for Advanced Internet Development, Inc.]
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 /*
18  * ServletContextInitializer.java
19  * 
20  * Each application in a Servlet Container (a Java Web server like Tomcat)
21  * occupies its own subdirectory, has its own ClassLoader, and owns a 
22  * collection of objects and classes that are collectively its "Context".
23  * 
24  * It is not entirely predictable what initialization method will be 
25  * called first (maybe a Filter, maybe a Servlet, it depends on the 
26  * way web.xml is coded and processed). Some objects may be marked to
27  * preload, and some may be loaded when first called.
28  * 
29  * However, the ServiceProviderContext must be initialzed just once,
30  * and it must be initialized before any other ServiceProvider methods
31  * are called. So this static class does the job. It can be called from
32  * any init() type method in any filter or servlet, and it can be called
33  * from the static initialization method of any other class loaded by the
34  * container configuration.
35  * 
36  * The gotcha is that the file location of the configuration file may be
37  * a parameter specified in the web.xml file. Code provided here will
38  * handle the normal cases where the Servlet or Filter intializes it and
39  * the web.xml parameter is found through the ServletContext object. If 
40  * you want to use ServiceProvider methods earlier than that, and do not
41  * have access to a ServletContext, then you have to modify this class
42  * to find the parameter someplace else (say in the server.xml file).
43  * Of course, if you initialize the Service Provider classes from 
44  * the server's environment instead of the /shibboleth context environment,
45  * then the shibboleth JAR files have to be in the server's parent classpath
46  * (example: {Tomcat}/common/lib) rather than just in the /shibboleth/WEB-INF/lib. 
47  * 
48  * As with Servlet and Filter classes, this class knows about javax.servlet.* 
49  * objects that other shibboleth classes are not allowed to reference.
50  */
51 package edu.internet2.middleware.shibboleth.serviceprovider;
52
53 import javax.servlet.ServletContext;
54 import javax.servlet.UnavailableException;
55 import javax.servlet.http.HttpServletRequest;
56 import javax.servlet.http.HttpServletResponse;
57 import javax.servlet.http.HttpSession;
58
59 import org.apache.log4j.Logger;
60
61 import edu.internet2.middleware.shibboleth.common.ShibbolethConfigurationException;
62
63
64 /**
65  * @author Howard Gilbert
66  */
67 public class ServletContextInitializer {
68         
69         private static Logger log = Logger.getLogger(ContextListener.SHIBBOLETH_INIT+".Initializer");
70         private static ServiceProviderContext context   = ServiceProviderContext.getInstance();
71
72         public static boolean initialized = false;
73         
74         public static synchronized void initServiceProvider(ServletContext scontext) 
75                 throws UnavailableException{
76                 
77                 if (initialized)
78                         return;
79                 
80                 try {
81                         log.info("Initializing Service Provider.");
82                         
83                         ServiceProviderConfig config = new ServiceProviderConfig();
84                         context.setServiceProviderConfig(config);
85                         
86                         // could config.addOrReplaceXXXImplementor()
87
88                         String configFileName = getServiceProviderConfigFile(scontext);
89                         config.loadConfigObjects(configFileName);
90                         
91                         // could config.addOrReplaceXXXImplementor()
92                         
93                         context.setServiceProviderConfig(config);
94
95                         log.info("Service Provider initialization complete.");
96
97                 } catch (ShibbolethConfigurationException ex) {
98                         context.setFatalErrors(true);
99                         log.fatal("Service Provider runtime configuration error.  Please fix and re-initialize. Cause: " + ex);
100                         throw new UnavailableException("Assertion Consumer Service failed to initialize.");
101                 }
102                 initialized = true;
103         }
104         
105         /**
106          * Return name of target's XML configuration file from
107          *  ServiceProviderConfigFile parameter of WEB-INF/web.xml, or
108          *  default string
109          * 
110          * @param ServletContext or null 
111          * @return String filename
112          * @throws ShibbolethConfigurationException 
113          */
114         private static String getServiceProviderConfigFile(ServletContext scontext) 
115                 throws ShibbolethConfigurationException {
116             
117                 if (scontext!=null) {
118                         String servletparm = scontext.getInitParameter("ServiceProviderConfigFile");
119                         if (servletparm != null) {
120                                 return servletparm;
121                         }
122                 }
123                 log.error("ServiceProviderConfigFile parameter missing in WEB-INF/web.xml");
124                 throw new ShibbolethConfigurationException("ServiceProviderConfigFile parameter missing");
125                 
126         }
127
128     /**
129      * Initialization specific to processing a request
130      * @param request
131      * @param response
132      */
133     public static void beginService(
134             HttpServletRequest request, 
135             HttpServletResponse response) {
136        
137         String ipaddr = request.getRemoteAddr();
138         RequestTracker requestTracker = new RequestTracker();
139         requestTracker.setIpaddr(ipaddr);
140         context.setRequestContext(requestTracker);
141         
142     }
143
144     /**
145      * Cleanup specific to a processing a request
146      * @param request
147      * @param response
148      */
149     public static void finishService(
150             HttpServletRequest request, 
151             HttpServletResponse response) {
152         RequestTracker requestContext = context.getRequestContext();
153         context.setRequestContext(null);
154         String ipaddr = requestContext.getIpaddr();
155         HttpSession session = request.getSession();
156     }
157
158 }