示例#1
0
  /**
   * Determine what nodes are affected (i.e. contain references to the items being deleted), if
   * these nodes are deleted.
   *
   * @param affectedNodes
   * @param edNode
   */
  public Map<EditableObjectNode, List<EditableObjectNode>> findAffectedNodes(
      List<EditableObjectNode> nodesToRemove) {
    Map<EditableObjectNode, List<EditableObjectNode>> referenceLinks =
        new HashMap<EditableObjectNode, List<EditableObjectNode>>();

    for (TreeNode node : nodesToRemove) {
      // find references to this node and its children
      for (Enumeration<?> en = ((DefaultMutableTreeNode) node).preorderEnumeration();
          en != null && en.hasMoreElements(); ) {
        DefaultMutableTreeNode child = (DefaultMutableTreeNode) en.nextElement();
        if (child instanceof EditableObjectNode) {
          List<EditableObjectNode> references = findReferences((EditableObjectNode) child);
          for (EditableObjectNode referencedNode : references) {
            // add reference node to map
            List<EditableObjectNode> refersToList = referenceLinks.get(referencedNode);
            if (refersToList == null) {
              refersToList = new ArrayList<EditableObjectNode>();
              referenceLinks.put(referencedNode, refersToList);
            }
            // add child to the "refersTo" list
            if (!refersToList.contains(child)) {
              refersToList.add((EditableObjectNode) child);
            }
          }
        }
      }
    }

    // ignore references within the nodes we're removing
    for (EditableObjectNode node : nodesToRemove) {
      for (Enumeration<?> en = ((DefaultMutableTreeNode) node).preorderEnumeration();
          en != null && en.hasMoreElements(); ) {
        DefaultMutableTreeNode child = (DefaultMutableTreeNode) en.nextElement();
        referenceLinks.remove(child);
      }

      // special case - don't include MessageSyntaxModelNode if we're removing the root
      if (node.getParent() instanceof MessageSyntaxModelNode) {
        MessageSyntaxModelNode syntaxModelNode = (MessageSyntaxModelNode) node.getParent();
        MessageSyntaxModel syntaxModel = (MessageSyntaxModel) syntaxModelNode.getUserObject();
        if (syntaxModel.getRoot() == node.getUserObject()) {
          referenceLinks.remove(syntaxModelNode);
        }
      }
    }

    return referenceLinks;
  }
示例#2
0
  /**
   * Find all nodes that have a user-object with references to the supplied user-object
   *
   * @param referencedObject
   * @return
   */
  public List<EditableObjectNode> findReferences(Object referencedObject, MessageGroup group) {

    List<EditableObjectNode> referenceNodes = new ArrayList<EditableObjectNode>();

    // walk tree and look for references
    for (Enumeration<?> en = m_root.preorderEnumeration(); en != null && en.hasMoreElements(); ) {
      DefaultMutableTreeNode child = (DefaultMutableTreeNode) en.nextElement();
      if (child instanceof EditableObjectNode) {
        EditableObjectNode edChild = (EditableObjectNode) child;
        // skip the nodes that are not in this message group
        if (edChild.getMessageGroup() != group) {
          continue;
        }

        // skip the non-editable nodes, since these are just for show
        if (!edChild.isEditable()) {
          continue;
        }

        Object childUserObject = child.getUserObject();

        // special handling of Field, which is referenced by name in a SyntaxNode, SemanticElement
        // and BER
        if (referencedObject instanceof Field) {
          if (nodeReferencesField(child, (Field) referencedObject)) {
            referenceNodes.add(edChild);
            continue;
          }
        }

        // Special handling of an MdmiDatatype, which is referenced in a list by a DataRule
        if (referencedObject instanceof MdmiDatatype && childUserObject instanceof DataRule) {
          if (((DataRule) childUserObject).getDatatypes().contains(referencedObject)) {
            referenceNodes.add(edChild);
          }
          continue;
        }

        // inspect user object to determine if it has any references
        if (hasReferenceTo(childUserObject, referencedObject)) {
          referenceNodes.add(edChild);
        }
      }
    }
    return referenceNodes;
  }
示例#3
0
  /**
   * Find all nodes that have a user-object with references to the user-object in the provided node
   *
   * @param node
   * @return
   */
  public List<EditableObjectNode> findReferences(EditableObjectNode node) {
    Object referencedObject = node.getUserObject();

    return findReferences(referencedObject, node.getMessageGroup());
  }