1 11 12 package org.eclipse.osgi.framework.internal.core; 13 14 import java.security.*; 15 import java.util.*; 16 import org.eclipse.osgi.framework.debug.Debug; 17 import org.osgi.framework.Bundle; 18 19 23 final class BundlePermissions extends BundlePermissionCollection { 24 private static final long serialVersionUID = 3257844389794428984L; 25 26 30 private Hashtable collections = new Hashtable(8); 32 35 private PermissionCollection allPermission; 36 37 38 private PackageAdminImpl packageAdmin; 39 40 44 BundlePermissions(PackageAdminImpl packageAdmin) { 45 super(); 46 47 this.packageAdmin = packageAdmin; 48 } 49 50 56 public void add(Permission permission) { 57 if (isReadOnly()) { 58 throw new SecurityException (); 59 } 60 61 PermissionCollection collection; 62 63 synchronized (collections) { 64 collection = findCollection(permission); 65 66 if (collection == null) { 67 collection = newPermissionCollection(permission); 68 } 69 } 70 71 if (permission instanceof AllPermission) { 72 allPermission = collection; 73 } 74 75 collection.add(permission); 76 } 77 78 85 public Enumeration elements() { 86 return new Enumeration() { 87 Enumeration enumMap = collections.elements(); 88 PermissionCollection c; 89 Enumeration enumC; 90 Permission next = findNextPermission(); 91 92 public boolean hasMoreElements() { 93 return (next != null); 94 } 95 96 public Object nextElement() { 97 if (next == null) { 98 throw new NoSuchElementException(); 99 } else { 100 Object answer = next; 101 next = findNextPermission(); 102 return (answer); 103 } 104 } 105 106 private Permission findNextPermission() { 110 while (c == null && enumMap.hasMoreElements()) { 112 c = (PermissionCollection) enumMap.nextElement(); 113 enumC = c.elements(); 114 if (!enumC.hasMoreElements()) 115 c = null; 116 } 117 if (c == null) { 121 return (null); 123 } else { 124 Permission answer = (Permission) enumC.nextElement(); 125 if (!enumC.hasMoreElements()) 126 c = null; 127 return (answer); 128 } 129 } 130 }; 131 } 132 133 142 private PermissionCollection findCollection(Permission permission) { 143 Class clazz = permission.getClass(); 144 145 PermissionCollection collection = (PermissionCollection) collections.get(clazz); 146 147 if (collection == null) { 148 synchronized (collections) { 149 collection = (PermissionCollection) collections.get(clazz); 150 151 if (collection == null) { 152 collection = resolvePermissions(permission); 153 } 154 } 155 } 156 157 return collection; 158 } 159 160 170 private PermissionCollection resolvePermissions(Permission permission) { 171 UnresolvedPermissionCollection unresolvedCollection = (UnresolvedPermissionCollection) collections.get(UnresolvedPermission.class); 172 173 if (unresolvedCollection != null) { 174 String name = permission.getClass().getName(); 175 176 Vector permissions = unresolvedCollection.getPermissions(name); 177 178 if (permissions != null) { 179 PermissionCollection collection = null; 180 Class clazz; 181 182 clazz = permission.getClass(); 189 if (clazz == null) { 190 return null; 191 } 192 193 Enumeration permsEnum = permissions.elements(); 194 195 while (permsEnum.hasMoreElements()) { 196 Permission resolved = ((UnresolvedPermission) permsEnum.nextElement()).resolve(clazz); 197 198 if (resolved != null) { 199 if (collection == null) { 200 collection = newPermissionCollection(resolved); 201 } 202 203 collection.add(resolved); 204 } 205 } 206 207 return collection; 208 } 209 } 210 211 return null; 212 } 213 214 220 private PermissionCollection newPermissionCollection(Permission permission) { 221 PermissionCollection collection = permission.newPermissionCollection(); 222 223 if (collection == null) { 224 collection = new PermissionsHash(); 225 } 226 227 collections.put(permission.getClass(), collection); 228 229 return collection; 230 } 231 232 243 public boolean implies(Permission perm) { 244 if ((allPermission != null) && allPermission.implies(perm)) { 245 return true; 246 } 247 248 PermissionCollection collection = findCollection(perm); 249 250 if (collection == null) { 251 return false; 252 } 253 254 return collection.implies(perm); 255 } 256 257 263 void unresolvePermissions(AbstractBundle[] refreshedBundles) { 264 synchronized (collections) { 265 int size = collections.size(); 266 267 Class [] clazzes = new Class [size]; 268 Enumeration keysEnum = collections.keys(); 269 270 for (int i = 0; i < size; i++) { 271 clazzes[i] = (Class ) keysEnum.nextElement(); 272 } 273 274 for (int i = 0; i < size; i++) { 275 Class clazz = clazzes[i]; 276 Bundle bundle = packageAdmin.getBundle(clazz); 277 if (bundle == null) 278 continue; 279 for (int j = 0; j < refreshedBundles.length; j++) 280 if (refreshedBundles[j] == bundle) { 281 if (Debug.DEBUG && Debug.DEBUG_SECURITY) { 282 Debug.println(" Unresolving permission class " + clazz.getName()); } 284 collections.remove(clazz); 285 continue; 286 } 287 } 288 } 289 } 290 } 291 | Popular Tags |