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