diff --git a/kie-wb-common-dmn/.gitignore b/kie-wb-common-dmn/.gitignore
index e9277639889..b99d5feafbf 100644
--- a/kie-wb-common-dmn/.gitignore
+++ b/kie-wb-common-dmn/.gitignore
@@ -13,10 +13,6 @@
# Repository wide ignore mac DS_Store files
.DS_Store
-#Ignore DMN's kogito related work on branch DROOLS-3727
-#Added to simplify switching branches and avoid accidentially committing unrelated work!
-/kie-wb-common-dmn-webapp-kogito-marshaller
-/kie-wb-common-dmn-webapp-kogito-runtime
-/kie-wb-common-dmn-webapp-kogito-testing
-/kie-wb-common-dmn-webapp-standalone
+#This is on master. Ignore to make switching branches easier
+/kie-wb-common-dmn-webapp
diff --git a/kie-wb-common-dmn/README.md b/kie-wb-common-dmn/README.md
new file mode 100644
index 00000000000..842d8c91d9f
--- /dev/null
+++ b/kie-wb-common-dmn/README.md
@@ -0,0 +1,64 @@
+Graphical DMN modeling tool
+===========================
+
+This module contains various children for different purposes.
+
+1) `kie-wb-common-dmn-api`
+
+Common API and UI model used by Business Central and _kogito_.
+
+2) `kie-wb-common-dmn-backend`
+
+Server-side implementation of services relating to marshalling, imports and validation
+used exclusively by Business Central and the `kie-wb-common-webapp-standalone` module.
+
+3) `kie-wb-common-dmn-client`
+
+Common client-side code for the _core_ editor used by Business Central and _kogito_.
+
+4) `kie-wb-common-dmn-project-api`
+
+API specific to integration with Business Central.
+
+5) `kie-wb-common-dmn-project-client`
+
+Client-side code specific to the integration with Business Central.
+
+6) `kie-wb-common-dmn-webapp-common`
+
+Client-side code common to the `kie-wb-common-webapp-standalone` and `kie-wb-common-webapp-kogito-testing`
+modules. Includes _docks_ and diagram _navigator_. This code is not used by Business Central.
+
+7) `kie-wb-common-dmn-webapp-kogito-common`
+
+Substitute implementations of services in `kie-wb-common-dmn-backend` for _kogito_ client-side use.
+
+8) `kie-wb-common-dmn-webapp-kogito-marshaller`
+
+Client-side marshaller for _kogito_.
+
+9) `kie-wb-common-dmn-webapp-kogito-runtime`
+
+Webapp targeting _kogito_ integration with VSCode etc. No decorations.
+
+10) `kie-wb-common-dmn-webapp-kogito-testing`
+
+Webapp used for development of _kogito_ decorated with a diagram _navigator_ to emulate integration with VSCode etc.
+
+11) `kie-wb-common-dmn-webapp-standalone`
+
+Webapp used for development of Business Central integration.
+
+
+The _kogito_ modules are isolated by the `kogito` Maven profile. In order to compile and run a _kogito_ related
+webapp the following steps need to be adhered to.
+
+1) Clone https://github.com/kiegroup/droolsjbpm-build-bootstrap/ and build the `DROOLS-3727` branch.
+
+2) Clone https://github.com/highsource/jsonix and build the `master` branch. Ignore the failure of the compilation of some sub-modules.. enough is compiled for our use.
+
+3) Clone https://github.com/kiegroup/gwt-jsonix-marshallers and build the `master` branch.
+
+4) Compile `kie-wb-common` using the `kogito` profile; e.g. `mvn clean install -Pkogito`
+
+5) Run one of the _kogito_ webapps using `mvn clean process-resources gwt:run`
\ No newline at end of file
diff --git a/kie-wb-common-dmn/kie-wb-common-dmn-api/pom.xml b/kie-wb-common-dmn/kie-wb-common-dmn-api/pom.xml
index 327dc75964d..70fbb8b9260 100644
--- a/kie-wb-common-dmn/kie-wb-common-dmn-api/pom.xml
+++ b/kie-wb-common-dmn/kie-wb-common-dmn-api/pom.xml
@@ -40,33 +40,18 @@
validation-api
-
- org.hibernate
- hibernate-validator
-
-
org.kie.workbench.stunner
kie-wb-common-stunner-core-api
-
- org.kie.workbench.stunner
- kie-wb-common-stunner-client-api
-
-
org.kie.workbench.stunner
kie-wb-common-stunner-core-common
-
- org.kie.workbench.stunner
- kie-wb-common-stunner-shapes-api
- provided
-
-
+
org.kie.workbench.stunner
kie-wb-common-stunner-processors
@@ -83,13 +68,6 @@
kie-wb-common-stunner-forms-api
-
-
- com.google.gwt
- gwt-user
- provided
-
-
org.kie.workbench.forms
@@ -101,6 +79,7 @@
kie-wb-common-forms-adf-base
+
org.kie.workbench.forms
kie-wb-common-forms-adf-processors
@@ -149,11 +128,6 @@
uberfire-api
-
- org.uberfire
- uberfire-commons
-
-
org.uberfire
uberfire-project-api
@@ -170,6 +144,18 @@
kie-dmn-model
+
+
+ org.powermock
+ powermock-api-mockito
+ test
+
+
+
+ com.google.gwt
+ gwt-user
+ test
+
diff --git a/kie-wb-common-dmn/kie-wb-common-dmn-api/src/main/java/org/kie/workbench/common/dmn/api/definition/model/DMNElement.java b/kie-wb-common-dmn/kie-wb-common-dmn-api/src/main/java/org/kie/workbench/common/dmn/api/definition/model/DMNElement.java
index f29d0e4df0d..c558b332068 100644
--- a/kie-wb-common-dmn/kie-wb-common-dmn-api/src/main/java/org/kie/workbench/common/dmn/api/definition/model/DMNElement.java
+++ b/kie-wb-common-dmn/kie-wb-common-dmn-api/src/main/java/org/kie/workbench/common/dmn/api/definition/model/DMNElement.java
@@ -77,13 +77,12 @@ public void setExtensionElements(final ExtensionElements extensionElements) {
this.extensionElements = extensionElements;
}
- //TODO {manstis} The DMN model uses Object not String
@Portable
public static class ExtensionElements extends DMNModelInstrumentedBase {
- protected List any;
+ protected List any;
- public List getAny() {
+ public List getAny() {
if (any == null) {
any = new ArrayList<>();
}
diff --git a/kie-wb-common-dmn/kie-wb-common-dmn-api/src/main/java/org/kie/workbench/common/dmn/api/definition/model/DMNModelInstrumentedBase.java b/kie-wb-common-dmn/kie-wb-common-dmn-api/src/main/java/org/kie/workbench/common/dmn/api/definition/model/DMNModelInstrumentedBase.java
index 50a626ca204..851166b6c0c 100644
--- a/kie-wb-common-dmn/kie-wb-common-dmn-api/src/main/java/org/kie/workbench/common/dmn/api/definition/model/DMNModelInstrumentedBase.java
+++ b/kie-wb-common-dmn/kie-wb-common-dmn-api/src/main/java/org/kie/workbench/common/dmn/api/definition/model/DMNModelInstrumentedBase.java
@@ -109,10 +109,10 @@ public Optional getPrefixForNamespaceURI(final String namespaceURI) {
public String getDefaultNamespace() {
if (nsContext != null && nsContext.containsKey("")) {
return nsContext.entrySet().stream()
- .filter(kv -> Objects.equals(kv.getKey(), ""))
- .findFirst()
- .map(Map.Entry::getValue)
- .get();
+ .filter(kv -> Objects.equals(kv.getKey(), ""))
+ .findFirst()
+ .map(Map.Entry::getValue)
+ .get();
}
if (this.parent != null) {
return parent.getDefaultNamespace();
diff --git a/kie-wb-common-dmn/kie-wb-common-dmn-api/src/main/java/org/kie/workbench/common/dmn/api/definition/model/FunctionDefinition.java b/kie-wb-common-dmn/kie-wb-common-dmn-api/src/main/java/org/kie/workbench/common/dmn/api/definition/model/FunctionDefinition.java
index f29337e0c03..42d8eb08403 100644
--- a/kie-wb-common-dmn/kie-wb-common-dmn-api/src/main/java/org/kie/workbench/common/dmn/api/definition/model/FunctionDefinition.java
+++ b/kie-wb-common-dmn/kie-wb-common-dmn-api/src/main/java/org/kie/workbench/common/dmn/api/definition/model/FunctionDefinition.java
@@ -17,6 +17,7 @@
import java.util.ArrayList;
import java.util.List;
+import java.util.Objects;
import org.jboss.errai.common.client.api.annotations.Portable;
import org.kie.workbench.common.dmn.api.definition.HasExpression;
@@ -148,22 +149,34 @@ public int hashCode() {
@Portable
public enum Kind {
- FEEL("F"),
- JAVA("J"),
- PMML("P");
+ FEEL("F", "FEEL"),
+ JAVA("J", "Java"),
+ PMML("P", "PMML");
private final String code;
+ private final String value;
- Kind(final String code) {
+ Kind(final String code,
+ final String value) {
this.code = code;
+ this.value = value;
}
public String code() {
return code;
}
+ public static Kind fromValue(final String value) {
+ for (Kind kind : Kind.values()) {
+ if (Objects.equals(kind.value, value)) {
+ return kind;
+ }
+ }
+ throw new IllegalArgumentException("FunctionKind [" + value + "] is not supported.");
+ }
+
public static FunctionDefinition.Kind determineFromString(final String code) {
- return code == null ? null : (FEEL.code.equals(code) ? FEEL : (JAVA.code.equals(code) ? JAVA : (PMML.code.equals(code) ? PMML : null)));
+ return code == null ? null : Objects.equals(FEEL.code, code) ? FEEL : (Objects.equals(JAVA.code, code) ? JAVA : (Objects.equals(PMML.code, code) ? PMML : null));
}
}
}
diff --git a/kie-wb-common-dmn/kie-wb-common-dmn-api/src/main/java/org/kie/workbench/common/dmn/api/factory/DMNDiagramFactory.java b/kie-wb-common-dmn/kie-wb-common-dmn-api/src/main/java/org/kie/workbench/common/dmn/api/factory/DMNDiagramFactory.java
index 1b4381295ca..92197752ad9 100644
--- a/kie-wb-common-dmn/kie-wb-common-dmn-api/src/main/java/org/kie/workbench/common/dmn/api/factory/DMNDiagramFactory.java
+++ b/kie-wb-common-dmn/kie-wb-common-dmn-api/src/main/java/org/kie/workbench/common/dmn/api/factory/DMNDiagramFactory.java
@@ -20,8 +20,7 @@
import org.kie.workbench.common.stunner.core.factory.diagram.DiagramFactory;
import org.kie.workbench.common.stunner.core.graph.Graph;
-public interface DMNDiagramFactory
- extends DMNFactory,
- DiagramFactory> {
+public interface DMNDiagramFactory extends DMNFactory,
+ DiagramFactory> {
}
diff --git a/kie-wb-common-dmn/kie-wb-common-dmn-api/src/main/java/org/kie/workbench/common/dmn/api/factory/DMNDiagramFactoryImpl.java b/kie-wb-common-dmn/kie-wb-common-dmn-api/src/main/java/org/kie/workbench/common/dmn/api/factory/DMNDiagramFactoryImpl.java
index eebef0ff0a5..207b19a9aef 100644
--- a/kie-wb-common-dmn/kie-wb-common-dmn-api/src/main/java/org/kie/workbench/common/dmn/api/factory/DMNDiagramFactoryImpl.java
+++ b/kie-wb-common-dmn/kie-wb-common-dmn-api/src/main/java/org/kie/workbench/common/dmn/api/factory/DMNDiagramFactoryImpl.java
@@ -18,7 +18,6 @@
import javax.enterprise.context.Dependent;
import org.kie.workbench.common.dmn.api.DMNDefinitionSet;
-import org.kie.workbench.common.stunner.core.diagram.AbstractDiagram;
import org.kie.workbench.common.stunner.core.diagram.Diagram;
import org.kie.workbench.common.stunner.core.diagram.DiagramImpl;
import org.kie.workbench.common.stunner.core.diagram.Metadata;
@@ -41,12 +40,12 @@ public Class extends Metadata> getMetadataType() {
}
@Override
- public Diagram doBuild(final String name,
- final Metadata metadata,
- final Graph graph) {
- final AbstractDiagram result = new DiagramImpl(name,
- metadata);
- result.setGraph(graph);
+ public Diagram doBuild(final String name,
+ final Metadata metadata,
+ final Graph graph) {
+ final Diagram result = new DiagramImpl(name,
+ graph,
+ metadata);
return result;
}
}
diff --git a/kie-wb-common-dmn/kie-wb-common-dmn-backend/src/main/java/org/kie/workbench/common/dmn/backend/common/DMNImportTypesHelper.java b/kie-wb-common-dmn/kie-wb-common-dmn-api/src/main/java/org/kie/workbench/common/dmn/api/marshalling/DMNImportTypesHelper.java
similarity index 94%
rename from kie-wb-common-dmn/kie-wb-common-dmn-backend/src/main/java/org/kie/workbench/common/dmn/backend/common/DMNImportTypesHelper.java
rename to kie-wb-common-dmn/kie-wb-common-dmn-api/src/main/java/org/kie/workbench/common/dmn/api/marshalling/DMNImportTypesHelper.java
index addf8aa7370..107bc432637 100644
--- a/kie-wb-common-dmn/kie-wb-common-dmn-backend/src/main/java/org/kie/workbench/common/dmn/backend/common/DMNImportTypesHelper.java
+++ b/kie-wb-common-dmn/kie-wb-common-dmn-api/src/main/java/org/kie/workbench/common/dmn/api/marshalling/DMNImportTypesHelper.java
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.kie.workbench.common.dmn.backend.common;
+package org.kie.workbench.common.dmn.api.marshalling;
import org.uberfire.backend.vfs.Path;
diff --git a/kie-wb-common-dmn/kie-wb-common-dmn-api/src/main/java/org/kie/workbench/common/dmn/api/marshalling/DMNMarshallerImportsHelper.java b/kie-wb-common-dmn/kie-wb-common-dmn-api/src/main/java/org/kie/workbench/common/dmn/api/marshalling/DMNMarshallerImportsHelper.java
new file mode 100644
index 00000000000..d3c07a71e61
--- /dev/null
+++ b/kie-wb-common-dmn/kie-wb-common-dmn-api/src/main/java/org/kie/workbench/common/dmn/api/marshalling/DMNMarshallerImportsHelper.java
@@ -0,0 +1,103 @@
+/*
+ * Copyright 2019 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.kie.workbench.common.dmn.api.marshalling;
+
+import java.io.InputStream;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+
+import org.guvnor.common.services.project.model.WorkspaceProject;
+import org.kie.workbench.common.dmn.api.editors.included.PMMLDocumentMetadata;
+import org.kie.workbench.common.stunner.core.diagram.Metadata;
+import org.uberfire.backend.vfs.Path;
+
+/**
+ * This helper provides methods to handle imports into the DMNMarshaller.
+ */
+public interface DMNMarshallerImportsHelper {
+
+ /**
+ * This method loads all imported DMN definitions from a list of imports.
+ * @param metadata represents the metadata from the main DMN model.
+ * @param imports represent the list of imported files.
+ * @return a map {@link DEFINITIONS} indexed by {@link IMPORT}s.
+ */
+ Map getImportDefinitions(final Metadata metadata,
+ final List imports);
+
+ /**
+ * This method loads all imported PMML documents from a list of imports.
+ * @param metadata represents the metadata from the main DMN model.
+ * @param imports represent the list of imported files.
+ * @return a map {@link PMMLDocumentMetadata} indexed by {@link IMPORT}s.
+ */
+ Map getPMMLDocuments(final Metadata metadata,
+ final List imports);
+
+ /**
+ * This method loads {@link String} of all imported XML files from a list of imports.
+ * @param metadata represents the metadata from the main DMN model.
+ * @param imports represent the list of imported files.
+ * @return a map {@link String} indexed by {@link IMPORT}s.
+ */
+ Map getImportXML(final Metadata metadata,
+ final List imports);
+
+ /**
+ * This method extract a list of {@link DRGELEMENT}s from the importDefinitions
map.
+ * @param importDefinitions is a map of {@link DEFINITIONS} indexed by {@link IMPORT}.
+ * @return a list of imported {@link DRGELEMENT}s.
+ */
+ List getImportedDRGElements(final Map importDefinitions);
+
+ /**
+ * This method extract a list of {@link ITEMDEFINITION} from the importDefinitions
map.
+ * @param importDefinitions is a map of {@link DEFINITIONS} indexed by {@link IMPORT}.
+ * @return a list of imported {@link ITEMDEFINITION}s.
+ */
+ List getImportedItemDefinitions(final Map importDefinitions);
+
+ /**
+ * This method finds the list of {@link ITEMDEFINITION}s for a given namespace
.
+ * @param workspaceProject represents the project that will be scanned.
+ * @param modelName is the value used as the prefix for imported {@link ITEMDEFINITION}s.
+ * @param namespace is the namespace of the model that provides the list of {@link ITEMDEFINITION}s.
+ * @return a list of imported {@link ITEMDEFINITION}s.
+ */
+ List getImportedItemDefinitionsByNamespace(final WorkspaceProject workspaceProject,
+ final String modelName,
+ final String namespace);
+
+ /**
+ * This method finds the {@link Path} of DMN model.
+ * @param metadata represents the metadata from the a DMN model from the scanned project.
+ * @param modelNamespace represents the namespace of the desired DMN model.
+ * @param modelName represents the mode name of the desired DMN model.
+ * @return the {@link Path} of the desired DMN model.
+ */
+ Path getDMNModelPath(final Metadata metadata,
+ final String modelNamespace,
+ final String modelName);
+
+ /**
+ * This method loads the {@link InputStream} from a given {@link org.uberfire.backend.vfs.Path}.
+ * @param path to be loaded.
+ * @return the {@link InputStream} when the path is valid, otherwise is returns empty.
+ */
+ Optional loadPath(final Path path);
+}
diff --git a/kie-wb-common-dmn/kie-wb-common-dmn-backend/src/main/java/org/kie/workbench/common/dmn/backend/common/DMNPathsHelper.java b/kie-wb-common-dmn/kie-wb-common-dmn-api/src/main/java/org/kie/workbench/common/dmn/api/marshalling/DMNPathsHelper.java
similarity index 97%
rename from kie-wb-common-dmn/kie-wb-common-dmn-backend/src/main/java/org/kie/workbench/common/dmn/backend/common/DMNPathsHelper.java
rename to kie-wb-common-dmn/kie-wb-common-dmn-api/src/main/java/org/kie/workbench/common/dmn/api/marshalling/DMNPathsHelper.java
index 45695bff8da..b9fed0fde5d 100644
--- a/kie-wb-common-dmn/kie-wb-common-dmn-backend/src/main/java/org/kie/workbench/common/dmn/backend/common/DMNPathsHelper.java
+++ b/kie-wb-common-dmn/kie-wb-common-dmn-api/src/main/java/org/kie/workbench/common/dmn/api/marshalling/DMNPathsHelper.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.kie.workbench.common.dmn.backend.common;
+package org.kie.workbench.common.dmn.api.marshalling;
import java.util.List;
diff --git a/kie-wb-common-dmn/kie-wb-common-dmn-api/src/main/resources/org/kie/workbench/common/dmn/DMNAPI.gwt.xml b/kie-wb-common-dmn/kie-wb-common-dmn-api/src/main/resources/org/kie/workbench/common/dmn/DMNAPI.gwt.xml
index c6a0973c62b..286fa5a95f0 100644
--- a/kie-wb-common-dmn/kie-wb-common-dmn-api/src/main/resources/org/kie/workbench/common/dmn/DMNAPI.gwt.xml
+++ b/kie-wb-common-dmn/kie-wb-common-dmn-api/src/main/resources/org/kie/workbench/common/dmn/DMNAPI.gwt.xml
@@ -22,7 +22,7 @@
-
+
diff --git a/kie-wb-common-dmn/kie-wb-common-dmn-api/src/test/java/org/kie/workbench/common/dmn/api/factory/DMNDiagramFactoryImplTest.java b/kie-wb-common-dmn/kie-wb-common-dmn-api/src/test/java/org/kie/workbench/common/dmn/api/factory/DMNDiagramFactoryImplTest.java
index 793b33aca53..3c9e656ee28 100644
--- a/kie-wb-common-dmn/kie-wb-common-dmn-api/src/test/java/org/kie/workbench/common/dmn/api/factory/DMNDiagramFactoryImplTest.java
+++ b/kie-wb-common-dmn/kie-wb-common-dmn-api/src/test/java/org/kie/workbench/common/dmn/api/factory/DMNDiagramFactoryImplTest.java
@@ -27,7 +27,6 @@
import org.kie.workbench.common.stunner.core.diagram.Diagram;
import org.kie.workbench.common.stunner.core.diagram.Metadata;
import org.kie.workbench.common.stunner.core.graph.Edge;
-import org.kie.workbench.common.stunner.core.graph.Graph;
import org.kie.workbench.common.stunner.core.graph.Node;
import org.kie.workbench.common.stunner.core.graph.content.Bounds;
import org.kie.workbench.common.stunner.core.graph.content.definition.DefinitionSet;
@@ -77,7 +76,7 @@ private Node newNode(final Object definition) {
@Test
@SuppressWarnings("unchecked")
public void testDefaultNameSpaces() {
- final Diagram diagram = factory.build(NAME, metadata, graph);
+ final Diagram diagram = factory.build(NAME, metadata, graph);
//We can safely get the first object on the iterator as we know the graph only contains one node
final Node root = (Node) diagram.getGraph().nodes().iterator().next();
@@ -118,7 +117,7 @@ public void testDefaultNameSpaces() {
@Test
@SuppressWarnings("unchecked")
public void testModelName() {
- final Diagram diagram = factory.build(NAME, metadata, graph);
+ final Diagram diagram = factory.build(NAME, metadata, graph);
//We can safely get the first object on the iterator as we know the graph only contains one node
final Node root = (Node) diagram.getGraph().nodes().iterator().next();
@@ -137,7 +136,7 @@ public void testModelNameWithNonEmptyExistingName() {
final Definitions existingDMNDefinitions = existingDMNDiagram.getDefinitions();
existingDMNDefinitions.getName().setValue(EXISTING_NAME);
- final Diagram newDiagram = factory.build(NAME, metadata, graph);
+ final Diagram newDiagram = factory.build(NAME, metadata, graph);
final Node newRoot = (Node) newDiagram.getGraph().nodes().iterator().next();
final DMNDiagram newDMNDiagram = (DMNDiagram) newRoot.getContent().getDefinition();
final Definitions newDMNDefinitions = newDMNDiagram.getDefinitions();
diff --git a/kie-wb-common-dmn/kie-wb-common-dmn-backend/pom.xml b/kie-wb-common-dmn/kie-wb-common-dmn-backend/pom.xml
index 31b6686d565..cd462f60254 100644
--- a/kie-wb-common-dmn/kie-wb-common-dmn-backend/pom.xml
+++ b/kie-wb-common-dmn/kie-wb-common-dmn-backend/pom.xml
@@ -110,16 +110,6 @@
errai-bus
-
- org.jboss.errai
- errai-config
-
-
-
- org.jboss.errai
- errai-security-server
-
-
org.uberfire
uberfire-commons
@@ -150,11 +140,6 @@
kie-dmn-validation
-
- org.antlr
- antlr4-runtime
-
-
org.uberfire
uberfire-nio2-api
@@ -165,11 +150,6 @@
uberfire-nio2-model
-
- org.uberfire
- uberfire-backend-api
-
-
org.uberfire
uberfire-backend-server
@@ -185,12 +165,6 @@
uberfire-io
-
- org.jboss.spec.javax.servlet
- jboss-servlet-api_3.1_spec
- provided
-
-
javax.inject
@@ -204,16 +178,6 @@
provided
-
- org.uberfire
- uberfire-commons-editor-backend
-
-
-
- org.apache.commons
- commons-lang3
-
-
org.slf4j
slf4j-api
@@ -263,12 +227,6 @@
test-jar
-
- org.uberfire
- uberfire-testing-utils
- test
-
-
org.slf4j
slf4j-simple
@@ -294,6 +252,18 @@
test
+
+ org.apache.commons
+ commons-lang3
+ test
+
+
+
+ org.apache.ant
+ ant
+ test
+
+
diff --git a/kie-wb-common-dmn/kie-wb-common-dmn-backend/src/main/java/org/kie/workbench/common/dmn/backend/DMNBackendService.java b/kie-wb-common-dmn/kie-wb-common-dmn-backend/src/main/java/org/kie/workbench/common/dmn/backend/DMNBackendService.java
index 0ed7b3a4a86..3d84eebfd2f 100644
--- a/kie-wb-common-dmn/kie-wb-common-dmn-backend/src/main/java/org/kie/workbench/common/dmn/backend/DMNBackendService.java
+++ b/kie-wb-common-dmn/kie-wb-common-dmn-backend/src/main/java/org/kie/workbench/common/dmn/backend/DMNBackendService.java
@@ -33,7 +33,7 @@ protected DMNBackendService() {
}
@Inject
- public DMNBackendService(final DMNMarshaller marshaller,
+ public DMNBackendService(final DMNMarshallerStandalone marshaller,
final DMNDefinitionSetResourceType resourceType) {
super(marshaller);
this.resourceType = resourceType;
diff --git a/kie-wb-common-dmn/kie-wb-common-dmn-backend/src/main/java/org/kie/workbench/common/dmn/backend/DMNMarshaller.java b/kie-wb-common-dmn/kie-wb-common-dmn-backend/src/main/java/org/kie/workbench/common/dmn/backend/DMNMarshaller.java
deleted file mode 100644
index 066e56ff5ec..00000000000
--- a/kie-wb-common-dmn/kie-wb-common-dmn-backend/src/main/java/org/kie/workbench/common/dmn/backend/DMNMarshaller.java
+++ /dev/null
@@ -1,1244 +0,0 @@
-/*
- * Copyright 2017 Red Hat, Inc. and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.kie.workbench.common.dmn.backend;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.util.AbstractMap.SimpleEntry;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.Set;
-import java.util.function.BiConsumer;
-import java.util.function.Consumer;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-import java.util.stream.StreamSupport;
-
-import javax.enterprise.context.ApplicationScoped;
-import javax.inject.Inject;
-import javax.xml.namespace.QName;
-
-import org.jboss.errai.marshalling.server.ServerMarshalling;
-import org.kie.dmn.model.api.Import;
-import org.kie.dmn.model.api.dmndi.Bounds;
-import org.kie.dmn.model.api.dmndi.Color;
-import org.kie.dmn.model.api.dmndi.DMNDecisionServiceDividerLine;
-import org.kie.dmn.model.api.dmndi.DMNEdge;
-import org.kie.dmn.model.api.dmndi.DMNShape;
-import org.kie.dmn.model.api.dmndi.DMNStyle;
-import org.kie.dmn.model.api.dmndi.Point;
-import org.kie.dmn.model.v1_2.dmndi.DMNDI;
-import org.kie.dmn.model.v1_2.dmndi.DiagramElement;
-import org.kie.workbench.common.dmn.api.DMNDefinitionSet;
-import org.kie.workbench.common.dmn.api.definition.DMNViewDefinition;
-import org.kie.workbench.common.dmn.api.definition.HasComponentWidths;
-import org.kie.workbench.common.dmn.api.definition.model.Association;
-import org.kie.workbench.common.dmn.api.definition.model.BusinessKnowledgeModel;
-import org.kie.workbench.common.dmn.api.definition.model.DMNDiagram;
-import org.kie.workbench.common.dmn.api.definition.model.DMNElement;
-import org.kie.workbench.common.dmn.api.definition.model.DMNModelInstrumentedBase;
-import org.kie.workbench.common.dmn.api.definition.model.DRGElement;
-import org.kie.workbench.common.dmn.api.definition.model.Decision;
-import org.kie.workbench.common.dmn.api.definition.model.DecisionService;
-import org.kie.workbench.common.dmn.api.definition.model.Definitions;
-import org.kie.workbench.common.dmn.api.definition.model.InputData;
-import org.kie.workbench.common.dmn.api.definition.model.ItemDefinition;
-import org.kie.workbench.common.dmn.api.definition.model.KnowledgeSource;
-import org.kie.workbench.common.dmn.api.definition.model.TextAnnotation;
-import org.kie.workbench.common.dmn.api.editors.included.PMMLDocumentMetadata;
-import org.kie.workbench.common.dmn.api.property.background.BackgroundSet;
-import org.kie.workbench.common.dmn.api.property.background.BgColour;
-import org.kie.workbench.common.dmn.api.property.background.BorderColour;
-import org.kie.workbench.common.dmn.api.property.dimensions.Height;
-import org.kie.workbench.common.dmn.api.property.dimensions.RectangleDimensionsSet;
-import org.kie.workbench.common.dmn.api.property.dimensions.Width;
-import org.kie.workbench.common.dmn.api.property.dmn.DecisionServiceDividerLineY;
-import org.kie.workbench.common.dmn.api.property.dmn.Description;
-import org.kie.workbench.common.dmn.api.property.dmn.Id;
-import org.kie.workbench.common.dmn.api.property.font.FontSet;
-import org.kie.workbench.common.dmn.backend.common.DMNMarshallerImportsHelper;
-import org.kie.workbench.common.dmn.backend.common.DMNMarshallerImportsHelperImpl;
-import org.kie.workbench.common.dmn.backend.definition.v1_1.AssociationConverter;
-import org.kie.workbench.common.dmn.backend.definition.v1_1.BusinessKnowledgeModelConverter;
-import org.kie.workbench.common.dmn.backend.definition.v1_1.DecisionConverter;
-import org.kie.workbench.common.dmn.backend.definition.v1_1.DecisionServiceConverter;
-import org.kie.workbench.common.dmn.backend.definition.v1_1.DefinitionsConverter;
-import org.kie.workbench.common.dmn.backend.definition.v1_1.InputDataConverter;
-import org.kie.workbench.common.dmn.backend.definition.v1_1.ItemDefinitionPropertyConverter;
-import org.kie.workbench.common.dmn.backend.definition.v1_1.KnowledgeSourceConverter;
-import org.kie.workbench.common.dmn.backend.definition.v1_1.TextAnnotationConverter;
-import org.kie.workbench.common.dmn.backend.definition.v1_1.dd.ColorUtils;
-import org.kie.workbench.common.dmn.backend.definition.v1_1.dd.ComponentWidths;
-import org.kie.workbench.common.dmn.backend.definition.v1_1.dd.ComponentsWidthsExtension;
-import org.kie.workbench.common.dmn.backend.definition.v1_1.dd.FontSetPropertyConverter;
-import org.kie.workbench.common.dmn.backend.definition.v1_1.dd.PointUtils;
-import org.kie.workbench.common.forms.adf.definitions.DynamicReadOnly;
-import org.kie.workbench.common.stunner.core.api.FactoryManager;
-import org.kie.workbench.common.stunner.core.backend.service.XMLEncoderDiagramMetadataMarshaller;
-import org.kie.workbench.common.stunner.core.definition.adapter.binding.BindableAdapterUtils;
-import org.kie.workbench.common.stunner.core.definition.service.DiagramMarshaller;
-import org.kie.workbench.common.stunner.core.definition.service.DiagramMetadataMarshaller;
-import org.kie.workbench.common.stunner.core.diagram.Diagram;
-import org.kie.workbench.common.stunner.core.diagram.Metadata;
-import org.kie.workbench.common.stunner.core.graph.Edge;
-import org.kie.workbench.common.stunner.core.graph.Graph;
-import org.kie.workbench.common.stunner.core.graph.Node;
-import org.kie.workbench.common.stunner.core.graph.content.Bound;
-import org.kie.workbench.common.stunner.core.graph.content.relationship.Child;
-import org.kie.workbench.common.stunner.core.graph.content.view.Connection;
-import org.kie.workbench.common.stunner.core.graph.content.view.ControlPoint;
-import org.kie.workbench.common.stunner.core.graph.content.view.MagnetConnection;
-import org.kie.workbench.common.stunner.core.graph.content.view.Point2D;
-import org.kie.workbench.common.stunner.core.graph.content.view.View;
-import org.kie.workbench.common.stunner.core.graph.content.view.ViewConnector;
-import org.kie.workbench.common.stunner.core.graph.impl.EdgeImpl;
-import org.kie.workbench.common.stunner.core.util.DefinitionUtils;
-import org.kie.workbench.common.stunner.core.util.StringUtils;
-import org.kie.workbench.common.stunner.core.util.UUID;
-
-import static java.util.Collections.emptyList;
-import static java.util.stream.Collectors.toMap;
-import static org.kie.workbench.common.dmn.backend.definition.v1_1.dd.PointUtils.heightOfShape;
-import static org.kie.workbench.common.dmn.backend.definition.v1_1.dd.PointUtils.lowerRightBound;
-import static org.kie.workbench.common.dmn.backend.definition.v1_1.dd.PointUtils.upperLeftBound;
-import static org.kie.workbench.common.dmn.backend.definition.v1_1.dd.PointUtils.widthOfShape;
-import static org.kie.workbench.common.dmn.backend.definition.v1_1.dd.PointUtils.xOfBound;
-import static org.kie.workbench.common.dmn.backend.definition.v1_1.dd.PointUtils.xOfShape;
-import static org.kie.workbench.common.dmn.backend.definition.v1_1.dd.PointUtils.yOfBound;
-import static org.kie.workbench.common.dmn.backend.definition.v1_1.dd.PointUtils.yOfShape;
-import static org.kie.workbench.common.stunner.core.definition.adapter.binding.BindableAdapterUtils.getDefinitionId;
-
-@ApplicationScoped
-public class DMNMarshaller implements DiagramMarshaller> {
-
- private static final double CENTRE_TOLERANCE = 1.0;
-
- private XMLEncoderDiagramMetadataMarshaller diagramMetadataMarshaller;
- private FactoryManager factoryManager;
- private InputDataConverter inputDataConverter;
- private DecisionConverter decisionConverter;
- private BusinessKnowledgeModelConverter bkmConverter;
- private KnowledgeSourceConverter knowledgeSourceConverter;
- private TextAnnotationConverter textAnnotationConverter;
- private DecisionServiceConverter decisionServiceConverter;
- private org.kie.dmn.api.marshalling.DMNMarshaller marshaller;
- private DMNMarshallerImportsHelper dmnMarshallerImportsHelper;
-
- protected DMNMarshaller() {
- this(null, null, null, null);
- }
-
- @Inject
- public DMNMarshaller(final XMLEncoderDiagramMetadataMarshaller diagramMetadataMarshaller,
- final FactoryManager factoryManager,
- final DMNMarshallerImportsHelper dmnMarshallerImportsHelper,
- final org.kie.dmn.api.marshalling.DMNMarshaller marshaller) {
- this.diagramMetadataMarshaller = diagramMetadataMarshaller;
- this.factoryManager = factoryManager;
- this.dmnMarshallerImportsHelper = dmnMarshallerImportsHelper;
- this.marshaller = marshaller;
- this.inputDataConverter = new InputDataConverter(factoryManager);
- this.decisionConverter = new DecisionConverter(factoryManager);
- this.bkmConverter = new BusinessKnowledgeModelConverter(factoryManager);
- this.knowledgeSourceConverter = new KnowledgeSourceConverter(factoryManager);
- this.textAnnotationConverter = new TextAnnotationConverter(factoryManager);
- this.decisionServiceConverter = new DecisionServiceConverter(factoryManager);
- }
-
- @Deprecated
- public Graph unmarshallFromStunnerJSON(final Metadata metadata,
- final InputStream input) throws IOException {
- Graph result = (Graph) ServerMarshalling.fromJSON(input);
- return result;
- }
-
- @Deprecated
- public String marshallFromStunnerToJSON(final Diagram diagram) throws IOException {
- String result = ServerMarshalling.toJSON(diagram.getGraph());
- return result;
- }
-
- private static Optional findDMNDiagram(org.kie.dmn.model.api.Definitions dmnXml) {
- if (!(dmnXml instanceof org.kie.dmn.model.v1_2.TDefinitions)) {
- return Optional.empty();
- }
- if (dmnXml.getDMNDI() == null) {
- return Optional.empty();
- }
- List elems = dmnXml.getDMNDI().getDMNDiagram();
- if (elems.size() != 1) {
- return Optional.empty();
- } else {
- return Optional.of(elems.get(0));
- }
- }
-
- public static final String INFO_REQ_ID = getDefinitionId(org.kie.workbench.common.dmn.api.definition.model.InformationRequirement.class);
- public static final String KNOWLEDGE_REQ_ID = getDefinitionId(org.kie.workbench.common.dmn.api.definition.model.KnowledgeRequirement.class);
- public static final String AUTH_REQ_ID = getDefinitionId(org.kie.workbench.common.dmn.api.definition.model.AuthorityRequirement.class);
- public static final String ASSOCIATION_ID = getDefinitionId(Association.class);
-
- @Override
- @SuppressWarnings("unchecked")
- public Graph unmarshall(final Metadata metadata,
- final InputStream input) throws IOException {
- final Map hasComponentWidthsMap = new HashMap<>();
- final BiConsumer hasComponentWidthsConsumer = (uuid, hcw) -> {
- if (Objects.nonNull(uuid)) {
- hasComponentWidthsMap.put(uuid, hcw);
- }
- };
-
- final org.kie.dmn.model.api.Definitions dmnXml = marshaller.unmarshal(new InputStreamReader(input));
- final List diagramDrgElements = dmnXml.getDrgElement();
- final Optional dmnDDDiagram = findDMNDiagram(dmnXml);
-
- // Get external DMN model information
- final Map importDefinitions = dmnMarshallerImportsHelper.getImportDefinitions(metadata, dmnXml.getImport());
-
- // Get external PMML model information
- final Map pmmlDocuments = dmnMarshallerImportsHelper.getPMMLDocuments(metadata, dmnXml.getImport());
-
- // Map external DRGElements
- final List dmnShapes = dmnDDDiagram.map(this::getUniqueDMNShapes).orElse(emptyList());
- final List importedDrgElements = getImportedDrgElementsByShape(dmnShapes, importDefinitions, dmnXml);
-
- // Group DRGElements
- final List drgElements = new ArrayList<>();
- drgElements.addAll(diagramDrgElements);
- drgElements.addAll(importedDrgElements);
-
- // Remove DRGElements that doesn't have any local or imported shape.
- removeDrgElementsWithoutShape(drgElements, dmnShapes);
-
- Map> elems = drgElements.stream().collect(toMap(org.kie.dmn.model.api.DRGElement::getId,
- dmn -> new SimpleEntry<>(dmn,
- dmnToStunner(dmn, hasComponentWidthsConsumer, importedDrgElements))));
-
- Set dmnDecisionServices = new HashSet<>();
-
- // Stunner rely on relative positioning for Edge connections, so need to cycle on DMNShape first.
- for (Entry kv : elems.values()) {
- ddExtAugmentStunner(dmnDDDiagram, kv.getValue());
- }
-
- // Setup Node Relationships and Connections all based on absolute positioning
- for (Entry kv : elems.values()) {
- org.kie.dmn.model.api.DRGElement elem = kv.getKey();
- Node currentNode = kv.getValue();
-
- // For imported nodes, we don't have its connections
- if (isImportedDRGElement(importedDrgElements, elem)) {
- continue;
- }
-
- // DMN spec table 2: Requirements connection rules
- if (elem instanceof org.kie.dmn.model.api.Decision) {
- org.kie.dmn.model.api.Decision decision = (org.kie.dmn.model.api.Decision) elem;
- for (org.kie.dmn.model.api.InformationRequirement ir : decision.getInformationRequirement()) {
- if (ir.getRequiredInput() != null) {
- String reqInputID = getId(ir.getRequiredInput());
- Node requiredNode = getRequiredNode(elems, reqInputID);
- Edge myEdge = factoryManager.newElement(idOfDMNorWBUUID(ir),
- INFO_REQ_ID).asEdge();
- connectEdge(myEdge,
- requiredNode,
- currentNode);
- setConnectionMagnets(myEdge, ir.getId(), dmnXml);
- }
- if (ir.getRequiredDecision() != null) {
- String reqInputID = getId(ir.getRequiredDecision());
- Node requiredNode = getRequiredNode(elems, reqInputID);
- Edge myEdge = factoryManager.newElement(idOfDMNorWBUUID(ir),
- INFO_REQ_ID).asEdge();
- connectEdge(myEdge,
- requiredNode,
- currentNode);
- setConnectionMagnets(myEdge, ir.getId(), dmnXml);
- }
- }
- for (org.kie.dmn.model.api.KnowledgeRequirement kr : decision.getKnowledgeRequirement()) {
- String reqInputID = getId(kr.getRequiredKnowledge());
- Node requiredNode = getRequiredNode(elems, reqInputID);
- Edge myEdge = factoryManager.newElement(idOfDMNorWBUUID(kr),
- KNOWLEDGE_REQ_ID).asEdge();
- connectEdge(myEdge,
- requiredNode,
- currentNode);
- setConnectionMagnets(myEdge, kr.getId(), dmnXml);
- }
- for (org.kie.dmn.model.api.AuthorityRequirement kr : decision.getAuthorityRequirement()) {
- String reqInputID = getId(kr.getRequiredAuthority());
- Node requiredNode = getRequiredNode(elems, reqInputID);
- Edge myEdge = factoryManager.newElement(idOfDMNorWBUUID(kr),
- AUTH_REQ_ID).asEdge();
- connectEdge(myEdge,
- requiredNode,
- currentNode);
- setConnectionMagnets(myEdge, kr.getId(), dmnXml);
- }
- } else if (elem instanceof org.kie.dmn.model.api.BusinessKnowledgeModel) {
- org.kie.dmn.model.api.BusinessKnowledgeModel bkm = (org.kie.dmn.model.api.BusinessKnowledgeModel) elem;
- for (org.kie.dmn.model.api.KnowledgeRequirement kr : bkm.getKnowledgeRequirement()) {
- String reqInputID = getId(kr.getRequiredKnowledge());
- Node requiredNode = getRequiredNode(elems, reqInputID);
- Edge myEdge = factoryManager.newElement(idOfDMNorWBUUID(kr),
- KNOWLEDGE_REQ_ID).asEdge();
- connectEdge(myEdge,
- requiredNode,
- currentNode);
- setConnectionMagnets(myEdge, kr.getId(), dmnXml);
- }
- for (org.kie.dmn.model.api.AuthorityRequirement kr : bkm.getAuthorityRequirement()) {
- String reqInputID = getId(kr.getRequiredAuthority());
- Node requiredNode = getRequiredNode(elems, reqInputID);
- Edge myEdge = factoryManager.newElement(idOfDMNorWBUUID(kr),
- AUTH_REQ_ID).asEdge();
- connectEdge(myEdge,
- requiredNode,
- currentNode);
- setConnectionMagnets(myEdge, kr.getId(), dmnXml);
- }
- } else if (elem instanceof org.kie.dmn.model.api.KnowledgeSource) {
- org.kie.dmn.model.api.KnowledgeSource ks = (org.kie.dmn.model.api.KnowledgeSource) elem;
- for (org.kie.dmn.model.api.AuthorityRequirement ir : ks.getAuthorityRequirement()) {
- if (ir.getRequiredInput() != null) {
- String reqInputID = getId(ir.getRequiredInput());
- Node requiredNode = getRequiredNode(elems, reqInputID);
- Edge myEdge = factoryManager.newElement(idOfDMNorWBUUID(ir),
- AUTH_REQ_ID).asEdge();
- connectEdge(myEdge,
- requiredNode,
- currentNode);
- setConnectionMagnets(myEdge, ir.getId(), dmnXml);
- }
- if (ir.getRequiredDecision() != null) {
- String reqInputID = getId(ir.getRequiredDecision());
- Node requiredNode = getRequiredNode(elems, reqInputID);
- Edge myEdge = factoryManager.newElement(idOfDMNorWBUUID(ir),
- AUTH_REQ_ID).asEdge();
- connectEdge(myEdge,
- requiredNode,
- currentNode);
- setConnectionMagnets(myEdge, ir.getId(), dmnXml);
- }
- if (ir.getRequiredAuthority() != null) {
- String reqInputID = getId(ir.getRequiredAuthority());
- Node requiredNode = getRequiredNode(elems, reqInputID);
- Edge myEdge = factoryManager.newElement(idOfDMNorWBUUID(ir),
- AUTH_REQ_ID).asEdge();
- connectEdge(myEdge,
- requiredNode,
- currentNode);
- setConnectionMagnets(myEdge, ir.getId(), dmnXml);
- }
- }
- } else if (elem instanceof org.kie.dmn.model.api.DecisionService) {
- org.kie.dmn.model.api.DecisionService ds = (org.kie.dmn.model.api.DecisionService) elem;
- dmnDecisionServices.add(ds);
- for (org.kie.dmn.model.api.DMNElementReference er : ds.getEncapsulatedDecision()) {
- final String reqInputID = getId(er);
- final Node requiredNode = getRequiredNode(elems, reqInputID);
- connectDSChildEdge(currentNode, requiredNode);
- }
- for (org.kie.dmn.model.api.DMNElementReference er : ds.getOutputDecision()) {
- final String reqInputID = getId(er);
- final Node requiredNode = getRequiredNode(elems, reqInputID);
- connectDSChildEdge(currentNode, requiredNode);
- }
- }
- }
-
- Map, ?>> textAnnotations = dmnXml.getArtifact().stream()
- .filter(org.kie.dmn.model.api.TextAnnotation.class::isInstance)
- .map(org.kie.dmn.model.api.TextAnnotation.class::cast)
- .collect(Collectors.toMap(org.kie.dmn.model.api.TextAnnotation::getId,
- dmn -> textAnnotationConverter.nodeFromDMN(dmn,
- hasComponentWidthsConsumer)));
- textAnnotations.values().forEach(n -> ddExtAugmentStunner(dmnDDDiagram, n));
-
- List associations = dmnXml.getArtifact().stream()
- .filter(org.kie.dmn.model.api.Association.class::isInstance)
- .map(org.kie.dmn.model.api.Association.class::cast)
- .collect(Collectors.toList());
- for (org.kie.dmn.model.api.Association a : associations) {
- String sourceId = getId(a.getSourceRef());
- Node sourceNode = Optional.ofNullable(elems.get(sourceId)).map(Entry::getValue).orElse(textAnnotations.get(sourceId));
-
- String targetId = getId(a.getTargetRef());
- Node targetNode = Optional.ofNullable(elems.get(targetId)).map(Entry::getValue).orElse(textAnnotations.get(targetId));
-
- @SuppressWarnings("unchecked")
- Edge, ?> myEdge = (Edge, ?>) factoryManager.newElement(idOfDMNorWBUUID(a),
- ASSOCIATION_ID).asEdge();
-
- Id id = new Id(a.getId());
- Description description = new Description(a.getDescription());
- Association definition = new Association(id,
- description);
- myEdge.getContent().setDefinition(definition);
-
- connectEdge(myEdge,
- sourceNode,
- targetNode);
- setConnectionMagnets(myEdge, a.getId(), dmnXml);
- }
-
- //Ensure all locations are updated to relative for Stunner
- for (Entry kv : elems.values()) {
- PointUtils.convertToRelativeBounds(kv.getValue());
- }
-
- Graph graph = factoryManager.newDiagram("prova",
- BindableAdapterUtils.getDefinitionSetId(DMNDefinitionSet.class),
- metadata).getGraph();
- elems.values().stream().map(Map.Entry::getValue).forEach(graph::addNode);
- textAnnotations.values().forEach(graph::addNode);
-
- Node, ?> dmnDiagramRoot = findDMNDiagramRoot(graph);
- Definitions definitionsStunnerPojo = DefinitionsConverter.wbFromDMN(dmnXml, importDefinitions, pmmlDocuments);
- loadImportedItemDefinitions(definitionsStunnerPojo, importDefinitions);
- ((View) dmnDiagramRoot.getContent()).getDefinition().setDefinitions(definitionsStunnerPojo);
-
- //Only connect Nodes to the Diagram that are not referenced by DecisionServices
- final List references = new ArrayList<>();
- dmnDecisionServices.forEach(ds -> references.addAll(ds.getEncapsulatedDecision().stream().map(org.kie.dmn.model.api.DMNElementReference::getHref).collect(Collectors.toList())));
- dmnDecisionServices.forEach(ds -> references.addAll(ds.getOutputDecision().stream().map(org.kie.dmn.model.api.DMNElementReference::getHref).collect(Collectors.toList())));
-
- final Map elemsToConnectToRoot = elems.values().stream()
- .filter(elem -> !references.contains("#" + elem.getKey().getId()))
- .collect(Collectors.toMap(Entry::getKey, Entry::getValue));
- elemsToConnectToRoot.values().stream()
- .forEach(node -> connectRootWithChild(dmnDiagramRoot,
- node));
-
- textAnnotations.values().stream().forEach(node -> connectRootWithChild(dmnDiagramRoot,
- node));
-
- //Copy ComponentWidths information
- final Optional extension = findComponentsWidthsExtension(dmnDDDiagram);
- extension.ifPresent(componentsWidthsExtension -> {
- //This condition is required because a node with ComponentsWidthsExtension
- //can be imported from another diagram but the extension is not imported or present in this diagram.
- //TODO: This will be fixed in this JIRA: https://issues.jboss.org/browse/DROOLS-3934
- if (componentsWidthsExtension.getComponentsWidths() != null) {
- hasComponentWidthsMap.entrySet().forEach(es -> {
- componentsWidthsExtension
- .getComponentsWidths()
- .stream()
- .filter(componentWidths -> componentWidths.getDmnElementRef().getLocalPart().equals(es.getKey()))
- .findFirst()
- .ifPresent(componentWidths -> {
- final List widths = es.getValue().getComponentWidths();
- widths.clear();
- widths.addAll(componentWidths.getWidths());
- });
- });
- }
- });
-
- return graph;
- }
-
- void removeDrgElementsWithoutShape(
- final List drgElements,
- final List dmnShapes) {
-
- if (dmnShapes.size() == 0) {
- // DMN 1.1 doesn't have DMNShape, so we include all DRGElements and create all the shapes.
- return;
- }
-
- drgElements.removeIf(element -> !dmnShapes.stream()
- .filter(s -> Objects.equals(s.getDmnElementRef().getLocalPart(), element.getId()))
- .findFirst()
- .isPresent()
- );
- }
-
- void updateIDsWithAlias(final HashMap indexByUri,
- final List importedDrgElements) {
-
- if (importedDrgElements.isEmpty()) {
- return;
- }
-
- final QName namespace = DMNMarshallerImportsHelperImpl.NAMESPACE;
-
- for (org.kie.dmn.model.api.DRGElement element : importedDrgElements) {
- final String namespaceAttribute = element.getAdditionalAttributes().getOrDefault(namespace, "");
- if (!StringUtils.isEmpty(namespaceAttribute)) {
- if (indexByUri.containsKey(namespaceAttribute)) {
- final String alias = indexByUri.get(namespaceAttribute);
- changeAlias(alias, element);
- }
- }
- }
- }
-
- HashMap getIndexByUri(final org.kie.dmn.model.api.Definitions dmnXml) {
-
- final HashMap indexByUri = new HashMap<>();
- dmnXml.getNsContext().entrySet().forEach(e -> indexByUri.put(e.getValue(), e.getKey()));
- return indexByUri;
- }
-
- void changeAlias(final String alias, final org.kie.dmn.model.api.DRGElement drgElement) {
- if (drgElement.getId().contains(":")) {
- final String id = drgElement.getId().split(":")[1];
- drgElement.setId(alias + ":" + id);
- }
- }
-
- private Node getRequiredNode(final Map> elems,
- final String reqInputID) {
- if (elems.containsKey(reqInputID)) {
- return elems.get(reqInputID).getValue();
- } else {
-
- final Optional match = elems.keySet().stream()
- .filter(k -> k.contains(reqInputID))
- .findFirst();
- if (match.isPresent()) {
- return elems.get(match.get()).getValue();
- }
- }
-
- return null;
- }
-
- List getImportedDrgElementsByShape(final List dmnShapes,
- final Map importDefinitions,
- final org.kie.dmn.model.api.Definitions dmnXml) {
-
- final List importedDRGElements = dmnMarshallerImportsHelper.getImportedDRGElements(importDefinitions);
-
- // Update IDs with the alias used in this file for the respective imports
- final HashMap indexByUri = getIndexByUri(dmnXml);
- updateIDsWithAlias(indexByUri, importedDRGElements);
-
- return dmnShapes
- .stream()
- .map(shape -> {
-
- final String dmnElementRef = getDmnElementRef(shape);
- final Optional ref = getReference(importedDRGElements, dmnElementRef);
-
- return ref.orElse(null);
- })
- .filter(Objects::nonNull)
- .collect(Collectors.toList());
- }
-
- Optional getReference(final List importedDRGElements,
- final String dmnElementRef) {
- final Optional element = importedDRGElements.stream().filter(drgElement -> dmnElementRef.equals(drgElement.getId())).findFirst();
- return element;
- }
-
- String getDmnElementRef(final DMNShape dmnShape) {
- return Optional
- .ofNullable(dmnShape.getDmnElementRef())
- .map(QName::getLocalPart)
- .orElse("");
- }
-
- List getUniqueDMNShapes(final org.kie.dmn.model.api.dmndi.DMNDiagram dmnDDDiagram) {
- return new ArrayList<>(dmnDDDiagram
- .getDMNDiagramElement()
- .stream()
- .filter(diagramElements -> diagramElements instanceof DMNShape)
- .map(d -> (DMNShape) d)
- .collect(toMap(DMNShape::getId, shape -> shape, (shape1, shape2) -> shape1))
- .values());
- }
-
- /**
- * Stunner's factoryManager is only used to create Nodes that are considered part of a "Definition Set" (a collection of nodes visible to the User e.g. BPMN2 StartNode, EndNode and DMN's DecisionNode etc).
- * Relationships are not created with the factory.
- * This method specializes to connect with an Edge containing a Child relationship the target Node.
- */
- private static void connectDSChildEdge(Node dsNode, Node requiredNode) {
- final String uuid = dsNode.getUUID() + "er" + requiredNode.getUUID();
- final Edge myEdge = new EdgeImpl<>(uuid);
- myEdge.setContent(new Child());
- connectEdge(myEdge,
- dsNode,
- requiredNode);
- }
-
- private static String idOfDMNorWBUUID(org.kie.dmn.model.api.DMNElement dmn) {
- return dmn.getId() != null ? dmn.getId() : UUID.uuid();
- }
-
- public static Node, ?> findDMNDiagramRoot(final Graph, Node> graph) {
- return StreamSupport.stream(graph.nodes().spliterator(),
- false).filter(n -> n.getContent().getDefinition() instanceof DMNDiagram).findFirst().orElseThrow(() -> new UnsupportedOperationException("TODO"));
- }
-
- private String getId(final org.kie.dmn.model.api.DMNElementReference er) {
- String href = er.getHref();
- return href.contains("#") ? href.substring(href.indexOf('#') + 1) : href;
- }
-
- private Node dmnToStunner(final org.kie.dmn.model.api.DRGElement dmn,
- final BiConsumer hasComponentWidthsConsumer,
- final List importedDrgElements) {
-
- final Node node = createNode(dmn, hasComponentWidthsConsumer);
- return setAllowOnlyVisualChange(importedDrgElements, node);
- }
-
- private Node createNode(org.kie.dmn.model.api.DRGElement dmn,
- final BiConsumer hasComponentWidthsConsumer) {
- if (dmn instanceof org.kie.dmn.model.api.InputData) {
- return inputDataConverter.nodeFromDMN((org.kie.dmn.model.api.InputData) dmn,
- hasComponentWidthsConsumer);
- } else if (dmn instanceof org.kie.dmn.model.api.Decision) {
- return decisionConverter.nodeFromDMN((org.kie.dmn.model.api.Decision) dmn,
- hasComponentWidthsConsumer);
- } else if (dmn instanceof org.kie.dmn.model.api.BusinessKnowledgeModel) {
- return bkmConverter.nodeFromDMN((org.kie.dmn.model.api.BusinessKnowledgeModel) dmn,
- hasComponentWidthsConsumer);
- } else if (dmn instanceof org.kie.dmn.model.api.KnowledgeSource) {
- return knowledgeSourceConverter.nodeFromDMN((org.kie.dmn.model.api.KnowledgeSource) dmn,
- hasComponentWidthsConsumer);
- } else if (dmn instanceof org.kie.dmn.model.api.DecisionService) {
- return decisionServiceConverter.nodeFromDMN((org.kie.dmn.model.api.DecisionService) dmn,
- hasComponentWidthsConsumer);
- } else {
- throw new UnsupportedOperationException("TODO"); // TODO
- }
- }
-
- Node setAllowOnlyVisualChange(final List importedDrgElements,
- final Node node) {
-
- getDRGElement(node).ifPresent(drgElement -> {
- if (isImportedDRGElement(importedDrgElements, drgElement)) {
- drgElement.setAllowOnlyVisualChange(true);
- } else {
- drgElement.setAllowOnlyVisualChange(false);
- }
- });
-
- return node;
- }
-
- Optional getDRGElement(final Node node) {
-
- final Object objectDefinition = DefinitionUtils.getElementDefinition(node);
-
- if (objectDefinition instanceof DRGElement) {
- return Optional.of((DRGElement) objectDefinition);
- }
-
- return Optional.empty();
- }
-
- boolean isImportedDRGElement(final List importedDrgElements,
- final org.kie.dmn.model.api.DRGElement drgElement) {
- return isImportedIdNode(importedDrgElements, drgElement.getId());
- }
-
- boolean isImportedDRGElement(final List importedDrgElements,
- final DRGElement drgElement) {
- return isImportedIdNode(importedDrgElements, drgElement.getId().getValue());
- }
-
- private boolean isImportedIdNode(final List importedDrgElements,
- final String id) {
- return importedDrgElements
- .stream()
- .anyMatch(drgElement -> Objects.equals(drgElement.getId(), id));
- }
-
- @SuppressWarnings({"rawtypes", "unchecked"})
- public static void connectRootWithChild(final Node dmnDiagramRoot,
- final Node child) {
- final String uuid = org.kie.workbench.common.stunner.core.util.UUID.uuid();
- final Edge edge = new EdgeImpl<>(uuid);
- edge.setContent(new Child());
- connectEdge(edge,
- dmnDiagramRoot,
- child);
- Definitions definitions = ((DMNDiagram) ((View) dmnDiagramRoot.getContent()).getDefinition()).getDefinitions();
- DMNModelInstrumentedBase childDRG = (DMNModelInstrumentedBase) ((View) child.getContent()).getDefinition();
- childDRG.setParent(definitions);
- }
-
- @SuppressWarnings({"rawtypes", "unchecked"})
- public static void connectEdge(final Edge edge,
- final Node source,
- final Node target) {
- edge.setSourceNode(source);
- edge.setTargetNode(target);
- source.getOutEdges().add(edge);
- target.getInEdges().add(edge);
- }
-
- @SuppressWarnings("unchecked")
- private void setConnectionMagnets(final Edge edge,
- final String dmnEdgeElementRef,
- final org.kie.dmn.model.api.Definitions dmnXml) {
- final ViewConnector connectionContent = (ViewConnector) edge.getContent();
-
- Optional dmnDiagram = findDMNDiagram(dmnXml);
- Optional dmnEdge = Optional.empty();
- if (dmnDiagram.isPresent()) {
- dmnEdge = dmnDiagram.get().getDMNDiagramElement().stream()
- .filter(DMNEdge.class::isInstance)
- .map(DMNEdge.class::cast)
- .filter(e -> e.getDmnElementRef().getLocalPart().equals(dmnEdgeElementRef))
- .findFirst();
- }
- if (dmnEdge.isPresent()) {
- DMNEdge e = dmnEdge.get();
- Point source = e.getWaypoint().get(0);
- final Node, Edge> sourceNode = edge.getSourceNode();
- if (null != sourceNode) {
- setConnectionMagnet(sourceNode,
- source,
- connectionContent::setSourceConnection);
- }
- Point target = e.getWaypoint().get(e.getWaypoint().size() - 1);
- final Node, Edge> targetNode = edge.getTargetNode();
- if (null != targetNode) {
- setConnectionMagnet(targetNode,
- target,
- connectionContent::setTargetConnection);
- }
- if (e.getWaypoint().size() > 2) {
- connectionContent.setControlPoints(e.getWaypoint()
- .subList(1, e.getWaypoint().size() - 1)
- .stream()
- .map(p -> ControlPoint.build(PointUtils.dmndiPointToPoint2D(p)))
- .toArray(ControlPoint[]::new));
- }
- } else {
- // Set the source connection, if any.
- final Node sourceNode = edge.getSourceNode();
- if (null != sourceNode) {
- connectionContent.setSourceConnection(MagnetConnection.Builder.atCenter(sourceNode));
- }
- // Set the target connection, if any.
- final Node targetNode = edge.getTargetNode();
- if (null != targetNode) {
- connectionContent.setTargetConnection(MagnetConnection.Builder.atCenter(targetNode));
- }
- }
- }
-
- private void setConnectionMagnet(final Node, Edge> node,
- final Point magnetPoint,
- final Consumer connectionConsumer) {
- final View> view = node.getContent();
- final double viewX = xOfBound(upperLeftBound(view));
- final double viewY = yOfBound(upperLeftBound(view));
- final double magnetRelativeX = magnetPoint.getX() - viewX;
- final double magnetRelativeY = magnetPoint.getY() - viewY;
- final double viewWidth = view.getBounds().getWidth();
- final double viewHeight = view.getBounds().getHeight();
- if (isCentre(magnetRelativeX,
- magnetRelativeY,
- viewWidth,
- viewHeight)) {
- connectionConsumer.accept(MagnetConnection.Builder.atCenter(node));
- } else {
- connectionConsumer.accept(MagnetConnection.Builder.at(magnetRelativeX, magnetRelativeY).setAuto(true));
- }
- }
-
- private boolean isCentre(final double magnetRelativeX,
- final double magnetRelativeY,
- final double viewWidth,
- final double viewHeight) {
- return Math.abs((viewWidth / 2) - magnetRelativeX) < CENTRE_TOLERANCE &&
- Math.abs((viewHeight / 2) - magnetRelativeY) < CENTRE_TOLERANCE;
- }
-
- private Optional findComponentsWidthsExtension(final Optional dmnDDDiagram) {
- if (!dmnDDDiagram.isPresent()) {
- return Optional.empty();
- }
- final org.kie.dmn.model.api.dmndi.DiagramElement.Extension dmnDDExtensions = dmnDDDiagram.get().getExtension();
-
- if (Objects.isNull(dmnDDExtensions)) {
- return Optional.empty();
- }
- final List extensions = dmnDDExtensions.getAny();
- if (Objects.isNull(extensions)) {
- return Optional.empty();
- }
- return extensions
- .stream()
- .filter(extension -> extension instanceof ComponentsWidthsExtension)
- .map(extension -> (ComponentsWidthsExtension) extension)
- .findFirst();
- }
-
- @Override
- @SuppressWarnings("unchecked")
- public String marshall(final Diagram diagram) throws IOException {
- Graph, Node> g = diagram.getGraph();
-
- Map nodes = new HashMap<>();
- Map textAnnotations = new HashMap<>();
-
- Node, ?> dmnDiagramRoot = (Node, ?>) findDMNDiagramRoot(g);
- Definitions definitionsStunnerPojo = dmnDiagramRoot.getContent().getDefinition().getDefinitions();
- cleanImportedItemDefinitions(definitionsStunnerPojo);
- org.kie.dmn.model.api.Definitions definitions = DefinitionsConverter.dmnFromWB(definitionsStunnerPojo);
- if (definitions.getExtensionElements() == null) {
- if (definitions instanceof org.kie.dmn.model.v1_1.KieDMNModelInstrumentedBase) {
- definitions.setExtensionElements(new org.kie.dmn.model.v1_1.TDMNElement.TExtensionElements());
- } else if (definitions instanceof org.kie.dmn.model.v1_2.KieDMNModelInstrumentedBase) {
- definitions.setExtensionElements(new org.kie.dmn.model.v1_2.TDMNElement.TExtensionElements());
- } else {
- definitions.setExtensionElements(new org.kie.dmn.model.v1_2.TDMNElement.TExtensionElements());
- }
- }
-
- if (definitions.getDMNDI() == null) {
- definitions.setDMNDI(new DMNDI());
- }
- org.kie.dmn.model.api.dmndi.DMNDiagram dmnDDDMNDiagram = new org.kie.dmn.model.v1_2.dmndi.DMNDiagram();
- definitions.getDMNDI().getDMNDiagram().add(dmnDDDMNDiagram);
- List dmnEdges = new ArrayList<>();
-
- //Convert relative positioning to absolute
- for (Node, ?> node : g.nodes()) {
- PointUtils.convertToAbsoluteBounds(node);
- }
-
- //Setup callback for marshalling ComponentWidths
- if (dmnDDDMNDiagram.getExtension() == null) {
- dmnDDDMNDiagram.setExtension(new DiagramElement.Extension());
- }
- final ComponentsWidthsExtension componentsWidthsExtension = new ComponentsWidthsExtension();
- dmnDDDMNDiagram.getExtension().getAny().add(componentsWidthsExtension);
-
- final Consumer componentWidthsConsumer = (cw) -> {
- componentsWidthsExtension.getComponentsWidths().add(cw);
- };
-
- //Iterate Graph processing nodes..
- for (Node, ?> node : g.nodes()) {
- if (node.getContent() instanceof View>) {
- View> view = (View>) node.getContent();
- if (view.getDefinition() instanceof DRGElement) {
- DRGElement n = (org.kie.workbench.common.dmn.api.definition.model.DRGElement) view.getDefinition();
- if (view.getDefinition() instanceof DynamicReadOnly) {
- final DynamicReadOnly def = (DynamicReadOnly) view.getDefinition();
- if (!def.isAllowOnlyVisualChange()) {
- nodes.put(n.getId().getValue(),
- stunnerToDMN(node,
- componentWidthsConsumer));
- }
- } else {
- nodes.put(n.getId().getValue(),
- stunnerToDMN(node,
- componentWidthsConsumer));
- }
- dmnDDDMNDiagram.getDMNDiagramElement().add(stunnerToDDExt((View extends DMNElement>) view));
- } else if (view.getDefinition() instanceof TextAnnotation) {
- TextAnnotation textAnnotation = (TextAnnotation) view.getDefinition();
- textAnnotations.put(textAnnotation.getId().getValue(),
- textAnnotationConverter.dmnFromNode((Node, ?>) node,
- componentWidthsConsumer));
- dmnDDDMNDiagram.getDMNDiagramElement().add(stunnerToDDExt((View extends DMNElement>) view));
-
- List associations = AssociationConverter.dmnFromWB((Node, ?>) node);
- definitions.getArtifact().addAll(associations);
- }
- // DMNDI Edge management.
- List> inEdges = (List>) node.getInEdges();
- for (Edge, ?> e : inEdges) {
- if (e.getContent() instanceof ViewConnector) {
- final ViewConnector connectionContent = (ViewConnector) e.getContent();
- if (connectionContent.getSourceConnection().isPresent() && connectionContent.getTargetConnection().isPresent()) {
- Point2D sourcePoint = ((Connection) connectionContent.getSourceConnection().get()).getLocation();
- Point2D targetPoint = ((Connection) connectionContent.getTargetConnection().get()).getLocation();
- if (sourcePoint == null) { // If the "connection source/target location is null" assume it's the centre of the shape.
- final Node, ?> sourceNode = e.getSourceNode();
- final View> sourceView = (View>) sourceNode.getContent();
- double xSource = xOfBound(upperLeftBound(sourceView));
- double ySource = yOfBound(upperLeftBound(sourceView));
- if (sourceView.getDefinition() instanceof DMNViewDefinition) {
- DMNViewDefinition dmnViewDefinition = (DMNViewDefinition) sourceView.getDefinition();
- xSource += dmnViewDefinition.getDimensionsSet().getWidth().getValue() / 2;
- ySource += dmnViewDefinition.getDimensionsSet().getHeight().getValue() / 2;
- }
- sourcePoint = Point2D.create(xSource, ySource);
- } else { // If it is non-null it is relative to the source/target shape location.
- final Node, ?> sourceNode = e.getSourceNode();
- final View> sourceView = (View>) sourceNode.getContent();
- double xSource = xOfBound(upperLeftBound(sourceView));
- double ySource = yOfBound(upperLeftBound(sourceView));
- sourcePoint = Point2D.create(xSource + sourcePoint.getX(), ySource + sourcePoint.getY());
- }
- if (targetPoint == null) { // If the "connection source/target location is null" assume it's the centre of the shape.
- double xTarget = xOfBound(upperLeftBound(view));
- double yTarget = yOfBound(upperLeftBound(view));
- if (view.getDefinition() instanceof DMNViewDefinition) {
- DMNViewDefinition dmnViewDefinition = (DMNViewDefinition) view.getDefinition();
- xTarget += dmnViewDefinition.getDimensionsSet().getWidth().getValue() / 2;
- yTarget += dmnViewDefinition.getDimensionsSet().getHeight().getValue() / 2;
- }
- targetPoint = Point2D.create(xTarget, yTarget);
- } else { // If it is non-null it is relative to the source/target shape location.
- final double xTarget = xOfBound(upperLeftBound(view));
- final double yTarget = yOfBound(upperLeftBound(view));
- targetPoint = Point2D.create(xTarget + targetPoint.getX(), yTarget + targetPoint.getY());
- }
-
- DMNEdge dmnEdge = new org.kie.dmn.model.v1_2.dmndi.DMNEdge();
- // DMNDI edge elementRef is uuid of Stunner edge,
- // with the only exception when edge contains as content a DMN Association (Association is an edge)
- String uuid = e.getUUID();
- if (e.getContent() instanceof View>) {
- final View> edgeView = (View>) e.getContent();
- if (edgeView.getDefinition() instanceof Association) {
- uuid = ((Association) edgeView.getDefinition()).getId().getValue();
- }
- }
- dmnEdge.setId("dmnedge-" + uuid);
- dmnEdge.setDmnElementRef(new QName(uuid));
-
- dmnEdge.getWaypoint().add(PointUtils.point2dToDMNDIPoint(sourcePoint));
- for (ControlPoint cp : connectionContent.getControlPoints()) {
- dmnEdge.getWaypoint().add(PointUtils.point2dToDMNDIPoint(cp.getLocation()));
- }
- dmnEdge.getWaypoint().add(PointUtils.point2dToDMNDIPoint(targetPoint));
- dmnEdges.add(dmnEdge);
- }
- }
- }
- }
- }
-
- nodes.values().forEach(n -> {
- n.setParent(definitions);
- definitions.getDrgElement().add(n);
- });
- textAnnotations.values().forEach(definitions.getArtifact()::add);
-
- // add DMNEdge last.
- dmnDDDMNDiagram.getDMNDiagramElement().addAll(dmnEdges);
-
- return marshaller.marshal(definitions);
- }
-
- void loadImportedItemDefinitions(final Definitions definitions,
- final Map importDefinitions) {
- definitions.getItemDefinition().addAll(getWbImportedItemDefinitions(importDefinitions));
- }
-
- void cleanImportedItemDefinitions(final Definitions definitions) {
- definitions.getItemDefinition().removeIf(ItemDefinition::isAllowOnlyVisualChange);
- }
-
- List getWbImportedItemDefinitions(final Map importDefinitions) {
- return dmnMarshallerImportsHelper
- .getImportedItemDefinitions(importDefinitions)
- .stream()
- .map(ItemDefinitionPropertyConverter::wbFromDMN)
- .peek(itemDefinition -> itemDefinition.setAllowOnlyVisualChange(true))
- .collect(Collectors.toList());
- }
-
- private void ddExtAugmentStunner(Optional dmnDDDiagram, Node currentNode) {
- if (!dmnDDDiagram.isPresent()) {
- return;
- }
-
- final Stream drgShapeStream = dmnDDDiagram.get().getDMNDiagramElement().stream().filter(DMNShape.class::isInstance).map(DMNShape.class::cast);
- final View content = (View) currentNode.getContent();
- final Bound ulBound = upperLeftBound(content);
- final Bound lrBound = lowerRightBound(content);
- if (content.getDefinition() instanceof Decision) {
- Decision d = (Decision) content.getDefinition();
- internalAugment(drgShapeStream, d.getId(),
- ulBound,
- d.getDimensionsSet(),
- lrBound,
- d.getBackgroundSet(),
- d::setFontSet);
- } else if (content.getDefinition() instanceof InputData) {
- InputData d = (InputData) content.getDefinition();
- internalAugment(drgShapeStream,
- d.getId(),
- ulBound,
- d.getDimensionsSet(),
- lrBound,
- d.getBackgroundSet(),
- d::setFontSet);
- } else if (content.getDefinition() instanceof BusinessKnowledgeModel) {
- BusinessKnowledgeModel d = (BusinessKnowledgeModel) content.getDefinition();
- internalAugment(drgShapeStream,
- d.getId(),
- ulBound,
- d.getDimensionsSet(),
- lrBound,
- d.getBackgroundSet(),
- d::setFontSet);
- } else if (content.getDefinition() instanceof KnowledgeSource) {
- KnowledgeSource d = (KnowledgeSource) content.getDefinition();
- internalAugment(drgShapeStream,
- d.getId(),
- ulBound,
- d.getDimensionsSet(),
- lrBound,
- d.getBackgroundSet(),
- d::setFontSet);
- } else if (content.getDefinition() instanceof TextAnnotation) {
- TextAnnotation d = (TextAnnotation) content.getDefinition();
- internalAugment(drgShapeStream,
- d.getId(),
- ulBound,
- d.getDimensionsSet(),
- lrBound,
- d.getBackgroundSet(),
- d::setFontSet);
- } else if (content.getDefinition() instanceof DecisionService) {
- DecisionService d = (DecisionService) content.getDefinition();
- internalAugment(drgShapeStream,
- d.getId(),
- ulBound,
- d.getDimensionsSet(),
- lrBound,
- d.getBackgroundSet(),
- d::setFontSet,
- (dividerLineY) -> d.setDividerLineY(new DecisionServiceDividerLineY(dividerLineY - ulBound.getY())));
- }
- }
-
- @SuppressWarnings("unchecked")
- private void internalAugment(final Stream drgShapeStream,
- final Id id,
- final Bound ulBound,
- final RectangleDimensionsSet dimensionsSet,
- final Bound lrBound,
- final BackgroundSet bgset,
- final Consumer fontSetSetter) {
- internalAugment(drgShapeStream,
- id,
- ulBound,
- dimensionsSet,
- lrBound,
- bgset,
- fontSetSetter,
- (line) -> {/*NOP*/});
- }
-
- @SuppressWarnings("unchecked")
- private void internalAugment(final Stream drgShapeStream,
- final Id id,
- final Bound ulBound,
- final RectangleDimensionsSet dimensionsSet,
- final Bound lrBound,
- final BackgroundSet bgset,
- final Consumer fontSetSetter,
- final Consumer decisionServiceDividerLineYSetter) {
- Optional drgShapeOpt = drgShapeStream.filter(shape -> shape.getDmnElementRef().getLocalPart().equals(id.getValue())).findFirst();
- if (!drgShapeOpt.isPresent()) {
- return;
- }
- DMNShape drgShape = drgShapeOpt.get();
-
- if (ulBound != null) {
- ulBound.setX(xOfShape(drgShape));
- ulBound.setY(yOfShape(drgShape));
- }
- dimensionsSet.setWidth(new Width(widthOfShape(drgShape)));
- dimensionsSet.setHeight(new Height(heightOfShape(drgShape)));
- if (lrBound != null) {
- lrBound.setX(xOfShape(drgShape) + widthOfShape(drgShape));
- lrBound.setY(yOfShape(drgShape) + heightOfShape(drgShape));
- }
-
- DMNStyle dmnStyleOfDrgShape = drgShape.getStyle() instanceof DMNStyle ? (DMNStyle) drgShape.getStyle() : null;
- if (dmnStyleOfDrgShape != null) {
- if (null != dmnStyleOfDrgShape.getFillColor()) {
- bgset.setBgColour(new BgColour(ColorUtils.wbFromDMN(dmnStyleOfDrgShape.getFillColor())));
- }
- if (null != dmnStyleOfDrgShape.getStrokeColor()) {
- bgset.setBorderColour(new BorderColour(ColorUtils.wbFromDMN(dmnStyleOfDrgShape.getStrokeColor())));
- }
- }
-
- FontSet fontSet = new FontSet();
- if (dmnStyleOfDrgShape != null) {
- mergeFontSet(fontSet, FontSetPropertyConverter.wbFromDMN(dmnStyleOfDrgShape));
- }
- if (drgShape.getDMNLabel() != null && drgShape.getDMNLabel().getSharedStyle() instanceof DMNStyle) {
- mergeFontSet(fontSet, FontSetPropertyConverter.wbFromDMN((DMNStyle) drgShape.getDMNLabel().getSharedStyle()));
- }
- if (drgShape.getDMNLabel() != null && drgShape.getDMNLabel().getStyle() instanceof DMNStyle) {
- mergeFontSet(fontSet, FontSetPropertyConverter.wbFromDMN((DMNStyle) drgShape.getDMNLabel().getStyle()));
- }
- fontSetSetter.accept(fontSet);
-
- if (drgShape.getDMNDecisionServiceDividerLine() != null) {
- decisionServiceDividerLineYSetter.accept(drgShape.getDMNDecisionServiceDividerLine().getWaypoint().get(0).getY());
- }
- }
-
- private static void mergeFontSet(FontSet fontSet, FontSet additional) {
- if (additional.getFontFamily() != null) {
- fontSet.setFontFamily(additional.getFontFamily());
- }
- if (additional.getFontSize() != null) {
- fontSet.setFontSize(additional.getFontSize());
- }
- if (additional.getFontColour() != null) {
- fontSet.setFontColour(additional.getFontColour());
- }
- }
-
- @SuppressWarnings("unchecked")
- private static DMNShape stunnerToDDExt(final View extends DMNElement> v) {
- DMNShape result = new org.kie.dmn.model.v1_2.dmndi.DMNShape();
- result.setId("dmnshape-" + v.getDefinition().getId().getValue());
- result.setDmnElementRef(new QName(v.getDefinition().getId().getValue()));
- Bounds bounds = new org.kie.dmn.model.v1_2.dmndi.Bounds();
- result.setBounds(bounds);
- bounds.setX(xOfBound(upperLeftBound(v)));
- bounds.setY(yOfBound(upperLeftBound(v)));
- result.setStyle(new org.kie.dmn.model.v1_2.dmndi.DMNStyle());
- result.setDMNLabel(new org.kie.dmn.model.v1_2.dmndi.DMNLabel());
- if (v.getDefinition() instanceof Decision) {
- Decision d = (Decision) v.getDefinition();
- applyBounds(d.getDimensionsSet(), bounds);
- applyBackgroundStyles(d.getBackgroundSet(), result);
- applyFontStyle(d.getFontSet(), result);
- } else if (v.getDefinition() instanceof InputData) {
- InputData d = (InputData) v.getDefinition();
- applyBounds(d.getDimensionsSet(), bounds);
- applyBackgroundStyles(d.getBackgroundSet(), result);
- applyFontStyle(d.getFontSet(), result);
- } else if (v.getDefinition() instanceof BusinessKnowledgeModel) {
- BusinessKnowledgeModel d = (BusinessKnowledgeModel) v.getDefinition();
- applyBounds(d.getDimensionsSet(), bounds);
- applyBackgroundStyles(d.getBackgroundSet(), result);
- applyFontStyle(d.getFontSet(), result);
- } else if (v.getDefinition() instanceof KnowledgeSource) {
- KnowledgeSource d = (KnowledgeSource) v.getDefinition();
- applyBounds(d.getDimensionsSet(), bounds);
- applyBackgroundStyles(d.getBackgroundSet(), result);
- applyFontStyle(d.getFontSet(), result);
- } else if (v.getDefinition() instanceof TextAnnotation) {
- TextAnnotation d = (TextAnnotation) v.getDefinition();
- applyBounds(d.getDimensionsSet(), bounds);
- applyBackgroundStyles(d.getBackgroundSet(), result);
- applyFontStyle(d.getFontSet(), result);
- } else if (v.getDefinition() instanceof DecisionService) {
- DecisionService d = (DecisionService) v.getDefinition();
- applyBounds(d.getDimensionsSet(), bounds);
- applyBackgroundStyles(d.getBackgroundSet(), result);
- applyFontStyle(d.getFontSet(), result);
- DMNDecisionServiceDividerLine dl = new org.kie.dmn.model.v1_2.dmndi.DMNDecisionServiceDividerLine();
- org.kie.dmn.model.api.dmndi.Point leftPoint = new org.kie.dmn.model.v1_2.dmndi.Point();
- leftPoint.setX(v.getBounds().getUpperLeft().getX());
- double dlY = v.getBounds().getUpperLeft().getY() + d.getDividerLineY().getValue();
- leftPoint.setY(dlY);
- dl.getWaypoint().add(leftPoint);
- org.kie.dmn.model.api.dmndi.Point rightPoint = new org.kie.dmn.model.v1_2.dmndi.Point();
- rightPoint.setX(v.getBounds().getLowerRight().getX());
- rightPoint.setY(dlY);
- dl.getWaypoint().add(rightPoint);
- result.setDMNDecisionServiceDividerLine(dl);
- }
- return result;
- }
-
- private static void applyFontStyle(FontSet fontSet, DMNShape result) {
- if (!(result.getStyle() instanceof DMNStyle)) {
- return;
- }
- DMNStyle shapeStyle = (DMNStyle) result.getStyle();
- Color fontColor = ColorUtils.dmnFromWB(fontSet.getFontColour().getValue());
- shapeStyle.setFontColor(fontColor);
- if (null != fontSet.getFontFamily().getValue()) {
- shapeStyle.setFontFamily(fontSet.getFontFamily().getValue());
- }
- if (null != fontSet.getFontSize().getValue()) {
- shapeStyle.setFontSize(fontSet.getFontSize().getValue());
- }
- }
-
- private static void applyBounds(final RectangleDimensionsSet dimensionsSet,
- final Bounds bounds) {
- if (null != dimensionsSet.getWidth().getValue() &&
- null != dimensionsSet.getHeight().getValue()) {
- bounds.setWidth(dimensionsSet.getWidth().getValue());
- bounds.setHeight(dimensionsSet.getHeight().getValue());
- }
- }
-
- private static void applyBackgroundStyles(final BackgroundSet bgset,
- final DMNShape result) {
- if (!(result.getStyle() instanceof DMNStyle)) {
- return;
- }
- DMNStyle style = (DMNStyle) result.getStyle();
- if (null != bgset.getBgColour().getValue()) {
- style.setFillColor(ColorUtils.dmnFromWB(bgset.getBgColour().getValue()));
- }
- if (null != bgset.getBorderColour().getValue()) {
- style.setStrokeColor(ColorUtils.dmnFromWB(bgset.getBorderColour().getValue()));
- }
- }
-
- @SuppressWarnings("unchecked")
- private org.kie.dmn.model.api.DRGElement stunnerToDMN(final Node, ?> node,
- final Consumer componentWidthsConsumer) {
- if (node.getContent() instanceof View>) {
- View> view = (View>) node.getContent();
- if (view.getDefinition() instanceof InputData) {
- return inputDataConverter.dmnFromNode((Node, ?>) node,
- componentWidthsConsumer);
- } else if (view.getDefinition() instanceof Decision) {
- return decisionConverter.dmnFromNode((Node, ?>) node,
- componentWidthsConsumer);
- } else if (view.getDefinition() instanceof BusinessKnowledgeModel) {
- return bkmConverter.dmnFromNode((Node, ?>) node,
- componentWidthsConsumer);
- } else if (view.getDefinition() instanceof KnowledgeSource) {
- return knowledgeSourceConverter.dmnFromNode((Node, ?>) node,
- componentWidthsConsumer);
- } else if (view.getDefinition() instanceof DecisionService) {
- return decisionServiceConverter.dmnFromNode((Node, ?>) node,
- componentWidthsConsumer);
- } else {
- throw new UnsupportedOperationException("TODO"); // TODO
- }
- }
- throw new RuntimeException("wrong diagram structure to marshall");
- }
-
- @Override
- public DiagramMetadataMarshaller getMetadataMarshaller() {
- return diagramMetadataMarshaller;
- }
-}
diff --git a/kie-wb-common-dmn/kie-wb-common-dmn-backend/src/main/java/org/kie/workbench/common/dmn/backend/DMNMarshallerStandalone.java b/kie-wb-common-dmn/kie-wb-common-dmn-backend/src/main/java/org/kie/workbench/common/dmn/backend/DMNMarshallerStandalone.java
new file mode 100644
index 00000000000..b264430c106
--- /dev/null
+++ b/kie-wb-common-dmn/kie-wb-common-dmn-backend/src/main/java/org/kie/workbench/common/dmn/backend/DMNMarshallerStandalone.java
@@ -0,0 +1,1234 @@
+/*
+ * Copyright 2017 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.kie.workbench.common.dmn.backend;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.AbstractMap.SimpleEntry;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+import java.util.function.BiConsumer;
+import java.util.function.Consumer;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+import java.util.stream.StreamSupport;
+
+import javax.enterprise.context.ApplicationScoped;
+import javax.inject.Inject;
+import javax.xml.namespace.QName;
+
+import org.jboss.errai.marshalling.server.ServerMarshalling;
+import org.kie.dmn.api.marshalling.DMNMarshaller;
+import org.kie.dmn.model.api.Import;
+import org.kie.dmn.model.api.dmndi.Bounds;
+import org.kie.dmn.model.api.dmndi.Color;
+import org.kie.dmn.model.api.dmndi.DMNDecisionServiceDividerLine;
+import org.kie.dmn.model.api.dmndi.DMNEdge;
+import org.kie.dmn.model.api.dmndi.DMNShape;
+import org.kie.dmn.model.api.dmndi.DMNStyle;
+import org.kie.dmn.model.api.dmndi.Point;
+import org.kie.dmn.model.v1_2.dmndi.DMNDI;
+import org.kie.dmn.model.v1_2.dmndi.DiagramElement;
+import org.kie.workbench.common.dmn.api.DMNDefinitionSet;
+import org.kie.workbench.common.dmn.api.definition.DMNViewDefinition;
+import org.kie.workbench.common.dmn.api.definition.HasComponentWidths;
+import org.kie.workbench.common.dmn.api.definition.model.Association;
+import org.kie.workbench.common.dmn.api.definition.model.AuthorityRequirement;
+import org.kie.workbench.common.dmn.api.definition.model.BusinessKnowledgeModel;
+import org.kie.workbench.common.dmn.api.definition.model.DMNDiagram;
+import org.kie.workbench.common.dmn.api.definition.model.DMNElement;
+import org.kie.workbench.common.dmn.api.definition.model.DMNModelInstrumentedBase;
+import org.kie.workbench.common.dmn.api.definition.model.DRGElement;
+import org.kie.workbench.common.dmn.api.definition.model.Decision;
+import org.kie.workbench.common.dmn.api.definition.model.DecisionService;
+import org.kie.workbench.common.dmn.api.definition.model.Definitions;
+import org.kie.workbench.common.dmn.api.definition.model.InformationRequirement;
+import org.kie.workbench.common.dmn.api.definition.model.InputData;
+import org.kie.workbench.common.dmn.api.definition.model.ItemDefinition;
+import org.kie.workbench.common.dmn.api.definition.model.KnowledgeRequirement;
+import org.kie.workbench.common.dmn.api.definition.model.KnowledgeSource;
+import org.kie.workbench.common.dmn.api.definition.model.TextAnnotation;
+import org.kie.workbench.common.dmn.api.editors.included.PMMLDocumentMetadata;
+import org.kie.workbench.common.dmn.api.property.background.BackgroundSet;
+import org.kie.workbench.common.dmn.api.property.background.BgColour;
+import org.kie.workbench.common.dmn.api.property.background.BorderColour;
+import org.kie.workbench.common.dmn.api.property.dimensions.Height;
+import org.kie.workbench.common.dmn.api.property.dimensions.RectangleDimensionsSet;
+import org.kie.workbench.common.dmn.api.property.dimensions.Width;
+import org.kie.workbench.common.dmn.api.property.dmn.DecisionServiceDividerLineY;
+import org.kie.workbench.common.dmn.api.property.dmn.Description;
+import org.kie.workbench.common.dmn.api.property.dmn.Id;
+import org.kie.workbench.common.dmn.api.property.font.FontSet;
+import org.kie.workbench.common.dmn.backend.common.DMNMarshallerImportsHelperStandalone;
+import org.kie.workbench.common.dmn.backend.common.DMNMarshallerImportsHelperStandaloneImpl;
+import org.kie.workbench.common.dmn.backend.definition.v1_1.AssociationConverter;
+import org.kie.workbench.common.dmn.backend.definition.v1_1.BusinessKnowledgeModelConverter;
+import org.kie.workbench.common.dmn.backend.definition.v1_1.DecisionConverter;
+import org.kie.workbench.common.dmn.backend.definition.v1_1.DecisionServiceConverter;
+import org.kie.workbench.common.dmn.backend.definition.v1_1.DefinitionsConverter;
+import org.kie.workbench.common.dmn.backend.definition.v1_1.InputDataConverter;
+import org.kie.workbench.common.dmn.backend.definition.v1_1.ItemDefinitionPropertyConverter;
+import org.kie.workbench.common.dmn.backend.definition.v1_1.KnowledgeSourceConverter;
+import org.kie.workbench.common.dmn.backend.definition.v1_1.TextAnnotationConverter;
+import org.kie.workbench.common.dmn.backend.definition.v1_1.dd.ColorUtils;
+import org.kie.workbench.common.dmn.backend.definition.v1_1.dd.ComponentWidths;
+import org.kie.workbench.common.dmn.backend.definition.v1_1.dd.ComponentsWidthsExtension;
+import org.kie.workbench.common.dmn.backend.definition.v1_1.dd.FontSetPropertyConverter;
+import org.kie.workbench.common.dmn.backend.definition.v1_1.dd.PointUtils;
+import org.kie.workbench.common.stunner.core.api.FactoryManager;
+import org.kie.workbench.common.stunner.core.backend.service.XMLEncoderDiagramMetadataMarshaller;
+import org.kie.workbench.common.stunner.core.definition.adapter.binding.BindableAdapterUtils;
+import org.kie.workbench.common.stunner.core.definition.service.DiagramMarshaller;
+import org.kie.workbench.common.stunner.core.definition.service.DiagramMetadataMarshaller;
+import org.kie.workbench.common.stunner.core.diagram.Diagram;
+import org.kie.workbench.common.stunner.core.diagram.Metadata;
+import org.kie.workbench.common.stunner.core.graph.Edge;
+import org.kie.workbench.common.stunner.core.graph.Graph;
+import org.kie.workbench.common.stunner.core.graph.Node;
+import org.kie.workbench.common.stunner.core.graph.content.Bound;
+import org.kie.workbench.common.stunner.core.graph.content.relationship.Child;
+import org.kie.workbench.common.stunner.core.graph.content.view.Connection;
+import org.kie.workbench.common.stunner.core.graph.content.view.ControlPoint;
+import org.kie.workbench.common.stunner.core.graph.content.view.MagnetConnection;
+import org.kie.workbench.common.stunner.core.graph.content.view.Point2D;
+import org.kie.workbench.common.stunner.core.graph.content.view.View;
+import org.kie.workbench.common.stunner.core.graph.content.view.ViewConnector;
+import org.kie.workbench.common.stunner.core.graph.impl.EdgeImpl;
+import org.kie.workbench.common.stunner.core.util.DefinitionUtils;
+import org.kie.workbench.common.stunner.core.util.StringUtils;
+import org.kie.workbench.common.stunner.core.util.UUID;
+
+import static java.util.Collections.emptyList;
+import static java.util.stream.Collectors.toMap;
+import static org.kie.workbench.common.dmn.backend.definition.v1_1.dd.PointUtils.heightOfShape;
+import static org.kie.workbench.common.dmn.backend.definition.v1_1.dd.PointUtils.lowerRightBound;
+import static org.kie.workbench.common.dmn.backend.definition.v1_1.dd.PointUtils.upperLeftBound;
+import static org.kie.workbench.common.dmn.backend.definition.v1_1.dd.PointUtils.widthOfShape;
+import static org.kie.workbench.common.dmn.backend.definition.v1_1.dd.PointUtils.xOfBound;
+import static org.kie.workbench.common.dmn.backend.definition.v1_1.dd.PointUtils.xOfShape;
+import static org.kie.workbench.common.dmn.backend.definition.v1_1.dd.PointUtils.yOfBound;
+import static org.kie.workbench.common.dmn.backend.definition.v1_1.dd.PointUtils.yOfShape;
+import static org.kie.workbench.common.stunner.core.definition.adapter.binding.BindableAdapterUtils.getDefinitionId;
+
+@ApplicationScoped
+public class DMNMarshallerStandalone implements DiagramMarshaller> {
+
+ public static final String INFO_REQ_ID = getDefinitionId(InformationRequirement.class);
+
+ public static final String KNOWLEDGE_REQ_ID = getDefinitionId(KnowledgeRequirement.class);
+
+ public static final String AUTH_REQ_ID = getDefinitionId(AuthorityRequirement.class);
+
+ public static final String ASSOCIATION_ID = getDefinitionId(Association.class);
+
+ private static final double CENTRE_TOLERANCE = 1.0;
+
+ private XMLEncoderDiagramMetadataMarshaller diagramMetadataMarshaller;
+ private FactoryManager factoryManager;
+ private InputDataConverter inputDataConverter;
+ private DecisionConverter decisionConverter;
+ private BusinessKnowledgeModelConverter bkmConverter;
+ private KnowledgeSourceConverter knowledgeSourceConverter;
+ private TextAnnotationConverter textAnnotationConverter;
+ private DecisionServiceConverter decisionServiceConverter;
+ private DMNMarshaller marshaller;
+ private DMNMarshallerImportsHelperStandalone dmnMarshallerImportsHelper;
+
+ protected DMNMarshallerStandalone() {
+ this(null, null, null, null);
+ }
+
+ @Inject
+ public DMNMarshallerStandalone(final XMLEncoderDiagramMetadataMarshaller diagramMetadataMarshaller,
+ final FactoryManager factoryManager,
+ final DMNMarshallerImportsHelperStandalone dmnMarshallerImportsHelper,
+ final DMNMarshaller marshaller) {
+ this.diagramMetadataMarshaller = diagramMetadataMarshaller;
+ this.factoryManager = factoryManager;
+ this.dmnMarshallerImportsHelper = dmnMarshallerImportsHelper;
+ this.marshaller = marshaller;
+ this.inputDataConverter = new InputDataConverter(factoryManager);
+ this.decisionConverter = new DecisionConverter(factoryManager);
+ this.bkmConverter = new BusinessKnowledgeModelConverter(factoryManager);
+ this.knowledgeSourceConverter = new KnowledgeSourceConverter(factoryManager);
+ this.textAnnotationConverter = new TextAnnotationConverter(factoryManager);
+ this.decisionServiceConverter = new DecisionServiceConverter(factoryManager);
+ }
+
+ @Deprecated
+ public Graph unmarshallFromStunnerJSON(final Metadata metadata,
+ final InputStream input) throws IOException {
+ Graph result = (Graph) ServerMarshalling.fromJSON(input);
+ return result;
+ }
+
+ @Deprecated
+ public String marshallFromStunnerToJSON(final Diagram diagram) throws IOException {
+ String result = ServerMarshalling.toJSON(diagram.getGraph());
+ return result;
+ }
+
+ private static Optional findDMNDiagram(final org.kie.dmn.model.api.Definitions dmnXml) {
+ if (!(dmnXml instanceof org.kie.dmn.model.v1_2.TDefinitions)) {
+ return Optional.empty();
+ }
+ if (dmnXml.getDMNDI() == null) {
+ return Optional.empty();
+ }
+ final List elems = dmnXml.getDMNDI().getDMNDiagram();
+ if (elems.size() != 1) {
+ return Optional.empty();
+ } else {
+ return Optional.of(elems.get(0));
+ }
+ }
+
+ @Override
+ @SuppressWarnings("unchecked")
+ public Graph unmarshall(final Metadata metadata,
+ final InputStream input) throws IOException {
+ final Map hasComponentWidthsMap = new HashMap<>();
+ final BiConsumer hasComponentWidthsConsumer = (uuid, hcw) -> {
+ if (Objects.nonNull(uuid)) {
+ hasComponentWidthsMap.put(uuid, hcw);
+ }
+ };
+
+ final org.kie.dmn.model.api.Definitions dmnXml = marshaller.unmarshal(new InputStreamReader(input));
+ final List diagramDrgElements = dmnXml.getDrgElement();
+ final Optional dmnDDDiagram = findDMNDiagram(dmnXml);
+
+ // Get external DMN model information
+ final Map importDefinitions = dmnMarshallerImportsHelper.getImportDefinitions(metadata, dmnXml.getImport());
+
+ // Get external PMML model information
+ final Map pmmlDocuments = dmnMarshallerImportsHelper.getPMMLDocuments(metadata, dmnXml.getImport());
+
+ // Map external DRGElements
+ final List dmnShapes = dmnDDDiagram.map(this::getUniqueDMNShapes).orElse(emptyList());
+ final List importedDrgElements = getImportedDrgElementsByShape(dmnShapes, importDefinitions, dmnXml);
+
+ // Group DRGElements
+ final List drgElements = new ArrayList<>();
+ drgElements.addAll(diagramDrgElements);
+ drgElements.addAll(importedDrgElements);
+
+ // Remove DRGElements that doesn't have any local or imported shape.
+ removeDrgElementsWithoutShape(drgElements, dmnShapes);
+
+ final Map> elems = drgElements.stream().collect(toMap(org.kie.dmn.model.api.DRGElement::getId,
+ dmn -> new SimpleEntry<>(dmn,
+ dmnToStunner(dmn, hasComponentWidthsConsumer, importedDrgElements))));
+
+ final Set dmnDecisionServices = new HashSet<>();
+
+ // Stunner rely on relative positioning for Edge connections, so need to cycle on DMNShape first.
+ for (Entry kv : elems.values()) {
+ ddExtAugmentStunner(dmnDDDiagram, kv.getValue());
+ }
+
+ // Setup Node Relationships and Connections all based on absolute positioning
+ for (Entry kv : elems.values()) {
+ final org.kie.dmn.model.api.DRGElement elem = kv.getKey();
+ final Node currentNode = kv.getValue();
+
+ // For imported nodes, we don't have its connections
+ if (isImportedDRGElement(importedDrgElements, elem)) {
+ continue;
+ }
+
+ // DMN spec table 2: Requirements connection rules
+ if (elem instanceof org.kie.dmn.model.api.Decision) {
+ final org.kie.dmn.model.api.Decision decision = (org.kie.dmn.model.api.Decision) elem;
+ for (org.kie.dmn.model.api.InformationRequirement ir : decision.getInformationRequirement()) {
+ connectEdgeToNodes(INFO_REQ_ID,
+ ir,
+ ir.getRequiredInput(),
+ elems,
+ dmnXml,
+ currentNode);
+ connectEdgeToNodes(INFO_REQ_ID,
+ ir,
+ ir.getRequiredDecision(),
+ elems,
+ dmnXml,
+ currentNode);
+ }
+ for (org.kie.dmn.model.api.KnowledgeRequirement kr : decision.getKnowledgeRequirement()) {
+ connectEdgeToNodes(KNOWLEDGE_REQ_ID,
+ kr,
+ kr.getRequiredKnowledge(),
+ elems,
+ dmnXml,
+ currentNode);
+ }
+ for (org.kie.dmn.model.api.AuthorityRequirement ar : decision.getAuthorityRequirement()) {
+ connectEdgeToNodes(AUTH_REQ_ID,
+ ar,
+ ar.getRequiredAuthority(),
+ elems,
+ dmnXml,
+ currentNode);
+ }
+ } else if (elem instanceof org.kie.dmn.model.api.BusinessKnowledgeModel) {
+ final org.kie.dmn.model.api.BusinessKnowledgeModel bkm = (org.kie.dmn.model.api.BusinessKnowledgeModel) elem;
+ for (org.kie.dmn.model.api.KnowledgeRequirement kr : bkm.getKnowledgeRequirement()) {
+ connectEdgeToNodes(KNOWLEDGE_REQ_ID,
+ kr,
+ kr.getRequiredKnowledge(),
+ elems,
+ dmnXml,
+ currentNode);
+ }
+ for (org.kie.dmn.model.api.AuthorityRequirement ar : bkm.getAuthorityRequirement()) {
+ connectEdgeToNodes(AUTH_REQ_ID,
+ ar,
+ ar.getRequiredAuthority(),
+ elems,
+ dmnXml,
+ currentNode);
+ }
+ } else if (elem instanceof org.kie.dmn.model.api.KnowledgeSource) {
+ final org.kie.dmn.model.api.KnowledgeSource ks = (org.kie.dmn.model.api.KnowledgeSource) elem;
+ for (org.kie.dmn.model.api.AuthorityRequirement ar : ks.getAuthorityRequirement()) {
+ connectEdgeToNodes(AUTH_REQ_ID,
+ ar,
+ ar.getRequiredInput(),
+ elems,
+ dmnXml,
+ currentNode);
+ connectEdgeToNodes(AUTH_REQ_ID,
+ ar,
+ ar.getRequiredDecision(),
+ elems,
+ dmnXml,
+ currentNode);
+ connectEdgeToNodes(AUTH_REQ_ID,
+ ar,
+ ar.getRequiredAuthority(),
+ elems,
+ dmnXml,
+ currentNode);
+ }
+ } else if (elem instanceof org.kie.dmn.model.api.DecisionService) {
+ final org.kie.dmn.model.api.DecisionService ds = (org.kie.dmn.model.api.DecisionService) elem;
+ dmnDecisionServices.add(ds);
+ for (org.kie.dmn.model.api.DMNElementReference er : ds.getEncapsulatedDecision()) {
+ final String reqInputID = getId(er);
+ final Node requiredNode = getRequiredNode(elems, reqInputID);
+ if (Objects.nonNull(requiredNode)) {
+ connectDSChildEdge(currentNode, requiredNode);
+ }
+ }
+ for (org.kie.dmn.model.api.DMNElementReference er : ds.getOutputDecision()) {
+ final String reqInputID = getId(er);
+ final Node requiredNode = getRequiredNode(elems, reqInputID);
+ if (Objects.nonNull(requiredNode)) {
+ connectDSChildEdge(currentNode, requiredNode);
+ }
+ }
+ }
+ }
+
+ final Map, ?>> textAnnotations = dmnXml.getArtifact().stream()
+ .filter(org.kie.dmn.model.api.TextAnnotation.class::isInstance)
+ .map(org.kie.dmn.model.api.TextAnnotation.class::cast)
+ .collect(Collectors.toMap(org.kie.dmn.model.api.TextAnnotation::getId,
+ dmn -> textAnnotationConverter.nodeFromDMN(dmn,
+ hasComponentWidthsConsumer)));
+ textAnnotations.values().forEach(n -> ddExtAugmentStunner(dmnDDDiagram, n));
+
+ final List associations = dmnXml.getArtifact().stream()
+ .filter(org.kie.dmn.model.api.Association.class::isInstance)
+ .map(org.kie.dmn.model.api.Association.class::cast)
+ .collect(Collectors.toList());
+ for (org.kie.dmn.model.api.Association a : associations) {
+ final String sourceId = getId(a.getSourceRef());
+ final Node sourceNode = Optional.ofNullable(elems.get(sourceId)).map(Entry::getValue).orElse(textAnnotations.get(sourceId));
+
+ final String targetId = getId(a.getTargetRef());
+ final Node targetNode = Optional.ofNullable(elems.get(targetId)).map(Entry::getValue).orElse(textAnnotations.get(targetId));
+
+ @SuppressWarnings("unchecked")
+ final Edge, ?> myEdge = (Edge, ?>) factoryManager.newElement(idOfDMNorWBUUID(a),
+ ASSOCIATION_ID).asEdge();
+
+ final Id id = new Id(a.getId());
+ final Description description = new Description(a.getDescription());
+ final Association definition = new Association(id,
+ description);
+ myEdge.getContent().setDefinition(definition);
+
+ connectEdge(myEdge,
+ sourceNode,
+ targetNode);
+ setConnectionMagnets(myEdge, a.getId(), dmnXml);
+ }
+
+ //Ensure all locations are updated to relative for Stunner
+ for (Entry kv : elems.values()) {
+ PointUtils.convertToRelativeBounds(kv.getValue());
+ }
+
+ final Graph graph = factoryManager.newDiagram("prova",
+ BindableAdapterUtils.getDefinitionSetId(DMNDefinitionSet.class),
+ metadata).getGraph();
+ elems.values().stream().map(Map.Entry::getValue).forEach(graph::addNode);
+ textAnnotations.values().forEach(graph::addNode);
+
+ final Node, ?> dmnDiagramRoot = findDMNDiagramRoot(graph);
+ final Definitions definitionsStunnerPojo = DefinitionsConverter.wbFromDMN(dmnXml, importDefinitions, pmmlDocuments);
+ loadImportedItemDefinitions(definitionsStunnerPojo, importDefinitions);
+ ((View) dmnDiagramRoot.getContent()).getDefinition().setDefinitions(definitionsStunnerPojo);
+
+ //Only connect Nodes to the Diagram that are not referenced by DecisionServices
+ final List references = new ArrayList<>();
+ dmnDecisionServices.forEach(ds -> references.addAll(ds.getEncapsulatedDecision().stream().map(org.kie.dmn.model.api.DMNElementReference::getHref).collect(Collectors.toList())));
+ dmnDecisionServices.forEach(ds -> references.addAll(ds.getOutputDecision().stream().map(org.kie.dmn.model.api.DMNElementReference::getHref).collect(Collectors.toList())));
+
+ final Map elemsToConnectToRoot = elems.values().stream()
+ .filter(elem -> !references.contains("#" + elem.getKey().getId()))
+ .collect(Collectors.toMap(Entry::getKey, Entry::getValue));
+ elemsToConnectToRoot.values().stream()
+ .forEach(node -> connectRootWithChild(dmnDiagramRoot,
+ node));
+
+ textAnnotations.values().stream().forEach(node -> connectRootWithChild(dmnDiagramRoot,
+ node));
+
+ //Copy ComponentWidths information
+ final Optional extension = findComponentsWidthsExtension(dmnDDDiagram);
+ extension.ifPresent(componentsWidthsExtension -> {
+ //This condition is required because a node with ComponentsWidthsExtension
+ //can be imported from another diagram but the extension is not imported or present in this diagram.
+ if (componentsWidthsExtension.getComponentsWidths() != null) {
+ hasComponentWidthsMap.entrySet().forEach(es -> {
+ componentsWidthsExtension
+ .getComponentsWidths()
+ .stream()
+ .filter(componentWidths -> componentWidths.getDmnElementRef().getLocalPart().equals(es.getKey()))
+ .findFirst()
+ .ifPresent(componentWidths -> {
+ final List widths = es.getValue().getComponentWidths();
+ widths.clear();
+ widths.addAll(componentWidths.getWidths());
+ });
+ });
+ }
+ });
+
+ return graph;
+ }
+
+ void removeDrgElementsWithoutShape(final List drgElements,
+ final List dmnShapes) {
+
+ // DMN 1.1 doesn't have DMNShape, so we include all DRGElements and create all the shapes.
+ if (dmnShapes.isEmpty()) {
+ return;
+ }
+
+ drgElements.removeIf(element -> !dmnShapes.stream()
+ .filter(s -> Objects.equals(s.getDmnElementRef().getLocalPart(), element.getId()))
+ .findFirst()
+ .isPresent()
+ );
+ }
+
+ void updateIDsWithAlias(final HashMap indexByUri,
+ final List importedDrgElements) {
+
+ if (importedDrgElements.isEmpty()) {
+ return;
+ }
+
+ final QName namespace = DMNMarshallerImportsHelperStandaloneImpl.NAMESPACE;
+
+ for (org.kie.dmn.model.api.DRGElement element : importedDrgElements) {
+ final String namespaceAttribute = element.getAdditionalAttributes().getOrDefault(namespace, "");
+ if (!StringUtils.isEmpty(namespaceAttribute)) {
+ if (indexByUri.containsKey(namespaceAttribute)) {
+ final String alias = indexByUri.get(namespaceAttribute);
+ changeAlias(alias, element);
+ }
+ }
+ }
+ }
+
+ HashMap getIndexByUri(final org.kie.dmn.model.api.Definitions dmnXml) {
+
+ final HashMap indexByUri = new HashMap<>();
+ dmnXml.getNsContext().entrySet().forEach(e -> indexByUri.put(e.getValue(), e.getKey()));
+ return indexByUri;
+ }
+
+ void changeAlias(final String alias,
+ final org.kie.dmn.model.api.DRGElement drgElement) {
+ if (drgElement.getId().contains(":")) {
+ final String id = drgElement.getId().split(":")[1];
+ drgElement.setId(alias + ":" + id);
+ }
+ }
+
+ private Node getRequiredNode(final Map> elems,
+ final String reqInputID) {
+ if (elems.containsKey(reqInputID)) {
+ return elems.get(reqInputID).getValue();
+ } else {
+
+ final Optional match = elems.keySet().stream()
+ .filter(k -> k.contains(reqInputID))
+ .findFirst();
+ if (match.isPresent()) {
+ return elems.get(match.get()).getValue();
+ }
+ }
+
+ return null;
+ }
+
+ List getImportedDrgElementsByShape(final List dmnShapes,
+ final Map importDefinitions,
+ final org.kie.dmn.model.api.Definitions dmnXml) {
+
+ final List importedDRGElements = dmnMarshallerImportsHelper.getImportedDRGElements(importDefinitions);
+
+ // Update IDs with the alias used in this file for the respective imports
+ final HashMap indexByUri = getIndexByUri(dmnXml);
+ updateIDsWithAlias(indexByUri, importedDRGElements);
+
+ return dmnShapes
+ .stream()
+ .map(shape -> {
+ final String dmnElementRef = getDmnElementRef(shape);
+ final Optional ref = getReference(importedDRGElements, dmnElementRef);
+ return ref.orElse(null);
+ })
+ .filter(Objects::nonNull)
+ .collect(Collectors.toList());
+ }
+
+ Optional getReference(final List importedDRGElements,
+ final String dmnElementRef) {
+ final Optional element = importedDRGElements.stream().filter(drgElement -> dmnElementRef.equals(drgElement.getId())).findFirst();
+ return element;
+ }
+
+ String getDmnElementRef(final DMNShape dmnShape) {
+ return Optional
+ .ofNullable(dmnShape.getDmnElementRef())
+ .map(QName::getLocalPart)
+ .orElse("");
+ }
+
+ List getUniqueDMNShapes(final org.kie.dmn.model.api.dmndi.DMNDiagram dmnDDDiagram) {
+ return new ArrayList<>(dmnDDDiagram
+ .getDMNDiagramElement()
+ .stream()
+ .filter(diagramElements -> diagramElements instanceof DMNShape)
+ .map(d -> (DMNShape) d)
+ .collect(toMap(DMNShape::getId, shape -> shape, (shape1, shape2) -> shape1))
+ .values());
+ }
+
+ /**
+ * Stunner's factoryManager is only used to create Nodes that are considered part of a "Definition Set" (a collection of nodes visible to the User e.g. BPMN2 StartNode, EndNode and DMN's DecisionNode etc).
+ * Relationships are not created with the factory.
+ * This method specializes to connect with an Edge containing a Child relationship the target Node.
+ */
+ private static void connectDSChildEdge(final Node dsNode,
+ final Node requiredNode) {
+ final String uuid = dsNode.getUUID() + "er" + requiredNode.getUUID();
+ final Edge myEdge = new EdgeImpl<>(uuid);
+ myEdge.setContent(new Child());
+ connectEdge(myEdge,
+ dsNode,
+ requiredNode);
+ }
+
+ private static String idOfDMNorWBUUID(final org.kie.dmn.model.api.DMNElement dmn) {
+ return dmn.getId() != null ? dmn.getId() : UUID.uuid();
+ }
+
+ public static Node, ?> findDMNDiagramRoot(final Graph, Node> graph) {
+ return StreamSupport.stream(graph.nodes().spliterator(),
+ false).filter(n -> n.getContent().getDefinition() instanceof DMNDiagram).findFirst().orElseThrow(() -> new UnsupportedOperationException("TODO"));
+ }
+
+ private String getId(final org.kie.dmn.model.api.DMNElementReference er) {
+ final String href = er.getHref();
+ return href.contains("#") ? href.substring(href.indexOf('#') + 1) : href;
+ }
+
+ private void connectEdgeToNodes(final String connectorTypeId,
+ final org.kie.dmn.model.api.DMNElement dmnElement,
+ final org.kie.dmn.model.api.DMNElementReference dmnElementReference,
+ final Map> elems,
+ final org.kie.dmn.model.api.Definitions definitions,
+ final Node currentNode) {
+ if (Objects.nonNull(dmnElementReference)) {
+ final String reqInputID = getId(dmnElementReference);
+ final Node requiredNode = getRequiredNode(elems, reqInputID);
+ final Edge myEdge = factoryManager.newElement(idOfDMNorWBUUID(dmnElement),
+ connectorTypeId).asEdge();
+ connectEdge(myEdge,
+ requiredNode,
+ currentNode);
+ setConnectionMagnets(myEdge, dmnElement.getId(), definitions);
+ }
+ }
+
+ private Node dmnToStunner(final org.kie.dmn.model.api.DRGElement dmn,
+ final BiConsumer hasComponentWidthsConsumer,
+ final List importedDrgElements) {
+ final Node node = createNode(dmn, hasComponentWidthsConsumer);
+ return setAllowOnlyVisualChange(importedDrgElements, node);
+ }
+
+ private Node createNode(final org.kie.dmn.model.api.DRGElement dmn,
+ final BiConsumer hasComponentWidthsConsumer) {
+ if (dmn instanceof org.kie.dmn.model.api.InputData) {
+ return inputDataConverter.nodeFromDMN((org.kie.dmn.model.api.InputData) dmn,
+ hasComponentWidthsConsumer);
+ } else if (dmn instanceof org.kie.dmn.model.api.Decision) {
+ return decisionConverter.nodeFromDMN((org.kie.dmn.model.api.Decision) dmn,
+ hasComponentWidthsConsumer);
+ } else if (dmn instanceof org.kie.dmn.model.api.BusinessKnowledgeModel) {
+ return bkmConverter.nodeFromDMN((org.kie.dmn.model.api.BusinessKnowledgeModel) dmn,
+ hasComponentWidthsConsumer);
+ } else if (dmn instanceof org.kie.dmn.model.api.KnowledgeSource) {
+ return knowledgeSourceConverter.nodeFromDMN((org.kie.dmn.model.api.KnowledgeSource) dmn,
+ hasComponentWidthsConsumer);
+ } else if (dmn instanceof org.kie.dmn.model.api.DecisionService) {
+ return decisionServiceConverter.nodeFromDMN((org.kie.dmn.model.api.DecisionService) dmn,
+ hasComponentWidthsConsumer);
+ } else {
+ throw new UnsupportedOperationException("Unsupported node type detected.");
+ }
+ }
+
+ Node setAllowOnlyVisualChange(final List importedDrgElements,
+ final Node node) {
+
+ getDRGElement(node).ifPresent(drgElement -> {
+ if (isImportedDRGElement(importedDrgElements, drgElement)) {
+ drgElement.setAllowOnlyVisualChange(true);
+ } else {
+ drgElement.setAllowOnlyVisualChange(false);
+ }
+ });
+
+ return node;
+ }
+
+ Optional getDRGElement(final Node node) {
+
+ final Object objectDefinition = DefinitionUtils.getElementDefinition(node);
+
+ if (objectDefinition instanceof DRGElement) {
+ return Optional.of((DRGElement) objectDefinition);
+ }
+
+ return Optional.empty();
+ }
+
+ boolean isImportedDRGElement(final List importedDrgElements,
+ final org.kie.dmn.model.api.DRGElement drgElement) {
+ return isImportedIdNode(importedDrgElements, drgElement.getId());
+ }
+
+ boolean isImportedDRGElement(final List importedDrgElements,
+ final DRGElement drgElement) {
+ return isImportedIdNode(importedDrgElements, drgElement.getId().getValue());
+ }
+
+ private boolean isImportedIdNode(final List importedDrgElements,
+ final String id) {
+ return importedDrgElements
+ .stream()
+ .anyMatch(drgElement -> Objects.equals(drgElement.getId(), id));
+ }
+
+ @SuppressWarnings({"rawtypes", "unchecked"})
+ public static void connectRootWithChild(final Node dmnDiagramRoot,
+ final Node child) {
+ final String uuid = org.kie.workbench.common.stunner.core.util.UUID.uuid();
+ final Edge edge = new EdgeImpl<>(uuid);
+ edge.setContent(new Child());
+ connectEdge(edge,
+ dmnDiagramRoot,
+ child);
+ final Definitions definitions = ((DMNDiagram) ((View) dmnDiagramRoot.getContent()).getDefinition()).getDefinitions();
+ final DMNModelInstrumentedBase childDRG = (DMNModelInstrumentedBase) ((View) child.getContent()).getDefinition();
+ childDRG.setParent(definitions);
+ }
+
+ @SuppressWarnings({"rawtypes", "unchecked"})
+ public static void connectEdge(final Edge edge,
+ final Node source,
+ final Node target) {
+ edge.setSourceNode(source);
+ edge.setTargetNode(target);
+ source.getOutEdges().add(edge);
+ target.getInEdges().add(edge);
+ }
+
+ @SuppressWarnings("unchecked")
+ private void setConnectionMagnets(final Edge edge,
+ final String dmnEdgeElementRef,
+ final org.kie.dmn.model.api.Definitions dmnXml) {
+ final ViewConnector connectionContent = (ViewConnector) edge.getContent();
+
+ final Optional dmnDiagram = findDMNDiagram(dmnXml);
+ Optional dmnEdge = Optional.empty();
+ if (dmnDiagram.isPresent()) {
+ dmnEdge = dmnDiagram.get().getDMNDiagramElement().stream()
+ .filter(DMNEdge.class::isInstance)
+ .map(DMNEdge.class::cast)
+ .filter(e -> e.getDmnElementRef().getLocalPart().equals(dmnEdgeElementRef))
+ .findFirst();
+ }
+ if (dmnEdge.isPresent()) {
+ DMNEdge e = dmnEdge.get();
+ final Point source = e.getWaypoint().get(0);
+ final Node, Edge> sourceNode = edge.getSourceNode();
+ if (null != sourceNode) {
+ setConnectionMagnet(sourceNode,
+ source,
+ connectionContent::setSourceConnection);
+ }
+ final Point target = e.getWaypoint().get(e.getWaypoint().size() - 1);
+ final Node, Edge> targetNode = edge.getTargetNode();
+ if (null != targetNode) {
+ setConnectionMagnet(targetNode,
+ target,
+ connectionContent::setTargetConnection);
+ }
+ if (e.getWaypoint().size() > 2) {
+ connectionContent.setControlPoints(e.getWaypoint()
+ .subList(1, e.getWaypoint().size() - 1)
+ .stream()
+ .map(p -> ControlPoint.build(PointUtils.dmndiPointToPoint2D(p)))
+ .toArray(ControlPoint[]::new));
+ }
+ } else {
+ // Set the source connection, if any.
+ final Node sourceNode = edge.getSourceNode();
+ if (null != sourceNode) {
+ connectionContent.setSourceConnection(MagnetConnection.Builder.atCenter(sourceNode));
+ }
+ // Set the target connection, if any.
+ final Node targetNode = edge.getTargetNode();
+ if (null != targetNode) {
+ connectionContent.setTargetConnection(MagnetConnection.Builder.atCenter(targetNode));
+ }
+ }
+ }
+
+ private void setConnectionMagnet(final Node, Edge> node,
+ final Point magnetPoint,
+ final Consumer connectionConsumer) {
+ final View> view = node.getContent();
+ final double viewX = xOfBound(upperLeftBound(view));
+ final double viewY = yOfBound(upperLeftBound(view));
+ final double magnetRelativeX = magnetPoint.getX() - viewX;
+ final double magnetRelativeY = magnetPoint.getY() - viewY;
+ final double viewWidth = view.getBounds().getWidth();
+ final double viewHeight = view.getBounds().getHeight();
+ if (isCentre(magnetRelativeX,
+ magnetRelativeY,
+ viewWidth,
+ viewHeight)) {
+ connectionConsumer.accept(MagnetConnection.Builder.atCenter(node));
+ } else {
+ connectionConsumer.accept(MagnetConnection.Builder.at(magnetRelativeX, magnetRelativeY).setAuto(true));
+ }
+ }
+
+ private boolean isCentre(final double magnetRelativeX,
+ final double magnetRelativeY,
+ final double viewWidth,
+ final double viewHeight) {
+ return Math.abs((viewWidth / 2) - magnetRelativeX) < CENTRE_TOLERANCE &&
+ Math.abs((viewHeight / 2) - magnetRelativeY) < CENTRE_TOLERANCE;
+ }
+
+ private Optional findComponentsWidthsExtension(final Optional dmnDDDiagram) {
+ if (!dmnDDDiagram.isPresent()) {
+ return Optional.empty();
+ }
+ final org.kie.dmn.model.api.dmndi.DiagramElement.Extension dmnDDExtensions = dmnDDDiagram.get().getExtension();
+
+ if (Objects.isNull(dmnDDExtensions)) {
+ return Optional.empty();
+ }
+ final List extensions = dmnDDExtensions.getAny();
+ if (Objects.isNull(extensions)) {
+ return Optional.empty();
+ }
+ return extensions
+ .stream()
+ .filter(extension -> extension instanceof ComponentsWidthsExtension)
+ .map(extension -> (ComponentsWidthsExtension) extension)
+ .findFirst();
+ }
+
+ @Override
+ @SuppressWarnings("unchecked")
+ public String marshall(final Diagram diagram) throws IOException {
+ final Graph, Node> g = diagram.getGraph();
+
+ final Map nodes = new HashMap<>();
+ final Map textAnnotations = new HashMap<>();
+
+ final Node, ?> dmnDiagramRoot = (Node, ?>) findDMNDiagramRoot(g);
+ final Definitions definitionsStunnerPojo = dmnDiagramRoot.getContent().getDefinition().getDefinitions();
+ cleanImportedItemDefinitions(definitionsStunnerPojo);
+ final org.kie.dmn.model.api.Definitions definitions = DefinitionsConverter.dmnFromWB(definitionsStunnerPojo);
+ if (definitions.getExtensionElements() == null) {
+ if (definitions instanceof org.kie.dmn.model.v1_1.KieDMNModelInstrumentedBase) {
+ definitions.setExtensionElements(new org.kie.dmn.model.v1_1.TDMNElement.TExtensionElements());
+ } else if (definitions instanceof org.kie.dmn.model.v1_2.KieDMNModelInstrumentedBase) {
+ definitions.setExtensionElements(new org.kie.dmn.model.v1_2.TDMNElement.TExtensionElements());
+ } else {
+ definitions.setExtensionElements(new org.kie.dmn.model.v1_2.TDMNElement.TExtensionElements());
+ }
+ }
+
+ if (definitions.getDMNDI() == null) {
+ definitions.setDMNDI(new DMNDI());
+ }
+ final org.kie.dmn.model.api.dmndi.DMNDiagram dmnDDDMNDiagram = new org.kie.dmn.model.v1_2.dmndi.DMNDiagram();
+ definitions.getDMNDI().getDMNDiagram().add(dmnDDDMNDiagram);
+ final List dmnEdges = new ArrayList<>();
+
+ //Convert relative positioning to absolute
+ for (Node, ?> node : g.nodes()) {
+ PointUtils.convertToAbsoluteBounds(node);
+ }
+
+ //Setup callback for marshalling ComponentWidths
+ if (dmnDDDMNDiagram.getExtension() == null) {
+ dmnDDDMNDiagram.setExtension(new DiagramElement.Extension());
+ }
+ final ComponentsWidthsExtension componentsWidthsExtension = new ComponentsWidthsExtension();
+ dmnDDDMNDiagram.getExtension().getAny().add(componentsWidthsExtension);
+
+ final Consumer componentWidthsConsumer = (cw) -> {
+ componentsWidthsExtension.getComponentsWidths().add(cw);
+ };
+
+ //Iterate Graph processing nodes..
+ for (Node, ?> node : g.nodes()) {
+ if (node.getContent() instanceof View>) {
+ final View> view = (View>) node.getContent();
+ if (view.getDefinition() instanceof DRGElement) {
+ final DRGElement drgElement = (org.kie.workbench.common.dmn.api.definition.model.DRGElement) view.getDefinition();
+ if (!drgElement.isAllowOnlyVisualChange()) {
+ nodes.put(drgElement.getId().getValue(),
+ stunnerToDMN(node,
+ componentWidthsConsumer));
+ }
+ dmnDDDMNDiagram.getDMNDiagramElement().add(stunnerToDDExt((View extends DMNElement>) view));
+ } else if (view.getDefinition() instanceof TextAnnotation) {
+ final TextAnnotation textAnnotation = (TextAnnotation) view.getDefinition();
+ textAnnotations.put(textAnnotation.getId().getValue(),
+ textAnnotationConverter.dmnFromNode((Node, ?>) node,
+ componentWidthsConsumer));
+ dmnDDDMNDiagram.getDMNDiagramElement().add(stunnerToDDExt((View extends DMNElement>) view));
+
+ final List associations = AssociationConverter.dmnFromWB((Node, ?>) node);
+ definitions.getArtifact().addAll(associations);
+ }
+ // DMNDI Edge management.
+ final List> inEdges = (List>) node.getInEdges();
+ for (Edge, ?> e : inEdges) {
+ if (e.getContent() instanceof ViewConnector) {
+ final ViewConnector connectionContent = (ViewConnector) e.getContent();
+ if (connectionContent.getSourceConnection().isPresent() && connectionContent.getTargetConnection().isPresent()) {
+ Point2D sourcePoint = ((Connection) connectionContent.getSourceConnection().get()).getLocation();
+ Point2D targetPoint = ((Connection) connectionContent.getTargetConnection().get()).getLocation();
+ final Node, ?> sourceNode = e.getSourceNode();
+ final View> sourceView = (View>) sourceNode.getContent();
+ double xSource = xOfBound(upperLeftBound(sourceView));
+ double ySource = yOfBound(upperLeftBound(sourceView));
+ double xTarget = xOfBound(upperLeftBound(view));
+ double yTarget = yOfBound(upperLeftBound(view));
+ if (sourcePoint == null) {
+ // If the "connection source/target location is null" assume it's the centre of the shape.
+ if (sourceView.getDefinition() instanceof DMNViewDefinition) {
+ DMNViewDefinition dmnViewDefinition = (DMNViewDefinition) sourceView.getDefinition();
+ xSource += dmnViewDefinition.getDimensionsSet().getWidth().getValue() / 2;
+ ySource += dmnViewDefinition.getDimensionsSet().getHeight().getValue() / 2;
+ }
+ sourcePoint = Point2D.create(xSource, ySource);
+ } else {
+ // If it is non-null it is relative to the source/target shape location.
+ sourcePoint = Point2D.create(xSource + sourcePoint.getX(), ySource + sourcePoint.getY());
+ }
+ if (targetPoint == null) {
+ // If the "connection source/target location is null" assume it's the centre of the shape.
+ if (view.getDefinition() instanceof DMNViewDefinition) {
+ DMNViewDefinition dmnViewDefinition = (DMNViewDefinition) view.getDefinition();
+ xTarget += dmnViewDefinition.getDimensionsSet().getWidth().getValue() / 2;
+ yTarget += dmnViewDefinition.getDimensionsSet().getHeight().getValue() / 2;
+ }
+ targetPoint = Point2D.create(xTarget, yTarget);
+ } else {
+ // If it is non-null it is relative to the source/target shape location.
+ targetPoint = Point2D.create(xTarget + targetPoint.getX(), yTarget + targetPoint.getY());
+ }
+
+ final DMNEdge dmnEdge = new org.kie.dmn.model.v1_2.dmndi.DMNEdge();
+ // DMNDI edge elementRef is uuid of Stunner edge,
+ // with the only exception when edge contains as content a DMN Association (Association is an edge)
+ String uuid = e.getUUID();
+ if (e.getContent() instanceof View>) {
+ final View> edgeView = (View>) e.getContent();
+ if (edgeView.getDefinition() instanceof Association) {
+ uuid = ((Association) edgeView.getDefinition()).getId().getValue();
+ }
+ }
+ dmnEdge.setId("dmnedge-" + uuid);
+ dmnEdge.setDmnElementRef(new QName(uuid));
+
+ dmnEdge.getWaypoint().add(PointUtils.point2dToDMNDIPoint(sourcePoint));
+ for (ControlPoint cp : connectionContent.getControlPoints()) {
+ dmnEdge.getWaypoint().add(PointUtils.point2dToDMNDIPoint(cp.getLocation()));
+ }
+ dmnEdge.getWaypoint().add(PointUtils.point2dToDMNDIPoint(targetPoint));
+ dmnEdges.add(dmnEdge);
+ }
+ }
+ }
+ }
+ }
+
+ nodes.values().forEach(n -> {
+ n.setParent(definitions);
+ definitions.getDrgElement().add(n);
+ });
+ textAnnotations.values().forEach(definitions.getArtifact()::add);
+
+ // add DMNEdge last.
+ dmnDDDMNDiagram.getDMNDiagramElement().addAll(dmnEdges);
+
+ return marshaller.marshal(definitions);
+ }
+
+ void loadImportedItemDefinitions(final Definitions definitions,
+ final Map importDefinitions) {
+ definitions.getItemDefinition().addAll(getWbImportedItemDefinitions(importDefinitions));
+ }
+
+ void cleanImportedItemDefinitions(final Definitions definitions) {
+ definitions.getItemDefinition().removeIf(ItemDefinition::isAllowOnlyVisualChange);
+ }
+
+ List getWbImportedItemDefinitions(final Map importDefinitions) {
+ return dmnMarshallerImportsHelper
+ .getImportedItemDefinitions(importDefinitions)
+ .stream()
+ .map(ItemDefinitionPropertyConverter::wbFromDMN)
+ .peek(itemDefinition -> itemDefinition.setAllowOnlyVisualChange(true))
+ .collect(Collectors.toList());
+ }
+
+ private void ddExtAugmentStunner(final Optional dmnDDDiagram, Node currentNode) {
+ if (!dmnDDDiagram.isPresent()) {
+ return;
+ }
+
+ final Stream drgShapeStream = dmnDDDiagram.get().getDMNDiagramElement().stream().filter(DMNShape.class::isInstance).map(DMNShape.class::cast);
+ final View content = (View) currentNode.getContent();
+ final Bound ulBound = upperLeftBound(content);
+ final Bound lrBound = lowerRightBound(content);
+ if (content.getDefinition() instanceof Decision) {
+ final Decision d = (Decision) content.getDefinition();
+ internalAugment(drgShapeStream, d.getId(),
+ ulBound,
+ d.getDimensionsSet(),
+ lrBound,
+ d.getBackgroundSet(),
+ d::setFontSet);
+ } else if (content.getDefinition() instanceof InputData) {
+ final InputData d = (InputData) content.getDefinition();
+ internalAugment(drgShapeStream,
+ d.getId(),
+ ulBound,
+ d.getDimensionsSet(),
+ lrBound,
+ d.getBackgroundSet(),
+ d::setFontSet);
+ } else if (content.getDefinition() instanceof BusinessKnowledgeModel) {
+ final BusinessKnowledgeModel d = (BusinessKnowledgeModel) content.getDefinition();
+ internalAugment(drgShapeStream,
+ d.getId(),
+ ulBound,
+ d.getDimensionsSet(),
+ lrBound,
+ d.getBackgroundSet(),
+ d::setFontSet);
+ } else if (content.getDefinition() instanceof KnowledgeSource) {
+ final KnowledgeSource d = (KnowledgeSource) content.getDefinition();
+ internalAugment(drgShapeStream,
+ d.getId(),
+ ulBound,
+ d.getDimensionsSet(),
+ lrBound,
+ d.getBackgroundSet(),
+ d::setFontSet);
+ } else if (content.getDefinition() instanceof TextAnnotation) {
+ final TextAnnotation d = (TextAnnotation) content.getDefinition();
+ internalAugment(drgShapeStream,
+ d.getId(),
+ ulBound,
+ d.getDimensionsSet(),
+ lrBound,
+ d.getBackgroundSet(),
+ d::setFontSet);
+ } else if (content.getDefinition() instanceof DecisionService) {
+ final DecisionService d = (DecisionService) content.getDefinition();
+ internalAugment(drgShapeStream,
+ d.getId(),
+ ulBound,
+ d.getDimensionsSet(),
+ lrBound,
+ d.getBackgroundSet(),
+ d::setFontSet,
+ (dividerLineY) -> d.setDividerLineY(new DecisionServiceDividerLineY(dividerLineY - ulBound.getY())));
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ private void internalAugment(final Stream drgShapeStream,
+ final Id id,
+ final Bound ulBound,
+ final RectangleDimensionsSet dimensionsSet,
+ final Bound lrBound,
+ final BackgroundSet bgset,
+ final Consumer fontSetSetter) {
+ internalAugment(drgShapeStream,
+ id,
+ ulBound,
+ dimensionsSet,
+ lrBound,
+ bgset,
+ fontSetSetter,
+ (line) -> {/*NOP*/});
+ }
+
+ @SuppressWarnings("unchecked")
+ private void internalAugment(final Stream drgShapeStream,
+ final Id id,
+ final Bound ulBound,
+ final RectangleDimensionsSet dimensionsSet,
+ final Bound lrBound,
+ final BackgroundSet bgset,
+ final Consumer fontSetSetter,
+ final Consumer decisionServiceDividerLineYSetter) {
+ final Optional drgShapeOpt = drgShapeStream.filter(shape -> shape.getDmnElementRef().getLocalPart().equals(id.getValue())).findFirst();
+ if (!drgShapeOpt.isPresent()) {
+ return;
+ }
+ final DMNShape drgShape = drgShapeOpt.get();
+
+ if (ulBound != null) {
+ ulBound.setX(xOfShape(drgShape));
+ ulBound.setY(yOfShape(drgShape));
+ }
+ dimensionsSet.setWidth(new Width(widthOfShape(drgShape)));
+ dimensionsSet.setHeight(new Height(heightOfShape(drgShape)));
+ if (lrBound != null) {
+ lrBound.setX(xOfShape(drgShape) + widthOfShape(drgShape));
+ lrBound.setY(yOfShape(drgShape) + heightOfShape(drgShape));
+ }
+
+ final DMNStyle dmnStyleOfDrgShape = drgShape.getStyle() instanceof DMNStyle ? (DMNStyle) drgShape.getStyle() : null;
+ if (dmnStyleOfDrgShape != null) {
+ if (null != dmnStyleOfDrgShape.getFillColor()) {
+ bgset.setBgColour(new BgColour(ColorUtils.wbFromDMN(dmnStyleOfDrgShape.getFillColor())));
+ }
+ if (null != dmnStyleOfDrgShape.getStrokeColor()) {
+ bgset.setBorderColour(new BorderColour(ColorUtils.wbFromDMN(dmnStyleOfDrgShape.getStrokeColor())));
+ }
+ }
+
+ final FontSet fontSet = new FontSet();
+ if (dmnStyleOfDrgShape != null) {
+ mergeFontSet(fontSet, FontSetPropertyConverter.wbFromDMN(dmnStyleOfDrgShape));
+ }
+ if (drgShape.getDMNLabel() != null && drgShape.getDMNLabel().getSharedStyle() instanceof DMNStyle) {
+ mergeFontSet(fontSet, FontSetPropertyConverter.wbFromDMN((DMNStyle) drgShape.getDMNLabel().getSharedStyle()));
+ }
+ if (drgShape.getDMNLabel() != null && drgShape.getDMNLabel().getStyle() instanceof DMNStyle) {
+ mergeFontSet(fontSet, FontSetPropertyConverter.wbFromDMN((DMNStyle) drgShape.getDMNLabel().getStyle()));
+ }
+ fontSetSetter.accept(fontSet);
+
+ if (drgShape.getDMNDecisionServiceDividerLine() != null) {
+ decisionServiceDividerLineYSetter.accept(drgShape.getDMNDecisionServiceDividerLine().getWaypoint().get(0).getY());
+ }
+ }
+
+ private static void mergeFontSet(final FontSet fontSet,
+ final FontSet additional) {
+ if (additional.getFontFamily() != null) {
+ fontSet.setFontFamily(additional.getFontFamily());
+ }
+ if (additional.getFontSize() != null) {
+ fontSet.setFontSize(additional.getFontSize());
+ }
+ if (additional.getFontColour() != null) {
+ fontSet.setFontColour(additional.getFontColour());
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ private static DMNShape stunnerToDDExt(final View extends DMNElement> v) {
+ final DMNShape result = new org.kie.dmn.model.v1_2.dmndi.DMNShape();
+ result.setId("dmnshape-" + v.getDefinition().getId().getValue());
+ result.setDmnElementRef(new QName(v.getDefinition().getId().getValue()));
+ final Bounds bounds = new org.kie.dmn.model.v1_2.dmndi.Bounds();
+ result.setBounds(bounds);
+ bounds.setX(xOfBound(upperLeftBound(v)));
+ bounds.setY(yOfBound(upperLeftBound(v)));
+ result.setStyle(new org.kie.dmn.model.v1_2.dmndi.DMNStyle());
+ result.setDMNLabel(new org.kie.dmn.model.v1_2.dmndi.DMNLabel());
+ if (v.getDefinition() instanceof Decision) {
+ final Decision d = (Decision) v.getDefinition();
+ applyBounds(d.getDimensionsSet(), bounds);
+ applyBackgroundStyles(d.getBackgroundSet(), result);
+ applyFontStyle(d.getFontSet(), result);
+ } else if (v.getDefinition() instanceof InputData) {
+ final InputData d = (InputData) v.getDefinition();
+ applyBounds(d.getDimensionsSet(), bounds);
+ applyBackgroundStyles(d.getBackgroundSet(), result);
+ applyFontStyle(d.getFontSet(), result);
+ } else if (v.getDefinition() instanceof BusinessKnowledgeModel) {
+ final BusinessKnowledgeModel d = (BusinessKnowledgeModel) v.getDefinition();
+ applyBounds(d.getDimensionsSet(), bounds);
+ applyBackgroundStyles(d.getBackgroundSet(), result);
+ applyFontStyle(d.getFontSet(), result);
+ } else if (v.getDefinition() instanceof KnowledgeSource) {
+ final KnowledgeSource d = (KnowledgeSource) v.getDefinition();
+ applyBounds(d.getDimensionsSet(), bounds);
+ applyBackgroundStyles(d.getBackgroundSet(), result);
+ applyFontStyle(d.getFontSet(), result);
+ } else if (v.getDefinition() instanceof TextAnnotation) {
+ final TextAnnotation d = (TextAnnotation) v.getDefinition();
+ applyBounds(d.getDimensionsSet(), bounds);
+ applyBackgroundStyles(d.getBackgroundSet(), result);
+ applyFontStyle(d.getFontSet(), result);
+ } else if (v.getDefinition() instanceof DecisionService) {
+ final DecisionService d = (DecisionService) v.getDefinition();
+ applyBounds(d.getDimensionsSet(), bounds);
+ applyBackgroundStyles(d.getBackgroundSet(), result);
+ applyFontStyle(d.getFontSet(), result);
+ final DMNDecisionServiceDividerLine dl = new org.kie.dmn.model.v1_2.dmndi.DMNDecisionServiceDividerLine();
+ final org.kie.dmn.model.api.dmndi.Point leftPoint = new org.kie.dmn.model.v1_2.dmndi.Point();
+ leftPoint.setX(v.getBounds().getUpperLeft().getX());
+ final double dlY = v.getBounds().getUpperLeft().getY() + d.getDividerLineY().getValue();
+ leftPoint.setY(dlY);
+ dl.getWaypoint().add(leftPoint);
+ final org.kie.dmn.model.api.dmndi.Point rightPoint = new org.kie.dmn.model.v1_2.dmndi.Point();
+ rightPoint.setX(v.getBounds().getLowerRight().getX());
+ rightPoint.setY(dlY);
+ dl.getWaypoint().add(rightPoint);
+ result.setDMNDecisionServiceDividerLine(dl);
+ }
+ return result;
+ }
+
+ private static void applyFontStyle(final FontSet fontSet,
+ final DMNShape result) {
+ if (!(result.getStyle() instanceof DMNStyle)) {
+ return;
+ }
+ final DMNStyle shapeStyle = (DMNStyle) result.getStyle();
+ final Color fontColor = ColorUtils.dmnFromWB(fontSet.getFontColour().getValue());
+ shapeStyle.setFontColor(fontColor);
+ if (null != fontSet.getFontFamily().getValue()) {
+ shapeStyle.setFontFamily(fontSet.getFontFamily().getValue());
+ }
+ if (null != fontSet.getFontSize().getValue()) {
+ shapeStyle.setFontSize(fontSet.getFontSize().getValue());
+ }
+ }
+
+ private static void applyBounds(final RectangleDimensionsSet dimensionsSet,
+ final Bounds bounds) {
+ if (null != dimensionsSet.getWidth().getValue() &&
+ null != dimensionsSet.getHeight().getValue()) {
+ bounds.setWidth(dimensionsSet.getWidth().getValue());
+ bounds.setHeight(dimensionsSet.getHeight().getValue());
+ }
+ }
+
+ private static void applyBackgroundStyles(final BackgroundSet bgset,
+ final DMNShape result) {
+ if (!(result.getStyle() instanceof DMNStyle)) {
+ return;
+ }
+ final DMNStyle style = (DMNStyle) result.getStyle();
+ if (null != bgset.getBgColour().getValue()) {
+ style.setFillColor(ColorUtils.dmnFromWB(bgset.getBgColour().getValue()));
+ }
+ if (null != bgset.getBorderColour().getValue()) {
+ style.setStrokeColor(ColorUtils.dmnFromWB(bgset.getBorderColour().getValue()));
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ private org.kie.dmn.model.api.DRGElement stunnerToDMN(final Node, ?> node,
+ final Consumer componentWidthsConsumer) {
+ if (node.getContent() instanceof View>) {
+ final View> view = (View>) node.getContent();
+ if (view.getDefinition() instanceof InputData) {
+ return inputDataConverter.dmnFromNode((Node, ?>) node,
+ componentWidthsConsumer);
+ } else if (view.getDefinition() instanceof Decision) {
+ return decisionConverter.dmnFromNode((Node, ?>) node,
+ componentWidthsConsumer);
+ } else if (view.getDefinition() instanceof BusinessKnowledgeModel) {
+ return bkmConverter.dmnFromNode((Node, ?>) node,
+ componentWidthsConsumer);
+ } else if (view.getDefinition() instanceof KnowledgeSource) {
+ return knowledgeSourceConverter.dmnFromNode((Node, ?>) node,
+ componentWidthsConsumer);
+ } else if (view.getDefinition() instanceof DecisionService) {
+ return decisionServiceConverter.dmnFromNode((Node, ?>) node,
+ componentWidthsConsumer);
+ } else {
+ throw new UnsupportedOperationException("Unsupported node type detected.");
+ }
+ }
+ throw new RuntimeException("wrong diagram structure to marshall");
+ }
+
+ @Override
+ public DiagramMetadataMarshaller getMetadataMarshaller() {
+ return diagramMetadataMarshaller;
+ }
+}
diff --git a/kie-wb-common-dmn/kie-wb-common-dmn-backend/src/main/java/org/kie/workbench/common/dmn/backend/common/DMNImportTypesHelperImpl.java b/kie-wb-common-dmn/kie-wb-common-dmn-backend/src/main/java/org/kie/workbench/common/dmn/backend/common/DMNImportTypesHelperImpl.java
index 0b0008b6203..ec66fdfacf9 100644
--- a/kie-wb-common-dmn/kie-wb-common-dmn-backend/src/main/java/org/kie/workbench/common/dmn/backend/common/DMNImportTypesHelperImpl.java
+++ b/kie-wb-common-dmn/kie-wb-common-dmn-backend/src/main/java/org/kie/workbench/common/dmn/backend/common/DMNImportTypesHelperImpl.java
@@ -18,6 +18,7 @@
import javax.enterprise.context.ApplicationScoped;
import org.kie.workbench.common.dmn.api.editors.included.DMNImportTypes;
+import org.kie.workbench.common.dmn.api.marshalling.DMNImportTypesHelper;
import org.kie.workbench.common.stunner.core.util.StringUtils;
import org.uberfire.backend.vfs.Path;
diff --git a/kie-wb-common-dmn/kie-wb-common-dmn-backend/src/main/java/org/kie/workbench/common/dmn/backend/common/DMNMarshallerImportsHelper.java b/kie-wb-common-dmn/kie-wb-common-dmn-backend/src/main/java/org/kie/workbench/common/dmn/backend/common/DMNMarshallerImportsHelper.java
deleted file mode 100644
index 527e805e8e2..00000000000
--- a/kie-wb-common-dmn/kie-wb-common-dmn-backend/src/main/java/org/kie/workbench/common/dmn/backend/common/DMNMarshallerImportsHelper.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright 2019 Red Hat, Inc. and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.kie.workbench.common.dmn.backend.common;
-
-import java.io.InputStream;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-
-import org.guvnor.common.services.project.model.WorkspaceProject;
-import org.kie.dmn.model.api.DRGElement;
-import org.kie.dmn.model.api.Definitions;
-import org.kie.dmn.model.api.Import;
-import org.kie.dmn.model.api.ItemDefinition;
-import org.kie.workbench.common.dmn.api.editors.included.PMMLDocumentMetadata;
-import org.kie.workbench.common.dmn.backend.DMNMarshaller;
-import org.kie.workbench.common.stunner.core.diagram.Metadata;
-import org.uberfire.backend.vfs.Path;
-
-/**
- * This helper provides methods to handle imports into the {@link DMNMarshaller}.
- */
-public interface DMNMarshallerImportsHelper {
-
- /**
- * This method loads all imported DMN definitions from a list of imports.
- * @param metadata represents the metadata from the main DMN model.
- * @param imports represent the list of imported files.
- * @return a map {@link Definitions} indexed by {@link Import}s.
- */
- Map getImportDefinitions(final Metadata metadata,
- final List imports);
-
- /**
- * This method loads all imported PMML documents from a list of imports.
- * @param metadata represents the metadata from the main DMN model.
- * @param imports represent the list of imported files.
- * @return a map {@link PMMLDocumentMetadata} indexed by {@link Import}s.
- */
- Map getPMMLDocuments(final Metadata metadata,
- final List imports);
-
- /**
- * This method loads {@link String} of all imported XML files from a list of imports.
- * @param metadata represents the metadata from the main DMN model.
- * @param imports represent the list of imported files.
- * @return a map {@link String} indexed by {@link Import}s.
- */
- Map getImportXML(final Metadata metadata,
- final List imports);
-
- /**
- * This method extract a list of {@link DRGElement}s from the importDefinitions
map.
- * @param importDefinitions is a map of {@link Definitions} indexed by {@link Import}.
- * @return a list of imported {@link DRGElement}s.
- */
- List getImportedDRGElements(final Map importDefinitions);
-
- /**
- * This method extract a list of {@link ItemDefinition} from the importDefinitions
map.
- * @param importDefinitions is a map of {@link Definitions} indexed by {@link Import}.
- * @return a list of imported {@link ItemDefinition}s.
- */
- List getImportedItemDefinitions(final Map importDefinitions);
-
- /**
- * This method finds the list of {@link ItemDefinition}s for a given namespace
.
- * @param workspaceProject represents the project that will be scanned.
- * @param modelName is the value used as the prefix for imported {@link ItemDefinition}s.
- * @param namespace is the namespace of the model that provides the list of {@link ItemDefinition}s.
- * @return a list of imported {@link ItemDefinition}s.
- */
- List getImportedItemDefinitionsByNamespace(final WorkspaceProject workspaceProject,
- final String modelName,
- final String namespace);
-
- /**
- * This method finds the {@link Path} of DMN model.
- * @param metadata represents the metadata from the a DMN model from the scanned project.
- * @param modelNamespace represents the namespace of the desired DMN model.
- * @param modelName represents the mode name of the desired DMN model.
- * @return the {@link Path} of the desired DMN model.
- */
- Path getDMNModelPath(final Metadata metadata,
- final String modelNamespace,
- final String modelName);
-
- /**
- * This method loads the {@link InputStream} from a given {@link org.uberfire.backend.vfs.Path}.
- * @param path to be loaded.
- * @return the {@link InputStream} when the path is valid, otherwise is returns empty.
- */
- Optional loadPath(final Path path);
-}
diff --git a/kie-wb-common-dmn/kie-wb-common-dmn-backend/src/main/java/org/kie/workbench/common/dmn/backend/common/DMNMarshallerImportsHelperImpl.java b/kie-wb-common-dmn/kie-wb-common-dmn-backend/src/main/java/org/kie/workbench/common/dmn/backend/common/DMNMarshallerImportsHelperImpl.java
deleted file mode 100644
index 59331879a6b..00000000000
--- a/kie-wb-common-dmn/kie-wb-common-dmn-backend/src/main/java/org/kie/workbench/common/dmn/backend/common/DMNMarshallerImportsHelperImpl.java
+++ /dev/null
@@ -1,383 +0,0 @@
-/*
- * Copyright 2019 Red Hat, Inc. and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.kie.workbench.common.dmn.backend.common;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.StringReader;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.stream.Collectors;
-
-import javax.enterprise.context.ApplicationScoped;
-import javax.inject.Inject;
-import javax.inject.Named;
-import javax.xml.namespace.QName;
-
-import org.guvnor.common.services.project.model.WorkspaceProject;
-import org.guvnor.common.services.project.service.WorkspaceProjectService;
-import org.kie.dmn.api.marshalling.DMNMarshaller;
-import org.kie.dmn.model.api.DRGElement;
-import org.kie.dmn.model.api.Decision;
-import org.kie.dmn.model.api.Definitions;
-import org.kie.dmn.model.api.Import;
-import org.kie.dmn.model.api.InformationItem;
-import org.kie.dmn.model.api.InputData;
-import org.kie.dmn.model.api.Invocable;
-import org.kie.dmn.model.api.ItemDefinition;
-import org.kie.dmn.model.v1_2.TInformationItem;
-import org.kie.workbench.common.dmn.api.editors.included.PMMLDocumentMetadata;
-import org.kie.workbench.common.dmn.backend.editors.common.PMMLIncludedDocumentFactory;
-import org.kie.workbench.common.stunner.core.diagram.Metadata;
-import org.uberfire.backend.server.util.Paths;
-import org.uberfire.backend.vfs.Path;
-import org.uberfire.io.IOService;
-
-import static java.util.Collections.emptyList;
-import static org.kie.workbench.common.dmn.api.editors.types.BuiltInTypeUtils.isBuiltInType;
-import static org.kie.workbench.common.dmn.backend.definition.v1_1.ImportedItemDefinitionConverter.withNamespace;
-
-@ApplicationScoped
-public class DMNMarshallerImportsHelperImpl implements DMNMarshallerImportsHelper {
-
- private final DMNPathsHelper pathsHelper;
-
- private final WorkspaceProjectService projectService;
-
- private final IOService ioService;
-
- private final DMNMarshaller marshaller;
-
- private final DMNIOHelper dmnIOHelper;
-
- public static final QName NAMESPACE = new QName("Namespace");
-
- private final PMMLIncludedDocumentFactory pmmlDocumentFactory;
-
- public DMNMarshallerImportsHelperImpl() {
- this(null, null, null, null, null, null);
- }
-
- @Inject
- public DMNMarshallerImportsHelperImpl(final DMNPathsHelper pathsHelper,
- final WorkspaceProjectService projectService,
- final DMNMarshaller marshaller,
- final DMNIOHelper dmnIOHelper,
- final PMMLIncludedDocumentFactory pmmlDocumentFactory,
- final @Named("ioStrategy") IOService ioService) {
- this.pathsHelper = pathsHelper;
- this.projectService = projectService;
- this.marshaller = marshaller;
- this.dmnIOHelper = dmnIOHelper;
- this.pmmlDocumentFactory = pmmlDocumentFactory;
- this.ioService = ioService;
- }
-
- @Override
- public Map getImportDefinitions(final Metadata metadata,
- final List imports) {
-
- final Map importDefinitions = new HashMap<>();
-
- if (imports.size() > 0) {
- for (final Definitions definitions : getOtherDMNDiagramsDefinitions(metadata)) {
- findImportByDefinitions(definitions, imports).ifPresent(anImport -> {
- importDefinitions.put(anImport, definitions);
- });
- }
- }
-
- return importDefinitions;
- }
-
- @Override
- public Map getPMMLDocuments(final Metadata metadata,
- final List imports) {
- final Map pmmlDocuments = new HashMap<>();
-
- if (imports.size() > 0) {
- for (final Path pmmlDocumentPath : getPMMLDocumentPaths(metadata)) {
- findImportByPMMLDocument(metadata.getPath(), pmmlDocumentPath, imports).ifPresent(anImport -> {
- pmmlDocuments.put(anImport, pmmlDocumentFactory.getDocumentByPath(pmmlDocumentPath));
- });
- }
- }
-
- return pmmlDocuments;
- }
-
- @Override
- public Map getImportXML(final Metadata metadata,
- final List imports) {
-
- final Map importXML = new HashMap<>();
-
- if (imports.size() > 0) {
- for (final String xml : getOtherDMNDiagramsXML(metadata)) {
- try (StringReader sr = toStringReader(xml)) {
- final Definitions definitions = marshaller.unmarshal(sr);
- findImportByDefinitions(definitions, imports).ifPresent(anImport -> {
- importXML.put(anImport, xml);
- });
- }
- }
- }
-
- return importXML;
- }
-
- @Override
- public Path getDMNModelPath(final Metadata metadata,
- final String modelNamespace,
- final String modelName) {
-
- final WorkspaceProject workspaceProject = getProject(metadata);
-
- for (final Path dmnModelPath : pathsHelper.getDMNModelsPaths(workspaceProject)) {
-
- final Optional definitions = getDefinitionsByPath(dmnModelPath);
-
- if (definitions.map(d -> Objects.equals(d.getNamespace(), modelNamespace) && Objects.equals(d.getName(), modelName)).orElse(false)) {
- return dmnModelPath;
- }
- }
-
- throw new UnsupportedOperationException("No DMN model could be found for the following namespace: " + modelNamespace);
- }
-
- @Override
- public List getImportedDRGElements(final Map importDefinitions) {
-
- final List importedNodes = new ArrayList<>();
-
- importDefinitions.forEach((anImport, definitions) -> {
- importedNodes.addAll(getDrgElementsWithNamespace(definitions, anImport));
- });
-
- return importedNodes;
- }
-
- @Override
- public List getImportedItemDefinitions(final Map importDefinitions) {
-
- final List