Skip to content
Snippets Groups Projects
Commit 586675f3 authored by Jonas Blatt's avatar Jonas Blatt :ant:
Browse files

Add BAD_REQUEST (400) response, if no verifier was executed.

A parsing error of the dmn xml has the same BAD_REQUEST response.
parent c3cae130
No related branches found
No related tags found
No related merge requests found
package de.unikoblenz.fgbks.api; 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.DmnVerificationService;
import de.unikoblenz.fgbks.core.dmn.verification.metrics.DmnVerificationMetricsService; import de.unikoblenz.fgbks.core.dmn.verification.metrics.DmnVerificationMetricsService;
import de.unikoblenz.fgbks.core.dmn.verification.result.VerifierResultSet; import de.unikoblenz.fgbks.core.dmn.verification.result.VerifierResultSet;
...@@ -36,7 +38,7 @@ public class Verification { ...@@ -36,7 +38,7 @@ public class Verification {
@Produces(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.TEXT_XML) @Consumes(MediaType.TEXT_XML)
public Response verifyAll(String payload) { public Response verifyAll(String payload) {
return Response.accepted(dmnVerificationService.generate(payload)).build(); return checkResult(dmnVerificationService.generate(payload));
} }
/** /**
...@@ -64,7 +66,7 @@ public class Verification { ...@@ -64,7 +66,7 @@ public class Verification {
@Produces(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.TEXT_XML) @Consumes(MediaType.TEXT_XML)
public Response verifyType(@PathParam("typeName") String typeName, String payload) { 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 { ...@@ -93,9 +95,8 @@ public class Verification {
@Consumes(MediaType.TEXT_XML) @Consumes(MediaType.TEXT_XML)
public Response verifyClassification( public Response verifyClassification(
@PathParam("classificationName") String classificationName, String payload) { @PathParam("classificationName") String classificationName, String payload) {
return Response.accepted( return checkResult(
dmnVerificationService.generateFromClassification(classificationName, payload)) dmnVerificationService.generateFromClassification(classificationName, payload));
.build();
} }
/** /**
...@@ -109,4 +110,15 @@ public class Verification { ...@@ -109,4 +110,15 @@ public class Verification {
public Response metrics() { public Response metrics() {
return Response.accepted(dmnVerificationMetricsService.getMetrics()).build(); 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();
}
}
} }
...@@ -4,6 +4,7 @@ import de.unikoblenz.fgbks.core.dmn.domain.vdmn.VDmnDefinition; ...@@ -4,6 +4,7 @@ import de.unikoblenz.fgbks.core.dmn.domain.vdmn.VDmnDefinition;
import de.unikoblenz.fgbks.core.dmn.domain.vdmn.parser.SimpleVDmnParser; import de.unikoblenz.fgbks.core.dmn.domain.vdmn.parser.SimpleVDmnParser;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.util.List; import java.util.List;
import java.util.Optional;
import javax.enterprise.context.ApplicationScoped; import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject; import javax.inject.Inject;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
...@@ -14,8 +15,8 @@ import org.camunda.bpm.model.dmn.impl.DmnParser; ...@@ -14,8 +15,8 @@ import org.camunda.bpm.model.dmn.impl.DmnParser;
/** /**
* Application scoped service, which creates a {@link DmnObjectContainer} with the method {@link * Application scoped service, which creates a {@link DmnObjectContainer} with the method {@link
* DmnService#getDmnServiceFromXml(String)}. This container contained the different model types of a * DmnService#getDmnObjectContainerFromXml(String)}. This container contained the different model
* dmn table. * types of a dmn table.
*/ */
@ApplicationScoped @ApplicationScoped
public class DmnService { public class DmnService {
...@@ -23,20 +24,25 @@ public class DmnService { ...@@ -23,20 +24,25 @@ public class DmnService {
@Inject SimpleVDmnParser simpleDmnParser; @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 * @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) { public Optional<DmnObjectContainer> getDmnObjectContainerFromXml(String dmnXmlString) {
List<DmnDecision> dmnDecisions = try {
DmnEngineConfiguration.createDefaultDmnEngineConfiguration() List<DmnDecision> dmnDecisions =
.buildEngine() DmnEngineConfiguration.createDefaultDmnEngineConfiguration()
.parseDecisions(IOUtils.toInputStream(dmnXmlString, Charset.defaultCharset())); .buildEngine()
DmnModelInstance dmnModel = .parseDecisions(IOUtils.toInputStream(dmnXmlString, Charset.defaultCharset()));
new DmnParser() DmnModelInstance dmnModel =
.parseModelFromStream(IOUtils.toInputStream(dmnXmlString, Charset.defaultCharset())); new DmnParser()
VDmnDefinition vDmnDefinition = simpleDmnParser.getVDmnDefinition(dmnModel); .parseModelFromStream(IOUtils.toInputStream(dmnXmlString, Charset.defaultCharset()));
return new DmnObjectContainer(dmnDecisions, dmnModel, vDmnDefinition); VDmnDefinition vDmnDefinition = simpleDmnParser.getVDmnDefinition(dmnModel);
return Optional.of(new DmnObjectContainer(dmnDecisions, dmnModel, vDmnDefinition));
} catch (Exception e) {
return Optional.empty();
}
} }
} }
package de.unikoblenz.fgbks.core.dmn.verification; package de.unikoblenz.fgbks.core.dmn.verification;
import de.unikoblenz.fgbks.base.utils.UniqueIdGenerator; 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.utils.DmnService;
import de.unikoblenz.fgbks.core.dmn.verification.metrics.DmnVerificationMetricsService; import de.unikoblenz.fgbks.core.dmn.verification.metrics.DmnVerificationMetricsService;
import de.unikoblenz.fgbks.core.dmn.verification.result.VerifierResult; import de.unikoblenz.fgbks.core.dmn.verification.result.VerifierResult;
...@@ -20,6 +21,7 @@ import java.util.ArrayList; ...@@ -20,6 +21,7 @@ import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
...@@ -170,13 +172,19 @@ public class DmnVerificationService { ...@@ -170,13 +172,19 @@ public class DmnVerificationService {
String dmnXml, long verificationProcessId) { String dmnXml, long verificationProcessId) {
Map<Class<? extends AbstractDmnVerifierConfig>, AbstractDmnVerifierConfig> map = Map<Class<? extends AbstractDmnVerifierConfig>, AbstractDmnVerifierConfig> map =
new ConcurrentHashMap<>(); new ConcurrentHashMap<>();
map.put( Optional<DmnObjectContainer> dmnObjectContainerFromXml =
DefaultConfiguration.class, dmnService.getDmnObjectContainerFromXml(dmnXml);
DefaultConfiguration.getBuilder() if (!dmnObjectContainerFromXml.isPresent()) {
.withVerificationProcessId(verificationProcessId) throw new IllegalArgumentException("Dmn table can not be parsed.");
.withDmnObjectContainer(dmnService.getDmnServiceFromXml(dmnXml)) } else {
.build()); map.put(
return map; DefaultConfiguration.class,
DefaultConfiguration.getBuilder()
.withVerificationProcessId(verificationProcessId)
.withDmnObjectContainer(dmnObjectContainerFromXml.get())
.build());
return map;
}
} }
private VerifierResultSet generateWithFilter( private VerifierResultSet generateWithFilter(
...@@ -186,9 +194,14 @@ public class DmnVerificationService { ...@@ -186,9 +194,14 @@ public class DmnVerificationService {
LOGGER.info("Parsing dmn. Id: " + verificationProcessId); LOGGER.info("Parsing dmn. Id: " + verificationProcessId);
Validate.notNull(dmnXml); Validate.notNull(dmnXml);
LOGGER.debug(dmnXml); LOGGER.debug(dmnXml);
Map<Class<? extends AbstractDmnVerifierConfig>, AbstractDmnVerifierConfig> configs =
getConfigs(dmnXml, verificationProcessId);
Builder resultBuilder = VerifierResultSet.getBuilder(); 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); LOGGER.info("Looking for verifiers. Id: " + verificationProcessId);
List<Future<VerifierResult>> results = new ArrayList<>(verifierClasses.size()); List<Future<VerifierResult>> results = new ArrayList<>(verifierClasses.size());
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment