diff options
author | DJ Houghton | 2010-04-14 20:25:09 +0000 |
---|---|---|
committer | DJ Houghton | 2010-04-14 20:25:09 +0000 |
commit | 32a59f54057065f84bd0b4547d71b9977610bca4 (patch) | |
tree | 2cb191299e9238dc5795e1d1c3372959d67cf7b2 /bundles | |
parent | 88e18b045924b05c2ac9a55042482ab5ab025702 (diff) | |
download | rt.equinox.p2-32a59f54057065f84bd0b4547d71b9977610bca4.tar.gz rt.equinox.p2-32a59f54057065f84bd0b4547d71b9977610bca4.tar.xz rt.equinox.p2-32a59f54057065f84bd0b4547d71b9977610bca4.zip |
Bug 306439 - Verify that all metadata fields are properly persisted
Diffstat (limited to 'bundles')
7 files changed, 147 insertions, 49 deletions
diff --git a/bundles/org.eclipse.equinox.p2.metadata.repository/src/org/eclipse/equinox/internal/p2/metadata/repository/io/MetadataParser.java b/bundles/org.eclipse.equinox.p2.metadata.repository/src/org/eclipse/equinox/internal/p2/metadata/repository/io/MetadataParser.java index 964111e2a..050e09152 100644 --- a/bundles/org.eclipse.equinox.p2.metadata.repository/src/org/eclipse/equinox/internal/p2/metadata/repository/io/MetadataParser.java +++ b/bundles/org.eclipse.equinox.p2.metadata.repository/src/org/eclipse/equinox/internal/p2/metadata/repository/io/MetadataParser.java @@ -580,6 +580,7 @@ public abstract class MetadataParser extends XMLParser implements XMLConstants { private boolean greedy; private TextHandler filterHandler = null; + private TextHandler descriptionHandler = null; public RequirementHandler(AbstractHandler parentHandler, Attributes attributes, List<IRequirement> capabilities) { super(parentHandler, REQUIREMENT_ELEMENT); @@ -608,43 +609,47 @@ public abstract class MetadataParser extends XMLParser implements XMLConstants { 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<IInstallableUnit> 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<IInstallableUnit> 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<IInstallableUnit> 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<IInstallableUnit> 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 @@ public abstract class MetadataParser extends XMLParser implements XMLConstants { 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() { diff --git a/bundles/org.eclipse.equinox.p2.metadata.repository/src/org/eclipse/equinox/internal/p2/metadata/repository/io/MetadataWriter.java b/bundles/org.eclipse.equinox.p2.metadata.repository/src/org/eclipse/equinox/internal/p2/metadata/repository/io/MetadataWriter.java index 7decd767c..36492a9db 100644 --- a/bundles/org.eclipse.equinox.p2.metadata.repository/src/org/eclipse/equinox/internal/p2/metadata/repository/io/MetadataWriter.java +++ b/bundles/org.eclipse.equinox.p2.metadata.repository/src/org/eclipse/equinox/internal/p2/metadata/repository/io/MetadataWriter.java @@ -246,7 +246,9 @@ public abstract class MetadataWriter extends XMLWriter implements XMLConstants { } 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); } diff --git a/bundles/org.eclipse.equinox.p2.metadata.repository/src/org/eclipse/equinox/internal/p2/metadata/repository/io/XMLConstants.java b/bundles/org.eclipse.equinox.p2.metadata.repository/src/org/eclipse/equinox/internal/p2/metadata/repository/io/XMLConstants.java index 84c795937..014f1b831 100644 --- a/bundles/org.eclipse.equinox.p2.metadata.repository/src/org/eclipse/equinox/internal/p2/metadata/repository/io/XMLConstants.java +++ b/bundles/org.eclipse.equinox.p2.metadata.repository/src/org/eclipse/equinox/internal/p2/metadata/repository/io/XMLConstants.java @@ -65,6 +65,7 @@ public interface XMLConstants extends org.eclipse.equinox.internal.p2.persistenc // 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$ diff --git a/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/internal/p2/metadata/RequiredCapability.java b/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/internal/p2/metadata/RequiredCapability.java index 75aa4eb0f..3d11321fe 100644 --- a/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/internal/p2/metadata/RequiredCapability.java +++ b/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/internal/p2/metadata/RequiredCapability.java @@ -87,19 +87,20 @@ public class RequiredCapability implements IRequiredCapability, IMemberProvider this(namespace, name, range, filter, optional, multiple, true); } - public RequiredCapability(IMatchExpression<IInstallableUnit> requirement, IMatchExpression<IInstallableUnit> filter, int min, int max, boolean greedy) { + public RequiredCapability(IMatchExpression<IInstallableUnit> requirement, IMatchExpression<IInstallableUnit> 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<IInstallableUnit>) null : InstallableUnit.parseFilter(filter), optional ? 0 : 1, multiple ? Integer.MAX_VALUE : 1, greedy); + this(namespace, name, range, filter == null ? (IMatchExpression<IInstallableUnit>) null : InstallableUnit.parseFilter(filter), optional ? 0 : 1, multiple ? Integer.MAX_VALUE : 1, greedy, null); } - public RequiredCapability(String namespace, String name, VersionRange range, IMatchExpression<IInstallableUnit> filter, int min, int max, boolean greedy) { + public RequiredCapability(String namespace, String name, VersionRange range, IMatchExpression<IInstallableUnit> filter, int min, int max, boolean greedy, String description) { Assert.isNotNull(namespace); Assert.isNotNull(name); IExpressionFactory factory = ExpressionUtil.getFactory(); @@ -125,6 +126,7 @@ public class RequiredCapability implements IRequiredCapability, IMemberProvider this.max = max; this.greedy = greedy; this.filter = filter; + this.description = description; } public boolean equals(Object obj) { diff --git a/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/p2/metadata/MetadataFactory.java b/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/p2/metadata/MetadataFactory.java index 3a3c768a9..c4200bce3 100644 --- a/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/p2/metadata/MetadataFactory.java +++ b/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/p2/metadata/MetadataFactory.java @@ -21,13 +21,15 @@ import org.eclipse.equinox.p2.metadata.expression.*; /** * A factory class for instantiating various p2 metadata objects. + * @noextend + * @noimplement * @since 2.0 */ public final class MetadataFactory { /** * A description containing information about an installable unit. Once created, * installable units are immutable. This description class allows a client to build - * up the state for an installable unit incrementally, and then finally product + * up the state for an installable unit incrementally, and then finally produce * the resulting immutable unit. */ public static class InstallableUnitDescription { @@ -329,26 +331,98 @@ public final class MetadataFactory { * current environment, or <code>null</code> to indicate this capability is always applicable * @param optional <code>true</code> if this required capability is optional, * and <code>false</code> otherwise. - * @param multiple <code>true</code> if this capability can be satisfied by multiple provided capabilities, or it requires exactly one match + * @param multiple <code>true</code> if this capability can be satisfied by multiple provided capabilities, + * or <code>false</code> if it requires exactly one match + * @return the requirement */ public static IRequirement createRequirement(String namespace, String name, VersionRange range, IMatchExpression<IInstallableUnit> 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); } + /** + * Create and return a new requirement ({@link IRequirement}) with the specified values. + * + * @param namespace the namespace for the requirement. Must not be <code>null</code>. + * @param name the name for the requirement. Must not be <code>null</code>. + * @param range the version range. A value of <code>null</code> is equivalent to {@link VersionRange#emptyRange} and matches all versions. + * @param filter The filter used to evaluate whether this capability is applicable in the + * current environment, or <code>null</code> to indicate this capability is always applicable + * @param minCard minimum cardinality + * @param maxCard maximum cardinality + * @param greedy <code>true</code> if the requirement should be considered greedy and <code>false</code> otherwise + * @return the requirement + */ public static IRequirement createRequirement(String namespace, String name, VersionRange range, IMatchExpression<IInstallableUnit> 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); } + /** + * Create and return a new requirement ({@link IRequirement}) with the specified values. + * + * @param requirement the match expression + * @param filter The filter used to evaluate whether this capability is applicable in the + * current environment, or <code>null</code> to indicate this capability is always applicable + * @param minCard minimum cardinality + * @param maxCard maximum cardinality + * @param greedy <code>true</code> if the requirement should be considered greedy and <code>false</code> otherwise + * @return the requirement + */ public static IRequirement createRequirement(IMatchExpression<IInstallableUnit> requirement, IMatchExpression<IInstallableUnit> filter, int minCard, int maxCard, boolean greedy) { - return new RequiredCapability(requirement, filter, minCard, maxCard, greedy); - + return new RequiredCapability(requirement, filter, minCard, maxCard, greedy, null); } + /** + * Create and return a new requirement ({@link IRequirement}) with the specified values. + * + * @param namespace the namespace for the requirement. Must not be <code>null</code>. + * @param name the name for the requirement. Must not be <code>null</code>. + * @param range the version range. A value of <code>null</code> is equivalent to {@link VersionRange#emptyRange} and matches all versions. + * @param filter The filter used to evaluate whether this capability is applicable in the + * current environment, or <code>null</code> to indicate this capability is always applicable + * @param optional <code>true</code> if this requirement is optional, and <code>false</code> otherwise. + * @param multiple <code>true</code> if this requirement can be satisfied by multiple provided capabilities, or <code>false</code> + * if it requires exactly one match + * @param greedy <code>true</code> if the requirement should be considered greedy and <code>false</code> otherwise + * @return the requirement + */ 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); } /** + * Create and return a new requirement ({@link IRequirement}) with the specified values. + * + * @param namespace the namespace for the requirement. Must not be <code>null</code>. + * @param name the name for the requirement. Must not be <code>null</code>. + * @param range the version range. A value of <code>null</code> is equivalent to {@link VersionRange#emptyRange} and matches all versions. + * @param filter The filter used to evaluate whether this capability is applicable in the + * current environment, or <code>null</code> to indicate this capability is always applicable + * @param minCard minimum cardinality + * @param maxCard maximum cardinality + * @param greedy <code>true</code> if the requirement should be considered greedy and <code>false</code> otherwise + * @param description a <code>String</code> description of the requirement, or <code>null</code> + * @return the requirement + */ + public static IRequirement createRequirement(String namespace, String name, VersionRange range, IMatchExpression<IInstallableUnit> filter, int minCard, int maxCard, boolean greedy, String description) { + return new RequiredCapability(namespace, name, range, filter, minCard, maxCard, greedy, description); + } + + /** + * Create and return a new requirement ({@link IRequirement}) with the specified values. + * + * @param requirement the match expression + * @param filter the filter, or <code>null</code> + * @param minCard minimum cardinality + * @param maxCard maximum cardinality + * @param greedy <code>true</code> if the requirement should be considered greedy and <code>false</code> otherwise + * @param description a <code>String</code> description of the requirement, or <code>null</code> + * @return the requirement + */ + public static IRequirement createRequirement(IMatchExpression<IInstallableUnit> requirement, IMatchExpression<IInstallableUnit> 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 * @param newValue The result of the requirement change - the requirement to replace the source requirement with @@ -496,13 +570,27 @@ public final class MetadataFactory { } public static IUpdateDescriptor createUpdateDescriptor(Collection<IMatchExpression<IInstallableUnit>> 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); + } + + /** + * Create and return a new update descriptor {@link IUpdateDescriptor} with the specified values. + * + * @param id the identifiter for the update. Must not be <code>null</code>. + * @param range the version range. A <code>null</code> range is equivalent to {@link VersionRange#emptyRange} and matches all versions. + * @param severity the severity + * @param description a <code>String</code> description or <code>null</code> + * @param location a {@link URI} specifying the location or <code>null</code> + * @return the update descriptor + */ + public static IUpdateDescriptor createUpdateDescriptor(String id, VersionRange range, int severity, String description, URI location) { Collection<IMatchExpression<IInstallableUnit>> descriptors = new ArrayList<IMatchExpression<IInstallableUnit>>(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; diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/planner/Bug306424.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/planner/Bug306424.java index 43878212c..465963111 100644 --- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/planner/Bug306424.java +++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/planner/Bug306424.java @@ -16,7 +16,6 @@ import java.util.ArrayList; import java.util.Collection; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.equinox.internal.p2.engine.SimpleProfileRegistry; -import org.eclipse.equinox.internal.p2.metadata.RequiredCapability; import org.eclipse.equinox.internal.provisional.p2.director.ProfileChangeRequest; import org.eclipse.equinox.p2.engine.*; import org.eclipse.equinox.p2.metadata.*; @@ -79,7 +78,7 @@ public class Bug306424 extends AbstractProvisioningTest { IProfileChangeRequest changeRequest = new ProfileChangeRequest(profile); changeRequest.remove(b); - IRequirement negateB = new RequiredCapability(IInstallableUnit.NAMESPACE_IU_ID, b.getId(), new VersionRange(b.getVersion(), true, b.getVersion(), true), null, 0, 0, false); + IRequirement negateB = MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID, b.getId(), new VersionRange(b.getVersion(), true, b.getVersion(), true), null, 0, 0, false); Collection<IRequirement> extraReqs = new ArrayList<IRequirement>(); extraReqs.add(negateB); changeRequest.addExtraRequirements(extraReqs); diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/planner/NegationTesting.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/planner/NegationTesting.java index dce9c6728..bf6f7ff14 100644 --- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/planner/NegationTesting.java +++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/planner/NegationTesting.java @@ -47,7 +47,7 @@ public class NegationTesting extends AbstractProvisioningTest { 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 @@ public class NegationTesting extends AbstractProvisioningTest { 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 @@ public class NegationTesting extends AbstractProvisioningTest { 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 @@ public class NegationTesting extends AbstractProvisioningTest { 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 @@ public class NegationTesting extends AbstractProvisioningTest { 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); |