### Eclipse Workspace Patch 1.0 #P org.eclipse.equinox.p2.metadata Index: src/org/eclipse/equinox/internal/p2/metadata/RequiredCapability.java =================================================================== RCS file: /cvsroot/rt/org.eclipse.equinox/p2/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/internal/p2/metadata/RequiredCapability.java,v retrieving revision 1.15 diff -u -r1.15 RequiredCapability.java --- src/org/eclipse/equinox/internal/p2/metadata/RequiredCapability.java 10 Mar 2010 14:38:50 -0000 1.15 +++ src/org/eclipse/equinox/internal/p2/metadata/RequiredCapability.java 9 Apr 2010 14:16:22 -0000 @@ -87,19 +87,20 @@ this(namespace, name, range, filter, optional, multiple, true); } - public RequiredCapability(IMatchExpression requirement, IMatchExpression filter, int min, int max, boolean greedy) { + public RequiredCapability(IMatchExpression requirement, IMatchExpression filter, int min, int max, boolean greedy, String description) { this.matchExpression = requirement; this.filter = filter; this.min = min; this.max = max; this.greedy = greedy; + this.description = description; } public RequiredCapability(String namespace, String name, VersionRange range, String filter, boolean optional, boolean multiple, boolean greedy) { - this(namespace, name, range, filter == null ? (IMatchExpression) null : InstallableUnit.parseFilter(filter), optional ? 0 : 1, multiple ? 1 : Integer.MAX_VALUE, greedy); + this(namespace, name, range, filter == null ? (IMatchExpression) null : InstallableUnit.parseFilter(filter), optional ? 0 : 1, multiple ? 1 : Integer.MAX_VALUE, greedy, null); } - public RequiredCapability(String namespace, String name, VersionRange range, IMatchExpression filter, int min, int max, boolean greedy) { + public RequiredCapability(String namespace, String name, VersionRange range, IMatchExpression filter, int min, int max, boolean greedy, String description) { Assert.isNotNull(namespace); Assert.isNotNull(name); IExpressionFactory factory = ExpressionUtil.getFactory(); @@ -125,6 +126,7 @@ this.max = max; this.greedy = greedy; this.filter = filter; + this.description = description; } public boolean equals(Object obj) { Index: src/org/eclipse/equinox/p2/metadata/MetadataFactory.java =================================================================== RCS file: /cvsroot/rt/org.eclipse.equinox/p2/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/p2/metadata/MetadataFactory.java,v retrieving revision 1.20 diff -u -r1.20 MetadataFactory.java --- src/org/eclipse/equinox/p2/metadata/MetadataFactory.java 6 Apr 2010 01:04:20 -0000 1.20 +++ src/org/eclipse/equinox/p2/metadata/MetadataFactory.java 9 Apr 2010 14:16:23 -0000 @@ -332,22 +332,29 @@ * @param multiple true if this capability can be satisfied by multiple provided capabilities, or it requires exactly one match */ public static IRequirement createRequirement(String namespace, String name, VersionRange range, IMatchExpression filter, boolean optional, boolean multiple) { - return new RequiredCapability(namespace, name, range, filter, optional ? 0 : 1, multiple ? Integer.MAX_VALUE : 1, true); + return new RequiredCapability(namespace, name, range, filter, optional ? 0 : 1, multiple ? Integer.MAX_VALUE : 1, true, null); } public static IRequirement createRequirement(String namespace, String name, VersionRange range, IMatchExpression filter, int minCard, int maxCard, boolean greedy) { - return new RequiredCapability(namespace, name, range, filter, minCard, maxCard, greedy); + return new RequiredCapability(namespace, name, range, filter, minCard, maxCard, greedy, null); } public static IRequirement createRequirement(IMatchExpression requirement, IMatchExpression filter, int minCard, int maxCard, boolean greedy) { - return new RequiredCapability(requirement, filter, minCard, maxCard, greedy); - + return new RequiredCapability(requirement, filter, minCard, maxCard, greedy, null); } public static IRequirement createRequirement(String namespace, String name, VersionRange range, String filter, boolean optional, boolean multiple, boolean greedy) { return new RequiredCapability(namespace, name, range, filter, optional, multiple, greedy); } + public static IRequirement createRequirement(String namespace, String name, VersionRange range, IMatchExpression filter, int minCard, int maxCard, boolean greedy, String description) { + return new RequiredCapability(namespace, name, range, filter, minCard, maxCard, greedy, description); + } + + public static IRequirement createRequirement(IMatchExpression requirement, IMatchExpression filter, int minCard, int maxCard, boolean greedy, String description) { + return new RequiredCapability(requirement, filter, minCard, maxCard, greedy, description); + } + /** * Returns a new requirement change. * @param applyOn The source of the requirement change - the kind of requirement to apply the change to @@ -496,13 +503,17 @@ } public static IUpdateDescriptor createUpdateDescriptor(Collection> descriptors, int severity, String description, URI location) { - return new UpdateDescriptor(descriptors, severity, description, null); + return new UpdateDescriptor(descriptors, severity, description, location); } public static IUpdateDescriptor createUpdateDescriptor(String id, VersionRange range, int severity, String description) { + return createUpdateDescriptor(id, range, severity, description, null); + } + + public static IUpdateDescriptor createUpdateDescriptor(String id, VersionRange range, int severity, String description, URI location) { Collection> descriptors = new ArrayList>(1); descriptors.add(createMatchExpressionFromRange(IInstallableUnit.NAMESPACE_IU_ID, id, range)); - return new UpdateDescriptor(descriptors, severity, description, null); + return createUpdateDescriptor(descriptors, severity, description, location); } private static final IExpression allVersionsExpression; #P org.eclipse.equinox.p2.metadata.repository Index: src/org/eclipse/equinox/internal/p2/metadata/repository/io/MetadataParser.java =================================================================== RCS file: /cvsroot/rt/org.eclipse.equinox/p2/bundles/org.eclipse.equinox.p2.metadata.repository/src/org/eclipse/equinox/internal/p2/metadata/repository/io/MetadataParser.java,v retrieving revision 1.44 diff -u -r1.44 MetadataParser.java --- src/org/eclipse/equinox/internal/p2/metadata/repository/io/MetadataParser.java 6 Apr 2010 01:04:21 -0000 1.44 +++ src/org/eclipse/equinox/internal/p2/metadata/repository/io/MetadataParser.java 9 Apr 2010 14:16:23 -0000 @@ -580,6 +580,7 @@ private boolean greedy; private TextHandler filterHandler = null; + private TextHandler descriptionHandler = null; public RequirementHandler(AbstractHandler parentHandler, Attributes attributes, List capabilities) { super(parentHandler, REQUIREMENT_ELEMENT); @@ -608,43 +609,47 @@ public void startElement(String name, Attributes attributes) { if (name.equals(CAPABILITY_FILTER_ELEMENT)) { filterHandler = new TextHandler(this, CAPABILITY_FILTER_ELEMENT, attributes); + } else if (name.equals(REQUIREMENT_DESCRIPTION_ELEMENT)) { + descriptionHandler = new TextHandler(this, REQUIREMENT_DESCRIPTION_ELEMENT, attributes); } else { invalidElement(name, attributes); } } protected void finished() { - if (isValidXML()) { - IMatchExpression filter = null; - if (filterHandler != null) - try { - filter = InstallableUnit.parseFilter(filterHandler.getText()); - } catch (ExpressionParseException e) { - if (removeWhiteSpace(filterHandler.getText()).equals("(&(|)(|)(|))")) {//$NON-NLS-1$ - // We could log this I guess - } else { - throw e; - } - } - IRequirement requirement; - if (match != null) { - IExpressionFactory factory = ExpressionUtil.getFactory(); - IExpression expr = ExpressionUtil.parse(match); - Object[] params; - if (matchParams == null) - params = new Object[0]; - else { - IExpression[] arrayExpr = ExpressionUtil.getOperands(ExpressionUtil.parse(matchParams)); - params = new Object[arrayExpr.length]; - for (int idx = 0; idx < arrayExpr.length; ++idx) - params[idx] = arrayExpr[idx].evaluate(null); + if (!isValidXML()) + return; + IMatchExpression filter = null; + if (filterHandler != null) { + try { + filter = InstallableUnit.parseFilter(filterHandler.getText()); + } catch (ExpressionParseException e) { + if (removeWhiteSpace(filterHandler.getText()).equals("(&(|)(|)(|))")) {//$NON-NLS-1$ + // We could log this I guess + } else { + throw e; } - IMatchExpression matchExpr = factory.matchExpression(expr, params); - requirement = MetadataFactory.createRequirement(matchExpr, filter, min, max, greedy); - } else - requirement = MetadataFactory.createRequirement(namespace, name, range, filter, min, max, greedy); - capabilities.add(requirement); + } } + String description = descriptionHandler == null ? null : descriptionHandler.getText(); + IRequirement requirement; + if (match != null) { + IExpressionFactory factory = ExpressionUtil.getFactory(); + IExpression expr = ExpressionUtil.parse(match); + Object[] params; + if (matchParams == null) + params = new Object[0]; + else { + IExpression[] arrayExpr = ExpressionUtil.getOperands(ExpressionUtil.parse(matchParams)); + params = new Object[arrayExpr.length]; + for (int idx = 0; idx < arrayExpr.length; ++idx) + params[idx] = arrayExpr[idx].evaluate(null); + } + IMatchExpression matchExpr = factory.matchExpression(expr, params); + requirement = MetadataFactory.createRequirement(matchExpr, filter, min, max, greedy, description); + } else + requirement = MetadataFactory.createRequirement(namespace, name, range, filter, min, max, greedy, description); + capabilities.add(requirement); } private String removeWhiteSpace(String s) { @@ -808,7 +813,8 @@ String[] values = parseAttributes(attributes, required, optional); VersionRange range = checkVersionRange(REQUIREMENT_ELEMENT, VERSION_RANGE_ATTRIBUTE, values[1]); int severity = new Integer(values[2]).intValue(); - descriptor = MetadataFactory.createUpdateDescriptor(values[0], range, severity, values[3]); + URI location = parseURIAttribute(attributes, false); + descriptor = MetadataFactory.createUpdateDescriptor(values[0], range, severity, values[3], location); } public IUpdateDescriptor getUpdateDescriptor() { Index: src/org/eclipse/equinox/internal/p2/metadata/repository/io/MetadataWriter.java =================================================================== RCS file: /cvsroot/rt/org.eclipse.equinox/p2/bundles/org.eclipse.equinox.p2.metadata.repository/src/org/eclipse/equinox/internal/p2/metadata/repository/io/MetadataWriter.java,v retrieving revision 1.30 diff -u -r1.30 MetadataWriter.java --- src/org/eclipse/equinox/internal/p2/metadata/repository/io/MetadataWriter.java 10 Mar 2010 14:39:00 -0000 1.30 +++ src/org/eclipse/equinox/internal/p2/metadata/repository/io/MetadataWriter.java 9 Apr 2010 14:16:23 -0000 @@ -246,7 +246,9 @@ } attribute(CAPABILITY_GREED_ATTRIBUTE, requirement.isGreedy(), true); if (requirement.getFilter() != null) - writeTrimmedCdata(CAPABILITY_FILTER_ELEMENT, requirement.getFilter().getParameters()[0].toString()); + writeTrimmedCdata(CAPABILITY_FILTER_ELEMENT, requirement.getFilter().getParameters()[0].toString()); + if (requirement.getDescription() != null) + writeTrimmedCdata(REQUIREMENT_DESCRIPTION_ELEMENT, requirement.getDescription()); end(REQUIREMENT_ELEMENT); } Index: src/org/eclipse/equinox/internal/p2/metadata/repository/io/XMLConstants.java =================================================================== RCS file: /cvsroot/rt/org.eclipse.equinox/p2/bundles/org.eclipse.equinox.p2.metadata.repository/src/org/eclipse/equinox/internal/p2/metadata/repository/io/XMLConstants.java,v retrieving revision 1.22 diff -u -r1.22 XMLConstants.java --- src/org/eclipse/equinox/internal/p2/metadata/repository/io/XMLConstants.java 10 Mar 2010 09:51:08 -0000 1.22 +++ src/org/eclipse/equinox/internal/p2/metadata/repository/io/XMLConstants.java 9 Apr 2010 14:16:23 -0000 @@ -65,6 +65,7 @@ // Constants for sub-elements of a required capability element public static final String CAPABILITY_FILTER_ELEMENT = "filter"; //$NON-NLS-1$ + public static final String REQUIREMENT_DESCRIPTION_ELEMENT = "description"; //$NON-NLS-1$ // Constants for attributes of a required capability element public static final String CAPABILITY_OPTIONAL_ATTRIBUTE = "optional"; //$NON-NLS-1$ #P org.eclipse.equinox.p2.tests Index: src/org/eclipse/equinox/p2/tests/planner/NegationTesting.java =================================================================== RCS file: /cvsroot/rt/org.eclipse.equinox/p2/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/planner/NegationTesting.java,v retrieving revision 1.11 diff -u -r1.11 NegationTesting.java --- src/org/eclipse/equinox/p2/tests/planner/NegationTesting.java 6 Apr 2010 01:04:10 -0000 1.11 +++ src/org/eclipse/equinox/p2/tests/planner/NegationTesting.java 9 Apr 2010 14:16:23 -0000 @@ -47,7 +47,7 @@ MetadataFactory.InstallableUnitDescription iud1 = new MetadataFactory.InstallableUnitDescription(); iud1.setId("TestNegation4"); iud1.setVersion(Version.create("1.0.0")); - RequiredCapability req1 = new RequiredCapability(NS, N, new VersionRange("[1.1.0, 1.2.0)"), null, 0, 0, false); + RequiredCapability req1 = new RequiredCapability(NS, N, new VersionRange("[1.1.0, 1.2.0)"), null, 0, 0, false, null); RequiredCapability req2 = new RequiredCapability(NS, N, new VersionRange("[1.0.0, 2.0.0)"), null, false, false); Collection requirements = new ArrayList(); requirements.add(req1); @@ -105,7 +105,7 @@ MetadataFactory.InstallableUnitDescription iud1 = new MetadataFactory.InstallableUnitDescription(); iud1.setId("TestNegation4"); iud1.setVersion(Version.create("1.0.0")); - RequiredCapability req1 = new RequiredCapability(NS, N, new VersionRange("[1.1.0, 1.2.0)"), null, 0, 0, false); + RequiredCapability req1 = new RequiredCapability(NS, N, new VersionRange("[1.1.0, 1.2.0)"), null, 0, 0, false, null); RequiredCapability req2 = new RequiredCapability(NS, N, new VersionRange("[1.0.0, 1.1.0)"), null, false, false); Collection requirements = new ArrayList(); requirements.add(req1); @@ -146,7 +146,7 @@ MetadataFactory.InstallableUnitDescription iud1 = new MetadataFactory.InstallableUnitDescription(); iud1.setId("TestNegation4"); iud1.setVersion(Version.create("1.0.0")); - RequiredCapability req1 = new RequiredCapability(NS, N, new VersionRange("[1.1.0, 1.2.0)"), null, 0, 0, false); + RequiredCapability req1 = new RequiredCapability(NS, N, new VersionRange("[1.1.0, 1.2.0)"), null, 0, 0, false, null); RequiredCapability req2 = new RequiredCapability(NS, N, new VersionRange("[1.0.0, 1.1.0)"), null, false, false); Collection requirements = new ArrayList(); requirements.add(req1); @@ -188,7 +188,7 @@ MetadataFactory.InstallableUnitDescription iud1 = new MetadataFactory.InstallableUnitDescription(); iud1.setId("TestNegation4"); iud1.setVersion(Version.create("1.0.0")); - RequiredCapability req1 = new RequiredCapability(NS, N, new VersionRange("[1.1.0, 1.2.0)"), null, 0, 0, false); + RequiredCapability req1 = new RequiredCapability(NS, N, new VersionRange("[1.1.0, 1.2.0)"), null, 0, 0, false, null); RequiredCapability req2 = new RequiredCapability(NS, N, new VersionRange("[1.0.0, 2.0.0)"), null, false, false); Collection requirements = new ArrayList(); requirements.add(req1); @@ -249,7 +249,7 @@ MetadataFactory.InstallableUnitDescription iud1 = new MetadataFactory.InstallableUnitDescription(); iud1.setId("TestNegation4"); iud1.setVersion(Version.create("1.0.0")); - RequiredCapability req1 = new RequiredCapability(NS, N, new VersionRange("[1.1.0, 1.2.0)"), null, 0, 0, false); + RequiredCapability req1 = new RequiredCapability(NS, N, new VersionRange("[1.1.0, 1.2.0)"), null, 0, 0, false, null); RequiredCapability req2 = new RequiredCapability(NS, N, new VersionRange("[1.0.0, 2.0.0)"), null, false, false); Collection requirements = new ArrayList(); requirements.add(req1);