Index: trunk/CrossPare/src/de/ugoe/cs/cpdp/ExperimentConfiguration.java
===================================================================
--- trunk/CrossPare/src/de/ugoe/cs/cpdp/ExperimentConfiguration.java	(revision 67)
+++ trunk/CrossPare/src/de/ugoe/cs/cpdp/ExperimentConfiguration.java	(revision 68)
@@ -39,4 +39,5 @@
 import de.ugoe.cs.cpdp.dataselection.ISetWiseDataselectionStrategy;
 import de.ugoe.cs.cpdp.eval.IEvaluationStrategy;
+import de.ugoe.cs.cpdp.eval.IResultStorage;
 import de.ugoe.cs.cpdp.loader.IVersionLoader;
 import de.ugoe.cs.cpdp.training.ISetWiseTestdataAwareTrainingStrategy;
@@ -116,9 +117,9 @@
 
     /**
-     * setwise testdata aware trainers, i.e., trainers that require the selected training data to be separate from
-     * each other and the current testdata 
+     * setwise testdata aware trainers, i.e., trainers that require the selected training data to be
+     * separate from each other and the current testdata
      */
     private List<ISetWiseTestdataAwareTrainingStrategy> setwiseTestdataAwareTrainers;
-    
+
     /**
      * data processors that are applied before the pointwise data selection
@@ -140,5 +141,5 @@
      */
     private List<ITrainingStrategy> trainers;
-    
+
     /**
      * normal trainers, i.e., trainers that require the selected training data in a single data set
@@ -150,4 +151,9 @@
      */
     private List<IEvaluationStrategy> evaluators;
+
+    /**
+     * result storages used for experiments
+     */
+    private List<IResultStorage> resultStorages;
 
     /**
@@ -198,4 +204,5 @@
         testAwareTrainers = new LinkedList<>();
         evaluators = new LinkedList<>();
+        resultStorages = new LinkedList<>();
 
         if (file == null) {
@@ -347,5 +354,5 @@
         return setwiseTestdataAwareTrainers;
     }
-    
+
     /**
      * returns the processors applied before the pointwise data selection
@@ -383,5 +390,5 @@
         return trainers;
     }
-    
+
     /**
      * returns the test aware training algorithms
@@ -400,4 +407,8 @@
     public List<IEvaluationStrategy> getEvaluators() {
         return evaluators;
+    }
+
+    public List<IResultStorage> getResultStorages() {
+        return resultStorages;
     }
 
@@ -435,7 +446,6 @@
             }
             else if (qName.equals("loader")) {
-                final IVersionLoader loader =
-                    (IVersionLoader) Class.forName("de.ugoe.cs.cpdp.loader." +
-                                                       attributes.getValue("name")).newInstance();
+                final IVersionLoader loader = (IVersionLoader) Class
+                    .forName("de.ugoe.cs.cpdp.loader." + attributes.getValue("name")).newInstance();
                 loader.setLocation(attributes.getValue("datalocation"));
                 loaders.add(loader);
@@ -447,29 +457,28 @@
             }
             else if (qName.equals("versionfilter")) {
-                final IVersionFilter filter =
-                    (IVersionFilter) Class.forName("de.ugoe.cs.cpdp.versions." +
-                                                       attributes.getValue("name")).newInstance();
+                final IVersionFilter filter = (IVersionFilter) Class
+                    .forName("de.ugoe.cs.cpdp.versions." + attributes.getValue("name"))
+                    .newInstance();
                 filter.setParameter(attributes.getValue("param"));
                 versionFilters.add(filter);
             }
             else if (qName.equals("testVersionfilter")) {
-                final IVersionFilter filter =
-                    (IVersionFilter) Class.forName("de.ugoe.cs.cpdp.versions." +
-                                                       attributes.getValue("name")).newInstance();
+                final IVersionFilter filter = (IVersionFilter) Class
+                    .forName("de.ugoe.cs.cpdp.versions." + attributes.getValue("name"))
+                    .newInstance();
                 filter.setParameter(attributes.getValue("param"));
                 testVersionFilters.add(filter);
             }
             else if (qName.equals("trainVersionfilter")) {
-                final IVersionFilter filter =
-                    (IVersionFilter) Class.forName("de.ugoe.cs.cpdp.versions." +
-                                                       attributes.getValue("name")).newInstance();
+                final IVersionFilter filter = (IVersionFilter) Class
+                    .forName("de.ugoe.cs.cpdp.versions." + attributes.getValue("name"))
+                    .newInstance();
                 filter.setParameter(attributes.getValue("param"));
                 trainingVersionFilters.add(filter);
             }
             else if (qName.equals("setwisepreprocessor")) {
-                final ISetWiseProcessingStrategy processor =
-                    (ISetWiseProcessingStrategy) Class.forName("de.ugoe.cs.cpdp.dataprocessing." +
-                                                                   attributes.getValue("name"))
-                        .newInstance();
+                final ISetWiseProcessingStrategy processor = (ISetWiseProcessingStrategy) Class
+                    .forName("de.ugoe.cs.cpdp.dataprocessing." + attributes.getValue("name"))
+                    .newInstance();
                 processor.setParameter(attributes.getValue("param"));
                 setwisepreprocessors.add(processor);
@@ -477,6 +486,6 @@
             else if (qName.equals("setwiseselector")) {
                 final ISetWiseDataselectionStrategy selection =
-                    (ISetWiseDataselectionStrategy) Class.forName("de.ugoe.cs.cpdp.dataselection." +
-                                                                      attributes.getValue("name"))
+                    (ISetWiseDataselectionStrategy) Class
+                        .forName("de.ugoe.cs.cpdp.dataselection." + attributes.getValue("name"))
                         .newInstance();
                 selection.setParameter(attributes.getValue("param"));
@@ -484,16 +493,14 @@
             }
             else if (qName.equals("setwisepostprocessor")) {
-                final ISetWiseProcessingStrategy processor =
-                    (ISetWiseProcessingStrategy) Class.forName("de.ugoe.cs.cpdp.dataprocessing." +
-                                                                   attributes.getValue("name"))
-                        .newInstance();
+                final ISetWiseProcessingStrategy processor = (ISetWiseProcessingStrategy) Class
+                    .forName("de.ugoe.cs.cpdp.dataprocessing." + attributes.getValue("name"))
+                    .newInstance();
                 processor.setParameter(attributes.getValue("param"));
                 setwisepostprocessors.add(processor);
             }
             else if (qName.equals("setwisetrainer")) {
-                final ISetWiseTrainingStrategy trainer =
-                    (ISetWiseTrainingStrategy) Class.forName("de.ugoe.cs.cpdp.training." +
-                                                                 attributes.getValue("name"))
-                        .newInstance();
+                final ISetWiseTrainingStrategy trainer = (ISetWiseTrainingStrategy) Class
+                    .forName("de.ugoe.cs.cpdp.training." + attributes.getValue("name"))
+                    .newInstance();
                 trainer.setParameter(attributes.getValue("param"));
                 setwiseTrainers.add(trainer);
@@ -501,6 +508,6 @@
             else if (qName.equals("setwisetestdataawaretrainer")) {
                 final ISetWiseTestdataAwareTrainingStrategy trainer =
-                    (ISetWiseTestdataAwareTrainingStrategy) Class.forName("de.ugoe.cs.cpdp.training." +
-                                                                 attributes.getValue("name"))
+                    (ISetWiseTestdataAwareTrainingStrategy) Class
+                        .forName("de.ugoe.cs.cpdp.training." + attributes.getValue("name"))
                         .newInstance();
                 trainer.setParameter(attributes.getValue("param"));
@@ -510,8 +517,7 @@
             }
             else if (qName.equals("preprocessor")) {
-                final IProcessesingStrategy processor =
-                    (IProcessesingStrategy) Class.forName("de.ugoe.cs.cpdp.dataprocessing." +
-                                                              attributes.getValue("name"))
-                        .newInstance();
+                final IProcessesingStrategy processor = (IProcessesingStrategy) Class
+                    .forName("de.ugoe.cs.cpdp.dataprocessing." + attributes.getValue("name"))
+                    .newInstance();
                 processor.setParameter(attributes.getValue("param"));
                 preprocessors.add(processor);
@@ -526,33 +532,33 @@
             }
             else if (qName.equals("postprocessor")) {
-                final IProcessesingStrategy processor =
-                    (IProcessesingStrategy) Class.forName("de.ugoe.cs.cpdp.dataprocessing." +
-                                                              attributes.getValue("name"))
-                        .newInstance();
+                final IProcessesingStrategy processor = (IProcessesingStrategy) Class
+                    .forName("de.ugoe.cs.cpdp.dataprocessing." + attributes.getValue("name"))
+                    .newInstance();
                 processor.setParameter(attributes.getValue("param"));
                 postprocessors.add(processor);
             }
             else if (qName.equals("trainer")) {
-                final ITrainingStrategy trainer =
-                    (ITrainingStrategy) Class.forName("de.ugoe.cs.cpdp.training." +
-                                                          attributes.getValue("name"))
-                        .newInstance();
+                final ITrainingStrategy trainer = (ITrainingStrategy) Class
+                    .forName("de.ugoe.cs.cpdp.training." + attributes.getValue("name"))
+                    .newInstance();
                 trainer.setParameter(attributes.getValue("param"));
                 trainers.add(trainer);
             }
             else if (qName.equals("testawaretrainer")) {
-                final ITestAwareTrainingStrategy trainer =
-                    (ITestAwareTrainingStrategy) Class.forName("de.ugoe.cs.cpdp.training." +
-                                                          attributes.getValue("name"))
-                        .newInstance();
+                final ITestAwareTrainingStrategy trainer = (ITestAwareTrainingStrategy) Class
+                    .forName("de.ugoe.cs.cpdp.training." + attributes.getValue("name"))
+                    .newInstance();
                 trainer.setParameter(attributes.getValue("param"));
                 testAwareTrainers.add(trainer);
             }
             else if (qName.equals("eval")) {
-                final IEvaluationStrategy evaluator =
-                    (IEvaluationStrategy) Class.forName("de.ugoe.cs.cpdp.eval." +
-                                                            attributes.getValue("name"))
-                        .newInstance();
+                final IEvaluationStrategy evaluator = (IEvaluationStrategy) Class
+                    .forName("de.ugoe.cs.cpdp.eval." + attributes.getValue("name")).newInstance();
                 evaluators.add(evaluator);
+            }
+            else if (qName.equals("storage")) {
+                final IResultStorage resultStorage = (IResultStorage) Class
+                    .forName("de.ugoe.cs.cpdp.eval." + attributes.getValue("name")).newInstance();
+                resultStorages.add(resultStorage);
             }
             else if (qName.equals("saveClassifier")) {
@@ -625,6 +631,5 @@
 
         if (!executionStrategy.equals(other.executionStrategy)) {
-            throw new ExperimentConfigurationException(
-                                                       "Executionstrategies must be the same, if config files should be added.");
+            throw new ExperimentConfigurationException("Executionstrategies must be the same, if config files should be added.");
         }
 
@@ -651,6 +656,6 @@
         builder.append("Results path: " + resultsPath + StringTools.ENDLINE);
         builder.append("Version filters: " + versionFilters.toString() + StringTools.ENDLINE);
-        builder.append("Test version filters: " + testVersionFilters.toString() +
-            StringTools.ENDLINE);
+        builder
+            .append("Test version filters: " + testVersionFilters.toString() + StringTools.ENDLINE);
         builder.append("Training version filters: " + trainingVersionFilters.toString() +
             StringTools.ENDLINE);
@@ -661,11 +666,12 @@
             StringTools.ENDLINE);
         builder.append("Setwise trainers: " + setwiseTrainers.toString() + StringTools.ENDLINE);
-        builder.append("Setwise Testdata Aware trainers: " + setwiseTestdataAwareTrainers.toString() + StringTools.ENDLINE);
+        builder.append("Setwise Testdata Aware trainers: " +
+            setwiseTestdataAwareTrainers.toString() + StringTools.ENDLINE);
         builder
             .append("Pointwise preprocessors: " + preprocessors.toString() + StringTools.ENDLINE);
-        builder.append("Pointwise selectors: " + pointwiseselectors.toString() +
-            StringTools.ENDLINE);
-        builder.append("Pointwise postprocessors: " + postprocessors.toString() +
-            StringTools.ENDLINE);
+        builder
+            .append("Pointwise selectors: " + pointwiseselectors.toString() + StringTools.ENDLINE);
+        builder
+            .append("Pointwise postprocessors: " + postprocessors.toString() + StringTools.ENDLINE);
         builder.append("Pointwise trainers: " + trainers.toString() + StringTools.ENDLINE);
         builder.append("Evaluators: " + evaluators.toString() + StringTools.ENDLINE);
Index: trunk/CrossPare/src/de/ugoe/cs/cpdp/eval/AbstractWekaEvaluation.java
===================================================================
--- trunk/CrossPare/src/de/ugoe/cs/cpdp/eval/AbstractWekaEvaluation.java	(revision 67)
+++ trunk/CrossPare/src/de/ugoe/cs/cpdp/eval/AbstractWekaEvaluation.java	(revision 68)
@@ -19,4 +19,5 @@
 import java.io.PrintWriter;
 import java.util.ArrayList;
+import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
@@ -43,16 +44,15 @@
  * <li>fscore</li>
  * <li>gscore</li>
+ * <li>MCC</li>
  * <li>AUC</li>
  * <li>AUCEC (weighted by LOC, if applicable; 0.0 if LOC not available)</li>
  * <li>tpr: true positive rate</li>
  * <li>tnr: true negative rate</li>
+ * <li>fpr: false positive rate</li>
+ * <li>fnr: false negative rate</li>
  * <li>tp: true positives</li>
  * <li>fp: false positives</li>
  * <li>tn: true negatives</li>
  * <li>fn: false negatives</li>
- * <li>errortrain: training error</li>
- * <li>recalltrain: training recall</li>
- * <li>precisiontrain: training precision</li>
- * <li>succHetrain: training success with recall>0.7 and precision>0.5
  * </ul>
  * 
@@ -67,7 +67,9 @@
 
     private boolean outputIsSystemOut = true;
+    
+    private String configurationName = "default";
 
     /**
-     * Creates the weka evaluator. Allows the creation of the evaluator in different ways, e.g., for
+     * Creates the Weka evaluator. Allows the creation of the evaluator in different ways, e.g., for
      * cross-validation or evaluation on the test data.
      * 
@@ -90,10 +92,15 @@
                       Instances traindata,
                       List<ITrainer> trainers,
-                      boolean writeHeader)
+                      boolean writeHeader,
+                      List<IResultStorage> storages)
     {
-        final List<Classifier> classifiers = new LinkedList<Classifier>();
+        final List<Classifier> classifiers = new LinkedList<>();
+        final List<ExperimentResult> experimentResults = new LinkedList<>();
+        String productName = testdata.relationName();
+        
         for (ITrainer trainer : trainers) {
             if (trainer instanceof IWekaCompatibleTrainer) {
                 classifiers.add(((IWekaCompatibleTrainer) trainer).getClassifier());
+                experimentResults.add(new ExperimentResult(configurationName, productName, ((IWekaCompatibleTrainer) trainer).getName()));
             }
             else {
@@ -129,13 +136,14 @@
         }
 
-        output.append(testdata.relationName());
+        output.append(productName);
         output.append("," + testdata.numInstances());
         output.append("," + traindata.numInstances());
 
         Evaluation eval = null;
-        //Evaluation evalTrain = null;
-        for (Classifier classifier : classifiers) {
+        Iterator<Classifier> classifierIter = classifiers.iterator();
+        Iterator<ExperimentResult> resultIter = experimentResults.iterator();
+        while (classifierIter.hasNext()) {
+            Classifier classifier = classifierIter.next();
             eval = createEvaluator(testdata, classifier);
-            //evalTrain = createEvaluator(traindata, classifier);
 
             double pf =
@@ -143,33 +151,13 @@
             double gmeasure = 2 * eval.recall(1) * (1.0 - pf) / (eval.recall(1) + (1.0 - pf));
             double aucec = calculateReviewEffort(testdata, classifier);
-
-            if (eval.recall(1) >= 0.7 && eval.precision(1) >= 0.5) {
-                output.append(",1");
-            }
-            else {
-                output.append(",0");
-            }
-
-            if (eval.recall(1) >= 0.7 && eval.precision(1) >= 0.7) {
-                output.append(",1");
-            }
-            else {
-                output.append(",0");
-            }
-
-            if (gmeasure > 0.75) {
-                output.append(",1");
-            }
-            else {
-                output.append(",0");
-            }
-
-            if (gmeasure > 0.6) {
-                output.append(",1");
-            }
-            else {
-                output.append(",0");
-            }
-
+            double succHe = eval.recall(1) >= 0.7 && eval.precision(1) >= 0.5 ? 1.0 : 0.0;
+            double succZi = eval.recall(1) >= 0.7 && eval.precision(1) >= 0.7 ? 1.0 : 0.0;
+            double succG75 = gmeasure > 0.75 ? 1.0 : 0.0;
+            double succG60 = gmeasure > 0.6 ? 1.0 : 0.0;
+            
+            output.append("," + succHe);
+            output.append("," + succZi);
+            output.append("," + succG75);
+            output.append("," + succG60);            
             output.append("," + eval.errorRate());
             output.append("," + eval.recall(1));
@@ -188,4 +176,31 @@
             output.append("," + eval.numTrueNegatives(1));
             output.append("," + eval.numFalsePositives(1));
+            
+            ExperimentResult result = resultIter.next();
+            result.setSizeTestData(testdata.numInstances());
+            result.setSizeTrainingData(traindata.numInstances());
+            result.setSuccHe(succHe);
+            result.setSuccZi(succZi);
+            result.setSuccG75(succG75);
+            result.setSuccG60(succG60);
+            result.setError(eval.errorRate());
+            result.setRecall(eval.recall(1));
+            result.setPrecision(eval.precision(1));
+            result.setFscore(eval.fMeasure(1));
+            result.setGscore(gmeasure);
+            result.setMcc(eval.matthewsCorrelationCoefficient(1));
+            result.setAuc(eval.areaUnderROC(1));
+            result.setAucec(aucec);
+            result.setTpr(eval.truePositiveRate(1));
+            result.setTnr(eval.trueNegativeRate(1));
+            result.setFpr(eval.falsePositiveRate(1));
+            result.setFnr(eval.falseNegativeRate(1));
+            result.setTp(eval.numTruePositives(1));
+            result.setFn(eval.numFalseNegatives(1));
+            result.setTn(eval.numTrueNegatives(1));
+            result.setFp(eval.numFalsePositives(1));
+            for( IResultStorage storage : storages ) {
+                storage.addResult(result);
+            }
         }
 
@@ -301,4 +316,7 @@
                 output = new PrintWriter(new FileOutputStream(parameters));
                 outputIsSystemOut = false;
+                int filenameStart = parameters.lastIndexOf('/')+1;
+                int filenameEnd = parameters.lastIndexOf('.');
+                configurationName = parameters.substring(filenameStart, filenameEnd);
             }
             catch (FileNotFoundException e) {
Index: trunk/CrossPare/src/de/ugoe/cs/cpdp/eval/ExperimentResult.java
===================================================================
--- trunk/CrossPare/src/de/ugoe/cs/cpdp/eval/ExperimentResult.java	(revision 68)
+++ trunk/CrossPare/src/de/ugoe/cs/cpdp/eval/ExperimentResult.java	(revision 68)
@@ -0,0 +1,179 @@
+package de.ugoe.cs.cpdp.eval;
+
+public class ExperimentResult {
+
+    private final String configurationName;
+    private final String productName;
+    private final String classifier;
+    
+    public ExperimentResult(String configurationName, String productName, String classifier) {
+        this.configurationName = configurationName;
+        this.productName = productName;
+        this.classifier = classifier;
+    }
+    
+    int sizeTestData;
+    int sizeTrainingData;
+    double succHe = Double.NaN;
+    double succZi = Double.NaN;
+    double succG75 = Double.NaN;
+    double succG60 = Double.NaN;
+    double error = Double.NaN;
+    double recall = Double.NaN;
+    double precision = Double.NaN;
+    double fscore = Double.NaN;
+    double gscore = Double.NaN;
+    double mcc = Double.NaN;
+    double auc = Double.NaN;
+    double aucec = Double.NaN;
+    double tpr = Double.NaN;
+    double tnr = Double.NaN;
+    double fpr = Double.NaN;
+    double fnr = Double.NaN;
+    double tp = Double.NaN;
+    double fn = Double.NaN;
+    double tn = Double.NaN;
+    double fp = Double.NaN;
+
+    public String getConfigurationName() {
+        return configurationName;
+    }
+    public String getProductName() {
+        return productName;
+    }
+    public String getClassifier() {
+        return classifier;
+    }
+    public int getSizeTestData() {
+        return sizeTestData;
+    }
+    public void setSizeTestData(int sizeTestData) {
+        this.sizeTestData = sizeTestData;
+    }
+    public int getSizeTrainingData() {
+        return sizeTrainingData;
+    }
+    public void setSizeTrainingData(int sizeTrainingData) {
+        this.sizeTrainingData = sizeTrainingData;
+    }
+    public double getSuccHe() {
+        return succHe;
+    }
+    public void setSuccHe(double succHe) {
+        this.succHe = succHe;
+    }
+    public double getSuccZi() {
+        return succZi;
+    }
+    public void setSuccZi(double succZi) {
+        this.succZi = succZi;
+    }
+    public double getSuccG75() {
+        return succG75;
+    }
+    public void setSuccG75(double succG75) {
+        this.succG75 = succG75;
+    }
+    public double getSuccG60() {
+        return succG60;
+    }
+    public void setSuccG60(double succG60) {
+        this.succG60 = succG60;
+    }
+    public double getError() {
+        return error;
+    }
+    public void setError(double error) {
+        this.error = error;
+    }
+    public double getRecall() {
+        return recall;
+    }
+    public void setRecall(double recall) {
+        this.recall = recall;
+    }
+    public double getPrecision() {
+        return precision;
+    }
+    public void setPrecision(double precision) {
+        this.precision = precision;
+    }
+    public double getFscore() {
+        return fscore;
+    }
+    public void setFscore(double fscore) {
+        this.fscore = fscore;
+    }
+    public double getGscore() {
+        return gscore;
+    }
+    public void setGscore(double gscore) {
+        this.gscore = gscore;
+    }
+    public double getMcc() {
+        return mcc;
+    }
+    public void setMcc(double mcc) {
+        this.mcc = mcc;
+    }
+    public double getAuc() {
+        return auc;
+    }
+    public void setAuc(double auc) {
+        this.auc = auc;
+    }
+    public double getAucec() {
+        return aucec;
+    }
+    public void setAucec(double aucec) {
+        this.aucec = aucec;
+    }
+    public double getTpr() {
+        return tpr;
+    }
+    public void setTpr(double tpr) {
+        this.tpr = tpr;
+    }
+    public double getTnr() {
+        return tnr;
+    }
+    public void setTnr(double tnr) {
+        this.tnr = tnr;
+    }
+    public double getFpr() {
+        return fpr;
+    }
+    public void setFpr(double fpr) {
+        this.fpr = fpr;
+    }
+    public double getFnr() {
+        return fnr;
+    }
+    public void setFnr(double fnr) {
+        this.fnr = fnr;
+    }
+    public double getTp() {
+        return tp;
+    }
+    public void setTp(double tp) {
+        this.tp = tp;
+    }
+    public double getFn() {
+        return fn;
+    }
+    public void setFn(double fn) {
+        this.fn = fn;
+    }
+    public double getTn() {
+        return tn;
+    }
+    public void setTn(double tn) {
+        this.tn = tn;
+    }
+    public double getFp() {
+        return fp;
+    }
+    public void setFp(double fp) {
+        this.fp = fp;
+    }
+}
Index: trunk/CrossPare/src/de/ugoe/cs/cpdp/eval/IEvaluationStrategy.java
===================================================================
--- trunk/CrossPare/src/de/ugoe/cs/cpdp/eval/IEvaluationStrategy.java	(revision 67)
+++ trunk/CrossPare/src/de/ugoe/cs/cpdp/eval/IEvaluationStrategy.java	(revision 68)
@@ -40,5 +40,11 @@
      * @param writeHeader
      *            if true, a header line for the results file is written (may not be applicable)
+     * @param storages
+     *            result storages that shall additionally be used
      */
-    void apply(Instances testdata, Instances traindata, List<ITrainer> trainers, boolean writeHeader);
+    void apply(Instances testdata,
+               Instances traindata,
+               List<ITrainer> trainers,
+               boolean writeHeader,
+               List<IResultStorage> storages);
 }
Index: trunk/CrossPare/src/de/ugoe/cs/cpdp/eval/IResultStorage.java
===================================================================
--- trunk/CrossPare/src/de/ugoe/cs/cpdp/eval/IResultStorage.java	(revision 68)
+++ trunk/CrossPare/src/de/ugoe/cs/cpdp/eval/IResultStorage.java	(revision 68)
@@ -0,0 +1,6 @@
+package de.ugoe.cs.cpdp.eval;
+
+public interface IResultStorage {
+
+    public void addResult(ExperimentResult result);
+}
Index: trunk/CrossPare/src/de/ugoe/cs/cpdp/eval/MySQLResultStorage.java
===================================================================
--- trunk/CrossPare/src/de/ugoe/cs/cpdp/eval/MySQLResultStorage.java	(revision 68)
+++ trunk/CrossPare/src/de/ugoe/cs/cpdp/eval/MySQLResultStorage.java	(revision 68)
@@ -0,0 +1,87 @@
+
+package de.ugoe.cs.cpdp.eval;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+import java.sql.Statement;
+
+import de.ugoe.cs.util.console.Console;
+
+public class MySQLResultStorage implements IResultStorage {
+    private Connection con = null;
+    
+    public MySQLResultStorage() {
+        this("localhost", "3306", "crosspare", "crosspare", "benchmark");
+    }
+    
+    public MySQLResultStorage(String dbHost, String dbPort, String dbName, String dbUser, String dbPass) {
+        try {
+            Class.forName("com.mysql.jdbc.Driver");
+            con = DriverManager.getConnection("jdbc:mysql://" + dbHost + ":" + dbPort + "/" +
+                    dbName + "?" + "user=" + dbUser + "&" + "password=" + dbPass);
+        }
+        catch (ClassNotFoundException e) {
+            Console.printerr("JDBC driver not found");
+        }
+        catch (SQLException e) {
+            Console.printerr("Problem with MySQL connection: ");
+            Console.printerr("SQLException: " + e.getMessage());
+            Console.printerr("SQLState: " + e.getSQLState());
+            Console.printerr("VendorError: " + e.getErrorCode());
+        }
+    }
+
+    public void addResult(ExperimentResult result) {
+        Statement stmt;
+        try {
+            stmt = con.createStatement();
+        }
+        catch (SQLException e) {
+            Console.printerr("Problem with MySQL connection: ");
+            Console.printerr("SQLException: " + e.getMessage());
+            Console.printerr("SQLState: " + e.getSQLState());
+            Console.printerr("VendorError: " + e.getErrorCode());
+            return;
+        }
+        StringBuilder sql = new StringBuilder();
+        sql.append("INSERT INTO crosspare.results VALUES (NULL,");
+        sql.append("\'" + result.getConfigurationName()+"\',");
+        sql.append("\'" + result.getProductName()+"\',");
+        sql.append("\'" + result.getClassifier()+"\',");
+        sql.append(result.getSizeTestData()+",");
+        sql.append(result.getSizeTrainingData()+",");
+        sql.append(result.getSuccHe()+",");
+        sql.append(result.getSuccZi()+",");
+        sql.append(result.getSuccG75()+",");
+        sql.append(result.getSuccG60()+",");
+        sql.append(result.getError()+",");
+        sql.append(result.getRecall()+",");
+        sql.append(result.getPrecision()+",");
+        sql.append(result.getFscore()+",");
+        sql.append(result.getGscore()+",");
+        sql.append(result.getMcc()+",");
+        sql.append(result.getAuc()+",");
+        sql.append(result.getAucec()+",");
+        sql.append(result.getTpr()+",");
+        sql.append(result.getTnr()+",");
+        sql.append(result.getFpr()+",");
+        sql.append(result.getFnr()+",");
+        sql.append(result.getTp()+",");
+        sql.append(result.getFn()+",");
+        sql.append(result.getTn()+",");
+        sql.append(result.getFp()+");");
+        try {
+            stmt.executeUpdate(sql.toString().replace("NaN", "NULL"));
+        }
+        catch (SQLException e) {
+            Console.printerr("Problem with MySQL connection: ");
+            Console.printerr("SQLException: " + e.getMessage());
+            Console.printerr("SQLState: " + e.getSQLState());
+            Console.printerr("VendorError: " + e.getErrorCode());
+            return;
+        }
+    }
+    
+    //public boolean containsResult(String configurationName, String productName, String classifier);
+}
Index: trunk/CrossPare/src/de/ugoe/cs/cpdp/execution/AbstractCrossProjectExperiment.java
===================================================================
--- trunk/CrossPare/src/de/ugoe/cs/cpdp/execution/AbstractCrossProjectExperiment.java	(revision 67)
+++ trunk/CrossPare/src/de/ugoe/cs/cpdp/execution/AbstractCrossProjectExperiment.java	(revision 68)
@@ -299,5 +299,5 @@
                             config.getExperimentName() + ".csv");
                     }
-                    evaluator.apply(testdata, traindata, allTrainers, writeHeader);
+                    evaluator.apply(testdata, traindata, allTrainers, writeHeader, config.getResultStorages());
                     writeHeader = false;
                 }
Index: trunk/CrossPare/src/de/ugoe/cs/cpdp/execution/ClassifierCreationExperiment.java
===================================================================
--- trunk/CrossPare/src/de/ugoe/cs/cpdp/execution/ClassifierCreationExperiment.java	(revision 67)
+++ trunk/CrossPare/src/de/ugoe/cs/cpdp/execution/ClassifierCreationExperiment.java	(revision 68)
@@ -168,5 +168,5 @@
                         config.getExperimentName() + ".csv");
                 }
-                evaluator.apply(testdata, traindata, allTrainers, writeHeader);
+                evaluator.apply(testdata, traindata, allTrainers, writeHeader, config.getResultStorages());
                 writeHeader = false;
             }
