Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew Niefer2010-02-19 19:51:04 +0000
committerAndrew Niefer2010-02-19 19:51:04 +0000
commit614ee403e4fb28af460eaf223fe750d04305a162 (patch)
tree6cfa8a70c9489a645091d1bea2163c246fa4a506
parent5fd69a563655c7ec74be5695faee349412fc2337 (diff)
downloadrt.equinox.p2-614ee403e4fb28af460eaf223fe750d04305a162.tar.gz
rt.equinox.p2-614ee403e4fb28af460eaf223fe750d04305a162.tar.xz
rt.equinox.p2-614ee403e4fb28af460eaf223fe750d04305a162.zip
bug 302201 - fix broken query
-rw-r--r--bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/SiteXMLAction.java35
-rw-r--r--bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/VersionSuffixGenerator.java22
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) {

Back to the top