/** * 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; }
/** * 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; }
/** * 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()); }