context
must not be
* null and duplicates will be removed.
*
* @param context The ProtectionDomains to use
*/
public AccessControlContext(ProtectionDomain[] context)
{
HashSetCode calling this constructor must have a {@link * SecurityPermission} of createAccessControlContext.
* * @throws SecurityException If the caller does not have permission * to create an access control context. * @since 1.3 */ public AccessControlContext(AccessControlContext acc, DomainCombiner combiner) { AccessControlContext acc2 = null; SecurityManager sm = System.getSecurityManager (); if (sm != null) { Permission perm = new SecurityPermission ("createAccessControlContext"); // The default SecurityManager.checkPermission(perm) just calls // AccessController.checkPermission(perm) which in turn just // calls AccessController.getContext().checkPermission(perm). // This means AccessController.getContext() is called twice, // once for the security check and once by us. It's a very // expensive call (on gcj at least) so if we're using the // default security manager we avoid this duplication. if (sm.getClass() == SecurityManager.class) { acc2 = AccessController.getContext (); acc2.checkPermission (perm); } else sm.checkPermission (perm); } if (acc2 == null) acc2 = AccessController.getContext (); protectionDomains = combiner.combine (acc2.protectionDomains, acc.protectionDomains); this.combiner = combiner; } AccessControlContext (ProtectionDomain[] domains, AccessControlContext acc, DomainCombiner combiner) { protectionDomains = combiner.combine (domains, acc.protectionDomains); this.combiner = combiner; } /** * Returns the Domain Combiner associated with the AccessControlContext * * @return the DomainCombiner */ public DomainCombiner getDomainCombiner() { return combiner; } /** * Determines whether or not the specific permission is granted * depending on the context it is within. * * @param perm a permission to check * * @throws AccessControlException if the permssion is not permitted */ public void checkPermission(Permission perm) throws AccessControlException { if (protectionDomains.length == 0) throw new AccessControlException ("permission " + perm + " not granted: no protection domains"); for (int i = 0; i < protectionDomains.length; i++) { final ProtectionDomain domain = protectionDomains[i]; if (!domain.implies(perm)) throw new AccessControlException ("permission " + perm + " not granted: " + domain + " does not imply it."); } } /** * Checks if two AccessControlContexts are equal. * * It first checks if obj is an AccessControlContext class, and * then checks if each ProtectionDomain matches. * * @param obj The object to compare this class to * * @return true if equal, false otherwise */ @Override public boolean equals(Object obj) { if (obj instanceof AccessControlContext) { AccessControlContext acc = (AccessControlContext) obj; if (acc.protectionDomains.length != protectionDomains.length) return false; int i, j; for (i = 0; i < protectionDomains.length; i++) { for (j = 0; j < acc.protectionDomains.length; j++) { if (acc.protectionDomains[j].equals (protectionDomains[i])) break; } if (j == acc.protectionDomains.length) return false; } return true; } return false; } /** * Computes a hash code of this class * * @return a hash code representing this class */ @Override public int hashCode() { int h = 0; for (int i = 0; i < protectionDomains.length; i++) h ^= protectionDomains[i].hashCode(); return h; } ProtectionDomain[] getProtectionDomains () { return protectionDomains; } }