001    /**
002     *  Licensed to the Apache Software Foundation (ASF) under one or more
003     *  contributor license agreements.  See the NOTICE file distributed with
004     *  this work for additional information regarding copyright ownership.
005     *  The ASF licenses this file to You under the Apache License, Version 2.0
006     *  (the "License"); you may not use this file except in compliance with
007     *  the License.  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    package org.apache.geronimo.security.jacc.mappingprovider;
019    
020    import java.util.HashMap;
021    import java.util.Map;
022    import javax.security.jacc.PolicyConfiguration;
023    import javax.security.jacc.PolicyConfigurationFactory;
024    import javax.security.jacc.PolicyContextException;
025    
026    import org.apache.commons.logging.Log;
027    import org.apache.commons.logging.LogFactory;
028    import org.apache.geronimo.security.GeronimoSecurityPermission;
029    
030    
031    /**
032     * @version $Rev: 706640 $ $Date: 2008-10-21 14:44:05 +0000 (Tue, 21 Oct 2008) $
033     */
034    public class GeronimoPolicyConfigurationFactory extends PolicyConfigurationFactory implements PrincipalRoleConfigurationFactory {
035    
036        private static final Log log = LogFactory.getLog(GeronimoPolicyConfigurationFactory.class);
037        private static GeronimoPolicyConfigurationFactory singleton;
038        private Map<String, GeronimoPolicyConfiguration> configurations = new HashMap<String, GeronimoPolicyConfiguration>();
039    
040        public GeronimoPolicyConfigurationFactory() {
041            synchronized (GeronimoPolicyConfigurationFactory.class) {
042                if (singleton != null) {
043                    log.error("Singleton already assigned.  There may be more than one GeronimoPolicyConfigurationFactory being used.");
044                    throw new IllegalStateException("Singleton already assigned");
045                }
046                singleton = this;
047                ApplicationPrincipalRoleConfigurationManager.setPrincipalRoleConfigurationFactory(this);
048            }
049        }
050    
051        public void setPolicyConfiguration(String contextID, GeronimoPolicyConfiguration configuration) {
052            SecurityManager sm = System.getSecurityManager();
053            if (sm != null) sm.checkPermission(new GeronimoSecurityPermission("setPolicyConfiguration"));
054    
055            configurations.put(contextID, configuration);
056    
057            log.trace("Set policy configuration " + contextID);
058        }
059    
060        public GeronimoPolicyConfiguration getGeronimoPolicyConfiguration(String contextID) throws PolicyContextException {
061            GeronimoPolicyConfiguration configuration = configurations.get(contextID);
062    
063            if (configuration == null) {
064                throw new PolicyContextException("No policy configuration registered for contextID: " + contextID);
065            }
066    
067            log.trace("Get policy configuration " + contextID);
068            return configuration;
069        }
070    
071        public PolicyConfiguration getPolicyConfiguration(String contextID, boolean remove) throws PolicyContextException {
072            GeronimoPolicyConfiguration configuration = configurations.get(contextID);
073    
074            if (configuration == null) {
075                configuration = new PolicyConfigurationGeneric(contextID);
076                configurations.put(contextID, configuration);
077            } else {
078                configuration.open(remove);
079            }
080    
081            log.trace("Get " + (remove ? "CLEANED" : "") + " policy configuration " + contextID);
082            return configuration;
083        }
084    
085        public boolean inService(String contextID) throws PolicyContextException {
086            PolicyConfiguration configuration = getPolicyConfiguration(contextID, false);
087    
088            log.trace("Policy configuration " + contextID + " put into service");
089            return configuration.inService();
090        }
091    
092        static GeronimoPolicyConfigurationFactory getSingleton() {
093            return singleton;
094        }
095    
096        public PrincipalRoleConfiguration getPrincipalRoleConfiguration(String contextID) throws PolicyContextException {
097            return getGeronimoPolicyConfiguration(contextID);
098        }
099    }