Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Watson2017-02-03 16:11:57 +0000
committerThomas Watson2017-02-03 21:42:54 +0000
commitfcab3e35945c3d10db5b22838c1230c67afdaee2 (patch)
tree1dc34e838247a4200c7615eb54358343db3697f4 /bundles/org.eclipse.osgi/felix
parentf9777863a046cb6516c5846f2d592ff6aa25fb15 (diff)
downloadrt.equinox.framework-fcab3e35945c3d10db5b22838c1230c67afdaee2.tar.gz
rt.equinox.framework-fcab3e35945c3d10db5b22838c1230c67afdaee2.tar.xz
rt.equinox.framework-fcab3e35945c3d10db5b22838c1230c67afdaee2.zip
Bug 511593 - Issue resolving split packagesI20170205-2000I20170204-2000I20170203-2000
The resolver implementation fix. Change-Id: I71384aec4decc0a7b009c5d48815ade3a8a4c010 Signed-off-by: Thomas Watson <tjwatson@us.ibm.com>
Diffstat (limited to 'bundles/org.eclipse.osgi/felix')
-rw-r--r--bundles/org.eclipse.osgi/felix/src/org/apache/felix/resolver/FelixWiring.java26
-rwxr-xr-xbundles/org.eclipse.osgi/felix/src/org/apache/felix/resolver/ResolverImpl.java95
2 files changed, 115 insertions, 6 deletions
diff --git a/bundles/org.eclipse.osgi/felix/src/org/apache/felix/resolver/FelixWiring.java b/bundles/org.eclipse.osgi/felix/src/org/apache/felix/resolver/FelixWiring.java
new file mode 100644
index 000000000..ce453b029
--- /dev/null
+++ b/bundles/org.eclipse.osgi/felix/src/org/apache/felix/resolver/FelixWiring.java
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */package org.apache.felix.resolver;
+
+import java.util.Collection;
+import org.osgi.resource.Wire;
+
+public interface FelixWiring
+{
+ Collection<Wire> getSubstitutionWires();
+}
diff --git a/bundles/org.eclipse.osgi/felix/src/org/apache/felix/resolver/ResolverImpl.java b/bundles/org.eclipse.osgi/felix/src/org/apache/felix/resolver/ResolverImpl.java
index 13c7ca4f7..897b9698f 100755
--- a/bundles/org.eclipse.osgi/felix/src/org/apache/felix/resolver/ResolverImpl.java
+++ b/bundles/org.eclipse.osgi/felix/src/org/apache/felix/resolver/ResolverImpl.java
@@ -899,7 +899,6 @@ public class ResolverImpl implements Resolver
}
else if (candCap.getNamespace().equals(BundleNamespace.BUNDLE_NAMESPACE))
{
-
// Get the candidate's package space to determine which packages
// will be visible to the current resource.
if (visitedRequiredBundles.add(candCap.getResource()))
@@ -913,6 +912,13 @@ public class ResolverImpl implements Resolver
currentReq,
blame.m_cap);
}
+ // now merge in substitutes
+ for (Blame blame : resourcePkgMap.get(
+ candCap.getResource()).m_substitePkgs.values())
+ {
+ mergeCandidatePackage(packages.m_requiredPkgs, currentReq,
+ blame.m_cap);
+ }
}
// If the candidate requires any other bundles with reexport visibility,
@@ -1143,7 +1149,8 @@ public class ResolverImpl implements Resolver
{
public void run()
{
- calculateExportedPackages(session, allCandidates, resource, packages.m_exportedPkgs);
+ calculateExportedPackages(session, allCandidates, resource,
+ packages.m_exportedPkgs, packages.m_substitePkgs);
}
});
}
@@ -1573,7 +1580,7 @@ public class ResolverImpl implements Resolver
ResolveSession session,
Candidates allCandidates,
Resource resource,
- OpenHashMap<String, Blame> exports)
+ OpenHashMap<String, Blame> exports, OpenHashMap<String, Blame> substitutes)
{
// Get all exported packages.
Wiring wiring = session.getContext().getWirings().get(resource);
@@ -1598,9 +1605,34 @@ public class ResolverImpl implements Resolver
// already excludes imported substitutable exports, but
// for resolving resources we must look in the candidate
// map to determine which exports are substitutable.
- if (!exports.isEmpty())
+ if (wiring != null)
{
- if (wiring == null)
+ Collection<Wire> substitutionWires;
+ if (wiring instanceof FelixWiring)
+ {
+ substitutionWires = ((FelixWiring) wiring).getSubstitutionWires();
+ }
+ else
+ {
+ substitutionWires = getSubstitutionWires(wiring);
+ }
+ for (Wire wire : substitutionWires)
+ {
+ Capability cap = wire.getCapability();
+ if (!cap.getResource().equals(wire.getProvider()))
+ {
+ cap = new WrappedCapability(wire.getProvider(), cap);
+ }
+ substitutes.put(
+ // Using a null on requirement instead of the wire requirement here.
+ // It is unclear if we want to treat the substitution requirement as a permutation req here.
+ (String) cap.getAttributes().get(PackageNamespace.PACKAGE_NAMESPACE),
+ new Blame(cap, null));
+ }
+ }
+ else
+ {
+ if (!exports.isEmpty())
{
for (Requirement req : resource.getRequirements(null))
{
@@ -1610,7 +1642,13 @@ public class ResolverImpl implements Resolver
if (cand != null)
{
String pkgName = (String) cand.getAttributes().get(PackageNamespace.PACKAGE_NAMESPACE);
- exports.remove(pkgName);
+ Blame blame = exports.remove(pkgName);
+ if (blame != null)
+ {
+ // Using a null on requirement instead of the wire requirement here.
+ // It is unclear if we want to treat the substitution requirement as a permutation req here.
+ substitutes.put(pkgName, new Blame(cand, null));
+ }
}
}
}
@@ -1619,6 +1657,49 @@ public class ResolverImpl implements Resolver
return exports;
}
+ private static Collection<Wire> getSubstitutionWires(Wiring wiring)
+ {
+ Set<String> exportNames = new HashSet<String>();
+ for (Capability cap : wiring.getResource().getCapabilities(null))
+ {
+ if (PackageNamespace.PACKAGE_NAMESPACE.equals(cap.getNamespace()))
+ {
+ exportNames.add(
+ (String) cap.getAttributes().get(PackageNamespace.PACKAGE_NAMESPACE));
+ }
+ }
+ // Add fragment exports
+ for (Wire wire : wiring.getProvidedResourceWires(null))
+ {
+ if (HostNamespace.HOST_NAMESPACE.equals(wire.getCapability().getNamespace()))
+ {
+ for (Capability cap : wire.getRequirement().getResource().getCapabilities(
+ null))
+ {
+ if (PackageNamespace.PACKAGE_NAMESPACE.equals(cap.getNamespace()))
+ {
+ exportNames.add((String) cap.getAttributes().get(
+ PackageNamespace.PACKAGE_NAMESPACE));
+ }
+ }
+ }
+ }
+ Collection<Wire> substitutionWires = new ArrayList<Wire>();
+ for (Wire wire : wiring.getRequiredResourceWires(null))
+ {
+ if (PackageNamespace.PACKAGE_NAMESPACE.equals(
+ wire.getCapability().getNamespace()))
+ {
+ if (exportNames.contains(wire.getCapability().getAttributes().get(
+ PackageNamespace.PACKAGE_NAMESPACE)))
+ {
+ substitutionWires.add(wire);
+ }
+ }
+ }
+ return substitutionWires;
+ }
+
private static boolean isCompatible(
Blame currentBlame, Capability candCap,
Map<Resource, Packages> resourcePkgMap)
@@ -2022,6 +2103,7 @@ public class ResolverImpl implements Resolver
public static class Packages
{
public final OpenHashMap<String, Blame> m_exportedPkgs;
+ public final OpenHashMap<String, Blame> m_substitePkgs;
public final OpenHashMap<String, List<Blame>> m_importedPkgs;
public final OpenHashMap<String, List<Blame>> m_requiredPkgs;
public final OpenHashMap<String, ArrayMap<Capability, UsedBlames>> m_usedPkgs;
@@ -2034,6 +2116,7 @@ public class ResolverImpl implements Resolver
int nbReqs = resource.getRequirements(null).size();
m_exportedPkgs = new OpenHashMap<String, Blame>(nbCaps);
+ m_substitePkgs = new OpenHashMap<String, Blame>(nbCaps);
m_importedPkgs = new OpenHashMap<String, List<Blame>>(nbReqs) {
public List<Blame> compute(String s) {
return new ArrayList<Blame>();

Back to the top