⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 definitionparser.java

📁 一个java工作流引擎
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
    addName(NameType.NODE, fork.getName());
    fork.setDescription(getElementText(forkXml, "description", null));
    DelegationImpl forkDelegation = parseDelegation(forkXml);
    if (forkDelegation != null) {
      fork.setForkDelegation(forkDelegation);
    } else {
      // set the corresponding join for validation purposes
      unresolvedReferences.add(new UnresolvedFork(fork, getAttribute(forkXml, "corresponding-join", null)));
    }
    parseTransitions(fork, forkXml);
    parseActions(fork, forkXml);
    return fork;
  }

  private NodeImpl parseDecision(Element decisionXml) {
    DecisionImpl decision = new DecisionImpl(getAttribute(decisionXml, "name"));
    addName(NameType.NODE, decision.getName());
    decision.setDescription(getElementText(decisionXml, "description", null));
    decision.setDecisionDelegation(parseDelegation(decisionXml));
    parseTransitions(decision, decisionXml);
    parseActions(decision, decisionXml);
    return decision;
  }

  private NodeImpl parseProcessState(Element processStateXml) {
    ProcessStateImpl processState = new ProcessStateImpl(getAttribute(processStateXml, "name"));
    addName(NameType.NODE, processState.getName());
    processState.setDescription(getElementText(processStateXml, "description", null));
    processState.setProcessInvocationDelegation(parseDelegation(processStateXml));
    parseTransitions(processState, processStateXml);
    parseActions(processState, processStateXml);
    return processState;
  }

  private NodeImpl parseState(Element stateXml) {
    StateImpl state = new StateImpl(getAttribute(stateXml, "name"));
    addName(NameType.NODE, state.getName());
    state.setDescription(getElementText(stateXml, "description", null));
    resolveSwimlane(state, stateXml);
    parseTransitions(state, stateXml);
    parseActions(state, stateXml);
    return state;
  }

  private void resolveSwimlane(StateImpl state, Element stateXml) {
    String swimlaneName = getAttribute(stateXml, "swimlane", null);
    state.setSwimlane(definition.getSwimlane(swimlaneName));
  }

  private void parseTransitions(NodeImpl node, Element nodeXml) {
    Iterator iter = nodeXml.elements("transition").iterator();
    while (iter.hasNext()) {
      Element transitionXml = (Element) iter.next();
      TransitionImpl transition = node.addLeavingTransition(new TransitionImpl(getAttribute(transitionXml, "name", null)));
      transition.setFrom( node );
      unresolvedReferences.add(new UnresolvedTransition(transition, getAttribute(transitionXml, "to")));
      parseActions(transition, transitionXml);
    }
  }

  /**
   * checks if names are defined more then once.
   */
  private void addName(NameType nameType, String name) {
    Collection typeNames = (Collection) names.get(nameType);
    if (typeNames == null) {
      typeNames = new ArrayList();
      names.put(nameType, typeNames);
    }
    if (typeNames.contains(name)) {
      errors.add(nameType + " '" + name + "' is defined more then once");
    }
    typeNames.add(name);
  }

  private void parseActions(ElementImpl elementImpl, Element xmlElement) {
    EventType defaultEventType = elementImpl.getDefaultEventType();
    Iterator iter = xmlElement.elementIterator("action");
    while (iter.hasNext()) {
      elementImpl.add(parseAction((Element) iter.next(), defaultEventType));
    }
  }

  private ActionImpl parseAction(Element actionXml, EventType defaultEventType) {
    ActionImpl action = new ActionImpl();
    action.setActionDelegation(parseDelegation(actionXml));
    EventType eventType = defaultEventType;
    String eventTypeId = getAttribute(actionXml, "event-type", null);
    if (eventTypeId != null) {
      eventType = (EventType) Enum.findById(EventType.class, eventTypeId);
      if (eventType == null) {
        errors.add("action has unknown event-type '" + eventTypeId + "'");
      }
    }
    action.setEventType(eventType);
    return action;
  }

  private DelegationImpl parseDelegation(Element xmlElement) {
    DelegationImpl delegation = null;
    Element delegationXml = xmlElement.element("delegation");
    if (delegationXml != null) {
      delegation = new DelegationImpl(definition, getAttribute(delegationXml, "class"));
      String configuration = getElementText(xmlElement, "delegation", null);
      if (configuration != null) {
        delegation.setConfiguration(configuration.trim());
      }
    }
    return delegation;
  }

  private String getElementText(Element xmlElement, String name) {
    String text = getElementText(xmlElement, name, null);
    if (text == null)
      errors.add("element " + name + " is required in element " + xmlElement.asXML());
    return text;
  }

  private String getElementText(Element xmlElement, String name, String defaultValue) {
    String text = defaultValue;
    Element subElement = xmlElement.element(name);
    if (subElement != null) {
      if (subElement.isTextOnly()) {
        text = subElement.getStringValue();
      }
    }
    return text;
  }

  private String getAttribute(Element xmlElement, String name) {
    String value = getAttribute(xmlElement, name, null);
    if (value == null)
      errors.add("attribute " + name + " is required in element " + xmlElement.asXML());
    return value;
  }

  private String getAttribute(Element xmlElement, String name, String defaultValue) {
    String value = defaultValue;
    Attribute attribute = xmlElement.attribute(name);
    if (attribute != null) {
      value = attribute.getText();
    }
    return value;
  }

  private void resolveReferences() {
    Iterator iter = unresolvedReferences.iterator();
    while (iter.hasNext()) {
      UnresolvedReference unresolvedReference = (UnresolvedReference) iter.next();
      unresolvedReference.resolve();
    }
  }

  private static class NameType {
    public static final NameType NODE = new NameType("node");
    public static final NameType JAVATYPE = new NameType("type");
    public static final NameType SWIMLANE = new NameType("swimlane");
    public static final NameType VARIABLE = new NameType("variable");
    private String id = null;
    public NameType(String id) {
      this.id = id;
    }
    public String toString() {
      return id;
    }
  }

  private abstract class UnresolvedReference {
    protected Object object = null;
    protected String reference = null;
    public UnresolvedReference(Object object, String reference) {
      this.object = object;
      this.reference = reference;
    }
    public abstract void resolve();
  }

  private class UnresolvedTransition extends UnresolvedReference {
    public UnresolvedTransition(TransitionImpl transition, String toName) {
      super(transition, toName);
    }
    public void resolve() {
      NodeImpl to = (NodeImpl) definition.getNodes().get(reference);
      if (to == null) {
        errors.add("node '" + ((TransitionImpl) object).getFrom().getName() + "' references unexisting node '" + reference + "'");
      } else {
        ((TransitionImpl) object).setTo(to);
      }
    }
  }

  private class UnresolvedFork extends UnresolvedReference {
    public UnresolvedFork(ForkImpl fork, String joinName) {
      super(fork, joinName);
    }
    public void resolve() {
      try {
        JoinImpl join = (JoinImpl) definition.getNodes().get(reference);
        ((ForkImpl) object).setCorrespondingJoin(join);
      } catch (ClassCastException e) {
        errors.add(
          "fork '" + ((ForkImpl) object).getName() + "' references a '" + definition.getNodes().get(reference).getClass().getName() + "' instead of a join");
      }
    }
  }

  private class UnresolvedJoin extends UnresolvedReference {
    public UnresolvedJoin(JoinImpl join, String forkName) {
      super(join, forkName);
    }
    public void resolve() {
      try {
        ForkImpl fork = (ForkImpl) definition.getNodes().get(reference);
        ((JoinImpl) object).setCorrespondingFork(fork);
      } catch (ClassCastException e) {
        errors.add(
          "join '" + ((ForkImpl) object).getName() + "' references a '" + definition.getNodes().get(reference).getClass().getName() + "' instead of a fork");
      }
    }
  }

  private static Log log = LogFactory.getLog(DefinitionParser.class);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -