From 586675f3c55df35dddf2b2cb8c35dc517bf8a12b Mon Sep 17 00:00:00 2001
From: Jonas Blatt <jonasblatt@uni-koblenz.de>
Date: Thu, 10 Oct 2019 22:17:42 +0200
Subject: [PATCH] Add BAD_REQUEST (400) response, if no verifier was executed.
 A parsing error of the dmn xml has the same BAD_REQUEST response.

---
 .../de/unikoblenz/fgbks/api/Verification.java | 22 +++++++++---
 .../fgbks/core/dmn/utils/DmnService.java      | 34 +++++++++++--------
 .../verification/DmnVerificationService.java  | 31 ++++++++++++-----
 3 files changed, 59 insertions(+), 28 deletions(-)

diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/api/Verification.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/api/Verification.java
index cd369a79..6fe1f756 100644
--- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/api/Verification.java
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/api/Verification.java
@@ -1,5 +1,7 @@
 package de.unikoblenz.fgbks.api;
 
+import static javax.ws.rs.core.Response.Status.BAD_REQUEST;
+
 import de.unikoblenz.fgbks.core.dmn.verification.DmnVerificationService;
 import de.unikoblenz.fgbks.core.dmn.verification.metrics.DmnVerificationMetricsService;
 import de.unikoblenz.fgbks.core.dmn.verification.result.VerifierResultSet;
@@ -36,7 +38,7 @@ public class Verification {
   @Produces(MediaType.APPLICATION_JSON)
   @Consumes(MediaType.TEXT_XML)
   public Response verifyAll(String payload) {
-    return Response.accepted(dmnVerificationService.generate(payload)).build();
+    return checkResult(dmnVerificationService.generate(payload));
   }
 
   /**
@@ -64,7 +66,7 @@ public class Verification {
   @Produces(MediaType.APPLICATION_JSON)
   @Consumes(MediaType.TEXT_XML)
   public Response verifyType(@PathParam("typeName") String typeName, String payload) {
-    return Response.accepted(dmnVerificationService.generateFromType(typeName, payload)).build();
+    return checkResult(dmnVerificationService.generateFromType(typeName, payload));
   }
 
   /**
@@ -93,9 +95,8 @@ public class Verification {
   @Consumes(MediaType.TEXT_XML)
   public Response verifyClassification(
       @PathParam("classificationName") String classificationName, String payload) {
-    return Response.accepted(
-        dmnVerificationService.generateFromClassification(classificationName, payload))
-        .build();
+    return checkResult(
+        dmnVerificationService.generateFromClassification(classificationName, payload));
   }
 
   /**
@@ -109,4 +110,15 @@ public class Verification {
   public Response metrics() {
     return Response.accepted(dmnVerificationMetricsService.getMetrics()).build();
   }
+
+  private Response checkResult(VerifierResultSet resultSet) {
+    if (resultSet.getAmountOfVerifier() == 0) {
+      return Response.status(
+          BAD_REQUEST.getStatusCode(),
+          "The dmn syntax is not correct. The dmn can not be parsed.")
+          .build();
+    } else {
+      return Response.accepted(resultSet).build();
+    }
+  }
 }
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/utils/DmnService.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/utils/DmnService.java
index ee8fb34f..54b583e1 100644
--- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/utils/DmnService.java
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/utils/DmnService.java
@@ -4,6 +4,7 @@ import de.unikoblenz.fgbks.core.dmn.domain.vdmn.VDmnDefinition;
 import de.unikoblenz.fgbks.core.dmn.domain.vdmn.parser.SimpleVDmnParser;
 import java.nio.charset.Charset;
 import java.util.List;
+import java.util.Optional;
 import javax.enterprise.context.ApplicationScoped;
 import javax.inject.Inject;
 import org.apache.commons.io.IOUtils;
@@ -14,8 +15,8 @@ import org.camunda.bpm.model.dmn.impl.DmnParser;
 
 /**
  * Application scoped service, which creates a {@link DmnObjectContainer} with the method {@link
- * DmnService#getDmnServiceFromXml(String)}. This container contained the different model types of a
- * dmn table.
+ * DmnService#getDmnObjectContainerFromXml(String)}. This container contained the different model
+ * types of a dmn table.
  */
 @ApplicationScoped
 public class DmnService {
@@ -23,20 +24,25 @@ public class DmnService {
   @Inject SimpleVDmnParser simpleDmnParser;
 
   /**
-   * Get the {@link DmnObjectContainer} with the given xml string of a dmn table.
+   * Get an optional of {@link DmnObjectContainer} from the given xml string of a dmn table. The
+   * optional is empty, if the dmn xml can not be parsed.
    *
    * @param dmnXmlString the xml of a dmn table
-   * @return a new {@link DmnObjectContainer}
+   * @return a optional of a new {@link DmnObjectContainer}
    */
-  public DmnObjectContainer getDmnServiceFromXml(String dmnXmlString) {
-    List<DmnDecision> dmnDecisions =
-        DmnEngineConfiguration.createDefaultDmnEngineConfiguration()
-            .buildEngine()
-            .parseDecisions(IOUtils.toInputStream(dmnXmlString, Charset.defaultCharset()));
-    DmnModelInstance dmnModel =
-        new DmnParser()
-            .parseModelFromStream(IOUtils.toInputStream(dmnXmlString, Charset.defaultCharset()));
-    VDmnDefinition vDmnDefinition = simpleDmnParser.getVDmnDefinition(dmnModel);
-    return new DmnObjectContainer(dmnDecisions, dmnModel, vDmnDefinition);
+  public Optional<DmnObjectContainer> getDmnObjectContainerFromXml(String dmnXmlString) {
+    try {
+      List<DmnDecision> dmnDecisions =
+          DmnEngineConfiguration.createDefaultDmnEngineConfiguration()
+              .buildEngine()
+              .parseDecisions(IOUtils.toInputStream(dmnXmlString, Charset.defaultCharset()));
+      DmnModelInstance dmnModel =
+          new DmnParser()
+              .parseModelFromStream(IOUtils.toInputStream(dmnXmlString, Charset.defaultCharset()));
+      VDmnDefinition vDmnDefinition = simpleDmnParser.getVDmnDefinition(dmnModel);
+      return Optional.of(new DmnObjectContainer(dmnDecisions, dmnModel, vDmnDefinition));
+    } catch (Exception e) {
+      return Optional.empty();
+    }
   }
 }
diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/DmnVerificationService.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/DmnVerificationService.java
index 89cb8288..31518e15 100644
--- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/DmnVerificationService.java
+++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/DmnVerificationService.java
@@ -1,6 +1,7 @@
 package de.unikoblenz.fgbks.core.dmn.verification;
 
 import de.unikoblenz.fgbks.base.utils.UniqueIdGenerator;
+import de.unikoblenz.fgbks.core.dmn.utils.DmnObjectContainer;
 import de.unikoblenz.fgbks.core.dmn.utils.DmnService;
 import de.unikoblenz.fgbks.core.dmn.verification.metrics.DmnVerificationMetricsService;
 import de.unikoblenz.fgbks.core.dmn.verification.result.VerifierResult;
@@ -20,6 +21,7 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ExecutionException;
@@ -170,13 +172,19 @@ public class DmnVerificationService {
       String dmnXml, long verificationProcessId) {
     Map<Class<? extends AbstractDmnVerifierConfig>, AbstractDmnVerifierConfig> map =
         new ConcurrentHashMap<>();
-    map.put(
-        DefaultConfiguration.class,
-        DefaultConfiguration.getBuilder()
-            .withVerificationProcessId(verificationProcessId)
-            .withDmnObjectContainer(dmnService.getDmnServiceFromXml(dmnXml))
-            .build());
-    return map;
+    Optional<DmnObjectContainer> dmnObjectContainerFromXml =
+        dmnService.getDmnObjectContainerFromXml(dmnXml);
+    if (!dmnObjectContainerFromXml.isPresent()) {
+      throw new IllegalArgumentException("Dmn table can not be parsed.");
+    } else {
+      map.put(
+          DefaultConfiguration.class,
+          DefaultConfiguration.getBuilder()
+              .withVerificationProcessId(verificationProcessId)
+              .withDmnObjectContainer(dmnObjectContainerFromXml.get())
+              .build());
+      return map;
+    }
   }
 
   private VerifierResultSet generateWithFilter(
@@ -186,9 +194,14 @@ public class DmnVerificationService {
     LOGGER.info("Parsing dmn. Id: " + verificationProcessId);
     Validate.notNull(dmnXml);
     LOGGER.debug(dmnXml);
-    Map<Class<? extends AbstractDmnVerifierConfig>, AbstractDmnVerifierConfig> configs =
-        getConfigs(dmnXml, verificationProcessId);
     Builder resultBuilder = VerifierResultSet.getBuilder();
+    Map<Class<? extends AbstractDmnVerifierConfig>, AbstractDmnVerifierConfig> configs;
+    try {
+      configs = getConfigs(dmnXml, verificationProcessId);
+    } catch (IllegalArgumentException e) {
+      LOGGER.warn("Parsing dmn failed. Id: " + verificationProcessId);
+      return resultBuilder.build();
+    }
     LOGGER.info("Looking for verifiers. Id: " + verificationProcessId);
     List<Future<VerifierResult>> results = new ArrayList<>(verifierClasses.size());
 
-- 
GitLab