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);