6034eab7628ff30be8d5cbac8fc7f38b41026dee
[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
52         // Initialization, parsing files, and setting up
53         public static final String SHIBBOLETH_INIT = "shibboleth.init";
54         private static  Logger initLogger = Logger.getLogger(SHIBBOLETH_INIT);
55         private static  Logger initLogger2 = Logger.getLogger("edu.internet2.middleware.shibboleth.xml");
56         
57         // Authentication and Attribute processing, including SAML, Trust, 
58         // Metadata, etc. Because the SP doesn't control all the code, it is
59         // based on real classnames
60         private static Logger clientLogger = Logger.getLogger("edu.internet2.middleware");
61         private static Logger samlLogger = Logger.getLogger("org.opensaml");
62         
63         // Requests from the Resource Manager only touch the RequestMapper
64         // and Session Cache
65         public static final String SHIBBOLETH_SERVICE = "shibboleth.service";
66         private static Logger serviceLogger = Logger.getLogger(SHIBBOLETH_SERVICE);
67
68
69         public void contextInitialized(ServletContextEvent servletContextEvent) {
70                 ServletContext servletContext = servletContextEvent.getServletContext();
71                 Init.init(); // Let XML Security go first
72                 
73                 
74                 Layout initLayout = new PatternLayout("%d{HH:mm} %-5p %m%n");
75                 
76                 ThreadLocalAppender threadAppender = new ThreadLocalAppender();
77                 threadAppender.setLayout(initLayout);
78                 threadAppender.setName("ThreadAppender");
79                 
80                 ConsoleAppender consoleAppender= new ConsoleAppender(initLayout,ConsoleAppender.SYSTEM_OUT);
81                 consoleAppender.setName("SPConsoleAppender");
82                 
83                 clientLogger.addAppender(threadAppender);
84                 clientLogger.addAppender(consoleAppender);
85                 clientLogger.setLevel(Level.DEBUG);
86                 
87                 initLogger.addAppender(consoleAppender);
88                 initLogger.setLevel(Level.DEBUG);
89                 
90                 initLogger2.setLevel(Level.DEBUG);
91                 
92                 // The init log location is represented as a URL in the web.xml
93                 // We have to change this int a fully qualified path name
94                 String initLogUrl = servletContext.getInitParameter("InitializationLog");
95                 if (initLogUrl!=null)
96                         try {
97                                 URI initLogURI = new URI(initLogUrl); 
98                                 File initLogFile = new File(initLogURI);
99                                 String logname = initLogFile.getAbsolutePath();
100                                 FileAppender initLogAppender = new FileAppender(initLayout,logname);
101                                 initLogAppender.setName("SPInitLogFileAppender");
102                                 initLogger.addAppender(initLogAppender);
103                                 initLogger2.addAppender(initLogAppender);
104                         } catch (URISyntaxException e1) {
105                                 servletContext.log("InitializationLog context parameter is not a valid URL", e1);
106                         } catch (IOException e1) {
107                                 servletContext.log("InitializationLog context parameter does not point to a valid location",e1);
108                         }
109                         
110                 
111                 samlLogger.addAppender(threadAppender);
112                 samlLogger.addAppender(consoleAppender);
113                 samlLogger.setLevel(Level.DEBUG);
114
115                 serviceLogger.addAppender(consoleAppender);
116                 serviceLogger.setLevel(Level.DEBUG);
117                 
118                 
119                 try {
120                         ServletContextInitializer.initServiceProvider(servletContext);
121                 } catch (UnavailableException e) {
122                         // Do nothing now, Servlet will retry in a few milliseconds
123                 }
124                 
125         }
126
127         public void contextDestroyed(ServletContextEvent arg0) {
128                 // Nothing interesting happens at the end
129         }
130
131 }