A bit more robust sum criteria: if the property does not exists, nothing happens (it is basically ignored), while if a property is not an integer, the solver will stop with an explicit message.
Note that we suppose here that each property value can be stored in a long and that the sum can also be stored in a long (limitation of p2cudf, not of Sat4j).
diff --git a/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/Parser.java b/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/Parser.java
index f8e81c5..7f6d67c 100644
--- a/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/Parser.java
+++ b/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/Parser.java
@@ -161,8 +161,13 @@
}
private void handleSumProperty(String line, String sumProperty) {
- currentIU.setSumProperty(line.substring(sumProperty.length() + 1).trim());
- System.out.printf("**** handling property %s with value %s for IU %s\n", sumProperty, currentIU.getSumProperty(), currentIU.getId());
+ String value = line.substring(sumProperty.length() + 1).trim();
+ try {
+ currentIU.setSumProperty(Long.valueOf(value));
+ System.out.printf("# **** handling property %s with value %s for IU %s\n", sumProperty, currentIU.getSumProperty(), currentIU.getId());
+ } catch (NumberFormatException ex) {
+ throw new IllegalArgumentException("The value \"" + value + "\" of property \"" + sumProperty + "\" cannot be summed up");
+ }
}
private void handleKeep(String line) {
diff --git a/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/metadata/InstallableUnit.java b/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/metadata/InstallableUnit.java
index e762311..771a17f 100644
--- a/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/metadata/InstallableUnit.java
+++ b/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/metadata/InstallableUnit.java
@@ -26,7 +26,7 @@
private boolean singleton;
private boolean installed;
- private String sumProperty;
+ private long sumProperty;
public InstallableUnit() {
super();
@@ -136,11 +136,11 @@
return installed;
}
- public String getSumProperty() {
+ public long getSumProperty() {
return sumProperty;
}
- public void setSumProperty(String sumProperty) {
+ public void setSumProperty(long sumProperty) {
this.sumProperty = sumProperty;
}
}
diff --git a/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/OptimizationFunction.java b/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/OptimizationFunction.java
index 4201e46..9abdeff 100644
--- a/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/OptimizationFunction.java
+++ b/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/OptimizationFunction.java
@@ -204,8 +204,8 @@
Collection versions = ((HashMap) entry.getValue()).values();
for (Iterator iterator2 = versions.iterator(); iterator2.hasNext();) {
InstallableUnit iuv = (InstallableUnit) iterator2.next();
- if (iuv.getSumProperty() != null) {
- BigInteger weight = new BigInteger(iuv.getSumProperty());
+ if (iuv.getSumProperty() != 0) {
+ BigInteger weight = BigInteger.valueOf(iuv.getSumProperty());
weightedObjects.add(WeightedObject.newWO(iuv, minimize ? weight : weight.negate()));
}
}
diff --git a/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/UserDefinedOptimizationFunction.java b/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/UserDefinedOptimizationFunction.java
index 84ca7cc..a805c02 100644
--- a/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/UserDefinedOptimizationFunction.java
+++ b/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/UserDefinedOptimizationFunction.java
@@ -160,9 +160,7 @@
Object element = it.next();
if (element instanceof InstallableUnit) {
InstallableUnit iu = (InstallableUnit) element;
- if (iu.getSumProperty() != null) {
- sum += Long.parseLong(iu.getSumProperty());
- }
+ sum += iu.getSumProperty();
}
}
System.out.println("# " + criteria[i] + " criteria value: " + sum);