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