Author: peter_firmstone Date: Mon Feb 25 09:37:42 2013 New Revision: 1449626
URL: http://svn.apache.org/r1449626 Log: Ensure AggregatePolicyProvider blocks during modification. Modified: river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/start/AggregatePolicyProvider.java Modified: river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/start/AggregatePolicyProvider.java URL: http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/start/AggregatePolicyProvider.java?rev=1449626&r1=1449625&r2=1449626&view=diff ============================================================================== --- river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/start/AggregatePolicyProvider.java (original) +++ river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/start/AggregatePolicyProvider.java Mon Feb 25 09:37:42 2013 @@ -18,39 +18,40 @@ package com.sun.jini.start; +import au.net.zeus.collection.RC; +import au.net.zeus.collection.Ref; +import au.net.zeus.collection.Referrer; import java.lang.reflect.Method; import java.security.AccessControlContext; import java.security.AccessController; import java.security.AllPermission; import java.security.CodeSource; import java.security.Permission; -import java.security.Permissions; import java.security.PermissionCollection; +import java.security.Permissions; +import java.security.Policy; import java.security.Principal; import java.security.PrivilegedAction; import java.security.PrivilegedExceptionAction; -import java.security.Policy; import java.security.ProtectionDomain; import java.security.Security; import java.security.SecurityPermission; +import java.util.Collection; +import java.util.LinkedList; import java.util.Map; import java.util.WeakHashMap; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantLock; +import java.util.concurrent.locks.ReadWriteLock; +import java.util.concurrent.locks.ReentrantReadWriteLock; import net.jini.security.SecurityContext; -import org.apache.river.api.security.ScalableNestedPolicy; import net.jini.security.policy.DynamicPolicy; import net.jini.security.policy.PolicyInitializationException; import net.jini.security.policy.SecurityContextSource; -import org.apache.river.api.security.PermissionGrant; -import au.net.zeus.collection.RC; -import au.net.zeus.collection.Ref; -import au.net.zeus.collection.Referrer; -import java.util.Collection; -import java.util.LinkedList; import org.apache.river.api.security.AbstractPolicy; +import org.apache.river.api.security.PermissionGrant; +import org.apache.river.api.security.ScalableNestedPolicy; /** * Security policy provider which supports associating security sub-policies @@ -87,9 +88,9 @@ public class AggregatePolicyProvider private static final String defaultMainPolicyClass = "net.jini.security.policy.DynamicPolicyProvider"; - private static final ConcurrentMap<Class,Boolean> trustGetCCL + private static final ConcurrentMap<Class<? extends Thread>,Boolean> trustGetCCL = RC.concurrentMap( - new ConcurrentHashMap<Referrer<Class>,Referrer<Boolean>>(), + new ConcurrentHashMap<Referrer<Class<? extends Thread>>,Referrer<Boolean>>(), Ref.WEAK_IDENTITY, Ref.STRONG, 1000L, 0L); private static final ProtectionDomain myDomain = AccessController.doPrivileged( @@ -107,7 +108,9 @@ public class AggregatePolicyProvider RC.concurrentMap( new ConcurrentHashMap<Referrer<ClassLoader>,Referrer<Policy>>(), Ref.WEAK_IDENTITY, Ref.STRONG, 1000L, 0L); - private final Lock lock = new ReentrantLock(); + private final ReadWriteLock rwl = new ReentrantReadWriteLock(); + private final Lock lock = rwl.writeLock(); + private final Lock readLock = rwl.readLock(); // stop access to subPolicyChildClassLoaderCache while write in progress. private volatile Policy mainPolicy; // write protected by lock /** @@ -241,14 +244,6 @@ public class AggregatePolicyProvider c.add(extractGrantFromPolicy(p,domain)); return c; } - -// public Collection<PermissionGrant> getPermissionGrants(boolean recursive) { -// Policy p = getCurrentSubPolicy(); -// if (p instanceof ScalableNestedPolicy){ -// return ((ScalableNestedPolicy)p).getPermissionGrants(recursive); -// } -// throw new UnsupportedOperationException("sub policy doesn't implement ScalableNestedPolicy"); -// } /** * Changes sub-policy association with given class loader. If @@ -419,8 +414,13 @@ public class AggregatePolicyProvider boolean trust = trustGetContextClassLoader(t); ClassLoader ccl = trust ? getContextClassLoader() : null; if ( ccl == null ) return mainPolicy; - Policy policy = subPolicyChildClassLoaderCache.get(ccl); // just a cache. - if ( policy != null ) return policy; + readLock.lock(); + try { + Policy policy = subPolicyChildClassLoaderCache.get(ccl); // just a cache. + if ( policy != null ) return policy; + } finally { + readLock.unlock(); + } return lookupSubPolicy(ccl); } @@ -467,7 +467,7 @@ public class AggregatePolicyProvider * Thread.getContextClassLoader(), false otherwise. */ private static boolean trustGetContextClassLoader(Thread t) { - Class cl = t.getClass(); + Class<? extends Thread> cl = t.getClass(); if (cl == Thread.class) { return true; }
