/* * 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.AccessController; import java.security.PrivilegedActionException; import java.security.PrivilegedExceptionAction; import java.security.SecurityPermission; import org.apache.geronimo.osgi.locator.ProviderLocator; /** * Abstract factory and finder class for obtaining the instance of the class * that implements the PolicyConfigurationFactory of a provider. The factory * will be used to instantiate PolicyConfiguration objects that will be used * by the deployment tools of the container to create and manage policy * contexts within the Policy Provider. * * Implementation classes must have a public no argument constructor that may * be used to create an operational instance of the factory implementation class. * @see java.security.Permission * @see PolicyConfiguration * @see PolicyContextException * * @version $Rev$ $Date$ */ public abstract class PolicyConfigurationFactory { private final static String FACTORY_NAME = "javax.security.jacc.PolicyConfigurationFactory.provider"; private static PolicyConfigurationFactory policyConfigurationFactory; /** * This static method uses a system property to find and instantiate (via a * public constructor) a provider specific factory implementation class. * The name of the provider specific factory implementation class is * obtained from the value of the system property,<p> * <code>javax.security.jacc.PolicyConfigurationFactory.provider</code>. * @return the singleton instance of the provider specific * PolicyConfigurationFactory implementation class. * @throws ClassNotFoundException when the class named by the system * property could not be found including because the value of the system * property has not be set. * @throws PolicyContextException if the implementation throws a checked * exception that has not been accounted for by the * getPolicyConfigurationFactory method signature. The exception thrown by * the implementation class will be encapsulated (during construction) in * the thrown PolicyContextException */ public static PolicyConfigurationFactory getPolicyConfigurationFactory() throws ClassNotFoundException, PolicyContextException { SecurityManager sm = System.getSecurityManager(); if (sm != null) sm.checkPermission(new SecurityPermission("setPolicy")); if (policyConfigurationFactory != null) return policyConfigurationFactory; final String[] factoryClassName = { null }; try { policyConfigurationFactory = (PolicyConfigurationFactory)AccessController.doPrivileged(new PrivilegedExceptionAction() { public Object run() throws Exception { factoryClassName[0] = System.getProperty(FACTORY_NAME); if (factoryClassName[0] == null) throw new ClassNotFoundException("Property " + FACTORY_NAME + " not set"); Thread currentThread = Thread.currentThread(); ClassLoader tccl = currentThread.getContextClassLoader(); return ProviderLocator.loadClass(factoryClassName[0], PolicyConfigurationFactory.class, tccl).newInstance(); } }); } catch(PrivilegedActionException pae) { if (pae.getException() instanceof ClassNotFoundException) { throw (ClassNotFoundException)pae.getException(); } else if (pae.getException() instanceof InstantiationException) { throw new ClassNotFoundException(factoryClassName[0] + " could not be instantiated"); } else if (pae.getException() instanceof IllegalAccessException) { throw new ClassNotFoundException("Illegal access to " + factoryClassName); } throw new PolicyContextException(pae.getException()); } return policyConfigurationFactory; } /** * This method is used to obtain an instance of the provider specific class * that implements the PolicyConfiguration interface that corresponds to * the identified policy context within the provider. The methods of the * PolicyConfiguration interface are used to define the policy statements * of the identified policy context.<p> * * If at the time of the call, the identified policy context does not exist * in the provider, then the policy context will be created in the provider * and the Object that implements the context's PolicyConfiguration * Interface will be returned. If the state of the identified context is * "deleted" or "inService" it will be transitioned to the "open" state as * a result of the call. The states in the lifecycle of a policy context * are defined by the PolicyConfiguration interface.<p> * * For a given value of policy context identifier, this method must always * return the same instance of PolicyConfiguration and there must be at * most one actual instance of a PolicyConfiguration with a given policy * context identifier (during a process context). <p> * * To preserve the invariant that there be at most one PolicyConfiguration * object for a given policy context, it may be necessary for this method * to be thread safe. * @param contextID A String identifying the policy context whose * PolicyConfiguration interface is to be returned. The value passed to * this parameter must not be null. * @param remove A boolean value that establishes whether or not the policy * statements of an existing policy context are to be removed before its * PolicyConfiguration object is returned. If the value passed to this * parameter is true, the policy statements of an existing policy context * will be removed. If the value is false, they will not be removed. * @return an Object that implements the PolicyConfiguration Interface * matched to the Policy provider and corresponding to the identified * policy context. * @throws PolicyContextException if the implementation throws a checked * exception that has not been accounted for by the getPolicyConfiguration * method signature. The exception thrown by the implementation class will * be encapsulated (during construction) in the thrown PolicyContextException. */ public abstract javax.security.jacc.PolicyConfiguration getPolicyConfiguration(String contextID, boolean remove) throws PolicyContextException; /** * This method determines if the identified policy context exists with * state "inService" in the Policy provider associated with the factory. * @param contextID A string identifying a policy context * @return true if the identified policy context exists within the provider * and its state is "inService", false otherwise. * @throws PolicyContextException if the implementation throws a checked * exception that has not been accounted for by the inService method * signature. The exception thrown by the implementation class will be * encapsulated (during construction) in the thrown PolicyContextException. */ public abstract boolean inService(String contextID) throws PolicyContextException; }