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