use of org.osate.aadl2.FlowEnd in project osate2 by osate.
the class FlowImplementationImpl method createInEnd.
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public FlowEnd createInEnd() {
FlowEnd newInEnd = (FlowEnd) create(Aadl2Package.eINSTANCE.getFlowEnd());
setInEnd(newInEnd);
return newInEnd;
}
use of org.osate.aadl2.FlowEnd in project osate2 by osate.
the class FlowImplementationImpl method basicSetOutEnd.
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public NotificationChain basicSetOutEnd(FlowEnd newOutEnd, NotificationChain msgs) {
FlowEnd oldOutEnd = outEnd;
outEnd = newOutEnd;
if (eNotificationRequired()) {
ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, Aadl2Package.FLOW_IMPLEMENTATION__OUT_END, oldOutEnd, newOutEnd);
if (msgs == null) {
msgs = notification;
} else {
msgs.add(notification);
}
}
return msgs;
}
use of org.osate.aadl2.FlowEnd in project osate2 by osate.
the class PropertiesLinkingService method getLinkedObjects.
/**
* returns the first linked object
*/
@Override
public List<EObject> getLinkedObjects(EObject context, EReference reference, INode node) throws IllegalNodeException {
final EClass requiredType = reference.getEReferenceType();
if (requiredType == null) {
return Collections.<EObject>emptyList();
}
EObject searchResult = null;
final EClass cl = Aadl2Package.eINSTANCE.getClassifier();
final EClass sct = Aadl2Package.eINSTANCE.getSubcomponentType();
final EClass pt = Aadl2Package.eINSTANCE.getPropertyType();
final String name = getCrossRefNodeAsString(node);
if (sct.isSuperTypeOf(requiredType) || cl.isSuperTypeOf(requiredType)) {
// XXX: this code can be replicated in Aadl2LinkingService as it is called often in the core
// resolve classifier reference
EObject e = findClassifier(context, reference, name);
if (e != null) {
// the result satisfied the expected class
return Collections.singletonList(e);
}
if (!(context instanceof Generalization) && sct.isSuperTypeOf(requiredType)) {
// need to resolve prototype
EObject res = AadlUtil.getContainingClassifier(context).findNamedElement(name);
if (Aadl2Package.eINSTANCE.getDataPrototype() == reference) {
if (res instanceof DataPrototype) {
searchResult = res;
}
} else if (res instanceof ComponentPrototype) {
searchResult = res;
}
}
} else if (Aadl2Package.eINSTANCE.getModelUnit() == requiredType) {
AadlPackage pack = findAadlPackage(context, name, reference);
if (pack != null) {
searchResult = pack;
} else {
PropertySet ps = findPropertySet(context, name, reference);
if (ps != null) {
searchResult = ps;
}
}
} else if (Aadl2Package.eINSTANCE.getAadlPackage() == requiredType) {
AadlPackage pack = findAadlPackage(context, name, reference);
if (pack != null) {
searchResult = pack;
}
} else if (Aadl2Package.eINSTANCE.getPropertySet() == requiredType) {
PropertySet ps = findPropertySet(context, name, reference);
if (ps != null) {
searchResult = ps;
}
} else if (Aadl2Package.eINSTANCE.getFeature().isSuperTypeOf(requiredType)) {
if (context instanceof Feature) {
// Feature referenced in feature refinement
Classifier ns = AadlUtil.getContainingClassifier(context);
// we need to resolve a refinement
if (ns.getExtended() != null) {
EObject res = ns.getExtended().findNamedElement(name);
if (res != null && res instanceof Feature) {
searchResult = res;
}
} else {
return Collections.emptyList();
}
} else if (context instanceof FlowEnd) {
FlowEnd flowEnd = (FlowEnd) context;
searchResult = findElementInContext(flowEnd, flowEnd.getContext(), name, Feature.class);
}
} else if (Aadl2Package.eINSTANCE.getSubcomponent().isSuperTypeOf(requiredType)) {
// if context Subcomponent then find in extension source (refined
// to)
// prototype binding as context
Classifier ns = AadlUtil.getContainingClassifier(context);
if (context instanceof Subcomponent) {
// we need to resolve a refinement
if (ns.getExtended() != null) {
ns = ns.getExtended();
} else {
return Collections.emptyList();
}
}
EObject res = ns.findNamedElement(name);
if (res instanceof Subcomponent) {
searchResult = res;
}
} else if (Aadl2Package.eINSTANCE.getProperty() == requiredType) {
// look for property definition in property set
return findPropertyDefinitionAsList(context, reference, name);
} else if (Aadl2Package.eINSTANCE.getAbstractNamedValue() == requiredType) {
// AbstractNamedValue: constant reference, property definition reference, unit literal, enumeration literal
if (context instanceof NamedValue) {
List<EObject> res = Collections.EMPTY_LIST;
if (name.indexOf("::") == -1) {
// names without qualifier. Must be enum/unit literal
res = findEnumLiteralAsList(context, reference, name);
if (res.isEmpty()) {
res = findUnitLiteralAsList(context, reference, name);
}
}
if (res.isEmpty()) {
res = findPropertyConstant(context, reference, name);
}
if (res.isEmpty()) {
res = findPropertyDefinitionAsList(context, reference, name);
}
return res;
}
} else if (Aadl2Package.eINSTANCE.getBasicProperty() == requiredType) {
// look for record field definition
if (context instanceof BasicPropertyAssociation) {
BasicPropertyAssociation bpa = (BasicPropertyAssociation) context;
// TODO: Need to check that the type of the record field is
// correct for the value.
Element parent = bpa.getOwner();
while (parent != null && !(parent instanceof BasicPropertyAssociation || parent instanceof PropertyAssociation || parent instanceof Property || parent instanceof PropertyConstant)) {
parent = parent.getOwner();
}
PropertyType propertyType = null;
if (parent instanceof BasicPropertyAssociation) {
BasicProperty bp = ((BasicPropertyAssociation) parent).getProperty();
if (bp != null) {
propertyType = bp.getPropertyType();
}
} else if (parent instanceof PropertyAssociation) {
Property pd = ((PropertyAssociation) parent).getProperty();
if (pd != null) {
propertyType = pd.getPropertyType();
}
} else if (parent instanceof Property) {
propertyType = ((Property) parent).getPropertyType();
} else if (parent instanceof PropertyConstant) {
propertyType = ((PropertyConstant) parent).getPropertyType();
}
propertyType = AadlUtil.getBasePropertyType(propertyType);
if (propertyType != null && propertyType instanceof RecordType) {
BasicProperty rf = (BasicProperty) ((RecordType) propertyType).findNamedElement(name);
if (rf != null) {
searchResult = rf;
}
}
}
} else if (pt.isSuperTypeOf(requiredType)) {
// look for property type in property set
return findPropertyType(context, reference, name);
} else if (Aadl2Package.eINSTANCE.getPropertyConstant() == requiredType) {
// look for property constant in property set
return findPropertyConstant(context, reference, name);
} else if (Aadl2Package.eINSTANCE.getUnitLiteral() == requiredType) {
// look for unit literal pointed to by baseUnit
return findUnitLiteralAsList(context, reference, name);
} else if (Aadl2Package.eINSTANCE.getEnumerationLiteral() == requiredType) {
// look for enumeration literal
return findEnumLiteralAsList(context, reference, name);
} else if (Aadl2Package.eINSTANCE.getMode() == requiredType) {
// referenced by mode transition, inmodes, ModeBinding
EObject res = null;
if (context instanceof ModeBinding) {
if (reference == Aadl2Package.eINSTANCE.getModeBinding_ParentMode()) {
res = AadlUtil.getContainingClassifier(context).findNamedElement(name);
} else if (reference == Aadl2Package.eINSTANCE.getModeBinding_DerivedMode()) {
Subcomponent subcomponent = AadlUtil.getContainingSubcomponent(context);
while (subcomponent.getSubcomponentType() == null && subcomponent.getRefined() != null) {
subcomponent = subcomponent.getRefined();
}
ComponentClassifier subcomponentClassifier = null;
if (subcomponent.getSubcomponentType() instanceof ComponentClassifier) {
subcomponentClassifier = ((ComponentClassifier) subcomponent.getSubcomponentType());
} else if (subcomponent.getSubcomponentType() instanceof ComponentPrototype) {
subcomponentClassifier = findClassifierForComponentPrototype(AadlUtil.getContainingClassifier(context), ((ComponentPrototype) subcomponent.getSubcomponentType()));
}
if (subcomponentClassifier != null) {
res = subcomponentClassifier.findNamedElement(name);
}
}
} else {
// check about in modes in a contained property association
PropertyAssociation pa = AadlUtil.getContainingPropertyAssociation(context);
if (pa != null && !pa.getAppliesTos().isEmpty()) {
ContainedNamedElement path = pa.getAppliesTos().get(0);
EList<ContainmentPathElement> cpelist = path.getContainmentPathElements();
Subcomponent cpesub = null;
for (ContainmentPathElement containmentPathElement : cpelist) {
if (containmentPathElement.getNamedElement() instanceof Subcomponent) {
cpesub = (Subcomponent) containmentPathElement.getNamedElement();
} else {
break;
}
}
if (cpesub != null) {
if (cpesub.getAllClassifier() != null) {
res = cpesub.getAllClassifier().findNamedElement(name);
}
} else {
res = AadlUtil.getContainingClassifier(context).findNamedElement(name);
}
} else {
if ((pa != null) && (pa.getOwner() instanceof Subcomponent)) {
Subcomponent subco = (Subcomponent) pa.getOwner();
if (subco.getAllClassifier() != null) {
res = subco.getAllClassifier().findNamedElement(name);
}
} else {
res = AadlUtil.getContainingClassifier(context).findNamedElement(name);
}
}
}
if (res != null && res instanceof Mode) {
searchResult = res;
}
} else if (Aadl2Package.eINSTANCE.getNamedElement() == requiredType) {
// containment path element
if (context instanceof ContainmentPathElement) {
EObject res = null;
if (((ContainmentPathElement) context).getOwner() instanceof ContainmentPathElement) {
// find next element in namespace of previous element
ContainmentPathElement el = (ContainmentPathElement) ((ContainmentPathElement) context).getOwner();
NamedElement ne = el.getNamedElement();
if (ne instanceof Subcomponent) {
Subcomponent subcomponent = (Subcomponent) ne;
while (subcomponent.getSubcomponentType() == null && subcomponent.getRefined() != null) {
subcomponent = subcomponent.getRefined();
}
ComponentClassifier ns = null;
if (subcomponent.getSubcomponentType() instanceof ComponentClassifier) {
ns = (ComponentClassifier) subcomponent.getSubcomponentType();
} else if (subcomponent.getSubcomponentType() instanceof ComponentPrototype) {
ns = ResolvePrototypeUtil.resolveComponentPrototype((ComponentPrototype) subcomponent.getSubcomponentType(), el);
}
if (ns != null) {
res = ns.findNamedElement(name);
if (res == null && (ne instanceof ThreadSubcomponent || ne instanceof SubprogramSubcomponent || ne instanceof AbstractSubcomponent) && ns instanceof BehavioredImplementation) {
res = AadlUtil.findNamedElementInList(((BehavioredImplementation) ns).subprogramCalls(), name);
}
}
} else if (ne instanceof FeatureGroup) {
FeatureGroup featureGroup = (FeatureGroup) ne;
while (featureGroup.getFeatureType() == null && featureGroup.getRefined() instanceof FeatureGroup) {
featureGroup = (FeatureGroup) featureGroup.getRefined();
}
FeatureGroupType ns = null;
if (featureGroup.getFeatureType() instanceof FeatureGroupType) {
ns = (FeatureGroupType) featureGroup.getFeatureType();
} else if (featureGroup.getFeatureType() instanceof FeatureGroupPrototype) {
ns = ResolvePrototypeUtil.resolveFeatureGroupPrototype((FeatureGroupPrototype) featureGroup.getFeatureType(), el);
}
if (ns != null) {
res = ns.findNamedElement(name);
}
}
} else {
// the first containment path element
Classifier ns = null;
PropertyAssociation containingPropertyAssociation = AadlUtil.getContainingPropertyAssociation(context);
if (containingPropertyAssociation != null) {
// need to make sure we look in the correct name space
if (containingPropertyAssociation.getOwner() instanceof Subcomponent) {
Subcomponent subcomponent = (Subcomponent) containingPropertyAssociation.getOwner();
while (subcomponent.getSubcomponentType() == null && subcomponent.getRefined() != null) {
subcomponent = subcomponent.getRefined();
}
if (subcomponent.getSubcomponentType() instanceof ComponentClassifier) {
ns = (ComponentClassifier) subcomponent.getSubcomponentType();
} else if (subcomponent.getSubcomponentType() instanceof ComponentPrototype) {
ns = ResolvePrototypeUtil.resolveComponentPrototype((ComponentPrototype) subcomponent.getSubcomponentType(), AadlUtil.getContainingClassifier(context));
}
} else if (containingPropertyAssociation.getOwner() instanceof FeatureGroup) {
FeatureGroup fg = (FeatureGroup) containingPropertyAssociation.getOwner();
while (fg.getFeatureType() == null && fg.getRefined() instanceof FeatureGroup) {
fg = (FeatureGroup) fg.getRefined();
}
if (fg.getFeatureType() instanceof FeatureGroupType) {
ns = (FeatureGroupType) fg.getFeatureType();
} else if (fg.getFeatureType() instanceof FeatureGroupPrototype) {
ns = ResolvePrototypeUtil.resolveFeatureGroupPrototype((FeatureGroupPrototype) fg.getFeatureType(), AadlUtil.getContainingClassifier(context));
}
} else {
ns = containingPropertyAssociation.getContainingClassifier();
}
}
if (ns != null) {
res = ns.findNamedElement(name);
}
}
if (res != null && res instanceof NamedElement) {
searchResult = res;
}
}
} else {
List<EObject> superes = super.getLinkedObjects(context, reference, node);
return superes;
}
if (searchResult != null) {
return Collections.singletonList(searchResult);
}
return Collections.<EObject>emptyList();
}
use of org.osate.aadl2.FlowEnd in project osate2 by osate.
the class CreateEndToEndFlowsSwitch method doFlowSpecInstances.
/**
* add flowspec instances to the component instance
*/
private void doFlowSpecInstances(ComponentInstance ci) {
EList<FlowSpecification> flowspecs = InstanceUtil.getComponentType(ci, 0, null).getAllFlowSpecifications();
for (Iterator<FlowSpecification> it = flowspecs.iterator(); it.hasNext(); ) {
FlowSpecification f = it.next();
FlowSpecificationInstance speci = InstanceFactory.eINSTANCE.createFlowSpecificationInstance();
speci.setFlowSpecification(f);
speci.setName(f.getName());
FlowEnd inend = f.getAllInEnd();
if (inend != null) {
Feature srcfp = inend.getFeature();
Context srcpg = inend.getContext();
if (srcpg == null) {
FeatureInstance fi = ci.findFeatureInstance(srcfp);
if (fi != null) {
speci.setSource(fi);
}
} else if (srcpg instanceof FeatureGroup) {
FeatureInstance pgi = ci.findFeatureInstance((FeatureGroup) srcpg);
if (pgi != null) {
FeatureInstance fi = pgi.findFeatureInstance(srcfp);
if (fi != null) {
speci.setSource(fi);
}
}
}
}
FlowEnd outend = f.getAllOutEnd();
if (outend != null) {
Feature dstfp = outend.getFeature();
Context dstpg = outend.getContext();
if (dstpg == null) {
FeatureInstance fi = ci.findFeatureInstance(dstfp);
if (fi != null) {
speci.setDestination(fi);
}
} else if (dstpg instanceof FeatureGroup) {
FeatureInstance pgi = ci.findFeatureInstance((FeatureGroup) dstpg);
if (pgi != null) {
FeatureInstance fi = pgi.findFeatureInstance(dstfp);
if (fi != null) {
speci.setDestination(fi);
}
}
}
}
ci.getFlowSpecifications().add(speci);
for (Mode mode : f.getAllInModes()) {
ModeInstance mi = ci.findModeInstance(mode);
if (mi != null) {
speci.getInModes().add(mi);
}
}
for (ModeTransition mt : f.getInModeTransitions()) {
ModeTransitionInstance ti = ci.findModeTransitionInstance(mt);
if (ti != null) {
speci.getInModeTransitions().add(ti);
}
}
}
}
use of org.osate.aadl2.FlowEnd in project osate2 by osate.
the class ShowFlowContributionItem method createControl.
@Override
protected Control createControl(final Composite parent) {
showFlowBtn = new Button(parent, SWT.PUSH);
showFlowBtn.setImage(showIcon.createImage());
showFlowBtn.setToolTipText("Show");
updateButton();
showFlowBtn.addSelectionListener(new SelectionAdapter() {
private ProjectReferenceService referenceService;
@Override
public void widgetSelected(final SelectionEvent e) {
if (editor != null && selectedFlow != null) {
referenceService = Objects.requireNonNull(Adapters.adapt(editor, ProjectReferenceService.class), "Unable to retrieve reference service");
final DiagramUpdater diagramUpdater = editor.getDiagramUpdater();
final BusinessObjectTreeUpdater boTreeUpdater = editor.getBoTreeUpdater();
final BusinessObjectNode boTree = getBoTree(boTreeUpdater);
final BusinessObjectNode containerNode = boTree.getAllDescendants().filter(q -> q.getBusinessObject() == selectedFlow.getContainer().getBusinessObject()).findAny().map(BusinessObjectNode.class::cast).orElseThrow(() -> new RuntimeException("Cannot find container for highlightable flow: " + selectedFlow.getFlowSegment().getName()));
final Object component = getContainerComponent(selectedFlow.getContainer().getBusinessObject());
ensureFlowSegmentsExist(component, selectedFlow.getFlowSegment(), containerNode);
final AgeDiagram diagram = editor.getDiagram();
final LayoutInfoProvider layoutInfoProvider = Objects.requireNonNull(Adapters.adapt(editor, LayoutInfoProvider.class), "Unable to retrieve layout info provider");
editor.getActionExecutor().execute("Show Flow Elements", ExecutionMode.NORMAL, () -> {
// Update the diagram
diagramUpdater.updateDiagram(diagram, boTree);
// Update layout
diagram.modify("Layout Incrementally", m -> DiagramElementLayoutUtil.layoutIncrementally(diagram, m, layoutInfoProvider));
return null;
});
}
}
private List<FlowSegmentReference> findFlowSegments(final FlowSegmentReference flowElementRef) {
if (flowElementRef.flowSegmentElement instanceof FlowSpecification) {
// Check if flow specification has flow implementation(s)
return AadlClassifierUtil.getComponentImplementation(flowElementRef.container.getBusinessObject()).map(ci -> ci.getAllFlowImplementations().stream().filter(cfi -> flowElementRef.flowSegmentElement == cfi.getSpecification()).flatMap(cfi -> cfi.getOwnedFlowSegments().stream()).map(flowSegment -> createFlowSegmentReference(flowSegment, (BusinessObjectNode) flowElementRef.container))).orElse(Stream.empty()).collect(Collectors.toList());
} else if (flowElementRef.flowSegmentElement instanceof EndToEndFlow) {
final EndToEndFlow endToEndFlow = (EndToEndFlow) flowElementRef.flowSegmentElement;
final BusinessObjectNode containerNode = (BusinessObjectNode) flowElementRef.container;
return AadlClassifierUtil.getComponentImplementation(containerNode.getBusinessObject()).map(ci -> ci.getAllEndToEndFlows().stream().filter(ownedEndToEndFlow -> ownedEndToEndFlow == endToEndFlow).flatMap(ete -> ete.getAllFlowSegments().stream().flatMap(flowSegment -> {
final EndToEndFlowElement endToEndFlowElement = flowSegment.getFlowElement();
if (endToEndFlowElement instanceof EndToEndFlow) {
// Find segments of a segment that is an end to end flow
return ((EndToEndFlow) endToEndFlowElement).getAllFlowSegments().stream();
}
return Stream.of(flowSegment);
})).map(endToEndFlowSegment -> createFlowSegmentReference(endToEndFlowSegment, containerNode))).orElse(Stream.empty()).collect(Collectors.toList());
} else if (flowElementRef.flowSegmentElement instanceof EndToEndFlowInstance) {
return AadlInstanceObjectUtil.getComponentInstance(flowElementRef.container.getBusinessObject()).map(ci -> ci.getEndToEndFlows().stream().filter(ete -> ete == flowElementRef.flowSegmentElement).flatMap(ete -> {
return ete.getFlowElements().stream().flatMap(fei -> {
if (fei instanceof ConnectionInstance) {
return ((ConnectionInstance) fei).getConnectionReferences().stream().map(cr -> createFlowSegmentReference(cr, (BusinessObjectNode) flowElementRef.container));
} else {
return Stream.of(createFlowSegmentReference(fei, (BusinessObjectNode) flowElementRef.container));
}
});
})).orElse(Stream.empty()).collect(Collectors.toList());
} else {
return Collections.emptyList();
}
}
private void ensureFlowSegmentsExist(final Object component, final NamedElement flow, final BusinessObjectNode containerNode) {
if (component instanceof ComponentImplementation) {
final ComponentImplementation ci = (ComponentImplementation) component;
if (flow instanceof FlowSpecification) {
ci.getAllFlowImplementations().stream().filter(fi -> flow.getName().equalsIgnoreCase(fi.getSpecification().getName())).findAny().ifPresent(flowImpl -> {
final FlowSegmentReference flowSegmentRef = createFlowSegmentReference(flowImpl.getSpecification(), containerNode);
enableFlowSegments(findFlowSegments(flowSegmentRef));
});
} else {
final String eteName = flow.getName();
final Optional<EndToEndFlow> eteFlow = ci.getAllEndToEndFlows().stream().filter(etef -> eteName.equalsIgnoreCase(etef.getName())).findAny();
eteFlow.ifPresent(endToEndFlow -> {
final FlowSegmentReference flowSegmentRef = createFlowSegmentReference(endToEndFlow, containerNode);
enableFlowSegments(findFlowSegments(flowSegmentRef));
});
}
} else if (component instanceof ComponentInstance) {
// ETE Flows only
final EndToEndFlowInstance eteFlowInstance = (EndToEndFlowInstance) flow;
final FlowSegmentReference flowSegmentRef = createFlowSegmentReference(eteFlowInstance, containerNode);
enableFlowSegments(findFlowSegments(flowSegmentRef));
}
}
private void enableFlowSegments(final List<FlowSegmentReference> highlightableFlowElements) {
highlightableFlowElements.stream().filter(Predicates.notNull()).forEach(highlightableFlowElement -> {
final NamedElement flowSegmentElement = highlightableFlowElement.flowSegmentElement;
final BusinessObjectContext flowSegmentContainer = highlightableFlowElement.container;
// Find segments for flow and remove cycles
final List<FlowSegmentReference> flowSegmentReferences = findFlowSegments(highlightableFlowElement).stream().filter(flowSegmentReference -> flowSegmentReference.flowSegmentElement != flowSegmentElement && flowSegmentReference.container != flowSegmentContainer).collect(Collectors.toList());
enableFlowSegments(flowSegmentReferences);
});
}
private Object getContainerComponent(final Object container) {
if (container instanceof Subcomponent) {
final Subcomponent sc = (Subcomponent) container;
return sc.getComponentImplementation();
}
return container;
}
private BusinessObjectNode getBoTree(final BusinessObjectTreeUpdater treeUpdater) {
BusinessObjectNode boTree = DiagramToBusinessObjectTreeConverter.createBusinessObjectNode(editor.getDiagram());
return treeUpdater.updateTree(editor.getDiagram().getConfiguration(), boTree);
}
private FlowSegmentReference createFlowSegmentReference(final Object bo, final BusinessObjectNode container) {
if (bo instanceof FlowSegment) {
final FlowSegment flowSegment = (FlowSegment) bo;
final FlowElement flowElement = flowSegment.getFlowElement();
if (flowSegment.getContext() == null) {
return createFlowSegmentReference(flowElement, container);
} else {
final BusinessObjectNode contextNode = ensureEnabledChild(flowSegment.getContext(), container);
return createFlowSegmentReference(flowElement, contextNode);
}
} else if (bo instanceof EndToEndFlowSegment) {
final EndToEndFlowSegment flowSegment = (EndToEndFlowSegment) bo;
if (flowSegment.getFlowElement() instanceof FlowElement) {
final FlowElement flowElement = (FlowElement) flowSegment.getFlowElement();
if (flowSegment.getContext() == null) {
return createFlowSegmentReference(flowElement, container);
} else {
final BusinessObjectNode contextNode = ensureEnabledChild(flowSegment.getContext(), container);
return createFlowSegmentReference(flowElement, contextNode);
}
}
return createFlowSegmentReference(flowSegment.getFlowElement(), container);
} else if (bo instanceof InstanceObject) {
final InstanceObject io = (InstanceObject) bo;
if (bo instanceof EndToEndFlowInstance) {
return new FlowSegmentReference(io, container);
} else {
final Map<Object, BusinessObjectContext> descendantBoToQueryable = container.getAllDescendants().collect(Collectors.toMap(BusinessObjectContext::getBusinessObject, Function.identity()));
if (bo instanceof FlowSpecificationInstance) {
final FlowSpecificationInstance fsi = (FlowSpecificationInstance) bo;
enableFlowSpecificationInstanceNodes(descendantBoToQueryable, fsi);
}
if (bo instanceof ConnectionReference) {
final ConnectionReference cr = (ConnectionReference) bo;
enableConnectionReferenceNodes(descendantBoToQueryable, cr);
}
return new FlowSegmentReference(io, container);
}
} else if (bo instanceof NamedElement) {
final RelativeBusinessObjectReference ref = getRelativeBusinessObjectReference(bo);
if (ref != null) {
ensureEnabledChild(bo, container);
}
if (bo instanceof FlowSpecification) {
final FlowSpecification fs = (FlowSpecification) bo;
if (fs.getAllInEnd() != null) {
enableFlowEnd(fs.getAllInEnd(), container);
}
if (fs.getAllOutEnd() != null) {
enableFlowEnd(fs.getAllOutEnd(), container);
}
} else if (bo instanceof Connection) {
final Connection connection = (Connection) bo;
final ConnectionEnd dstEnd = connection.getAllDestination();
final Context dstContext = connection.getAllDestinationContext();
final RelativeBusinessObjectReference dstEndRef = getRelativeBusinessObjectReference(dstEnd);
// Destination context
BusinessObjectNode ctxContainer = getContextContainer(dstContext, container);
if (ctxContainer.getChild(dstEndRef) == null) {
createNode(ctxContainer, dstEndRef, dstEnd);
}
final ConnectionEnd srcEnd = connection.getAllSource();
final Context srcContext = connection.getAllSourceContext();
// Source context
ctxContainer = getContextContainer(srcContext, container);
final RelativeBusinessObjectReference srcEndRef = getRelativeBusinessObjectReference(srcEnd);
if (ctxContainer.getChild(srcEndRef) == null) {
createNode(ctxContainer, srcEndRef, srcEnd);
}
}
return new FlowSegmentReference((NamedElement) bo, container);
} else {
throw new RuntimeException("Unexpected business object: " + bo);
}
}
private BusinessObjectNode getContextContainer(final Context context, final BusinessObjectNode contextContainer) {
if (context != null) {
// Ensure context container is created
final RelativeBusinessObjectReference contextRef = getRelativeBusinessObjectReference(context);
if (contextContainer.getChild(contextRef) == null) {
// Show context
createNode(contextContainer, contextRef, context);
}
return contextContainer.getChild(contextRef);
}
return contextContainer;
}
private void enableFlowEnd(final FlowEnd flowEnd, BusinessObjectNode containerNode) {
final Feature feature = (Feature) flowEnd.getFeature();
if (flowEnd.getContext() != null) {
containerNode = ensureEnabledChild(flowEnd.getContext(), containerNode);
}
ensureEnabledChild(feature, containerNode);
}
private void enableFlowSpecificationInstanceNodes(final Map<Object, BusinessObjectContext> descendantBoToQueryable, final FlowSpecificationInstance fsi) {
enableAncestorNodes(descendantBoToQueryable, fsi);
if (fsi.getDestination() != null) {
enableAncestorNodes(descendantBoToQueryable, fsi.getDestination());
}
if (fsi.getSource() != null) {
enableAncestorNodes(descendantBoToQueryable, fsi.getSource());
}
}
private void enableConnectionReferenceNodes(final Map<Object, BusinessObjectContext> descendantBoToQueryable, final ConnectionReference cr) {
Element tmpElement = cr;
// Ancestors to ensure are enabled on the diagram
final Queue<Element> ancestors = Collections.asLifoQueue(new LinkedList<Element>());
if (!descendantBoToQueryable.containsKey(tmpElement)) {
ancestors.add(tmpElement);
tmpElement = tmpElement.getOwner();
// First owner of connection reference is connection instance
if (tmpElement instanceof ConnectionInstance) {
tmpElement = tmpElement.getOwner();
}
}
// Connection reference
populateAncestorsQueue(descendantBoToQueryable, ancestors, tmpElement);
enableAncestorNodes(descendantBoToQueryable, ancestors, ancestors.poll());
// Enable source and destination nodes
enableAncestorNodes(descendantBoToQueryable, cr.getSource());
enableAncestorNodes(descendantBoToQueryable, cr.getDestination());
}
// Gets the first element ancestor that is enabled
private void populateAncestorsQueue(final Map<Object, BusinessObjectContext> descendantBoToQueryable, final Queue<Element> ancestors, Element ancestor) {
while (!descendantBoToQueryable.containsKey(ancestor)) {
ancestors.add(ancestor);
ancestor = ancestor.getOwner();
}
ancestors.add(ancestor);
}
// Find ancestors and create if necessary
private void enableAncestorNodes(final Map<Object, BusinessObjectContext> descendantBoToQueryable, final Element ancestor) {
final Queue<Element> ancestors = Collections.asLifoQueue(new LinkedList<Element>());
populateAncestorsQueue(descendantBoToQueryable, ancestors, ancestor);
enableAncestorNodes(descendantBoToQueryable, ancestors, ancestors.poll());
}
// Create ancestor nodes
private void enableAncestorNodes(final Map<Object, BusinessObjectContext> descendantBoToQueryable, final Queue<Element> ancestors, final Element ancestor) {
BusinessObjectNode ancestorNode = (BusinessObjectNode) descendantBoToQueryable.get(ancestor);
for (final Element ancestorToEnable : ancestors) {
final RelativeBusinessObjectReference ancestorRef = getRelativeBusinessObjectReference(ancestorToEnable);
if (ancestorNode.getChild(ancestorRef) == null) {
ancestorNode = createNode(ancestorNode, ancestorRef, ancestorToEnable);
}
}
}
private BusinessObjectNode ensureEnabledChild(final Object childBo, final BusinessObjectNode parent) {
final RelativeBusinessObjectReference childRef = getRelativeBusinessObjectReference(childBo);
final BusinessObjectNode childNode = parent.getChild(childRef);
if (childRef != null && childNode == null) {
return createNode(parent, childRef, childBo);
}
return Objects.requireNonNull(childNode, "Child node does not exist");
}
private BusinessObjectNode createNode(final BusinessObjectNode parent, final RelativeBusinessObjectReference childRef, final Object childBo) {
return new BusinessObjectNode(parent, UUID.randomUUID(), childRef, childBo, Completeness.UNKNOWN, false);
}
private RelativeBusinessObjectReference getRelativeBusinessObjectReference(final Object bo) {
final RelativeBusinessObjectReference result = referenceService.getRelativeReference(bo);
return result;
}
});
return showFlowBtn;
}
Aggregations