Organize logging into init, client service, and resource service threads
[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          */
113         private static String getServiceProviderConfigFile(ServletContext scontext) {
114             
115                 if (scontext!=null) {
116                         String servletparm = scontext.getInitParameter("ServiceProviderConfigFile");
117                         if (servletparm != null) {
118                                 return servletparm;
119                         }
120                 }
121
122                 return "/conf/shibboleth.xml";
123                 
124         }
125
126     /**
127      * Initialization specific to processing a request
128      * @param request
129      * @param response
130      */
131     public static void beginService(
132             HttpServletRequest request, 
133             HttpServletResponse response) {
134        
135         String ipaddr = request.getRemoteAddr();
136         RequestTracker requestTracker = new RequestTracker();
137         requestTracker.setIpaddr(ipaddr);
138         context.setRequestContext(requestTracker);
139         
140     }
141
142     /**
143      * Cleanup specific to a processing a request
144      * @param request
145      * @param response
146      */
147     public static void finishService(
148             HttpServletRequest request, 
149             HttpServletResponse response) {
150         RequestTracker requestContext = context.getRequestContext();
151         context.setRequestContext(null);
152         String ipaddr = requestContext.getIpaddr();
153         HttpSession session = request.getSession();
154     }
155
156 }