use of org.kie.workbench.common.dmn.api.definition.model.Association in project kie-wb-common by kiegroup.
the class NodeConnector method connect.
void connect(final JSIDMNDiagram dmnDiagram, final List<JSIDMNEdge> edges, final List<JSITAssociation> associations, final List<NodeEntry> nodeEntries, final boolean isDMNDIPresent) {
final Map<String, List<NodeEntry>> entriesById = makeNodeIndex(nodeEntries);
final String diagramId = dmnDiagram.getId();
for (final NodeEntry nodeEntry : nodeEntries) {
final JSITDMNElement element = nodeEntry.getDmnElement();
final Node node = nodeEntry.getNode();
// For imported nodes, we don't have its connections
if (nodeEntry.isIncluded()) {
continue;
}
// DMN spec table 2: Requirements
if (JSITDecision.instanceOf(element)) {
final JSITDecision decision = Js.uncheckedCast(element);
final List<JSITInformationRequirement> jsiInformationRequirements = decision.getInformationRequirement();
for (int i = 0; i < jsiInformationRequirements.size(); i++) {
final JSITInformationRequirement ir = Js.uncheckedCast(jsiInformationRequirements.get(i));
connectEdgeToNodes(INFO_REQ_ID, ir, ir.getRequiredInput(), entriesById, diagramId, edges, isDMNDIPresent, node);
connectEdgeToNodes(INFO_REQ_ID, ir, ir.getRequiredDecision(), entriesById, diagramId, edges, isDMNDIPresent, node);
}
final List<JSITKnowledgeRequirement> jsiKnowledgeRequirements = decision.getKnowledgeRequirement();
for (int i = 0; i < jsiKnowledgeRequirements.size(); i++) {
final JSITKnowledgeRequirement kr = Js.uncheckedCast(jsiKnowledgeRequirements.get(i));
connectEdgeToNodes(KNOWLEDGE_REQ_ID, kr, kr.getRequiredKnowledge(), entriesById, diagramId, edges, isDMNDIPresent, node);
}
final List<JSITAuthorityRequirement> jsiAuthorityRequirements = decision.getAuthorityRequirement();
for (int i = 0; i < jsiAuthorityRequirements.size(); i++) {
final JSITAuthorityRequirement ar = Js.uncheckedCast(jsiAuthorityRequirements.get(i));
connectEdgeToNodes(AUTH_REQ_ID, ar, ar.getRequiredAuthority(), entriesById, diagramId, edges, isDMNDIPresent, node);
}
continue;
}
if (JSITBusinessKnowledgeModel.instanceOf(element)) {
final JSITBusinessKnowledgeModel bkm = Js.uncheckedCast(element);
final List<JSITKnowledgeRequirement> jsiKnowledgeRequirements = bkm.getKnowledgeRequirement();
for (int i = 0; i < jsiKnowledgeRequirements.size(); i++) {
final JSITKnowledgeRequirement kr = Js.uncheckedCast(jsiKnowledgeRequirements.get(i));
connectEdgeToNodes(KNOWLEDGE_REQ_ID, kr, kr.getRequiredKnowledge(), entriesById, diagramId, edges, isDMNDIPresent, node);
}
final List<JSITAuthorityRequirement> jsiAuthorityRequirements = bkm.getAuthorityRequirement();
for (int i = 0; i < jsiAuthorityRequirements.size(); i++) {
final JSITAuthorityRequirement ar = Js.uncheckedCast(jsiAuthorityRequirements.get(i));
connectEdgeToNodes(AUTH_REQ_ID, ar, ar.getRequiredAuthority(), entriesById, diagramId, edges, isDMNDIPresent, node);
}
continue;
}
if (JSITKnowledgeSource.instanceOf(element)) {
final JSITKnowledgeSource ks = Js.uncheckedCast(element);
final List<JSITAuthorityRequirement> jsiAuthorityRequirements = ks.getAuthorityRequirement();
for (int i = 0; i < jsiAuthorityRequirements.size(); i++) {
final JSITAuthorityRequirement ar = Js.uncheckedCast(jsiAuthorityRequirements.get(i));
connectEdgeToNodes(AUTH_REQ_ID, ar, ar.getRequiredInput(), entriesById, diagramId, edges, isDMNDIPresent, node);
connectEdgeToNodes(AUTH_REQ_ID, ar, ar.getRequiredDecision(), entriesById, diagramId, edges, isDMNDIPresent, node);
connectEdgeToNodes(AUTH_REQ_ID, ar, ar.getRequiredAuthority(), entriesById, diagramId, edges, isDMNDIPresent, node);
}
continue;
}
if (JSITDecisionService.instanceOf(element)) {
final JSITDecisionService ds = Js.uncheckedCast(element);
final List<JSITDMNElementReference> encapsulatedDecisions = ds.getEncapsulatedDecision();
forEach(encapsulatedDecisions, er -> {
final String reqInputID = getId(er);
getNode(nodeEntry, reqInputID, entriesById).ifPresent(requiredNode -> {
connectDSChildEdge(node, requiredNode);
});
});
final List<JSITDMNElementReference> outputDecisions = ds.getOutputDecision();
forEach(outputDecisions, er -> {
final String reqInputID = getId(er);
getNode(nodeEntry, reqInputID, entriesById).ifPresent(requiredNode -> {
connectDSChildEdge(node, requiredNode);
});
});
}
}
forEach(associations, association -> {
final String sourceId = getId(association.getSourceRef());
final String targetId = getId(association.getTargetRef());
final List<NodeEntry> source = entriesById.get(sourceId);
final List<NodeEntry> target = entriesById.get(targetId);
final boolean sourcePresent = source != null && source.size() > 0;
final boolean targetPresent = target != null && target.size() > 0;
if (sourcePresent && targetPresent) {
final NodeEntry sourceEntry = source.get(0);
final NodeEntry targetEntry = target.get(0);
final Node sourceNode = sourceEntry.getNode();
final Node targetNode = targetEntry.getNode();
@SuppressWarnings("unchecked") final Edge<View<Association>, ?> myEdge = (Edge<View<Association>, ?>) factoryManager.newElement(diagramId + "#" + association.getId(), ASSOCIATION_ID).asEdge();
final ViewConnector connectionContent = (ViewConnector) myEdge.getContent();
final Id id = new Id(association.getId());
final Description description = new Description(association.getDescription());
final Association definition = new Association(id, description);
connectEdge(myEdge, sourceNode, targetNode);
connectionContent.setDefinition(definition);
connectionContent.setTargetConnection(MagnetConnection.Builder.atCenter(targetNode));
connectionContent.setSourceConnection(MagnetConnection.Builder.atCenter(sourceNode));
}
});
}
use of org.kie.workbench.common.dmn.api.definition.model.Association in project kie-wb-common by kiegroup.
the class DMNMarshallerStandaloneTest method testAssociationEdgeDMNDI.
/**
* DROOLS-2569 [DMN Designer] Marshalling of magnet positions -- Association DMN Edge DMNDI serialization.
* This test re-create by hard-code the graph to simulate the behavior of the Stunner framework programmatically.
*/
@SuppressWarnings("unchecked")
@Test
public void testAssociationEdgeDMNDI() throws IOException {
final BiConsumer<String, HasComponentWidths> hasComponentWidthsConsumer = (uuid, hcw) -> {
/*NOP*/
};
Diagram diagram = createDiagram();
Graph g = diagram.getGraph();
Node diagramRoot = DMNMarshallerStandalone.findDMNDiagramRoot(g);
testAugmentWithNSPrefixes(((DMNDiagram) ((View<?>) diagramRoot.getContent()).getDefinition()).getDefinitions());
org.kie.dmn.model.api.InputData dmnInputData = new TInputData();
dmnInputData.setId("inputDataID");
dmnInputData.setName(dmnInputData.getId());
Node inputDataNode = new InputDataConverter(api.getFactoryManager()).nodeFromDMN(dmnInputData, hasComponentWidthsConsumer);
org.kie.dmn.model.api.TextAnnotation dmnTextAnnotation = new TTextAnnotation();
dmnTextAnnotation.setId("textAnnotationID");
Node textAnnotationNode = new TextAnnotationConverter(api.getFactoryManager()).nodeFromDMN(dmnTextAnnotation, hasComponentWidthsConsumer);
g.addNode(inputDataNode);
g.addNode(textAnnotationNode);
View content = (View) textAnnotationNode.getContent();
content.setBounds(org.kie.workbench.common.stunner.core.graph.content.Bounds.create(200, 200, 300, 250));
final String edgeID = "edgeID";
final String associationID = "associationID";
Edge myEdge = api.getFactoryManager().newElement(edgeID, DMNMarshallerStandalone.ASSOCIATION_ID).asEdge();
final View<?> edgeView = (View<?>) myEdge.getContent();
((Association) edgeView.getDefinition()).setId(new Id(associationID));
myEdge.setSourceNode(inputDataNode);
myEdge.setTargetNode(textAnnotationNode);
inputDataNode.getOutEdges().add(myEdge);
textAnnotationNode.getInEdges().add(myEdge);
ViewConnector connectionContent = (ViewConnector) myEdge.getContent();
connectionContent.setSourceConnection(MagnetConnection.Builder.atCenter(inputDataNode));
connectionContent.setTargetConnection(MagnetConnection.Builder.atCenter(textAnnotationNode));
DMNMarshallerStandalone.connectRootWithChild(diagramRoot, inputDataNode);
DMNMarshallerStandalone.connectRootWithChild(diagramRoot, textAnnotationNode);
DMNMarshallerStandalone m = getDMNMarshaller();
String output = m.marshall(diagram);
LOG.debug(output);
Definitions dmnDefinitions = DMNMarshallerFactory.newDefaultMarshaller().unmarshal(output);
assertThat(dmnDefinitions.getDMNDI().getDMNDiagram().get(0).getDMNDiagramElement().stream().filter(DMNEdge.class::isInstance).count()).isEqualTo(1);
DMNEdge dmndiEdge = findEdgeByDMNI(dmnDefinitions.getDMNDI().getDMNDiagram().get(0), associationID);
assertThat(dmndiEdge.getWaypoint()).hasSize(2);
}
use of org.kie.workbench.common.dmn.api.definition.model.Association in project kie-wb-common by kiegroup.
the class DMNMarshallerStandalone method unmarshall.
@Override
@SuppressWarnings("unchecked")
public Graph unmarshall(final Metadata metadata, final InputStream input) throws IOException {
final Map<String, HasComponentWidths> hasComponentWidthsMap = new HashMap<>();
final BiConsumer<String, HasComponentWidths> 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<org.kie.dmn.model.api.DRGElement> diagramDrgElements = dmnXml.getDrgElement();
final Optional<org.kie.dmn.model.api.dmndi.DMNDiagram> dmnDDDiagram = findDMNDiagram(dmnXml);
// Get external DMN model information
final Map<Import, org.kie.dmn.model.api.Definitions> importDefinitions = dmnMarshallerImportsHelper.getImportDefinitions(metadata, dmnXml.getImport());
// Get external PMML model information
final Map<Import, PMMLDocumentMetadata> pmmlDocuments = dmnMarshallerImportsHelper.getPMMLDocuments(metadata, dmnXml.getImport());
// Map external DRGElements
final List<DMNShape> dmnShapes = dmnDDDiagram.map(this::getUniqueDMNShapes).orElse(emptyList());
final List<org.kie.dmn.model.api.DRGElement> importedDrgElements = getImportedDrgElementsByShape(dmnShapes, importDefinitions);
// Group DRGElements
final List<org.kie.dmn.model.api.DRGElement> 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<String, Entry<org.kie.dmn.model.api.DRGElement, Node>> elems = drgElements.stream().collect(toMap(org.kie.dmn.model.api.DRGElement::getId, dmn -> new SimpleEntry<>(dmn, dmnToStunner(dmn, hasComponentWidthsConsumer, importedDrgElements))));
final Set<org.kie.dmn.model.api.DecisionService> dmnDecisionServices = new HashSet<>();
// Stunner rely on relative positioning for Edge connections, so need to cycle on DMNShape first.
for (Entry<org.kie.dmn.model.api.DRGElement, Node> kv : elems.values()) {
ddExtAugmentStunner(dmnDDDiagram, kv.getValue());
}
// Setup Node Relationships and Connections all based on absolute positioning
for (Entry<org.kie.dmn.model.api.DRGElement, Node> 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<String, Node<View<TextAnnotation>, ?>> 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<org.kie.dmn.model.api.Association> 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<View<Association>, ?> myEdge = (Edge<View<Association>, ?>) 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<org.kie.dmn.model.api.DRGElement, Node> 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<DMNDiagram>) dmnDiagramRoot.getContent()).getDefinition().setDefinitions(definitionsStunnerPojo);
// Only connect Nodes to the Diagram that are not referenced by DecisionServices
final List<String> 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<org.kie.dmn.model.api.DRGElement, Node> 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<ComponentsWidthsExtension> extension = findComponentsWidthsExtension(dmnDDDiagram);
extension.ifPresent(componentsWidthsExtension -> {
// can be imported from another diagram but the extension is not imported or present in this diagram.
if (componentsWidthsExtension.getComponentsWidths() != null) {
hasComponentWidthsMap.forEach((uuid, hasComponentWidths) -> componentsWidthsExtension.getComponentsWidths().stream().filter(componentWidths -> componentWidths.getDmnElementRef().getLocalPart().equals(uuid)).findFirst().ifPresent(componentWidths -> {
final List<Double> widths = hasComponentWidths.getComponentWidths();
widths.clear();
widths.addAll(componentWidths.getWidths());
}));
}
});
return graph;
}
use of org.kie.workbench.common.dmn.api.definition.model.Association in project kie-wb-common by kiegroup.
the class AssociationConverter method dmnFromWB.
@SuppressWarnings("unchecked")
public static List<JSITAssociation> dmnFromWB(final Node<View<TextAnnotation>, ?> node) {
final TextAnnotation ta = (TextAnnotation) DefinitionUtils.getElementDefinition(node);
final JSITDMNElementReference ta_elementReference = new JSITDMNElementReference();
ta_elementReference.setHref("#" + ta.getId().getValue());
final List<JSITAssociation> result = new ArrayList<>();
final List<Edge<?, ?>> inEdges = (List<Edge<?, ?>>) node.getInEdges();
for (Edge<?, ?> e : inEdges) {
final Node<?, ?> sourceNode = e.getSourceNode();
if (sourceNode.getContent() instanceof View<?>) {
final View<?> view = (View<?>) sourceNode.getContent();
if (view.getDefinition() instanceof DRGElement) {
final DRGElement drgElement = (DRGElement) view.getDefinition();
final JSITDMNElementReference sourceRef = new JSITDMNElementReference();
sourceRef.setHref(getHref(drgElement));
final JSITAssociation adding = new JSITAssociation();
adding.setId(((View<Association>) e.getContent()).getDefinition().getId().getValue());
final Optional<String> description = Optional.ofNullable(DescriptionPropertyConverter.dmnFromWB(((View<Association>) e.getContent()).getDefinition().getDescription()));
description.ifPresent(adding::setDescription);
adding.setSourceRef(sourceRef);
adding.setTargetRef(ta_elementReference);
adding.setAssociationDirection(Js.uncheckedCast(JSITAssociationDirection.NONE.value()));
result.add(adding);
}
}
}
final List<Edge<?, ?>> outEdges = (List<Edge<?, ?>>) node.getOutEdges();
for (Edge<?, ?> e : outEdges) {
final Node<?, ?> targetNode = e.getTargetNode();
if (targetNode.getContent() instanceof View<?>) {
final View<?> view = (View<?>) targetNode.getContent();
if (view.getDefinition() instanceof DRGElement) {
final DRGElement drgElement = (DRGElement) view.getDefinition();
final JSITDMNElementReference targetRef = new JSITDMNElementReference();
targetRef.setHref(getHref(drgElement));
final JSITAssociation adding = new JSITAssociation();
adding.setId(((View<Association>) e.getContent()).getDefinition().getId().getValue());
final Optional<String> description = Optional.ofNullable(DescriptionPropertyConverter.dmnFromWB(((View<Association>) e.getContent()).getDefinition().getDescription()));
description.ifPresent(adding::setDescription);
adding.setSourceRef(ta_elementReference);
adding.setTargetRef(targetRef);
adding.setAssociationDirection(Js.uncheckedCast(JSITAssociationDirection.NONE.value()));
result.add(adding);
}
}
}
return result;
}
Aggregations