diff options
author | Thomas Watson | 2006-11-17 20:07:35 +0000 |
---|---|---|
committer | Thomas Watson | 2006-11-17 20:07:35 +0000 |
commit | 3b0695ed7b6d4982d00a3c7c10806da900cbc85c (patch) | |
tree | 25474f4255fffbac9f9f362c6f49fd00c224a6cc | |
parent | 668b8fce79343693be9dbfbebf2aaa66418aefb9 (diff) | |
download | rt.equinox.framework-3b0695ed7b6d4982d00a3c7c10806da900cbc85c.tar.gz rt.equinox.framework-3b0695ed7b6d4982d00a3c7c10806da900cbc85c.tar.xz rt.equinox.framework-3b0695ed7b6d4982d00a3c7c10806da900cbc85c.zip |
Bug 156718 Projects can no longer reference ICU4J packages
3 files changed, 51 insertions, 22 deletions
diff --git a/bundles/org.eclipse.osgi/core/framework/org/eclipse/osgi/framework/internal/core/Constants.java b/bundles/org.eclipse.osgi/core/framework/org/eclipse/osgi/framework/internal/core/Constants.java index c78401f26..cf14933a8 100644 --- a/bundles/org.eclipse.osgi/core/framework/org/eclipse/osgi/framework/internal/core/Constants.java +++ b/bundles/org.eclipse.osgi/core/framework/org/eclipse/osgi/framework/internal/core/Constants.java @@ -127,6 +127,7 @@ public class Constants implements org.osgi.framework.Constants { /** OSGi strict delegation **/ public static final String OSGI_RESOLVER_MODE = "osgi.resolverMode"; //$NON-NLS-1$ public static final String STRICT_MODE = "strict"; //$NON-NLS-1$ + public static final String DEVELOPMENT_MODE = "development"; //$NON-NLS-1$ public static final String OSGI_FRAMEWORKBEGINNINGSTARTLEVEL = "osgi.framework.beginningstartlevel"; //$NON-NLS-1$ diff --git a/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/module/ResolverImpl.java b/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/module/ResolverImpl.java index eaf54b7eb..5d83d295d 100644 --- a/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/module/ResolverImpl.java +++ b/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/module/ResolverImpl.java @@ -60,6 +60,7 @@ public class ResolverImpl implements org.eclipse.osgi.service.resolver.Resolver private HashMap bundleMapping = null; private GroupingChecker groupingChecker; private Comparator selectionPolicy; + private boolean developmentMode = false; public ResolverImpl(BundleContext context, boolean checkPermissions) { this.permissionChecker = new PermissionChecker(context, checkPermissions, this); @@ -324,6 +325,7 @@ public class ResolverImpl implements org.eclipse.osgi.service.resolver.Resolver // keep a list of rejected singltons ArrayList rejectedSingletons = new ArrayList(); boolean resolveOptional = platformProperties.length == 0 ? false : "true".equals(platformProperties[0].get("osgi.resolveOptional")); //$NON-NLS-1$//$NON-NLS-2$ + developmentMode = platformProperties.length == 0 ? false : org.eclipse.osgi.framework.internal.core.Constants.DEVELOPMENT_MODE.equals(platformProperties[0].get(org.eclipse.osgi.framework.internal.core.Constants.OSGI_RESOLVER_MODE)); ResolverBundle[] currentlyResolved = null; if (resolveOptional) { BundleDescription[] resolvedBundles = state.getResolvedBundles(); @@ -397,7 +399,9 @@ public class ResolverImpl implements org.eclipse.osgi.service.resolver.Resolver // This will reset the resolvable flag for each bundle for (int i = 0; i < bundles.length; i++) { state.removeResolverErrors(bundles[i].getBundle()); - bundles[i].setResolvable(isResolvable(bundles[i].getBundle(), platformProperties, rejectedSingletons)); + // if in development mode then make all bundles resolvable + // we still want to call isResolvable here to populate any possible ResolverErrors for the bundle + bundles[i].setResolvable(isResolvable(bundles[i].getBundle(), platformProperties, rejectedSingletons) || developmentMode); bundles[i].clearRefs(); groupingChecker.removeAllExportConstraints(bundles[i]); } @@ -503,6 +507,8 @@ public class ResolverImpl implements org.eclipse.osgi.service.resolver.Resolver } private boolean selectSingletons(ResolverBundle[] bundles, ArrayList rejectedSingletons) { + if (developmentMode) + return false; // do no want to unresolve singletons in development mode boolean result = false; for (int i = 0; i < bundles.length; i++) { BundleDescription bundleDesc = bundles[i].getBundle(); @@ -575,11 +581,13 @@ public class ResolverImpl implements org.eclipse.osgi.service.resolver.Resolver ResolverImpl.log("** GENERICS " + genericRequires[i].getVersionConstraint().getName() + "[" + genericRequires[i].getBundleDescription() + "] failed to resolve"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ state.addResolverError(genericRequires[i].getVersionConstraint().getBundle(), ResolverError.MISSING_GENERIC_CAPABILITY, genericRequires[i].getVersionConstraint().toString(), genericRequires[i].getVersionConstraint()); if (genericRequires[i].isFromFragment()) { - resolverExports.remove(bundle.detachFragment((ResolverBundle) bundleMapping.get(genericRequires[i].getVersionConstraint().getBundle()), null)); + if (!developmentMode) // only detach fragments when not in devmode + resolverExports.remove(bundle.detachFragment((ResolverBundle) bundleMapping.get(genericRequires[i].getVersionConstraint().getBundle()), null)); continue; } failed = true; - break; + if (!developmentMode) + break; } } } @@ -594,11 +602,13 @@ public class ResolverImpl implements org.eclipse.osgi.service.resolver.Resolver state.addResolverError(requires[i].getVersionConstraint().getBundle(), ResolverError.MISSING_REQUIRE_BUNDLE, requires[i].getVersionConstraint().toString(), requires[i].getVersionConstraint()); // If the require has failed to resolve and it is from a fragment, then remove the fragment from the host if (requires[i].isFromFragment()) { - resolverExports.remove(bundle.detachFragment((ResolverBundle) bundleMapping.get(requires[i].getVersionConstraint().getBundle()), requires[i])); + if (!developmentMode) // only detach fragments when not in devmode + resolverExports.remove(bundle.detachFragment((ResolverBundle) bundleMapping.get(requires[i].getVersionConstraint().getBundle()), requires[i])); continue; } failed = true; - break; + if (!developmentMode) // in dev mode continue to next constraint + break; } } } @@ -614,18 +624,24 @@ public class ResolverImpl implements org.eclipse.osgi.service.resolver.Resolver // If the import has failed to resolve and it is from a fragment, then remove the fragment from the host state.addResolverError(imports[i].getVersionConstraint().getBundle(), ResolverError.MISSING_IMPORT_PACKAGE, imports[i].getVersionConstraint().toString(), imports[i].getVersionConstraint()); if (imports[i].isFromFragment()) { - resolverExports.remove(bundle.detachFragment((ResolverBundle) bundleMapping.get(imports[i].getBundleDescription()), imports[i])); + if (!developmentMode) // only detach fragments when not in devmode + resolverExports.remove(bundle.detachFragment((ResolverBundle) bundleMapping.get(imports[i].getBundleDescription()), imports[i])); continue; } failed = true; - break; + if (!developmentMode) // in dev mode continue to next constraint + break; } } } + // do some extra checking when in development mode to see if other resolver error occurred + if (developmentMode && !failed && state.getResolverErrors(bundle.getBundle()).length > 0) + failed = true; + // Need to check that all mandatory imports are wired. If they are then // set the bundle RESOLVED, otherwise set it back to UNRESOLVED if (failed) { - setBundleUnresolved(bundle, false); + setBundleUnresolved(bundle, false, developmentMode); if (DEBUG) ResolverImpl.log(bundle + " NOT RESOLVED"); //$NON-NLS-1$ } else if (!cycle.contains(bundle)) { @@ -675,7 +691,8 @@ public class ResolverImpl implements org.eclipse.osgi.service.resolver.Resolver ResolverBundle[] capabilityHosts = capability.isFromFragment() ? capability.getResolverBundle().getHost().getMatchingBundles() : new ResolverBundle[] {capability.getResolverBundle()}; boolean foundResolvedMatch = false; for (int j = 0; capabilityHosts != null && j < capabilityHosts.length; j++) - if (capabilityHosts[j].getState() == ResolverBundle.RESOLVED || resolveBundle(capabilityHosts[j], cycle)) { + // if in dev mode then allow a constraint to resolve to an unresolved bundle + if (capabilityHosts[j].getState() == ResolverBundle.RESOLVED || (resolveBundle(capabilityHosts[j], cycle) || developmentMode)) { foundResolvedMatch |= !capability.isFromFragment() ? true : capability.getResolverBundle().getHost().getMatchingBundles() != null; // Check cyclic dependencies if (capabilityHosts[j].getState() == ResolverBundle.RESOLVING) @@ -726,7 +743,8 @@ public class ResolverImpl implements org.eclipse.osgi.service.resolver.Resolver result = true; // Wired to ourselves continue; } - if ((bundle.getState() != ResolverBundle.RESOLVED && !resolveBundle(bundle, cycle))) { + // if in dev mode then allow a constraint to resolve to an unresolved bundle + if (bundle.getState() != ResolverBundle.RESOLVED && !resolveBundle(bundle, cycle) && !developmentMode) { req.setMatchingBundle(null); continue; // Bundle hasn't resolved } @@ -801,7 +819,8 @@ public class ResolverImpl implements org.eclipse.osgi.service.resolver.Resolver if (importerExps[j].getExportPackageDescription().isRoot()) // do not drop reexports when import wins resolverExports.remove(importerExps[j]); // Import wins, remove export } - if ((originalState != ResolverBundle.RESOLVED && !resolveBundle(export.getExporter(), cycle)) || export.isDropped()) { + // if in dev mode then allow a constraint to resolve to an unresolved bundle + if ((originalState != ResolverBundle.RESOLVED && !resolveBundle(export.getExporter(), cycle) && !developmentMode) || export.isDropped()) { if (imp.getMatchingExport() != null && imp.getMatchingExport() != export) // has been resolved to some other export recursively return true; // add back the exports of this package from the importer @@ -943,7 +962,7 @@ public class ResolverImpl implements org.eclipse.osgi.service.resolver.Resolver } // Move a bundle to UNRESOLVED - private void setBundleUnresolved(ResolverBundle bundle, boolean removed) { + private void setBundleUnresolved(ResolverBundle bundle, boolean removed, boolean isDevMode) { if (bundle.getState() == ResolverBundle.UNRESOLVED) return; if (bundle.getBundle().isResolved()) { @@ -956,7 +975,8 @@ public class ResolverImpl implements org.eclipse.osgi.service.resolver.Resolver } if (!removed) unresolvedBundles.add(bundle); - bundle.detachAllFragments(); + if (!isDevMode) + bundle.detachAllFragments(); bundle.setState(ResolverBundle.UNRESOLVED); } @@ -979,7 +999,7 @@ public class ResolverImpl implements org.eclipse.osgi.service.resolver.Resolver // Resolves the bundles in the State private void stateResolveBundles(ResolverBundle[] resolvedBundles) { for (int i = 0; i < resolvedBundles.length; i++) - if (resolvedBundles[i].isResolved() && !resolvedBundles[i].getBundle().isResolved()) + if (!resolvedBundles[i].getBundle().isResolved()) stateResolveBundle(resolvedBundles[i]); } @@ -1026,6 +1046,9 @@ public class ResolverImpl implements org.eclipse.osgi.service.resolver.Resolver } private void stateResolveBundle(ResolverBundle rb) { + // if in dev mode then we want to tell the state about the constraints we were able to resolve + if (!rb.isResolved() && !developmentMode) + return; // Gather selected exports ResolverExport[] exports = rb.getSelectedExports(); ArrayList selectedExports = new ArrayList(exports.length); @@ -1072,7 +1095,7 @@ public class ResolverImpl implements org.eclipse.osgi.service.resolver.Resolver } // Resolve the bundle in the state - state.resolveBundle(rb.getBundle(), true, hostBundles, selectedExportsArray, bundlesWiredToArray, exportsWiredToArray); + state.resolveBundle(rb.getBundle(), rb.isResolved(), hostBundles, selectedExportsArray, bundlesWiredToArray, exportsWiredToArray); } // Resolve dynamic import @@ -1196,11 +1219,12 @@ public class ResolverImpl implements org.eclipse.osgi.service.resolver.Resolver removed = true; } - if (!bundle.getBundle().isResolved()) + if (!bundle.getBundle().isResolved() && !developmentMode) return; - // if not removed then add to the list of unresolvedBundles - setBundleUnresolved(bundle, removed); - // Get bundles dependent on 'bundle' and selected exports of 'bundle' + // if not removed then add to the list of unresolvedBundles, + // passing false for devmode because we need all fragments detached + setBundleUnresolved(bundle, removed, false); + // Get bundles dependent on 'bundle' BundleDescription[] dependents = bundle.getBundle().getDependents(); state.resolveBundle(bundle.getBundle(), false, null, null, null, null); // Unresolve dependents of 'bundle' diff --git a/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/StateImpl.java b/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/StateImpl.java index 923f132cc..9e0dcdbf7 100644 --- a/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/StateImpl.java +++ b/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/resolver/StateImpl.java @@ -232,14 +232,18 @@ public abstract class StateImpl implements State { modifiable.setStateBit(BundleDescriptionImpl.RESOLVED, status); if (status) { resolverErrors.remove(modifiable); - resolveConstraints(modifiable, hosts, selectedExports, resolvedRequires, resolvedImports); resolvedBundles.add(modifiable); } else { - // ensures no links are left - unresolveConstraints(modifiable); // remove the bundle from the resolved pool resolvedBundles.remove(modifiable); + modifiable.removeDependencies(); } + // to support develoment mode we will resolveConstraints even if the resolve status == false + // we only do this if the resolved constraints are not null + if (selectedExports == null || resolvedRequires == null || resolvedImports == null) + unresolveConstraints(modifiable); + else + resolveConstraints(modifiable, hosts, selectedExports, resolvedRequires, resolvedImports); } public synchronized void removeBundleComplete(BundleDescription bundle) { |