blob: bc973f96718e67496b90179a188940f40dafa280 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
//
// This source code implements specifications defined by the Java
// Community Process. In order to remain compliant with the specification
// DO NOT add / change / or delete method signatures!
//
package javax.security.jacc;
import java.security.SecurityPermission;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* @version $Rev$ $Date$
*/
public final class PolicyContext {
private final static ThreadLocal<String> contextId = new ThreadLocal<String>();
private final static ThreadLocal<Object> handlerData = new ThreadLocal<Object>();
private static volatile Map<String, PolicyContextHandler> handlers = new HashMap<String, PolicyContextHandler>();
private final static SecurityPermission SET_POLICY = new SecurityPermission("setPolicy");
private PolicyContext() {
}
public static void setContextID(String contextID) {
SecurityManager sm = System.getSecurityManager();
if (sm != null) sm.checkPermission(SET_POLICY);
contextId.set(contextID);
}
public static String getContextID() {
return contextId.get();
}
public static void setHandlerData(Object data) {
SecurityManager sm = System.getSecurityManager();
if (sm != null) sm.checkPermission(SET_POLICY);
handlerData.set(data);
}
public static void registerHandler(String key, PolicyContextHandler handler, boolean replace) throws PolicyContextException {
if (key == null) throw new IllegalArgumentException("Key must not be null");
if (handler == null) throw new IllegalArgumentException("Handler must not be null");
if (!handler.supports(key)) throw new IllegalArgumentException("Registered handler does not support the key '" + key + "'");
SecurityManager sm = System.getSecurityManager();
if (sm != null) sm.checkPermission(SET_POLICY);
synchronized (PolicyContext.class) {
if (!replace && handlers.containsKey(key))
throw new IllegalArgumentException("A handler has already been registered under '" + key + "' and replace is false.");
Map<String, PolicyContextHandler> newHandlers = new HashMap<String, PolicyContextHandler>(handlers);
newHandlers.put(key, handler);
handlers = newHandlers;
}
}
public static Set getHandlerKeys() {
return handlers.keySet();
}
public static Object getContext(String key) throws PolicyContextException {
if (key == null) throw new IllegalArgumentException("Key must not be null");
PolicyContextHandler handler = handlers.get(key);
if (handler == null) throw new IllegalArgumentException("No handler can be found for the key '" + key + "'");
if (!handler.supports(key)) throw new IllegalArgumentException("Registered handler no longer supports the key '" + key + "'");
SecurityManager sm = System.getSecurityManager();
if (sm != null) sm.checkPermission(SET_POLICY);
return handler.getContext(key, handlerData.get());
}
}