use of org.kie.workbench.common.stunner.core.graph.content.view.View in project kie-wb-common by kiegroup.
the class AcyclicDirectedGraphRule method evaluate.
@Override
@SuppressWarnings("unchecked")
public RuleViolations evaluate(final RuleExtension rule, final GraphConnectionContext context) {
final Graph<?, Node> graph = (Graph<?, Node>) context.getGraph();
final Optional<Node<? extends View<?>, ? extends Edge>> oSource = context.getSource();
final Optional<Node<? extends View<?>, ? extends Edge>> oTarget = context.getTarget();
final Edge<? extends View<?>, ? extends Node> oConnector = context.getConnector();
final DefaultRuleViolations result = new DefaultRuleViolations();
// Only validate DAG when source and target nodes are set
if (!(oSource.isPresent() && oTarget.isPresent())) {
return result;
}
final Node<?, Edge> source = (Node<?, Edge>) oSource.get();
final Node<?, Edge> target = (Node<?, Edge>) oTarget.get();
final Edge<?, Node> connector = (Edge<?, Node>) oConnector;
try {
final TreeWalkTraverseProcessor walker = getTreeWalker(source, target, connector);
walker.traverse(graph, new TreeTraverseCallback<Graph, Node, Edge>() {
final Set<Node> inProgress = new HashSet<>();
@Override
public void startGraphTraversal(final Graph graph) {
}
@Override
public boolean startNodeTraversal(final Node node) {
if (inProgress.contains(node)) {
throw new DirectedAcrylicGraphViolationException();
}
inProgress.add(node);
return true;
}
@Override
public boolean startEdgeTraversal(final Edge edge) {
return true;
}
@Override
public void endNodeTraversal(final Node node) {
inProgress.remove(node);
}
@Override
public void endEdgeTraversal(final Edge edge) {
}
@Override
public void endGraphTraversal() {
}
});
} catch (DirectedAcrylicGraphViolationException e) {
result.addViolation(new RuleViolationImpl(ERROR_MESSAGE));
}
return result;
}
use of org.kie.workbench.common.stunner.core.graph.content.view.View in project kie-wb-common by kiegroup.
the class DMNMarshaller method ddExtAugmentStunner.
private void ddExtAugmentStunner(Optional<org.kie.workbench.common.dmn.backend.definition.v1_1.dd.DMNDiagram> dmnDDDiagram, Node currentNode) {
if (!dmnDDDiagram.isPresent()) {
return;
}
Stream<DMNShape> drgShapeStream = dmnDDDiagram.get().getAny().stream().filter(DMNShape.class::isInstance).map(DMNShape.class::cast);
View content = (View) currentNode.getContent();
if (content.getDefinition() instanceof Decision) {
Decision d = (Decision) content.getDefinition();
internalAugment(drgShapeStream, d.getId(), content.getBounds().getUpperLeft(), d.getDimensionsSet(), content.getBounds().getLowerRight(), d.getBackgroundSet(), d::setFontSet);
} else if (content.getDefinition() instanceof InputData) {
InputData d = (InputData) content.getDefinition();
internalAugment(drgShapeStream, d.getId(), content.getBounds().getUpperLeft(), d.getDimensionsSet(), content.getBounds().getLowerRight(), d.getBackgroundSet(), d::setFontSet);
} else if (content.getDefinition() instanceof BusinessKnowledgeModel) {
BusinessKnowledgeModel d = (BusinessKnowledgeModel) content.getDefinition();
internalAugment(drgShapeStream, d.getId(), content.getBounds().getUpperLeft(), d.getDimensionsSet(), content.getBounds().getLowerRight(), d.getBackgroundSet(), d::setFontSet);
} else if (content.getDefinition() instanceof KnowledgeSource) {
KnowledgeSource d = (KnowledgeSource) content.getDefinition();
internalAugment(drgShapeStream, d.getId(), content.getBounds().getUpperLeft(), d.getDimensionsSet(), content.getBounds().getLowerRight(), d.getBackgroundSet(), d::setFontSet);
} else if (content.getDefinition() instanceof TextAnnotation) {
TextAnnotation d = (TextAnnotation) content.getDefinition();
internalAugment(drgShapeStream, d.getId(), content.getBounds().getUpperLeft(), d.getDimensionsSet(), content.getBounds().getLowerRight(), d.getBackgroundSet(), d::setFontSet);
}
}
use of org.kie.workbench.common.stunner.core.graph.content.view.View in project kie-wb-common by kiegroup.
the class DMNMarshaller method unmarshall.
@Override
public Graph unmarshall(final Metadata metadata, final InputStream input) throws IOException {
org.kie.dmn.model.v1_1.Definitions dmnXml = marshaller.unmarshal(new InputStreamReader(input));
Map<String, Entry<org.kie.dmn.model.v1_1.DRGElement, Node>> elems = dmnXml.getDrgElement().stream().collect(Collectors.toMap(org.kie.dmn.model.v1_1.DRGElement::getId, dmn -> new SimpleEntry<>(dmn, dmnToStunner(dmn))));
Optional<org.kie.workbench.common.dmn.backend.definition.v1_1.dd.DMNDiagram> dmnDDDiagram = findDMNDiagram(dmnXml);
for (Entry<org.kie.dmn.model.v1_1.DRGElement, Node> kv : elems.values()) {
org.kie.dmn.model.v1_1.DRGElement elem = kv.getKey();
Node currentNode = kv.getValue();
ddExtAugmentStunner(dmnDDDiagram, currentNode);
// DMN spec table 2: Requirements connection rules
if (elem instanceof org.kie.dmn.model.v1_1.Decision) {
org.kie.dmn.model.v1_1.Decision decision = (org.kie.dmn.model.v1_1.Decision) elem;
for (org.kie.dmn.model.v1_1.InformationRequirement ir : decision.getInformationRequirement()) {
if (ir.getRequiredInput() != null) {
String reqInputID = getId(ir.getRequiredInput());
Node requiredNode = elems.get(reqInputID).getValue();
Edge myEdge = factoryManager.newElement(UUID.uuid(), org.kie.workbench.common.dmn.api.definition.v1_1.InformationRequirement.class).asEdge();
connectEdge(myEdge, requiredNode, currentNode);
setConnectionMagnets(myEdge);
}
if (ir.getRequiredDecision() != null) {
String reqInputID = getId(ir.getRequiredDecision());
Node requiredNode = elems.get(reqInputID).getValue();
Edge myEdge = factoryManager.newElement(UUID.uuid(), org.kie.workbench.common.dmn.api.definition.v1_1.InformationRequirement.class).asEdge();
connectEdge(myEdge, requiredNode, currentNode);
setConnectionMagnets(myEdge);
}
}
for (org.kie.dmn.model.v1_1.KnowledgeRequirement kr : decision.getKnowledgeRequirement()) {
String reqInputID = getId(kr.getRequiredKnowledge());
Node requiredNode = elems.get(reqInputID).getValue();
Edge myEdge = factoryManager.newElement(UUID.uuid(), org.kie.workbench.common.dmn.api.definition.v1_1.KnowledgeRequirement.class).asEdge();
connectEdge(myEdge, requiredNode, currentNode);
setConnectionMagnets(myEdge);
}
for (org.kie.dmn.model.v1_1.AuthorityRequirement kr : decision.getAuthorityRequirement()) {
String reqInputID = getId(kr.getRequiredAuthority());
Node requiredNode = elems.get(reqInputID).getValue();
Edge myEdge = factoryManager.newElement(UUID.uuid(), org.kie.workbench.common.dmn.api.definition.v1_1.AuthorityRequirement.class).asEdge();
connectEdge(myEdge, requiredNode, currentNode);
setConnectionMagnets(myEdge);
}
} else if (elem instanceof org.kie.dmn.model.v1_1.BusinessKnowledgeModel) {
org.kie.dmn.model.v1_1.BusinessKnowledgeModel bkm = (org.kie.dmn.model.v1_1.BusinessKnowledgeModel) elem;
for (org.kie.dmn.model.v1_1.KnowledgeRequirement kr : bkm.getKnowledgeRequirement()) {
String reqInputID = getId(kr.getRequiredKnowledge());
Node requiredNode = elems.get(reqInputID).getValue();
Edge myEdge = factoryManager.newElement(UUID.uuid(), org.kie.workbench.common.dmn.api.definition.v1_1.KnowledgeRequirement.class).asEdge();
connectEdge(myEdge, requiredNode, currentNode);
setConnectionMagnets(myEdge);
}
for (org.kie.dmn.model.v1_1.AuthorityRequirement kr : bkm.getAuthorityRequirement()) {
String reqInputID = getId(kr.getRequiredAuthority());
Node requiredNode = elems.get(reqInputID).getValue();
Edge myEdge = factoryManager.newElement(UUID.uuid(), org.kie.workbench.common.dmn.api.definition.v1_1.AuthorityRequirement.class).asEdge();
connectEdge(myEdge, requiredNode, currentNode);
setConnectionMagnets(myEdge);
}
} else if (elem instanceof org.kie.dmn.model.v1_1.KnowledgeSource) {
org.kie.dmn.model.v1_1.KnowledgeSource ks = (org.kie.dmn.model.v1_1.KnowledgeSource) elem;
for (org.kie.dmn.model.v1_1.AuthorityRequirement ir : ks.getAuthorityRequirement()) {
if (ir.getRequiredInput() != null) {
String reqInputID = getId(ir.getRequiredInput());
Node requiredNode = elems.get(reqInputID).getValue();
Edge myEdge = factoryManager.newElement(UUID.uuid(), org.kie.workbench.common.dmn.api.definition.v1_1.AuthorityRequirement.class).asEdge();
connectEdge(myEdge, requiredNode, currentNode);
setConnectionMagnets(myEdge);
}
if (ir.getRequiredDecision() != null) {
String reqInputID = getId(ir.getRequiredDecision());
Node requiredNode = elems.get(reqInputID).getValue();
Edge myEdge = factoryManager.newElement(UUID.uuid(), org.kie.workbench.common.dmn.api.definition.v1_1.AuthorityRequirement.class).asEdge();
connectEdge(myEdge, requiredNode, currentNode);
setConnectionMagnets(myEdge);
}
if (ir.getRequiredAuthority() != null) {
String reqInputID = getId(ir.getRequiredAuthority());
Node requiredNode = elems.get(reqInputID).getValue();
Edge myEdge = factoryManager.newElement(UUID.uuid(), org.kie.workbench.common.dmn.api.definition.v1_1.AuthorityRequirement.class).asEdge();
connectEdge(myEdge, requiredNode, currentNode);
setConnectionMagnets(myEdge);
}
}
}
}
Map<String, Node<View<TextAnnotation>, ?>> textAnnotations = dmnXml.getArtifact().stream().filter(org.kie.dmn.model.v1_1.TextAnnotation.class::isInstance).map(org.kie.dmn.model.v1_1.TextAnnotation.class::cast).collect(Collectors.toMap(org.kie.dmn.model.v1_1.TextAnnotation::getId, textAnnotationConverter::nodeFromDMN));
textAnnotations.values().forEach(n -> ddExtAugmentStunner(dmnDDDiagram, n));
List<org.kie.dmn.model.v1_1.Association> associations = dmnXml.getArtifact().stream().filter(org.kie.dmn.model.v1_1.Association.class::isInstance).map(org.kie.dmn.model.v1_1.Association.class::cast).collect(Collectors.toList());
for (org.kie.dmn.model.v1_1.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<View<Association>, ?> myEdge = (Edge<View<Association>, ?>) factoryManager.newElement(UUID.uuid(), Association.class).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);
}
Graph graph = factoryManager.newDiagram("prova", BindableAdapterUtils.getDefinitionSetId(DMNDefinitionSet.class), metadata).getGraph();
elems.values().stream().map(kv -> kv.getValue()).forEach(graph::addNode);
textAnnotations.values().forEach(graph::addNode);
@SuppressWarnings("unchecked") Node<View<DMNDiagram>, ?> dmnDiagramRoot = findDMNDiagramRoot(graph);
Definitions definitionsStunnerPojo = DefinitionsConverter.wbFromDMN(dmnXml);
dmnDiagramRoot.getContent().getDefinition().setDefinitions(definitionsStunnerPojo);
elems.values().stream().map(kv -> kv.getValue()).forEach(node -> connectRootWithChild(dmnDiagramRoot, node));
textAnnotations.values().stream().forEach(node -> connectRootWithChild(dmnDiagramRoot, node));
return graph;
}
use of org.kie.workbench.common.stunner.core.graph.content.view.View in project kie-wb-common by kiegroup.
the class AssociationConverter method dmnFromWB.
public static List<org.kie.dmn.model.v1_1.Association> dmnFromWB(final Node<View<TextAnnotation>, ?> node) {
TextAnnotation ta = node.getContent().getDefinition();
org.kie.dmn.model.v1_1.DMNElementReference ta_elementReference = new org.kie.dmn.model.v1_1.DMNElementReference();
ta_elementReference.setHref(new StringBuilder("#").append(ta.getId().getValue()).toString());
List<org.kie.dmn.model.v1_1.Association> result = new ArrayList<>();
List<Edge<?, ?>> inEdges = (List<Edge<?, ?>>) node.getInEdges();
for (Edge<?, ?> e : inEdges) {
Node<?, ?> sourceNode = e.getSourceNode();
if (sourceNode.getContent() instanceof View<?>) {
View<?> view = (View<?>) sourceNode.getContent();
if (view.getDefinition() instanceof DRGElement) {
DRGElement drgElement = (DRGElement) view.getDefinition();
org.kie.dmn.model.v1_1.DMNElementReference sourceRef = new org.kie.dmn.model.v1_1.DMNElementReference();
sourceRef.setHref(new StringBuilder("#").append(drgElement.getId().getValue()).toString());
org.kie.dmn.model.v1_1.Association adding = new org.kie.dmn.model.v1_1.Association();
adding.setId(((View<Association>) e.getContent()).getDefinition().getId().getValue());
adding.setDescription(((View<Association>) e.getContent()).getDefinition().getDescription().getValue());
adding.setSourceRef(sourceRef);
adding.setTargetRef(ta_elementReference);
result.add(adding);
}
}
}
List<Edge<?, ?>> outEdges = (List<Edge<?, ?>>) node.getOutEdges();
for (Edge<?, ?> e : outEdges) {
Node<?, ?> targetNode = e.getTargetNode();
if (targetNode.getContent() instanceof View<?>) {
View<?> view = (View<?>) targetNode.getContent();
if (view.getDefinition() instanceof DRGElement) {
DRGElement drgElement = (DRGElement) view.getDefinition();
org.kie.dmn.model.v1_1.DMNElementReference targetRef = new org.kie.dmn.model.v1_1.DMNElementReference();
targetRef.setHref(new StringBuilder("#").append(drgElement.getId().getValue()).toString());
org.kie.dmn.model.v1_1.Association adding = new org.kie.dmn.model.v1_1.Association();
adding.setId(((View<Association>) e.getContent()).getDefinition().getId().getValue());
adding.setDescription(((View<Association>) e.getContent()).getDefinition().getDescription().getValue());
adding.setSourceRef(ta_elementReference);
adding.setTargetRef(targetRef);
result.add(adding);
}
}
}
return result;
}
use of org.kie.workbench.common.stunner.core.graph.content.view.View in project kie-wb-common by kiegroup.
the class BusinessKnowledgeModelConverter method dmnFromNode.
@Override
public org.kie.dmn.model.v1_1.BusinessKnowledgeModel dmnFromNode(final Node<View<BusinessKnowledgeModel>, ?> node) {
BusinessKnowledgeModel source = node.getContent().getDefinition();
org.kie.dmn.model.v1_1.BusinessKnowledgeModel result = new org.kie.dmn.model.v1_1.BusinessKnowledgeModel();
result.setId(source.getId().getValue());
result.setDescription(DescriptionPropertyConverter.dmnFromWB(source.getDescription()));
result.setName(source.getName().getValue());
result.setVariable(InformationItemPropertyConverter.dmnFromWB(source.getVariable()));
result.setEncapsulatedLogic(FunctionDefinitionPropertyConverter.dmnFromWB(source.getEncapsulatedLogic()));
// DMN spec table 2: Requirements connection rules
List<Edge<?, ?>> inEdges = (List<Edge<?, ?>>) node.getInEdges();
for (Edge<?, ?> e : inEdges) {
Node<?, ?> sourceNode = e.getSourceNode();
if (sourceNode.getContent() instanceof View<?>) {
View<?> view = (View<?>) sourceNode.getContent();
if (view.getDefinition() instanceof DRGElement) {
DRGElement drgElement = (DRGElement) view.getDefinition();
if (drgElement instanceof BusinessKnowledgeModel) {
org.kie.dmn.model.v1_1.KnowledgeRequirement iReq = new org.kie.dmn.model.v1_1.KnowledgeRequirement();
org.kie.dmn.model.v1_1.DMNElementReference ri = new org.kie.dmn.model.v1_1.DMNElementReference();
ri.setHref(new StringBuilder("#").append(drgElement.getId().getValue()).toString());
iReq.setRequiredKnowledge(ri);
result.getKnowledgeRequirement().add(iReq);
} else if (drgElement instanceof KnowledgeSource) {
org.kie.dmn.model.v1_1.AuthorityRequirement iReq = new org.kie.dmn.model.v1_1.AuthorityRequirement();
org.kie.dmn.model.v1_1.DMNElementReference ri = new org.kie.dmn.model.v1_1.DMNElementReference();
ri.setHref(new StringBuilder("#").append(drgElement.getId().getValue()).toString());
iReq.setRequiredAuthority(ri);
result.getAuthorityRequirement().add(iReq);
} else {
throw new UnsupportedOperationException("wrong model definition.");
}
}
}
}
return result;
}
Aggregations