Organize logging into init, client service, and resource service threads
[java-idp.git] / src / edu / internet2 / middleware / shibboleth / serviceprovider / ContextListener.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 package edu.internet2.middleware.shibboleth.serviceprovider;
18
19 import java.io.File;
20 import java.io.IOException;
21 import java.net.URI;
22 import java.net.URISyntaxException;
23 import javax.servlet.ServletContext;
24 import javax.servlet.ServletContextEvent;
25 import javax.servlet.ServletContextListener;
26 import javax.servlet.UnavailableException;
27
28 import org.apache.log4j.FileAppender;
29 import org.apache.log4j.Layout;
30 import org.apache.log4j.Level;
31 import org.apache.log4j.Logger;
32 import org.apache.log4j.PatternLayout;
33 import org.apache.xml.security.Init;
34
35 import edu.internet2.middleware.commons.log4j.ThreadLocalAppender;
36
37 /**
38  * A ContextListener gets control from the Servlet Container before
39  * any Servlets or Filters are loaded. It can perform the earliest 
40  * forms of initialization. Commonly, this is used to initialize log
41  * files or container systems (such as Spring). Initialization can
42  * done here or in the init routines of the Filters and individual
43  * Servlets. It is better to do it here logic that is common to all
44  * Servlets and Filters since you do not know what order they will
45  * be loaded. It is generally a good idea to have one on spec so
46  * that you can move logic around as needed.
47  */
48 public class ContextListener implements ServletContextListener {
49         
50
51         // Initialization, parsing files, and setting up
52         public static final String SHIBBOLETH_INIT = "shibboleth.init";
53         private Logger initLogger = Logger.getLogger(SHIBBOLETH_INIT);
54         
55         // Authentication and Attribute processing, including SAML, Trust, 
56         // Metadata, etc. Because the SP doesn't control all the code, it is
57         // based on real classnames
58         private Logger clientLogger = Logger.getLogger("edu.internet2.middleware");
59         private Logger samlLogger = Logger.getLogger("org.opensaml");
60         
61         // Requests from the Resource Manager only touch the RequestMapper
62         // and Session Cache
63         public static final String SHIBBOLETH_SERVICE = "shibboleth.service";
64         private Logger serviceLogger = Logger.getLogger(SHIBBOLETH_SERVICE);
65
66
67         public void contextInitialized(ServletContextEvent servletContextEvent) {
68                 ServletContext servletContext = servletContextEvent.getServletContext();
69                 Init.init(); // Let XML Security go first
70                 
71                 Layout initLayout = new PatternLayout("%d{HH:mm} %-5p %m%n");
72                 ThreadLocalAppender threadAppender = new ThreadLocalAppender();
73                 threadAppender.setLayout(initLayout);
74                 clientLogger.addAppender(threadAppender);
75                 
76                 // The init log location is represented as a URL in the web.xml
77                 // We have to change this int a fully qualified path name
78                 String initLogUrl = servletContext.getInitParameter("InitializationLog");
79                 if (initLogUrl!=null)
80                         try {
81                                 URI initLogURI = new URI(initLogUrl); 
82                                 File initLogFile = new File(initLogURI);
83                                 String logname = initLogFile.getAbsolutePath();
84                                 FileAppender initLogAppender = new FileAppender(initLayout,logname);
85                                 initLogger.addAppender(initLogAppender);
86                                 initLogger.setLevel(Level.DEBUG);
87                         } catch (URISyntaxException e1) {
88                                 servletContext.log("InitializationLog context parameter is not a valid URL", e1);
89                         } catch (IOException e1) {
90                                 servletContext.log("InitializationLog context parameter does not point to a valid location",e1);
91                         }
92                         
93                 
94                 samlLogger.addAppender(threadAppender);
95                 samlLogger.setLevel(Level.DEBUG);
96                 
97                 try {
98                         ServletContextInitializer.initServiceProvider(servletContext);
99                 } catch (UnavailableException e) {
100                         // Do nothing now, Servlet will retry in a few milliseconds
101                 }
102                 
103         }
104
105         public void contextDestroyed(ServletContextEvent arg0) {
106                 // Nothing interesting happens at the end
107         }
108
109 }