From 7536f21e36daca64141512967b1ab8ab9ba2f17b Mon Sep 17 00:00:00 2001
From: "Bernhard J. Berger" <bernhard.berger@uni-bremen.de>
Date: Wed, 8 Feb 2023 22:01:14 +0100
Subject: [PATCH] More useful error messages for constraints with wrong number
 of parameters.

---
 .../constraint/ConstraintProducer.java        |  8 +++++---
 .../correlation/CorrelationsProducer.java     |  3 ++-
 .../deviation/DeviationProducer.java          |  5 +++--
 .../main/ea/constraints/el/LogHelper.java     | 20 +++++++++++++++++++
 4 files changed, 30 insertions(+), 6 deletions(-)
 create mode 100644 src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/el/LogHelper.java

diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/constraint/ConstraintProducer.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/constraint/ConstraintProducer.java
index c80303fc..2db5c6e8 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/constraint/ConstraintProducer.java
+++ b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/constraint/ConstraintProducer.java
@@ -11,8 +11,10 @@ import javax.enterprise.inject.Produces;
 import javax.inject.Named;
 
 import de.evoal.core.main.ea.constraints.el.ElHelper;
+import de.evoal.core.main.ea.constraints.el.LogHelper;
 import de.evoal.languages.model.ddl.DataDescription;
 import de.evoal.languages.model.ddl.FunctionName;
+import de.evoal.languages.model.ddl.dsl.DataDescriptionLanguageStandaloneSetup;
 import de.evoal.languages.model.el.Call;
 import de.evoal.core.main.ea.constraints.constraint.ast.ConditionConverter;
 import de.evoal.languages.model.instance.Array;
@@ -20,6 +22,7 @@ import de.evoal.languages.model.instance.Attribute;
 import de.evoal.languages.model.instance.DataReference;
 import de.evoal.languages.model.instance.Instance;
 import lombok.extern.slf4j.Slf4j;
+import org.eclipse.xtext.serializer.impl.Serializer;
 
 import java.util.Objects;
 import java.util.Optional;
@@ -37,7 +40,6 @@ public class ConstraintProducer {
                               @ConfigurationValue(entry = CoreBlackboardEntries.OPTIMISATION_CONFIGURATION, access = "algorithm.fitness") final Instance fitnessConfig) {
         this.genoSpec = genoSpec;
         this.fitnessSpec = toInnerSpecification(fitnessConfig);
-
         final Constraints result = new Constraints();
 
         constraints.stream()
@@ -79,9 +81,9 @@ public class ConstraintProducer {
                         .build();
     }
 
-    private Optional<Constraint> convert(final Call constraint, DataDescription context) {
+    private Optional<Constraint> convert(final Call constraint, final DataDescription context) {
         if(constraint.getParameters().size() != 2) {
-            log.error("Constraint has more than two parameters. Skipping.");
+            LogHelper.parameterMismatch(log,"constraint", constraint, 2);
             return Optional.empty();
         }
 
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/correlation/CorrelationsProducer.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/correlation/CorrelationsProducer.java
index 09de44dc..0739e389 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/correlation/CorrelationsProducer.java
+++ b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/correlation/CorrelationsProducer.java
@@ -11,6 +11,7 @@ import de.evoal.core.main.ea.constraints.el.ElHelper;
 import de.evoal.core.api.ea.correlations.Correlation;
 import de.evoal.core.api.ea.correlations.Correlations;
 import de.evoal.core.api.ea.correlations.RangedCorrelation;
+import de.evoal.core.main.ea.constraints.el.LogHelper;
 import de.evoal.languages.model.ddl.DataDescription;
 import de.evoal.languages.model.el.Call;
 import lombok.extern.slf4j.Slf4j;
@@ -82,7 +83,7 @@ public class CorrelationsProducer {
 
             return Optional.of(result);
         } else {
-            log.error("connection constraint has wrong number of parameters: {}", constraint.getParameters().size());
+            LogHelper.parameterMismatch(log, "connection", constraint, 3);
             return Optional.empty();
         }
     }
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/deviation/DeviationProducer.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/deviation/DeviationProducer.java
index b1f55d12..2c9562be 100644
--- a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/deviation/DeviationProducer.java
+++ b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/deviation/DeviationProducer.java
@@ -12,6 +12,7 @@ import javax.inject.Named;
 import de.evoal.core.main.ea.constraints.deviation.model.Deviation;
 import de.evoal.core.main.ea.constraints.deviation.model.Deviations;
 import de.evoal.core.main.ea.constraints.el.ElHelper;
+import de.evoal.core.main.ea.constraints.el.LogHelper;
 import de.evoal.languages.model.ddl.DataDescription;
 import de.evoal.languages.model.el.Call;
 import de.evoal.languages.model.el.Expression;
@@ -56,8 +57,8 @@ public class DeviationProducer {
     }
 
     private Optional<Deviation> convert(final Call constraint, final DataDescription context) {
-        if(constraint.getParameters().size() != 1) {
-            log.error("Deviation has more than two parameters. Skipping.");
+        if(constraint.getParameters().size() != 2) {
+            LogHelper.parameterMismatch(log, "standardDeviation", constraint, 2);
             return Optional.empty();
         }
 
diff --git a/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/el/LogHelper.java b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/el/LogHelper.java
new file mode 100644
index 00000000..3fec549b
--- /dev/null
+++ b/src/core/de.evoal.core.main/src/main/java/de/evoal/core/main/ea/constraints/el/LogHelper.java
@@ -0,0 +1,20 @@
+package de.evoal.core.main.ea.constraints.el;
+
+import de.evoal.languages.model.ddl.dsl.DataDescriptionLanguageStandaloneSetup;
+import de.evoal.languages.model.el.Call;
+import org.eclipse.xtext.serializer.impl.Serializer;
+import org.slf4j.Logger;
+
+public final class LogHelper {
+    private LogHelper() {}
+
+    public static void parameterMismatch(final Logger log, final String name, final Call call, final int expectedParameters) {
+        final Serializer serializer = new DataDescriptionLanguageStandaloneSetup()
+                .createInjector()
+                .getInstance(Serializer.class);
+
+        final String representation = serializer.serialize(call).strip();
+
+        log.error("Call to {} has not the correct number of parameters. Expected {} parameters. Skipping call '{}'.", name, expectedParameters, representation);
+    }
+}
-- 
GitLab