/** * 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 user-object in the provided node * * @param node * @return */ public List<EditableObjectNode> findReferences(EditableObjectNode node) { Object referencedObject = node.getUserObject(); return findReferences(referencedObject, node.getMessageGroup()); }