diff options
Diffstat (limited to 'bundles/org.eclipse.equinox.p2.metadata.generator')
5 files changed, 84 insertions, 4 deletions
diff --git a/bundles/org.eclipse.equinox.p2.metadata.generator/src/org/eclipse/equinox/internal/p2/metadata/generator/ProductQuery.java b/bundles/org.eclipse.equinox.p2.metadata.generator/src/org/eclipse/equinox/internal/p2/metadata/generator/ProductQuery.java index 049a097de..8486d52b7 100644 --- a/bundles/org.eclipse.equinox.p2.metadata.generator/src/org/eclipse/equinox/internal/p2/metadata/generator/ProductQuery.java +++ b/bundles/org.eclipse.equinox.p2.metadata.generator/src/org/eclipse/equinox/internal/p2/metadata/generator/ProductQuery.java @@ -10,13 +10,16 @@ *******************************************************************************/ package org.eclipse.equinox.internal.p2.metadata.generator; +import java.io.*; import java.util.*; import org.eclipse.equinox.internal.p2.metadata.generator.features.ProductFile; import org.eclipse.equinox.internal.provisional.p2.metadata.IInstallableUnit; import org.eclipse.equinox.internal.provisional.p2.metadata.generator.MetadataGeneratorHelper; import org.eclipse.equinox.internal.provisional.p2.metadata.generator.Generator.GeneratorResult; +import org.eclipse.equinox.internal.provisional.p2.query.Collector; import org.eclipse.equinox.internal.provisional.p2.query.Query; import org.eclipse.osgi.service.resolver.VersionRange; +import org.osgi.framework.Version; public class ProductQuery extends Query { private static final String EQUINOX_LAUNCHER = "org.eclipse.equinox.launcher"; //$NON-NLS-1$ @@ -24,22 +27,80 @@ public class ProductQuery extends Query { private final ProductFile product; private final String flavor; private final Map children = new HashMap(); + private final String versionAdvice; - public ProductQuery(ProductFile product, String flavor, Map configIUs) { + // Collector collects the largest version of each IU + private final Collector collector = new Collector() { + private final HashMap elements = new HashMap(); + + public boolean accept(Object object) { + if (!(object instanceof IInstallableUnit)) + return true; + IInstallableUnit iu = (IInstallableUnit) object; + if (elements.containsKey(iu.getId())) { + IInstallableUnit existing = (IInstallableUnit) elements.get(iu.getId()); + if (existing.getVersion().compareTo(iu.getVersion()) >= 0) + return true; + getList().remove(existing); + } + elements.put(iu.getId(), iu); + return super.accept(object); + } + }; + + public ProductQuery(ProductFile product, String flavor, Map configIUs, String versionAdvice) { this.product = product; this.flavor = flavor; + this.versionAdvice = versionAdvice; initialize(configIUs); } + public Collector getCollector() { + return this.collector; + } + + private Properties loadVersions(String location) { + Properties properties = new Properties(); + if (location == null) + return properties; + File file = new File(location); + if (file.exists()) { + InputStream stream = null; + try { + stream = new BufferedInputStream(new FileInputStream(file)); + properties.load(stream); + } catch (IOException e) { + // nothing + } finally { + if (stream != null) + try { + stream.close(); + } catch (IOException e) { + //nothing + } + } + } + return properties; + } + private void initialize(Map configIUs) { boolean features = product.useFeatures(); + Properties versions = loadVersions(versionAdvice); + List contents = features ? product.getFeatures() : product.getPlugins(); for (Iterator iterator = contents.iterator(); iterator.hasNext();) { String item = (String) iterator.next(); + + VersionRange range = VersionRange.emptyRange; + if (versions.containsKey(item)) { + Version value = new Version(versions.getProperty(item)); + range = new VersionRange(value, true, value, true); + } + if (features) // for features we want the group item = MetadataGeneratorHelper.getTransformedId(item, false, true); - children.put(item, VersionRange.emptyRange); + children.put(item, range); if (configIUs.containsKey(item)) { for (Iterator ius = ((Set) configIUs.get(item)).iterator(); ius.hasNext();) { IInstallableUnit object = (IInstallableUnit) ius.next(); diff --git a/bundles/org.eclipse.equinox.p2.metadata.generator/src/org/eclipse/equinox/internal/provisional/p2/metadata/generator/EclipseInstallGeneratorInfoProvider.java b/bundles/org.eclipse.equinox.p2.metadata.generator/src/org/eclipse/equinox/internal/provisional/p2/metadata/generator/EclipseInstallGeneratorInfoProvider.java index 4c6f25fb8..8429a147b 100644 --- a/bundles/org.eclipse.equinox.p2.metadata.generator/src/org/eclipse/equinox/internal/provisional/p2/metadata/generator/EclipseInstallGeneratorInfoProvider.java +++ b/bundles/org.eclipse.equinox.p2.metadata.generator/src/org/eclipse/equinox/internal/provisional/p2/metadata/generator/EclipseInstallGeneratorInfoProvider.java @@ -90,6 +90,7 @@ public class EclipseInstallGeneratorInfoProvider implements IGeneratorInfo { private String rootVersion; private String productFile = null; private String launcherConfig; + private String versionAdvice; private URL siteLocation; @@ -502,4 +503,12 @@ public class EclipseInstallGeneratorInfoProvider implements IGeneratorInfo { } return false; } + + public String getVersionAdvice() { + return versionAdvice; + } + + public void setVersionAdvice(String advice) { + this.versionAdvice = advice; + } } diff --git a/bundles/org.eclipse.equinox.p2.metadata.generator/src/org/eclipse/equinox/internal/provisional/p2/metadata/generator/Generator.java b/bundles/org.eclipse.equinox.p2.metadata.generator/src/org/eclipse/equinox/internal/provisional/p2/metadata/generator/Generator.java index baabc85c4..5ba052e20 100644 --- a/bundles/org.eclipse.equinox.p2.metadata.generator/src/org/eclipse/equinox/internal/provisional/p2/metadata/generator/Generator.java +++ b/bundles/org.eclipse.equinox.p2.metadata.generator/src/org/eclipse/equinox/internal/provisional/p2/metadata/generator/Generator.java @@ -143,8 +143,8 @@ public class Generator { GeneratorResult productContents = new GeneratorResult(); - ProductQuery query = new ProductQuery(productFile, info.getFlavor(), result.configurationIUs); - Collector collector = info.getMetadataRepository().query(query, new Collector(), null); + ProductQuery query = new ProductQuery(productFile, info.getFlavor(), result.configurationIUs, info.getVersionAdvice()); + Collector collector = info.getMetadataRepository().query(query, query.getCollector(), null); for (Iterator iterator = collector.iterator(); iterator.hasNext();) { productContents.rootIUs.add(iterator.next()); } diff --git a/bundles/org.eclipse.equinox.p2.metadata.generator/src/org/eclipse/equinox/internal/provisional/p2/metadata/generator/IGeneratorInfo.java b/bundles/org.eclipse.equinox.p2.metadata.generator/src/org/eclipse/equinox/internal/provisional/p2/metadata/generator/IGeneratorInfo.java index a013391df..0a4f2acd6 100644 --- a/bundles/org.eclipse.equinox.p2.metadata.generator/src/org/eclipse/equinox/internal/provisional/p2/metadata/generator/IGeneratorInfo.java +++ b/bundles/org.eclipse.equinox.p2.metadata.generator/src/org/eclipse/equinox/internal/provisional/p2/metadata/generator/IGeneratorInfo.java @@ -88,6 +88,8 @@ public interface IGeneratorInfo { public String getProductFile(); + public String getVersionAdvice(); + /** * Returns the location of the site.xml file, or <code>null</code> if not * generating for an update site. @@ -115,6 +117,8 @@ public interface IGeneratorInfo { public void setRootId(String value); + public void setVersionAdvice(String advice); + // TODO: This is kind of ugly. It's purpose is to allow us to craft CUs that we know about and need for our build // We should try to replace this with something more generic prior to release public Collection getOtherIUs(); diff --git a/bundles/org.eclipse.equinox.p2.metadata.generator/src_ant/org/eclipse/equinox/internal/p2/metadata/generator/ant/GeneratorTask.java b/bundles/org.eclipse.equinox.p2.metadata.generator/src_ant/org/eclipse/equinox/internal/p2/metadata/generator/ant/GeneratorTask.java index c4a9e048a..663735cf5 100644 --- a/bundles/org.eclipse.equinox.p2.metadata.generator/src_ant/org/eclipse/equinox/internal/p2/metadata/generator/ant/GeneratorTask.java +++ b/bundles/org.eclipse.equinox.p2.metadata.generator/src_ant/org/eclipse/equinox/internal/p2/metadata/generator/ant/GeneratorTask.java @@ -179,4 +179,10 @@ public class GeneratorTask extends Task { public void setMode(String mode) { this.mode = mode; } + + public void setVersionAdvice(String advice) { + if (provider == null) + provider = new EclipseInstallGeneratorInfoProvider(); + provider.setVersionAdvice(advice); + } } |