1 36 package org.ungoverned.oscar; 37 38 import java.net.MalformedURLException ; 39 import java.net.URL ; 40 import java.security.*; 41 import java.security.cert.Certificate ; 42 import java.util.HashMap ; 43 import java.util.Iterator ; 44 import java.util.Map ; 45 46 import org.osgi.framework.Bundle; 47 import org.osgi.framework.PackagePermission; 48 import org.ungoverned.moduleloader.Module; 49 import org.ungoverned.moduleloader.ModuleEvent; 50 import org.ungoverned.moduleloader.ModuleListener; 51 import org.ungoverned.moduleloader.search.ImportSearchPolicy; 52 import org.ungoverned.moduleloader.search.SelectionPolicy; 53 import org.ungoverned.moduleloader.search.CompatibilityPolicy; 54 55 public class OSGiSelectionPolicy implements SelectionPolicy, ModuleListener 56 { 57 private Oscar m_oscar = null; 58 private Map m_resolvedPackageMap = new HashMap (); 59 private Map m_resolvedModuleMap = new HashMap (); 60 61 public OSGiSelectionPolicy(Oscar oscar) 62 { 63 m_oscar = oscar; 64 } 65 66 83 public synchronized Module select(Module module, Object identifier, 84 Object v, Module[] candidates, CompatibilityPolicy compatPolicy) 85 { 86 String pkgName = (String ) identifier; 87 int[] version = (int[]) v; 88 89 Module selModule = (Module) m_resolvedPackageMap.get(pkgName); 91 92 if (selModule == null) 95 { 96 int[] selVersion = version; 97 Bundle selBundle = null; 98 99 for (int i = 0; i < candidates.length; i++) 105 { 106 long id = BundleInfo.getBundleIdFromModuleId(candidates[i].getId()); 108 if (id < 0) 109 { 110 continue; 112 } 113 114 BundleImpl bundle = (BundleImpl) m_oscar.getBundle(id); 115 116 if (bundle == null) 118 { 119 continue; 120 } 121 122 if ((bundle.getState() != Bundle.RESOLVED) 125 && (bundle.getState() != Bundle.ACTIVE) 126 && (bundle.getState() != Bundle.INSTALLED)) 127 { 128 continue; 129 } 130 131 if ((System.getSecurityManager() != null) && (bundle.getBundleId() != 0)) 135 { 136 URL url = null; 137 try 138 { 139 url = new URL (bundle.getInfo().getLocation()); 140 } 141 catch (MalformedURLException ex) 142 { 143 continue; 146 } 147 try 148 { 149 AccessController.doPrivileged( 150 new CheckExportPrivileged(url, pkgName)); 151 } 152 catch (PrivilegedActionException ex) 153 { 154 continue; 157 } 158 } 159 160 int[] tmpVersion = (int[]) 161 ImportSearchPolicy.getExportVersion(candidates[i], pkgName); 162 163 if ((selModule == null) && 165 (compatPolicy.compare(pkgName, tmpVersion, pkgName, selVersion) >= 0)) 166 { 167 selModule = candidates[i]; 168 selVersion = tmpVersion; 169 selBundle = bundle; 170 } 171 else if (compatPolicy.compare(pkgName, tmpVersion, pkgName, selVersion) > 0) 175 { 176 selModule = candidates[i]; 177 selVersion = tmpVersion; 178 selBundle = bundle; 179 } 180 else if ((compatPolicy.compare(pkgName, tmpVersion, pkgName, selVersion) == 0) 184 && (bundle.getBundleId() < selBundle.getBundleId())) 185 { 186 selModule = candidates[i]; 187 selVersion = tmpVersion; 188 selBundle = bundle; 189 } 190 } 191 192 m_resolvedPackageMap.put(pkgName, selModule); 193 m_resolvedModuleMap.put(selModule, selModule); 194 } 195 else 198 { 199 int[] selVersion = (int[]) 200 ImportSearchPolicy.getExportVersion(selModule, pkgName); 201 Module tmpModule = selModule; 202 selModule = null; 203 if (compatPolicy.isCompatible(pkgName, selVersion, pkgName, version)) 204 { 205 selModule = tmpModule; 206 } 207 } 208 209 return selModule; 210 } 211 212 public void moduleAdded(ModuleEvent event) 213 { 214 } 215 216 public void moduleReset(ModuleEvent event) 217 { 218 moduleRemoved(event); 219 } 220 221 public synchronized void moduleRemoved(ModuleEvent event) 222 { 223 if (m_resolvedModuleMap.get(event.getModule()) != null) 228 { 229 m_resolvedModuleMap.remove(event.getModule()); 231 Iterator iter = m_resolvedPackageMap.entrySet().iterator(); 233 while (iter.hasNext()) 234 { 235 Map.Entry entry = (Map.Entry ) iter.next(); 236 if (entry.getValue() == event.getModule()) 237 { 238 iter.remove(); 239 } 240 } 241 } 242 } 243 244 248 private static class CheckExportPrivileged implements PrivilegedExceptionAction 249 { 250 private URL m_url = null; 251 private String m_pkgName = null; 252 253 public CheckExportPrivileged(URL url, String pkgName) 254 { 255 m_url = url; 256 m_pkgName = pkgName; 257 } 258 259 public Object run() throws Exception  260 { 261 CodeSource cs = new CodeSource(m_url, (Certificate []) null); 266 PermissionCollection pc = Policy.getPolicy().getPermissions(cs); 267 PackagePermission perm = new PackagePermission( 268 m_pkgName, PackagePermission.EXPORT); 269 if (!pc.implies(perm)) 270 { 271 throw new AccessControlException("access denied " + perm); 272 } 273 274 return null; 275 } 276 } 277 }
| Popular Tags
|