Improved command line from Emmanuel and fix for up and down from me.
diff --git a/p2/demos/misc-conf-2010/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/Parser.java b/p2/demos/misc-conf-2010/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/Parser.java
index 0114cd8..29d8ea9 100755
--- a/p2/demos/misc-conf-2010/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/Parser.java
+++ b/p2/demos/misc-conf-2010/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/Parser.java
@@ -123,23 +123,34 @@
// package stanza
else if (line.startsWith("package: ")) {
handlePackage(line);
+ handleExtraProperty(line);
+ String[] values = line.split(":", 2);
+ assert values.length == 2;
+ currentIU.addExtraProperty("name", values[1].trim());
} else if (line.startsWith("version: ")) {
handleVersion(line);
handleExtraProperty(line);
} else if (line.startsWith("installed: ")) {
handleInstalled(line);
+ handleExtraProperty(line);
} else if (line.startsWith("depends: ")) {
handleDepends(line);
+ handleExtraProperty(line);
} else if (line.startsWith("conflicts: ")) {
handleConflicts(line);
+ handleExtraProperty(line);
} else if (line.startsWith("provides: ")) {
handleProvides(line);
+ handleExtraProperty(line);
} else if (line.startsWith("expected: ")) {
handleExpected(line);
+ handleExtraProperty(line);
} else if (line.startsWith("recommends: ") && includeRecommends) {
handleRecommends(line);
+ handleExtraProperty(line);
} else if (line.startsWith("keep: ")) {
handleKeep(line);
+ handleExtraProperty(line);
} else {
handleExtraProperty(line);
if (sumProperty != null && line.startsWith(sumProperty + ":")) {
diff --git a/p2/demos/misc-conf-2010/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/UserDefinedOptimizationFunction2012.java b/p2/demos/misc-conf-2010/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/UserDefinedOptimizationFunction2012.java
index 679246e..c903b39 100755
--- a/p2/demos/misc-conf-2010/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/UserDefinedOptimizationFunction2012.java
+++ b/p2/demos/misc-conf-2010/org.eclipse.equinox.p2.cudf/src/main/java/org/eclipse/equinox/p2/cudf/solver/UserDefinedOptimizationFunction2012.java
@@ -20,7 +20,13 @@
List weightedObjects = new ArrayList();
List objects = new ArrayList();
BigInteger weight = BigInteger.valueOf(slice.size() + 1);
- String[] criteria = optfunction.split(",");
+ //String[] criteria = optfunction.split(",");
+ String[] criteria = null;
+ try {
+ criteria = splitCriteria(optfunction);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
BigInteger currentWeight = weight.pow(criteria.length - 1);
int formermaxvarid = dependencyHelper.getSolver().nextFreeVarId(false);
int newmaxvarid;
@@ -60,8 +66,7 @@
currentWeight = currentWeight.divide(weight);
} else if (criteria[i].contains("aligned")) {
weightedObjects.clear();
- StringTokenizer tokenizer = new StringTokenizer(criteria[i].substring(9), ";)");
- // tokenizer.nextToken();
+ StringTokenizer tokenizer = new StringTokenizer(criteria[i].substring(9), ",)");
String prop1 = tokenizer.nextToken();
String prop2 = tokenizer.nextToken();
aligned(weightedObjects, criteria[i].charAt(0) == '-', metaIu, prop1, prop2);
@@ -95,6 +100,69 @@
return null;
}
+ private String[] splitCriteria(String opt) {
+ List<String> res = new ArrayList<String>();
+ String crit = "";
+ int lookFrom = 0;
+ while (crit != null) {
+ crit = nextElement(opt, lookFrom);
+ if (crit != null) {
+ res.add(simplifyCriterion(crit));
+ lookFrom += crit.length() + 1;
+ }
+ }
+ String[] resArray = new String[res.size()];
+ resArray = res.toArray(resArray);
+ return resArray;
+ }
+
+ private String simplifyCriterion(String crit) {
+ crit = removeCountFunction(crit);
+ crit = removeSolutionToken(crit);
+ return crit;
+ }
+
+ private String removeCountFunction(String crit) {
+ String countFunction = "count";
+ if (crit.substring(1).startsWith(countFunction + "(")) {
+ crit = crit.substring(0, 1) + crit.substring(2 + countFunction.length(), crit.length() - 1);
+ }
+ return crit;
+ }
+
+ private String removeSolutionToken(String crit) {
+ String solutionToken = "solution";
+ int solutionTokenStart = crit.indexOf(solutionToken);
+ if (solutionTokenStart != -1) {
+ int solutionTokenEnd = solutionTokenStart + solutionToken.length();
+ if (crit.charAt(solutionTokenEnd) == ',') {
+ ++solutionTokenEnd;
+ }
+ crit = crit.substring(0, solutionTokenStart) + crit.substring(solutionTokenEnd);
+ }
+ return crit;
+ }
+
+ private String nextElement(String opt, int lookFrom) {
+ if (lookFrom >= opt.length()) {
+ return null;
+ }
+ int parCpt = 0;
+ for (int i = lookFrom; i < opt.length(); ++i) {
+ char curChar = opt.charAt(i);
+ if (parCpt == 0 && curChar == ',') {
+ return opt.substring(lookFrom, i);
+ }
+ if (curChar == '(') {
+ ++parCpt;
+ }
+ if (curChar == ')') {
+ --parCpt;
+ }
+ }
+ return opt.substring(lookFrom, opt.length());
+ }
+
public String getName() {
return "User defined:" + optfunction;
}
@@ -102,7 +170,13 @@
public void printSolutionValue() {
int counter;
List proof = new ArrayList();
- String[] criteria = optfunction.split(",");
+ //String[] criteria = optfunction.split(",");
+ String[] criteria = null;
+ try {
+ criteria = splitCriteria(optfunction);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
for (int i = 0; i < criteria.length; i++) {
if (criteria[i].endsWith("new")) {
proof.clear();
@@ -195,7 +269,7 @@
Object var = upVariables.get(j);
if (dependencyHelper.getBooleanValueFor(var)) {
counter++;
- proof.add(var.toString().substring(18));
+ proof.add(var.toString());
}
}
System.out.println("# " + criteria[i] + " criteria value: " + counter);
@@ -209,7 +283,7 @@
Object var = downVariables.get(j);
if (dependencyHelper.getBooleanValueFor(var)) {
counter++;
- proof.add(var.toString().substring(18));
+ proof.add(var.toString());
}
}
System.out.println("# " + criteria[i] + " criteria value: " + counter);