ProcessElementUtil.java 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package com.flow.flowable.utils;
  2. import org.flowable.bpmn.model.FlowElement;
  3. import org.flowable.bpmn.model.FlowNode;
  4. import org.flowable.bpmn.model.SequenceFlow;
  5. import org.flowable.editor.language.json.converter.util.CollectionUtils;
  6. import java.util.LinkedHashSet;
  7. import java.util.List;
  8. import java.util.Set;
  9. public class ProcessElementUtil {
  10. /**
  11. * 递归查找所有子节点
  12. *
  13. * @param flowElement
  14. * @return
  15. */
  16. public static Set<FlowElement> findChildElements(FlowElement flowElement) {
  17. LinkedHashSet<FlowElement> elements = new LinkedHashSet<>();
  18. if (flowElement instanceof FlowNode) {
  19. FlowNode flowNode = (FlowNode) flowElement;
  20. List<SequenceFlow> outgoingFlows = flowNode.getOutgoingFlows();
  21. if (CollectionUtils.isNotEmpty(outgoingFlows)) {
  22. for (SequenceFlow sequenceFlow : outgoingFlows) {
  23. FlowElement targetElement = sequenceFlow.getTargetFlowElement();
  24. elements.add(targetElement);
  25. Set<FlowElement> childElements = findChildElements(targetElement);
  26. elements.addAll(childElements);
  27. }
  28. }
  29. }
  30. return elements;
  31. }
  32. /**
  33. * 递归查找所有父节点
  34. *
  35. * @param flowElement
  36. * @param clazz
  37. * @param <T>
  38. * @return
  39. */
  40. public static <T extends FlowElement> Set<T> findParentElements(FlowElement flowElement, Class<T> clazz) {
  41. Set<FlowElement> parentElements = findParentElements(flowElement);
  42. Set<T> elements = new LinkedHashSet<>();
  43. for (FlowElement parentElement : parentElements) {
  44. if (clazz.isInstance(parentElement)) {
  45. elements.add(clazz.cast(parentElement));
  46. }
  47. }
  48. return elements;
  49. }
  50. /**
  51. * 递归查找所有父节点
  52. *
  53. * @param flowElement
  54. * @return
  55. */
  56. public static Set<FlowElement> findParentElements(FlowElement flowElement) {
  57. LinkedHashSet<FlowElement> elements = new LinkedHashSet<>();
  58. if (flowElement instanceof FlowNode) {
  59. FlowNode flowNode = (FlowNode) flowElement;
  60. List<SequenceFlow> incomingFlows = flowNode.getIncomingFlows();
  61. if (CollectionUtils.isNotEmpty(incomingFlows)) {
  62. for (SequenceFlow sequenceFlow : incomingFlows) {
  63. FlowElement sourceElement = sequenceFlow.getSourceFlowElement();
  64. if (sourceElement instanceof FlowNode) {
  65. FlowElement sourceFlowElement = sequenceFlow.getSourceFlowElement();
  66. elements.add(sourceElement);
  67. Set<FlowElement> parentElements = findParentElements(sourceFlowElement);
  68. elements.addAll(parentElements);
  69. }
  70. }
  71. }
  72. }
  73. return elements;
  74. }
  75. }