001 /**
002 *
003 * Copyright 2003-2004 The Apache Software Foundation
004 *
005 * Licensed under the Apache License, Version 2.0 (the "License");
006 * you may not use this file except in compliance with the License.
007 * You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017
018 //
019 // This source code implements specifications defined by the Java
020 // Community Process. In order to remain compliant with the specification
021 // DO NOT add / change / or delete method signatures!
022 //
023
024 package javax.security.jacc;
025
026 import java.security.SecurityPermission;
027 import java.util.Hashtable;
028 import java.util.Set;
029
030
031 /**
032 *
033 * @version $Rev: 54183 $ $Date: 2004-10-09 15:04:29 -0700 (Sat, 09 Oct 2004) $
034 */
035 public final class PolicyContext {
036
037 private static ThreadLocal contextId = new ThreadLocal();
038 private static ThreadLocal handlerData = new ThreadLocal();
039 private static Hashtable handlers = new Hashtable();
040 private final static SecurityPermission SET_POLICY = new SecurityPermission("setPolicy");
041
042 private PolicyContext() {
043 }
044
045 public static void setContextID(String contextID) {
046 SecurityManager sm = System.getSecurityManager();
047 if (sm != null) sm.checkPermission(SET_POLICY);
048
049 contextId.set(contextID);
050 }
051
052 public static String getContextID() {
053 return (String) contextId.get();
054 }
055
056 public static void setHandlerData(Object data) {
057 SecurityManager sm = System.getSecurityManager();
058 if (sm != null) sm.checkPermission(SET_POLICY);
059
060 handlerData.set(data);
061 }
062
063 public static void registerHandler(String key, PolicyContextHandler handler, boolean replace) throws PolicyContextException {
064 if (key == null) throw new IllegalArgumentException("Key must not be null");
065 if (handler == null) throw new IllegalArgumentException("Handler must not be null");
066 if (!replace && handlers.containsKey(key)) throw new IllegalArgumentException("A handler has already been registered under '" + key + "' and replace is false.");
067
068 SecurityManager sm = System.getSecurityManager();
069 if (sm != null) sm.checkPermission(SET_POLICY);
070
071 handlers.put(key, handler);
072 }
073
074 public static Set getHandlerKeys() {
075 return handlers.keySet();
076 }
077
078 public static Object getContext(String key) throws PolicyContextException {
079 if (key == null) throw new IllegalArgumentException("Key must not be null");
080
081 PolicyContextHandler handler = (PolicyContextHandler) handlers.get(key);
082
083 if (handler == null) throw new IllegalArgumentException("No handler can be found for the key '" + key + "'");
084 if (!handler.supports(key)) throw new IllegalArgumentException("Registered handler no longer supports the key '" + key + "'");
085
086 SecurityManager sm = System.getSecurityManager();
087 if (sm != null) sm.checkPermission(SET_POLICY);
088
089 return handler.getContext(key, handlerData.get());
090 }
091 }