You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@ant.apache.org by hi...@apache.org on 2014/12/22 18:37:19 UTC
[3/6] ant-ivy git commit: Make the latest-osgi take also into account
the implementation when resolving requirements
Make the latest-osgi take also into account the implementation when resolving requirements
Project: http://git-wip-us.apache.org/repos/asf/ant-ivy/repo
Commit: http://git-wip-us.apache.org/repos/asf/ant-ivy/commit/ee94e6d8
Tree: http://git-wip-us.apache.org/repos/asf/ant-ivy/tree/ee94e6d8
Diff: http://git-wip-us.apache.org/repos/asf/ant-ivy/diff/ee94e6d8
Branch: refs/heads/master
Commit: ee94e6d82370b6b6086cae2693dc2fe31388fb64
Parents: 10118c9
Author: Nicolas Lalevée <ni...@hibnet.org>
Authored: Sun Dec 21 17:58:49 2014 +0100
Committer: Nicolas Lalevée <ni...@hibnet.org>
Committed: Sun Dec 21 18:08:14 2014 +0100
----------------------------------------------------------------------
.../ivy/osgi/core/OsgiLatestStrategy.java | 53 +++++++++++++++++++-
1 file changed, 52 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ant-ivy/blob/ee94e6d8/src/java/org/apache/ivy/osgi/core/OsgiLatestStrategy.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/ivy/osgi/core/OsgiLatestStrategy.java b/src/java/org/apache/ivy/osgi/core/OsgiLatestStrategy.java
index e160fce..4cdf906 100644
--- a/src/java/org/apache/ivy/osgi/core/OsgiLatestStrategy.java
+++ b/src/java/org/apache/ivy/osgi/core/OsgiLatestStrategy.java
@@ -21,10 +21,14 @@ import java.text.ParseException;
import java.util.Comparator;
import org.apache.ivy.core.IvyContext;
+import org.apache.ivy.core.module.descriptor.DependencyDescriptor;
+import org.apache.ivy.core.module.descriptor.ModuleDescriptor;
import org.apache.ivy.core.module.id.ModuleRevisionId;
+import org.apache.ivy.core.resolve.ResolvedModuleRevision;
import org.apache.ivy.osgi.util.Version;
import org.apache.ivy.plugins.latest.ArtifactInfo;
import org.apache.ivy.plugins.latest.ComparatorLatestStrategy;
+import org.apache.ivy.plugins.resolver.util.MDResolvedResource;
import org.apache.ivy.plugins.version.VersionMatcher;
public class OsgiLatestStrategy extends ComparatorLatestStrategy {
@@ -80,7 +84,54 @@ public class OsgiLatestStrategy extends ComparatorLatestStrategy {
return c >= 0 ? -1 : 1;
}
- return mridComparator.compare(mrid1, mrid2);
+ int res = mridComparator.compare(mrid1, mrid2);
+
+ if (res == 0) {
+ // if same requirements, maybe we can make a difference on the implementation ?
+ ModuleRevisionId implMrid1 = getImplMrid(o1);
+ ModuleRevisionId implMrid2 = getImplMrid(o2);
+ if (implMrid1 != null && implMrid2 != null) {
+ if (implMrid1.getModuleId().equals(implMrid2.getModuleId())) {
+ // same implementation, compare the versions
+ res = mridComparator.compare(implMrid1, implMrid2);
+ } else {
+ // not same bundle
+ // to keep a total order, compare module names even if it means nothing
+ res = implMrid1.getModuleId().compareTo(implMrid2.getModuleId());
+ }
+ }
+
+ }
+
+ return res;
+ }
+
+ /*
+ * In the resolve process, a resolved requirement is represented in a special way. Here we
+ * deconstruct the resolved resource to know which implementation is actually resolved. See
+ * AbstractOSGiResolver.buildResolvedCapabilityMd()
+ */
+ private ModuleRevisionId getImplMrid(ArtifactInfo o) {
+ if (!(o instanceof MDResolvedResource)) {
+ return null;
+ }
+ MDResolvedResource mdrr = (MDResolvedResource) o;
+ ResolvedModuleRevision rmr = mdrr.getResolvedModuleRevision();
+ if (rmr == null) {
+ return null;
+ }
+ ModuleDescriptor md = rmr.getDescriptor();
+ if (md == null) {
+ return null;
+ }
+ if (!md.getModuleRevisionId().getOrganisation().equals(BundleInfo.PACKAGE_TYPE)) {
+ return null;
+ }
+ DependencyDescriptor[] dds = md.getDependencies();
+ if (dds == null || dds.length != 1) {
+ return null;
+ }
+ return dds[0].getDependencyRevisionId();
}
}