Patches for opensaml profile/binding changes.
[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 import org.opensaml.NoSuchProviderException;
29 import org.opensaml.ReplayCache;
30 import org.opensaml.ReplayCacheFactory;
31
32 /**
33  * Unique object through which all Service Provider objects and collections
34  * are found. Obtain a reference to this object by calling the static
35  * getInstance() method.
36  * 
37  * @author Howard Gilbert
38  *
39  */
40 public class ServiceProviderContext {
41         
42         /*
43          * This static object provides the default implimentation of the 
44          * ServiceProviderContext singleton object. However, the getInstance
45          * Factory actually determines the particular instance used.
46          * 
47          * Warning:
48          * 
49          * Some of the following fields may have an initialization
50          * expression as in "Foo x = new Foo()".
51          * The "Foo" class in turn may have a constructor or its own
52          * static and non-static initialization statements. If anywhere
53          * in this cascade of initialization triggered directly or 
54          * indirectly by creating this first new object of type
55          * ServiceProviderContext() there is some code that calls
56          * back to getServiceProviderContext() then it will get back
57          * a null from that call. This is because the targetContext
58          * variable is not filled in with a reference to the object 
59          * until it is constructed, and we are still in the middle of
60          * constructing it.  
61          */
62         private static ServiceProviderContext targetContext = new ServiceProviderContext();
63         
64         /*
65          * The fatalErrors flag provides a global reference where Service Provider
66          * components can know that we are totally hosed and cannot proceed. When
67          * set, this tells all servlets right up front to generate error messages
68          * and apologize.
69          */
70         private boolean fatalErrors = false; 
71         
72         
73         
74         /**
75          * <p>Static Factory method to return the ServiceProviderContext.
76          * </p><p>
77          * The default implmementation is to use a static field. 
78          * However, in other environments you may wish to replace this
79          * with an object managed by J2EE or by Spring. If so, create
80          * the object someplace else and change this factory to locate
81          * it with LDAP, an external context, Spring, or whatever.
82          * </p>
83          * @return Returns the ServiceProviderContext object.
84          */
85         public static ServiceProviderContext getInstance() {
86                 return targetContext;
87         }
88         
89         /**
90          * The ServiceProviderConfig object holds all information from
91          * the configuration file and the other sources of information
92          * and metadata to which it refers.
93          */
94         private ServiceProviderConfig serviceProviderConfig = null;
95         
96         
97         
98         /*
99          * <p>Manager for the collection (and Cache) of Session Objects
100          * </p><p>
101          * All access to and creation/deletion of Sessions occurs through
102          * this object. This could be a wiring point later if someone
103          * wanted to load and configure the Session Manager in Spring.
104          */
105         private SessionManager sessionManager = null;
106
107         private ReplayCache replayCache = null;
108         
109         private ThreadLocal requestContext = new ThreadLocal();
110                 public void setRequestContext(RequestTracker trk) {
111                     requestContext.set(trk);
112                 }
113                 public RequestTracker getRequestContext() {
114                     return (RequestTracker) requestContext.get();
115                 }
116
117         /**
118          * Constructor currently made private to force use of getInstance()
119          */
120         private ServiceProviderContext() {
121         }
122         
123         
124         
125         // property accessor methods
126
127         public synchronized SessionManager getSessionManager() {
128             // deferred allocation, since sessionManger needs a reference
129             // back to context.
130             if (sessionManager==null)
131                     sessionManager = new SessionManager();
132                 return sessionManager;
133         }
134
135     // TODO: Make this pluggable / configurable
136     public synchronized ReplayCache getReplayCache() {
137         if (replayCache == null) {
138             try {
139                 replayCache = ReplayCacheFactory.getInstance();
140             }
141             catch (NoSuchProviderException e) {
142             }
143         }
144         return replayCache;
145     }
146     
147         public ServiceProviderConfig getServiceProviderConfig() {
148                 return serviceProviderConfig;
149         }
150         public void setServiceProviderConfig(
151                         ServiceProviderConfig serviceProviderConfig) {
152                 this.serviceProviderConfig = serviceProviderConfig;
153         }
154         public boolean isFatalErrors() {
155                 return fatalErrors;
156         }
157         public void setFatalErrors(boolean fatalErrors) {
158                 this.fatalErrors = fatalErrors;
159         }
160         
161 }