diff options
author | Andrew Niefer | 2010-02-19 19:51:04 +0000 |
---|---|---|
committer | Andrew Niefer | 2010-02-19 19:51:04 +0000 |
commit | 614ee403e4fb28af460eaf223fe750d04305a162 (patch) | |
tree | 6cfa8a70c9489a645091d1bea2163c246fa4a506 | |
parent | 5fd69a563655c7ec74be5695faee349412fc2337 (diff) | |
download | rt.equinox.p2-614ee403e4fb28af460eaf223fe750d04305a162.tar.gz rt.equinox.p2-614ee403e4fb28af460eaf223fe750d04305a162.tar.xz rt.equinox.p2-614ee403e4fb28af460eaf223fe750d04305a162.zip |
bug 302201 - fix broken query
2 files changed, 52 insertions, 5 deletions
diff --git a/bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/SiteXMLAction.java b/bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/SiteXMLAction.java index ebd5b07c3..f4c92e837 100644 --- a/bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/SiteXMLAction.java +++ b/bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/SiteXMLAction.java @@ -23,7 +23,8 @@ import org.eclipse.equinox.internal.provisional.p2.metadata.MetadataFactory; import org.eclipse.equinox.internal.provisional.p2.metadata.MetadataFactory.InstallableUnitDescription; import org.eclipse.equinox.p2.core.ProvisionException; import org.eclipse.equinox.p2.metadata.*; -import org.eclipse.equinox.p2.metadata.expression.*; +import org.eclipse.equinox.p2.metadata.expression.ExpressionUtil; +import org.eclipse.equinox.p2.metadata.expression.IExpression; import org.eclipse.equinox.p2.metadata.query.ExpressionQuery; import org.eclipse.equinox.p2.metadata.query.InstallableUnitQuery; import org.eclipse.equinox.p2.publisher.*; @@ -144,9 +145,8 @@ public class SiteXMLAction extends AbstractPublisherAction { qualifier = null; } if (qualifier != null && qualifier.endsWith(QUALIFIER)) { - String v = versionString.substring(0, versionString.indexOf(QUALIFIER)); - String qualifierVersion = v.endsWith(".") ? v.substring(0, v.length() - 1) : v; //$NON-NLS-1$ - IQuery<IInstallableUnit> qualifierQuery = new ExpressionQuery<IInstallableUnit>(IInstallableUnit.class, qualifierMatchExpr, id, SimplePattern.compile(qualifierVersion + '*')); + VersionRange range = createVersionRange(version.toString()); + IQuery<IInstallableUnit> qualifierQuery = new ExpressionQuery<IInstallableUnit>(IInstallableUnit.class, qualifierMatchExpr, id, range); query = new LatestIUVersionQuery<IInstallableUnit>(qualifierQuery); } else { query = new LimitQuery<IInstallableUnit>(new InstallableUnitQuery(id, version), 1); @@ -164,6 +164,33 @@ public class SiteXMLAction extends AbstractPublisherAction { return null; } + protected VersionRange createVersionRange(String versionId) { + VersionRange range = null; + if (versionId == null || "0.0.0".equals(versionId)) //$NON-NLS-1$ + range = VersionRange.emptyRange; + else { + int qualifierIdx = versionId.indexOf(QUALIFIER); + if (qualifierIdx != -1) { + String newVersion = versionId.substring(0, qualifierIdx); + if (newVersion.endsWith(".")) //$NON-NLS-1$ + newVersion = newVersion.substring(0, newVersion.length() - 1); + + Version lower = Version.parseVersion(newVersion); + Version upper = null; + String newQualifier = VersionSuffixGenerator.incrementQualifier(Version.toOSGiVersion(lower).getQualifier()); + org.osgi.framework.Version osgiVersion = Version.toOSGiVersion(lower); + if (newQualifier == null) + upper = Version.createOSGi(osgiVersion.getMajor(), osgiVersion.getMinor(), osgiVersion.getMicro() + 1); + else + upper = Version.createOSGi(osgiVersion.getMajor(), osgiVersion.getMinor(), osgiVersion.getMicro(), newQualifier); + range = new VersionRange(lower, true, upper, false); + } else { + range = new VersionRange(Version.parseVersion(versionId), true, Version.parseVersion(versionId), true); + } + } + return range; + } + /** * Computes the mapping of features to categories as defined in the site.xml, * if available. Returns an empty map if there is not site.xml, or no categories. diff --git a/bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/VersionSuffixGenerator.java b/bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/VersionSuffixGenerator.java index 0cdf73061..d2f7cbd79 100644 --- a/bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/VersionSuffixGenerator.java +++ b/bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/VersionSuffixGenerator.java @@ -25,7 +25,27 @@ public class VersionSuffixGenerator { private static final int QUALIFIER_SUFFIX_VERSION = 1; // The 64 characters that are legal in a version qualifier, in lexicographical order. - private static final String BASE_64_ENCODING = "-0123456789_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; //$NON-NLS-1$ + public static final String BASE_64_ENCODING = "-0123456789_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; //$NON-NLS-1$ + + public static String incrementQualifier(String qualifier) { + int idx = qualifier.length() - 1; + + for (; idx >= 0; idx--) { + //finding last non-'z' character + if (qualifier.charAt(idx) != 'z') + break; + } + + if (idx >= 0) { + // charAt(idx) is < 'z', so don't need to check bounds + int c = BASE_64_ENCODING.indexOf(qualifier.charAt(idx)) + 1; + String newQualifier = qualifier.substring(0, idx); + newQualifier += BASE_64_ENCODING.charAt(c); + return newQualifier; + } + + return null; + } private static void appendEncodedCharacter(StringBuffer buffer, int c) { while (c > 62) { |