Example #1
0
  public void execute(WorkItem workItem, ProcessContext context) throws Exception {
    String from = assignment.getFrom();
    String to = assignment.getTo();

    XPathFactory factory = XPathFactory.newInstance();
    XPath xpathFrom = factory.newXPath();

    XPathExpression exprFrom = xpathFrom.compile(from);

    XPath xpathTo = factory.newXPath();

    XPathExpression exprTo = xpathTo.compile(to);

    Object target = null;
    Object source = null;

    if (isInput) {
      source = context.getVariable(sourceExpr);
      target = ((WorkItem) workItem).getParameter(targetExpr);
    } else {
      target = context.getVariable(targetExpr);
      source = ((WorkItem) workItem).getResult(sourceExpr);
    }

    Object targetElem = null;

    //        XPATHExpressionModifier modifier = new XPATHExpressionModifier();
    //        // modify the tree, returning the root node
    //        target = modifier.insertMissingData(to, (org.w3c.dom.Node) target);

    // now pick the leaf for this operation
    if (target != null) {
      org.w3c.dom.Node parent = null;
      parent = ((org.w3c.dom.Node) target).getParentNode();

      targetElem = exprTo.evaluate(parent, XPathConstants.NODE);

      if (targetElem == null) {
        throw new RuntimeException(
            "Nothing was selected by the to expression " + to + " on " + targetExpr);
      }
    }
    NodeList nl = null;
    if (source instanceof org.w3c.dom.Node) {
      nl = (NodeList) exprFrom.evaluate(source, XPathConstants.NODESET);
    } else if (source instanceof String) {
      DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
      Document doc = builder.newDocument();
      // quirky: create a temporary element, use its nodelist
      Element temp = doc.createElementNS(null, "temp");
      temp.appendChild(doc.createTextNode((String) source));
      nl = temp.getChildNodes();
    } else if (source == null) {
      // don't throw errors yet ?
      throw new RuntimeException("Source value was null for source " + sourceExpr);
    }

    if (nl.getLength() == 0) {
      throw new RuntimeException(
          "Nothing was selected by the from expression " + from + " on " + sourceExpr);
    }
    for (int i = 0; i < nl.getLength(); i++) {

      if (!(targetElem instanceof org.w3c.dom.Node)) {
        if (nl.item(i) instanceof Attr) {
          targetElem = ((Attr) nl.item(i)).getValue();
        } else if (nl.item(i) instanceof Text) {
          targetElem = ((Text) nl.item(i)).getWholeText();
        } else {
          DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
          Document doc = builder.newDocument();
          targetElem = doc.importNode(nl.item(i), true);
        }
        target = targetElem;
      } else {
        org.w3c.dom.Node n =
            ((org.w3c.dom.Node) targetElem).getOwnerDocument().importNode(nl.item(i), true);
        if (n instanceof Attr) {
          ((Element) targetElem).setAttributeNode((Attr) n);
        } else {
          ((org.w3c.dom.Node) targetElem).appendChild(n);
        }
      }
    }

    if (isInput) {
      ((WorkItem) workItem).setParameter(targetExpr, target);
    } else {
      context.setVariable(targetExpr, target);
    }
  }