View | Details | Raw Unified | Return to bug 306439 | Differences between
and this patch

Collapse All | Expand All

(-)src/org/eclipse/equinox/internal/p2/metadata/RequiredCapability.java (-3 / +5 lines)
Lines 87-105 Link Here
87
		this(namespace, name, range, filter, optional, multiple, true);
87
		this(namespace, name, range, filter, optional, multiple, true);
88
	}
88
	}
89
89
90
	public RequiredCapability(IMatchExpression<IInstallableUnit> requirement, IMatchExpression<IInstallableUnit> filter, int min, int max, boolean greedy) {
90
	public RequiredCapability(IMatchExpression<IInstallableUnit> requirement, IMatchExpression<IInstallableUnit> filter, int min, int max, boolean greedy, String description) {
91
		this.matchExpression = requirement;
91
		this.matchExpression = requirement;
92
		this.filter = filter;
92
		this.filter = filter;
93
		this.min = min;
93
		this.min = min;
94
		this.max = max;
94
		this.max = max;
95
		this.greedy = greedy;
95
		this.greedy = greedy;
96
		this.description = description;
96
	}
97
	}
97
98
98
	public RequiredCapability(String namespace, String name, VersionRange range, String filter, boolean optional, boolean multiple, boolean greedy) {
99
	public RequiredCapability(String namespace, String name, VersionRange range, String filter, boolean optional, boolean multiple, boolean greedy) {
99
		this(namespace, name, range, filter == null ? (IMatchExpression<IInstallableUnit>) null : InstallableUnit.parseFilter(filter), optional ? 0 : 1, multiple ? 1 : Integer.MAX_VALUE, greedy);
100
		this(namespace, name, range, filter == null ? (IMatchExpression<IInstallableUnit>) null : InstallableUnit.parseFilter(filter), optional ? 0 : 1, multiple ? 1 : Integer.MAX_VALUE, greedy, null);
100
	}
101
	}
101
102
102
	public RequiredCapability(String namespace, String name, VersionRange range, IMatchExpression<IInstallableUnit> filter, int min, int max, boolean greedy) {
103
	public RequiredCapability(String namespace, String name, VersionRange range, IMatchExpression<IInstallableUnit> filter, int min, int max, boolean greedy, String description) {
103
		Assert.isNotNull(namespace);
104
		Assert.isNotNull(namespace);
104
		Assert.isNotNull(name);
105
		Assert.isNotNull(name);
105
		IExpressionFactory factory = ExpressionUtil.getFactory();
106
		IExpressionFactory factory = ExpressionUtil.getFactory();
Lines 125-130 Link Here
125
		this.max = max;
126
		this.max = max;
126
		this.greedy = greedy;
127
		this.greedy = greedy;
127
		this.filter = filter;
128
		this.filter = filter;
129
		this.description = description;
128
	}
130
	}
129
131
130
	public boolean equals(Object obj) {
132
	public boolean equals(Object obj) {
(-)src/org/eclipse/equinox/p2/metadata/MetadataFactory.java (-6 / +17 lines)
Lines 332-353 Link Here
332
	 * @param multiple <code>true</code> if this capability can be satisfied by multiple provided capabilities, or it requires exactly one match
332
	 * @param multiple <code>true</code> if this capability can be satisfied by multiple provided capabilities, or it requires exactly one match
333
	 */
333
	 */
334
	public static IRequirement createRequirement(String namespace, String name, VersionRange range, IMatchExpression<IInstallableUnit> filter, boolean optional, boolean multiple) {
334
	public static IRequirement createRequirement(String namespace, String name, VersionRange range, IMatchExpression<IInstallableUnit> filter, boolean optional, boolean multiple) {
335
		return new RequiredCapability(namespace, name, range, filter, optional ? 0 : 1, multiple ? Integer.MAX_VALUE : 1, true);
335
		return new RequiredCapability(namespace, name, range, filter, optional ? 0 : 1, multiple ? Integer.MAX_VALUE : 1, true, null);
336
	}
336
	}
337
337
338
	public static IRequirement createRequirement(String namespace, String name, VersionRange range, IMatchExpression<IInstallableUnit> filter, int minCard, int maxCard, boolean greedy) {
338
	public static IRequirement createRequirement(String namespace, String name, VersionRange range, IMatchExpression<IInstallableUnit> filter, int minCard, int maxCard, boolean greedy) {
339
		return new RequiredCapability(namespace, name, range, filter, minCard, maxCard, greedy);
339
		return new RequiredCapability(namespace, name, range, filter, minCard, maxCard, greedy, null);
340
	}
340
	}
341
341
342
	public static IRequirement createRequirement(IMatchExpression<IInstallableUnit> requirement, IMatchExpression<IInstallableUnit> filter, int minCard, int maxCard, boolean greedy) {
342
	public static IRequirement createRequirement(IMatchExpression<IInstallableUnit> requirement, IMatchExpression<IInstallableUnit> filter, int minCard, int maxCard, boolean greedy) {
343
		return new RequiredCapability(requirement, filter, minCard, maxCard, greedy);
343
		return new RequiredCapability(requirement, filter, minCard, maxCard, greedy, null);
344
345
	}
344
	}
346
345
347
	public static IRequirement createRequirement(String namespace, String name, VersionRange range, String filter, boolean optional, boolean multiple, boolean greedy) {
346
	public static IRequirement createRequirement(String namespace, String name, VersionRange range, String filter, boolean optional, boolean multiple, boolean greedy) {
348
		return new RequiredCapability(namespace, name, range, filter, optional, multiple, greedy);
347
		return new RequiredCapability(namespace, name, range, filter, optional, multiple, greedy);
349
	}
348
	}
350
349
350
	public static IRequirement createRequirement(String namespace, String name, VersionRange range, IMatchExpression<IInstallableUnit> filter, int minCard, int maxCard, boolean greedy, String description) {
351
		return new RequiredCapability(namespace, name, range, filter, minCard, maxCard, greedy, description);
352
	}
353
354
	public static IRequirement createRequirement(IMatchExpression<IInstallableUnit> requirement, IMatchExpression<IInstallableUnit> filter, int minCard, int maxCard, boolean greedy, String description) {
355
		return new RequiredCapability(requirement, filter, minCard, maxCard, greedy, description);
356
	}
357
351
	/**
358
	/**
352
	 * Returns a new requirement change.
359
	 * Returns a new requirement change.
353
	 * @param applyOn The source of the requirement change - the kind of requirement to apply the change to
360
	 * @param applyOn The source of the requirement change - the kind of requirement to apply the change to
Lines 496-508 Link Here
496
	}
503
	}
497
504
498
	public static IUpdateDescriptor createUpdateDescriptor(Collection<IMatchExpression<IInstallableUnit>> descriptors, int severity, String description, URI location) {
505
	public static IUpdateDescriptor createUpdateDescriptor(Collection<IMatchExpression<IInstallableUnit>> descriptors, int severity, String description, URI location) {
499
		return new UpdateDescriptor(descriptors, severity, description, null);
506
		return new UpdateDescriptor(descriptors, severity, description, location);
500
	}
507
	}
501
508
502
	public static IUpdateDescriptor createUpdateDescriptor(String id, VersionRange range, int severity, String description) {
509
	public static IUpdateDescriptor createUpdateDescriptor(String id, VersionRange range, int severity, String description) {
510
		return createUpdateDescriptor(id, range, severity, description, null);
511
	}
512
513
	public static IUpdateDescriptor createUpdateDescriptor(String id, VersionRange range, int severity, String description, URI location) {
503
		Collection<IMatchExpression<IInstallableUnit>> descriptors = new ArrayList<IMatchExpression<IInstallableUnit>>(1);
514
		Collection<IMatchExpression<IInstallableUnit>> descriptors = new ArrayList<IMatchExpression<IInstallableUnit>>(1);
504
		descriptors.add(createMatchExpressionFromRange(IInstallableUnit.NAMESPACE_IU_ID, id, range));
515
		descriptors.add(createMatchExpressionFromRange(IInstallableUnit.NAMESPACE_IU_ID, id, range));
505
		return new UpdateDescriptor(descriptors, severity, description, null);
516
		return createUpdateDescriptor(descriptors, severity, description, location);
506
	}
517
	}
507
518
508
	private static final IExpression allVersionsExpression;
519
	private static final IExpression allVersionsExpression;
(-)src/org/eclipse/equinox/internal/p2/metadata/repository/io/MetadataParser.java (-30 / +36 lines)
Lines 580-585 Link Here
580
		private boolean greedy;
580
		private boolean greedy;
581
581
582
		private TextHandler filterHandler = null;
582
		private TextHandler filterHandler = null;
583
		private TextHandler descriptionHandler = null;
583
584
584
		public RequirementHandler(AbstractHandler parentHandler, Attributes attributes, List<IRequirement> capabilities) {
585
		public RequirementHandler(AbstractHandler parentHandler, Attributes attributes, List<IRequirement> capabilities) {
585
			super(parentHandler, REQUIREMENT_ELEMENT);
586
			super(parentHandler, REQUIREMENT_ELEMENT);
Lines 608-650 Link Here
608
		public void startElement(String name, Attributes attributes) {
609
		public void startElement(String name, Attributes attributes) {
609
			if (name.equals(CAPABILITY_FILTER_ELEMENT)) {
610
			if (name.equals(CAPABILITY_FILTER_ELEMENT)) {
610
				filterHandler = new TextHandler(this, CAPABILITY_FILTER_ELEMENT, attributes);
611
				filterHandler = new TextHandler(this, CAPABILITY_FILTER_ELEMENT, attributes);
612
			} else if (name.equals(REQUIREMENT_DESCRIPTION_ELEMENT)) {
613
				descriptionHandler = new TextHandler(this, REQUIREMENT_DESCRIPTION_ELEMENT, attributes);
611
			} else {
614
			} else {
612
				invalidElement(name, attributes);
615
				invalidElement(name, attributes);
613
			}
616
			}
614
		}
617
		}
615
618
616
		protected void finished() {
619
		protected void finished() {
617
			if (isValidXML()) {
620
			if (!isValidXML())
618
				IMatchExpression<IInstallableUnit> filter = null;
621
				return;
619
				if (filterHandler != null)
622
			IMatchExpression<IInstallableUnit> filter = null;
620
					try {
623
			if (filterHandler != null) {
621
						filter = InstallableUnit.parseFilter(filterHandler.getText());
624
				try {
622
					} catch (ExpressionParseException e) {
625
					filter = InstallableUnit.parseFilter(filterHandler.getText());
623
						if (removeWhiteSpace(filterHandler.getText()).equals("(&(|)(|)(|))")) {//$NON-NLS-1$
626
				} catch (ExpressionParseException e) {
624
							// We could log this I guess
627
					if (removeWhiteSpace(filterHandler.getText()).equals("(&(|)(|)(|))")) {//$NON-NLS-1$
625
						} else {
628
						// We could log this I guess
626
							throw e;
629
					} else {
627
						}
630
						throw e;
628
					}
629
				IRequirement requirement;
630
				if (match != null) {
631
					IExpressionFactory factory = ExpressionUtil.getFactory();
632
					IExpression expr = ExpressionUtil.parse(match);
633
					Object[] params;
634
					if (matchParams == null)
635
						params = new Object[0];
636
					else {
637
						IExpression[] arrayExpr = ExpressionUtil.getOperands(ExpressionUtil.parse(matchParams));
638
						params = new Object[arrayExpr.length];
639
						for (int idx = 0; idx < arrayExpr.length; ++idx)
640
							params[idx] = arrayExpr[idx].evaluate(null);
641
					}
631
					}
642
					IMatchExpression<IInstallableUnit> matchExpr = factory.matchExpression(expr, params);
632
				}
643
					requirement = MetadataFactory.createRequirement(matchExpr, filter, min, max, greedy);
644
				} else
645
					requirement = MetadataFactory.createRequirement(namespace, name, range, filter, min, max, greedy);
646
				capabilities.add(requirement);
647
			}
633
			}
634
			String description = descriptionHandler == null ? null : descriptionHandler.getText();
635
			IRequirement requirement;
636
			if (match != null) {
637
				IExpressionFactory factory = ExpressionUtil.getFactory();
638
				IExpression expr = ExpressionUtil.parse(match);
639
				Object[] params;
640
				if (matchParams == null)
641
					params = new Object[0];
642
				else {
643
					IExpression[] arrayExpr = ExpressionUtil.getOperands(ExpressionUtil.parse(matchParams));
644
					params = new Object[arrayExpr.length];
645
					for (int idx = 0; idx < arrayExpr.length; ++idx)
646
						params[idx] = arrayExpr[idx].evaluate(null);
647
				}
648
				IMatchExpression<IInstallableUnit> matchExpr = factory.matchExpression(expr, params);
649
				requirement = MetadataFactory.createRequirement(matchExpr, filter, min, max, greedy, description);
650
			} else
651
				requirement = MetadataFactory.createRequirement(namespace, name, range, filter, min, max, greedy, description);
652
			capabilities.add(requirement);
648
		}
653
		}
649
654
650
		private String removeWhiteSpace(String s) {
655
		private String removeWhiteSpace(String s) {
Lines 808-814 Link Here
808
			String[] values = parseAttributes(attributes, required, optional);
813
			String[] values = parseAttributes(attributes, required, optional);
809
			VersionRange range = checkVersionRange(REQUIREMENT_ELEMENT, VERSION_RANGE_ATTRIBUTE, values[1]);
814
			VersionRange range = checkVersionRange(REQUIREMENT_ELEMENT, VERSION_RANGE_ATTRIBUTE, values[1]);
810
			int severity = new Integer(values[2]).intValue();
815
			int severity = new Integer(values[2]).intValue();
811
			descriptor = MetadataFactory.createUpdateDescriptor(values[0], range, severity, values[3]);
816
			URI location = parseURIAttribute(attributes, false);
817
			descriptor = MetadataFactory.createUpdateDescriptor(values[0], range, severity, values[3], location);
812
		}
818
		}
813
819
814
		public IUpdateDescriptor getUpdateDescriptor() {
820
		public IUpdateDescriptor getUpdateDescriptor() {
(-)src/org/eclipse/equinox/internal/p2/metadata/repository/io/MetadataWriter.java (-1 / +3 lines)
Lines 246-252 Link Here
246
		}
246
		}
247
		attribute(CAPABILITY_GREED_ATTRIBUTE, requirement.isGreedy(), true);
247
		attribute(CAPABILITY_GREED_ATTRIBUTE, requirement.isGreedy(), true);
248
		if (requirement.getFilter() != null)
248
		if (requirement.getFilter() != null)
249
				writeTrimmedCdata(CAPABILITY_FILTER_ELEMENT, requirement.getFilter().getParameters()[0].toString());
249
			writeTrimmedCdata(CAPABILITY_FILTER_ELEMENT, requirement.getFilter().getParameters()[0].toString());
250
		if (requirement.getDescription() != null)
251
			writeTrimmedCdata(REQUIREMENT_DESCRIPTION_ELEMENT, requirement.getDescription());
250
		end(REQUIREMENT_ELEMENT);
252
		end(REQUIREMENT_ELEMENT);
251
	}
253
	}
252
254
(-)src/org/eclipse/equinox/internal/p2/metadata/repository/io/XMLConstants.java (+1 lines)
Lines 65-70 Link Here
65
65
66
	// Constants for sub-elements of a required capability element
66
	// Constants for sub-elements of a required capability element
67
	public static final String CAPABILITY_FILTER_ELEMENT = "filter"; //$NON-NLS-1$
67
	public static final String CAPABILITY_FILTER_ELEMENT = "filter"; //$NON-NLS-1$
68
	public static final String REQUIREMENT_DESCRIPTION_ELEMENT = "description"; //$NON-NLS-1$
68
69
69
	// Constants for attributes of a required capability element
70
	// Constants for attributes of a required capability element
70
	public static final String CAPABILITY_OPTIONAL_ATTRIBUTE = "optional"; //$NON-NLS-1$
71
	public static final String CAPABILITY_OPTIONAL_ATTRIBUTE = "optional"; //$NON-NLS-1$
(-)src/org/eclipse/equinox/p2/tests/planner/NegationTesting.java (-5 / +5 lines)
Lines 47-53 Link Here
47
		MetadataFactory.InstallableUnitDescription iud1 = new MetadataFactory.InstallableUnitDescription();
47
		MetadataFactory.InstallableUnitDescription iud1 = new MetadataFactory.InstallableUnitDescription();
48
		iud1.setId("TestNegation4");
48
		iud1.setId("TestNegation4");
49
		iud1.setVersion(Version.create("1.0.0"));
49
		iud1.setVersion(Version.create("1.0.0"));
50
		RequiredCapability req1 = new RequiredCapability(NS, N, new VersionRange("[1.1.0, 1.2.0)"), null, 0, 0, false);
50
		RequiredCapability req1 = new RequiredCapability(NS, N, new VersionRange("[1.1.0, 1.2.0)"), null, 0, 0, false, null);
51
		RequiredCapability req2 = new RequiredCapability(NS, N, new VersionRange("[1.0.0, 2.0.0)"), null, false, false);
51
		RequiredCapability req2 = new RequiredCapability(NS, N, new VersionRange("[1.0.0, 2.0.0)"), null, false, false);
52
		Collection requirements = new ArrayList();
52
		Collection requirements = new ArrayList();
53
		requirements.add(req1);
53
		requirements.add(req1);
Lines 105-111 Link Here
105
		MetadataFactory.InstallableUnitDescription iud1 = new MetadataFactory.InstallableUnitDescription();
105
		MetadataFactory.InstallableUnitDescription iud1 = new MetadataFactory.InstallableUnitDescription();
106
		iud1.setId("TestNegation4");
106
		iud1.setId("TestNegation4");
107
		iud1.setVersion(Version.create("1.0.0"));
107
		iud1.setVersion(Version.create("1.0.0"));
108
		RequiredCapability req1 = new RequiredCapability(NS, N, new VersionRange("[1.1.0, 1.2.0)"), null, 0, 0, false);
108
		RequiredCapability req1 = new RequiredCapability(NS, N, new VersionRange("[1.1.0, 1.2.0)"), null, 0, 0, false, null);
109
		RequiredCapability req2 = new RequiredCapability(NS, N, new VersionRange("[1.0.0, 1.1.0)"), null, false, false);
109
		RequiredCapability req2 = new RequiredCapability(NS, N, new VersionRange("[1.0.0, 1.1.0)"), null, false, false);
110
		Collection requirements = new ArrayList();
110
		Collection requirements = new ArrayList();
111
		requirements.add(req1);
111
		requirements.add(req1);
Lines 146-152 Link Here
146
		MetadataFactory.InstallableUnitDescription iud1 = new MetadataFactory.InstallableUnitDescription();
146
		MetadataFactory.InstallableUnitDescription iud1 = new MetadataFactory.InstallableUnitDescription();
147
		iud1.setId("TestNegation4");
147
		iud1.setId("TestNegation4");
148
		iud1.setVersion(Version.create("1.0.0"));
148
		iud1.setVersion(Version.create("1.0.0"));
149
		RequiredCapability req1 = new RequiredCapability(NS, N, new VersionRange("[1.1.0, 1.2.0)"), null, 0, 0, false);
149
		RequiredCapability req1 = new RequiredCapability(NS, N, new VersionRange("[1.1.0, 1.2.0)"), null, 0, 0, false, null);
150
		RequiredCapability req2 = new RequiredCapability(NS, N, new VersionRange("[1.0.0, 1.1.0)"), null, false, false);
150
		RequiredCapability req2 = new RequiredCapability(NS, N, new VersionRange("[1.0.0, 1.1.0)"), null, false, false);
151
		Collection requirements = new ArrayList();
151
		Collection requirements = new ArrayList();
152
		requirements.add(req1);
152
		requirements.add(req1);
Lines 188-194 Link Here
188
		MetadataFactory.InstallableUnitDescription iud1 = new MetadataFactory.InstallableUnitDescription();
188
		MetadataFactory.InstallableUnitDescription iud1 = new MetadataFactory.InstallableUnitDescription();
189
		iud1.setId("TestNegation4");
189
		iud1.setId("TestNegation4");
190
		iud1.setVersion(Version.create("1.0.0"));
190
		iud1.setVersion(Version.create("1.0.0"));
191
		RequiredCapability req1 = new RequiredCapability(NS, N, new VersionRange("[1.1.0, 1.2.0)"), null, 0, 0, false);
191
		RequiredCapability req1 = new RequiredCapability(NS, N, new VersionRange("[1.1.0, 1.2.0)"), null, 0, 0, false, null);
192
		RequiredCapability req2 = new RequiredCapability(NS, N, new VersionRange("[1.0.0, 2.0.0)"), null, false, false);
192
		RequiredCapability req2 = new RequiredCapability(NS, N, new VersionRange("[1.0.0, 2.0.0)"), null, false, false);
193
		Collection requirements = new ArrayList();
193
		Collection requirements = new ArrayList();
194
		requirements.add(req1);
194
		requirements.add(req1);
Lines 249-255 Link Here
249
		MetadataFactory.InstallableUnitDescription iud1 = new MetadataFactory.InstallableUnitDescription();
249
		MetadataFactory.InstallableUnitDescription iud1 = new MetadataFactory.InstallableUnitDescription();
250
		iud1.setId("TestNegation4");
250
		iud1.setId("TestNegation4");
251
		iud1.setVersion(Version.create("1.0.0"));
251
		iud1.setVersion(Version.create("1.0.0"));
252
		RequiredCapability req1 = new RequiredCapability(NS, N, new VersionRange("[1.1.0, 1.2.0)"), null, 0, 0, false);
252
		RequiredCapability req1 = new RequiredCapability(NS, N, new VersionRange("[1.1.0, 1.2.0)"), null, 0, 0, false, null);
253
		RequiredCapability req2 = new RequiredCapability(NS, N, new VersionRange("[1.0.0, 2.0.0)"), null, false, false);
253
		RequiredCapability req2 = new RequiredCapability(NS, N, new VersionRange("[1.0.0, 2.0.0)"), null, false, false);
254
		Collection requirements = new ArrayList();
254
		Collection requirements = new ArrayList();
255
		requirements.add(req1);
255
		requirements.add(req1);

Return to bug 306439