Global object for Service Provider data and configuration
[java-idp.git] / src / edu / internet2 / middleware / shibboleth / serviceprovider / ServiceProviderContext.java
1 /*
2  * ServiceProviderContext.java
3  * 
4  * There is one ServiceProviderContext per Service Provider.
5  * Other objects and collections of objects are referenced through it.
6  * 
7  * An object of type ServiceProviderContext must be created and
8  * shared among the Shibboleth classes in the same Service Provider.
9  * The default implimentation is for the object to be created during
10  * the static initialization of the class and accessed through the
11  * static getInstance() factory method.
12  * 
13  * Any change to this strategy can be propagated to all other classes
14  * just by changing the getInstance() method implementation to use 
15  * a different factory or lookup service.
16  * 
17  * --------------------
18  * Copyright 2002, 2004 
19  * University Corporation for Advanced Internet Development, Inc. 
20  * All rights reserved
21  * [Thats all we have to say to protect ourselves]
22  * Your permission to use this code is governed by "The Shibboleth License".
23  * A copy may be found at http://shibboleth.internet2.edu/license.html
24  * [Nothing in copyright law requires license text in every file.]
25  */
26 package edu.internet2.middleware.shibboleth.serviceprovider;
27
28 /**
29  * Unique object through which all Service Provider objects and collections
30  * are found. Obtain a reference to this object by calling the static
31  * getInstance() method.
32  * 
33  * @author Howard Gilbert
34  *
35  */
36 public class ServiceProviderContext {
37         
38         /*
39          * This static object provides the default implimentation of the 
40          * ServiceProviderContext singleton object. However, the getInstance
41          * Factory actually determines the particular instance used.
42          * 
43          * Warning:
44          * 
45          * Some of the following fields may have an initialization
46          * expression as in "Foo x = new Foo()".
47          * The "Foo" class in turn may have a constructor or its own
48          * static and non-static initialization statements. If anywhere
49          * in this cascade of initialization triggered directly or 
50          * indirectly by creating this first new object of type
51          * ServiceProviderContext() there is some code that calls
52          * back to getServiceProviderContext() then it will get back
53          * a null from that call. This is because the targetContext
54          * variable is not filled in with a reference to the object 
55          * until it is constructed, and we are still in the middle of
56          * constructing it.  
57          */
58         private static ServiceProviderContext targetContext = new ServiceProviderContext();
59         
60         /*
61          * The fatalErrors flag provides a global reference where Service Provider
62          * components can know that we are totally hosed and cannot proceed. When
63          * set, this tells all servlets right up front to generate error messages
64          * and apologize.
65          */
66         private boolean fatalErrors = false; 
67         
68         
69         
70         /**
71          * <p>Static Factory method to return the ServiceProviderContext.
72          * </p><p>
73          * The default implmementation is to use a static field. 
74          * However, in other environments you may wish to replace this
75          * with an object managed by J2EE or by Spring. If so, create
76          * the object someplace else and change this factory to locate
77          * it with LDAP, an external context, Spring, or whatever.
78          * </p>
79          * @return Returns the ServiceProviderContext object.
80          */
81         public static ServiceProviderContext getInstance() {
82                 return targetContext;
83         }
84         
85         /**
86          * The ServiceProviderConfig object holds all information from
87          * the configuration file and the other sources of information
88          * and metadata to which it refers.
89          */
90         private ServiceProviderConfig serviceProviderConfig = null;
91         
92         
93         
94         /*
95          * <p>Manager for the collection (and Cache) of Session Objects
96          * </p><p>
97          * All access to and creation/deletion of Sessions occurs through
98          * this object. This could be a wiring point later if someone
99          * wanted to load and configure the Session Manager in Spring.
100          */
101         private SessionManager sessionManager = null;
102         
103         
104         private ThreadLocal requestContext = new ThreadLocal();
105                 public void setRequestContext(RequestTracker trk) {
106                     requestContext.set(trk);
107                 }
108                 public RequestTracker getRequestContext() {
109                     return (RequestTracker) requestContext.get();
110                 }
111
112         /**
113          * Constructor currently made private to force use of getInstance()
114          */
115         private ServiceProviderContext() {
116         }
117         
118         
119         
120         // property accessor methods
121
122         public SessionManager getSessionManager() {
123             // deferred allocation, since sessionManger needs a reference
124             // back to context.
125             if (sessionManager==null)
126                     sessionManager = new SessionManager();
127                 return sessionManager;
128         }
129
130         public ServiceProviderConfig getServiceProviderConfig() {
131                 return serviceProviderConfig;
132         }
133         public void setServiceProviderConfig(
134                         ServiceProviderConfig serviceProviderConfig) {
135                 this.serviceProviderConfig = serviceProviderConfig;
136         }
137         public boolean isFatalErrors() {
138                 return fatalErrors;
139         }
140         public void setFatalErrors(boolean fatalErrors) {
141                 this.fatalErrors = fatalErrors;
142         }
143         
144 }