use of org.kie.dmn.model.v1_3.dmndi.DMNShape in project drools by kiegroup.
the class UnmarshalMarshalTest method testRoundTrip.
public void testRoundTrip(String subdir, String xmlfile, DMNMarshaller marshaller, Source... schemaSource) throws Exception {
File baseOutputDir = new File("target/test-xmlunit/");
File testClassesBaseDir = new File("target/test-classes/");
File inputXMLFile = new File(testClassesBaseDir, subdir + xmlfile);
FileInputStream fis = new FileInputStream(inputXMLFile);
Definitions unmarshal = marshaller.unmarshal(new InputStreamReader(fis));
Validator v = Validator.forLanguage(Languages.W3C_XML_SCHEMA_NS_URI);
v.setSchemaSources(schemaSource);
ValidationResult validateInputResult = v.validateInstance(new StreamSource(inputXMLFile));
if (!validateInputResult.isValid()) {
for (ValidationProblem p : validateInputResult.getProblems()) {
LOG.error("{}", p);
}
}
assertTrue(validateInputResult.isValid());
final File subdirFile = new File(baseOutputDir, subdir);
if (!subdirFile.mkdirs()) {
LOG.warn("mkdirs() failed for File: ", subdirFile.getAbsolutePath());
}
FileOutputStream sourceFos = new FileOutputStream(new File(baseOutputDir, subdir + "a." + xmlfile));
Files.copy(new File(testClassesBaseDir, subdir + xmlfile).toPath(), sourceFos);
sourceFos.flush();
sourceFos.close();
LOG.debug("{}", marshaller.marshal(unmarshal));
File outputXMLFile = new File(baseOutputDir, subdir + "b." + xmlfile);
try (FileWriter targetFos = new FileWriter(outputXMLFile)) {
marshaller.marshal(unmarshal, targetFos);
}
// Should also validate output XML:
ValidationResult validateOutputResult = v.validateInstance(new StreamSource(outputXMLFile));
if (!validateOutputResult.isValid()) {
for (ValidationProblem p : validateOutputResult.getProblems()) {
LOG.error("{}", p);
}
}
assertTrue(validateOutputResult.isValid());
LOG.debug("\n---\nDefault XMLUnit comparison:");
Source control = Input.fromFile(inputXMLFile).build();
Source test = Input.fromFile(outputXMLFile).build();
Diff allDiffsSimilarAndDifferent = DiffBuilder.compare(control).withTest(test).build();
allDiffsSimilarAndDifferent.getDifferences().forEach(m -> LOG.debug("{}", m));
LOG.info("XMLUnit comparison with customized similarity for defaults:");
// in the following a manual DifferenceEvaluator is needed until XMLUnit is configured for properly parsing the XSD linked inside the XML,
// in order to detect the optional+defaultvalue attributes of xml element which might be implicit in source-test, and explicit in test-serialized.
/*
* $ grep -Eo "<xsd:attribute name=\\\"([^\\\"]*)\\\" type=\\\"([^\\\"]*)\\\" use=\\\"optional\\\" default=\\\"([^\\\"])*\\\"" dmn.xsd
<xsd:attribute name="expressionLanguage" type="xsd:anyURI" use="optional" default="http://www.omg.org/spec/FEEL/20140401"
<xsd:attribute name="typeLanguage" type="xsd:anyURI" use="optional" default="http://www.omg.org/spec/FEEL/20140401"
<xsd:attribute name="isCollection" type="xsd:boolean" use="optional" default="false"
<xsd:attribute name="hitPolicy" type="tHitPolicy" use="optional" default="UNIQUE"
<xsd:attribute name="preferredOrientation" type="tDecisionTableOrientation" use="optional" default="Rule-as-Row"
DMNv1.2:
<xsd:attribute name="kind" type="tFunctionKind" default="FEEL"/>
<xsd:attribute name="textFormat" type="xsd:string" default="text/plain"/>
<xsd:attribute name="associationDirection" type="tAssociationDirection" default="None"/>
DMNDIv1.2:
<xsd:attribute name="isCollapsed" type="xsd:boolean" use="optional" default="false"/>
*/
Set<QName> attrWhichCanDefault = new HashSet<QName>();
attrWhichCanDefault.addAll(Arrays.asList(new QName[] { new QName("expressionLanguage"), new QName("typeLanguage"), new QName("isCollection"), new QName("hitPolicy"), new QName("preferredOrientation"), new QName("kind"), new QName("textFormat"), new QName("associationDirection"), new QName("isCollapsed") }));
Set<String> nodeHavingDefaultableAttr = new HashSet<>();
nodeHavingDefaultableAttr.addAll(Arrays.asList(new String[] { "definitions", "decisionTable", "itemDefinition", "itemComponent", "encapsulatedLogic", "textAnnotation", "association", "DMNShape" }));
Diff checkSimilar = DiffBuilder.compare(control).withTest(test).withDifferenceEvaluator(DifferenceEvaluators.chain(DifferenceEvaluators.Default, ((comparison, outcome) -> {
if (outcome == ComparisonResult.DIFFERENT && comparison.getType() == ComparisonType.ELEMENT_NUM_ATTRIBUTES) {
if (comparison.getControlDetails().getTarget().getNodeName().equals(comparison.getTestDetails().getTarget().getNodeName()) && nodeHavingDefaultableAttr.contains(safeStripDMNPRefix(comparison.getControlDetails().getTarget()))) {
return ComparisonResult.SIMILAR;
}
}
// DMNDI/DMNDiagram#documentation is actually deserialized escaped with newlines as by the XML JDK infra.
if (outcome == ComparisonResult.DIFFERENT && comparison.getType() == ComparisonType.ATTR_VALUE) {
if (comparison.getControlDetails().getTarget().getNodeName().equals(comparison.getTestDetails().getTarget().getNodeName()) && comparison.getControlDetails().getTarget().getNodeType() == Node.ATTRIBUTE_NODE && comparison.getControlDetails().getTarget().getLocalName().equals("documentation")) {
return ComparisonResult.SIMILAR;
}
}
if (outcome == ComparisonResult.DIFFERENT && comparison.getType() == ComparisonType.ATTR_NAME_LOOKUP) {
boolean testIsDefaulableAttribute = false;
QName whichDefaultableAttr = null;
if (comparison.getControlDetails().getValue() == null && attrWhichCanDefault.contains(comparison.getTestDetails().getValue())) {
for (QName a : attrWhichCanDefault) {
boolean check = comparison.getTestDetails().getXPath().endsWith("@" + a);
if (check) {
testIsDefaulableAttribute = true;
whichDefaultableAttr = a;
continue;
}
}
}
if (testIsDefaulableAttribute) {
if (comparison.getTestDetails().getXPath().equals(comparison.getControlDetails().getXPath() + "/@" + whichDefaultableAttr)) {
// TODO missing to check the explicited option attribute has value set to the actual default value.
return ComparisonResult.SIMILAR;
}
}
}
return outcome;
}))).ignoreWhitespace().checkForSimilar().build();
checkSimilar.getDifferences().forEach(m -> LOG.error("{}", m));
if (!checkSimilar.getDifferences().iterator().hasNext()) {
LOG.info("[ EMPTY - no diffs using customized similarity ]");
}
assertFalse("XML are NOT similar: " + checkSimilar.toString(), checkSimilar.hasDifferences());
}
use of org.kie.dmn.model.v1_3.dmndi.DMNShape in project drools by kiegroup.
the class DMNShapeConverter method writeAttributes.
@Override
protected void writeAttributes(HierarchicalStreamWriter writer, Object parent) {
super.writeAttributes(writer, parent);
DMNShape style = (DMNShape) parent;
writer.addAttribute("dmnElementRef", MarshallingUtils.formatQName(style.getDmnElementRef(), style));
if (style.isIsListedInputData() != null) {
writer.addAttribute("isListedInputData", style.isIsListedInputData().toString());
}
writer.addAttribute("isCollapsed", Boolean.valueOf(style.isIsCollapsed()).toString());
}
use of org.kie.dmn.model.v1_3.dmndi.DMNShape in project drools by kiegroup.
the class DMNShapeConverter method writeAttributes.
@Override
protected void writeAttributes(HierarchicalStreamWriter writer, Object parent) {
super.writeAttributes(writer, parent);
DMNShape style = (DMNShape) parent;
writer.addAttribute("dmnElementRef", MarshallingUtils.formatQName(style.getDmnElementRef(), style));
if (style.isIsListedInputData() != null) {
writer.addAttribute("isListedInputData", style.isIsListedInputData().toString());
}
writer.addAttribute("isCollapsed", Boolean.valueOf(style.isIsCollapsed()).toString());
}
use of org.kie.dmn.model.v1_3.dmndi.DMNShape in project drools by kiegroup.
the class DMNShapeConverter method assignAttributes.
@Override
protected void assignAttributes(HierarchicalStreamReader reader, Object parent) {
super.assignAttributes(reader, parent);
DMNShape style = (DMNShape) parent;
style.setDmnElementRef(MarshallingUtils.parseQNameString(reader.getAttribute("dmnElementRef")));
String isListedInputData = reader.getAttribute("isListedInputData");
String isCollapsed = reader.getAttribute("isCollapsed");
if (isListedInputData != null) {
style.setIsListedInputData(Boolean.valueOf(isListedInputData));
}
if (isCollapsed != null) {
style.setIsCollapsed(Boolean.valueOf(isCollapsed));
}
}
use of org.kie.dmn.model.v1_3.dmndi.DMNShape in project drools by kiegroup.
the class XStreamMarshaller method newXStream.
private XStream newXStream() {
XStream xStream = XStreamUtils.createNonTrustingXStream(staxDriver, Definitions.class.getClassLoader(), DMNXStream::from);
xStream.addPermission(new TypeHierarchyPermission(QName.class));
xStream.addPermission(new TypeHierarchyPermission(KieDMNModelInstrumentedBase.class));
xStream.addPermission(new TypeHierarchyPermission(org.kie.dmn.model.v1_3.KieDMNModelInstrumentedBase.class));
xStream.alias("artifact", TArtifact.class);
xStream.alias("definitions", TDefinitions.class);
xStream.alias("inputData", TInputData.class);
xStream.alias("decision", TDecision.class);
xStream.alias("variable", TInformationItem.class);
xStream.alias("informationRequirement", TInformationRequirement.class);
xStream.alias("requiredInput", TDMNElementReference.class);
xStream.alias("literalExpression", TLiteralExpression.class);
xStream.alias("DMNElement", TDMNElement.class);
xStream.alias("allowedValues", TUnaryTests.class);
xStream.alias("artifact", TArtifact.class);
xStream.alias("association", TAssociation.class);
xStream.alias("authorityRequirement", TAuthorityRequirement.class);
xStream.alias("binding", TBinding.class);
xStream.alias("businessContextElement", TBusinessContextElement.class);
xStream.alias("businessKnowledgeModel", TBusinessKnowledgeModel.class);
xStream.alias("column", TInformationItem.class);
xStream.alias("context", TContext.class);
xStream.alias("contextEntry", TContextEntry.class);
xStream.alias("decision", TDecision.class);
xStream.alias("decisionMade", TDMNElementReference.class);
xStream.alias("decisionMaker", TDMNElementReference.class);
xStream.alias("decisionOwned", TDMNElementReference.class);
xStream.alias("decisionOwner", TDMNElementReference.class);
xStream.alias("decisionService", TDecisionService.class);
xStream.alias("decisionTable", TDecisionTable.class);
xStream.alias("defaultOutputEntry", TLiteralExpression.class);
xStream.alias("definitions", TDefinitions.class);
xStream.alias("drgElement", TDMNElementReference.class);
xStream.alias("elementCollection", TElementCollection.class);
xStream.alias("encapsulatedDecision", TDMNElementReference.class);
xStream.alias("encapsulatedLogic", TFunctionDefinition.class);
xStream.alias("expression", TExpression.class);
xStream.alias("formalParameter", TInformationItem.class);
xStream.alias("functionItem", TFunctionItem.class);
xStream.alias("functionDefinition", TFunctionDefinition.class);
xStream.alias("group", TGroup.class);
xStream.alias("impactedPerformanceIndicator", TDMNElementReference.class);
xStream.alias("impactingDecision", TDMNElementReference.class);
xStream.alias("import", TImport.class);
xStream.alias("import", TImport.class);
// TODO where?
xStream.alias("importedElement", String.class);
xStream.alias("importedValues", TImportedValues.class);
xStream.alias("informationItem", TInformationItem.class);
xStream.alias("informationRequirement", TInformationRequirement.class);
xStream.alias("input", TInputClause.class);
xStream.alias("inputData", TInputData.class);
xStream.alias("inputDecision", TDMNElementReference.class);
xStream.alias("inputEntry", TUnaryTests.class);
xStream.alias("inputExpression", TLiteralExpression.class);
xStream.alias("inputValues", TUnaryTests.class);
xStream.alias("invocation", TInvocation.class);
xStream.alias("itemComponent", TItemDefinition.class);
xStream.alias("itemDefinition", TItemDefinition.class);
xStream.alias("knowledgeRequirement", TKnowledgeRequirement.class);
xStream.alias("knowledgeSource", TKnowledgeSource.class);
xStream.alias("literalExpression", TLiteralExpression.class);
xStream.alias("namedElement", TNamedElement.class);
xStream.alias("organizationUnit", TOrganizationUnit.class);
xStream.alias("output", TOutputClause.class);
xStream.alias("outputDecision", TDMNElementReference.class);
xStream.alias("outputEntry", TLiteralExpression.class);
xStream.alias("outputValues", TUnaryTests.class);
xStream.alias("owner", TDMNElementReference.class);
xStream.alias("parameter", TInformationItem.class);
xStream.alias("parameters", TInformationItem.class);
xStream.alias("performanceIndicator", TPerformanceIndicator.class);
xStream.alias("relation", TRelation.class);
xStream.alias("requiredAuthority", TDMNElementReference.class);
xStream.alias("requiredDecision", TDMNElementReference.class);
xStream.alias("requiredInput", TDMNElementReference.class);
xStream.alias("requiredKnowledge", TDMNElementReference.class);
xStream.alias("rule", TDecisionRule.class);
xStream.alias("sourceRef", TDMNElementReference.class);
xStream.alias("supportedObjective", TDMNElementReference.class);
xStream.alias("targetRef", TDMNElementReference.class);
xStream.alias("textAnnotation", TTextAnnotation.class);
// TODO where?
xStream.alias("type", String.class);
xStream.alias("typeRef", QName.class);
xStream.alias("usingProcess", TDMNElementReference.class);
xStream.alias("usingTask", TDMNElementReference.class);
xStream.alias("variable", TInformationItem.class);
xStream.alias("row", org.kie.dmn.model.v1_4.TList.class);
xStream.alias("list", org.kie.dmn.model.v1_4.TList.class);
xStream.alias("extensionElements", TDMNElement.TExtensionElements.class);
// Manually imported TEXT = String
xStream.alias(LiteralExpressionConverter.TEXT, String.class);
// unnecessary 'text' key repetition: xStream.alias( TextAnnotationConverter.TEXT, String.class );
// unnecessary 'text' key repetition: xStream.alias( UnaryTestsConverter.TEXT, String.class );
xStream.alias(DecisionConverter.QUESTION, String.class);
xStream.alias(DecisionConverter.ALLOWED_ANSWERS, String.class);
xStream.alias(DMNElementConverter.DESCRIPTION, String.class);
// unnecessary 'text' key repetition: xStream.alias("text", xsd:string.class );
// unnecessary 'text' key repetition: xStream.alias("text", xsd:string.class );
// unnecessary 'text' key repetition: xStream.alias("text", xsd:string.class );
// xStream.alias("question", xsd:string.class );
// xStream.alias("allowedAnswers", xsd:string.class );
// xStream.alias("description", xsd:string.class );
// DMN v1.2:
// Note, to comply with NS for XStream need also to adjust entries inside DMNModelInstrumentedBaseConverter
xStream.alias("annotation", TRuleAnnotationClause.class);
xStream.alias("annotationEntry", TRuleAnnotation.class);
xStream.registerConverter(new RuleAnnotationClauseConverter(xStream));
xStream.registerConverter(new RuleAnnotationConverter(xStream));
xStream.alias("DMNDI", DMNDI.class);
xStream.registerConverter(new DMNDIConverter(xStream));
xStream.alias("DMNDiagram", DMNDiagram.class);
xStream.registerConverter(new DMNDiagramConverter(xStream));
xStream.alias("DMNStyle", DMNStyle.class);
xStream.registerConverter(new DMNStyleConverter(xStream));
xStream.alias("Size", Dimension.class);
xStream.registerConverter(new DimensionConverter(xStream));
xStream.alias("DMNShape", DMNShape.class);
xStream.registerConverter(new DMNShapeConverter(xStream));
xStream.alias("FillColor", Color.class);
xStream.alias("StrokeColor", Color.class);
xStream.alias("FontColor", Color.class);
xStream.registerConverter(new ColorConverter(xStream));
xStream.alias("Bounds", Bounds.class);
xStream.registerConverter(new BoundsConverter(xStream));
xStream.alias("DMNLabel", DMNLabel.class);
xStream.registerConverter(new DMNLabelConverter(xStream));
xStream.alias("DMNEdge", DMNEdge.class);
xStream.registerConverter(new DMNEdgeConverter(xStream));
xStream.alias("DMNDecisionServiceDividerLine", DMNDecisionServiceDividerLine.class);
xStream.registerConverter(new DMNDecisionServiceDividerLineConverter(xStream));
xStream.alias("waypoint", Point.class);
xStream.registerConverter(new PointConverter(xStream));
xStream.alias("extension", DiagramElement.Extension.class);
xStream.alias(DMNLabelConverter.TEXT, String.class);
xStream.alias("for", TFor.class);
xStream.alias("every", TEvery.class);
xStream.alias("some", TSome.class);
xStream.alias("conditional", TConditional.class);
xStream.alias("filter", TFilter.class);
xStream.registerConverter(new AssociationConverter(xStream));
xStream.registerConverter(new AuthorityRequirementConverter(xStream));
xStream.registerConverter(new BindingConverter(xStream));
xStream.registerConverter(new BusinessKnowledgeModelConverter(xStream));
xStream.registerConverter(new ContextConverter(xStream));
xStream.registerConverter(new ContextEntryConverter(xStream));
xStream.registerConverter(new DecisionConverter(xStream));
xStream.registerConverter(new DecisionRuleConverter(xStream));
xStream.registerConverter(new DecisionServiceConverter(xStream));
xStream.registerConverter(new DecisionTableConverter(xStream));
xStream.registerConverter(new DefinitionsConverter(xStream));
xStream.registerConverter(new DMNElementReferenceConverter(xStream));
xStream.registerConverter(new GroupConverter(xStream));
xStream.registerConverter(new FunctionDefinitionConverter(xStream));
xStream.registerConverter(new ImportConverter(xStream));
xStream.registerConverter(new ImportedValuesConverter(xStream));
xStream.registerConverter(new InformationItemConverter(xStream));
xStream.registerConverter(new InformationRequirementConverter(xStream));
xStream.registerConverter(new InputClauseConverter(xStream));
xStream.registerConverter(new InputDataConverter(xStream));
xStream.registerConverter(new InvocationConverter(xStream));
xStream.registerConverter(new ItemDefinitionConverter(xStream));
xStream.registerConverter(new KnowledgeRequirementConverter(xStream));
xStream.registerConverter(new KnowledgeSourceConverter(xStream));
xStream.registerConverter(new LiteralExpressionConverter(xStream));
xStream.registerConverter(new OrganizationUnitConverter(xStream));
xStream.registerConverter(new OutputClauseConverter(xStream));
xStream.registerConverter(new PerformanceIndicatorConverter(xStream));
xStream.registerConverter(new RelationConverter(xStream));
xStream.registerConverter(new TextAnnotationConverter(xStream));
xStream.registerConverter(new UnaryTestsConverter(xStream));
xStream.registerConverter(new FunctionItemConverter(xStream));
xStream.registerConverter(new ChildExpressionConverter(xStream));
xStream.registerConverter(new TypedChildExpressionConverter(xStream));
xStream.registerConverter(new ForConverter(xStream));
xStream.registerConverter(new EveryConverter(xStream));
xStream.registerConverter(new SomeConverter(xStream));
xStream.registerConverter(new ConditionalConverter(xStream));
xStream.registerConverter(new FilterConverter(xStream));
xStream.registerConverter(new QNameConverter());
xStream.registerConverter(new DMNListConverter(xStream));
xStream.registerConverter(new ElementCollectionConverter(xStream));
xStream.registerConverter(new ExtensionElementsConverter(xStream, extensionRegisters));
xStream.registerConverter(new DiagramElementExtensionConverter(xStream, extensionRegisters));
for (DMNExtensionRegister extensionRegister : extensionRegisters) {
extensionRegister.registerExtensionConverters(xStream);
}
xStream.ignoreUnknownElements();
return xStream;
}
Aggregations