package org.eclipse.uml2.diagram.sequence.internal.layout.manage;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.eclipse.uml2.diagram.sequence.internal.layout.abstractgde.AbsLink;
import org.eclipse.uml2.diagram.sequence.internal.layout.abstractgde.AbsNode;
import org.eclipse.uml2.diagram.sequence.internal.layout.abstractgde.AbsNodeEnumeration;
import org.eclipse.uml2.diagram.sequence.internal.layout.model.SdLayoutModelAddRemoveProcessor;
class ElementsAddRemoveOrderChecker implements SdLayoutModelAddRemoveProcessor {
public boolean processAddedGdeNode(AbsNode gdeNode) {
myNodes.add(gdeNode);
return true;
}
public boolean processRemovedGdeNode(AbsNode gdeNode) {
myNodes.remove(gdeNode);
List children = findChildren(gdeNode);
if (!children.isEmpty()) {
throw new RuntimeException();
}
return true;
}
public boolean processAddedGdeLink(AbsLink absLink) {
if (!myNodes.contains(absLink.getSource())) {
// Reference expected = absLink.getSource().getReference();
// System.out.println("[ElementsAddRemoveOrderChecker] processAddedGdeLink expected ref = " + expected.getUniqueName());
// for (Iterator it = myNodes.iterator(); it.hasNext();) {
// AbsNode node = (AbsNode)it.next();
// System.out.println("[ElementsAddRemoveOrderChecker] processAddedGdeLink actual = " + node.getReference().getUniqueName());
// }
// System.out.println("[ElementsAddRemoveOrderChecker] processAddedGdeLink <<<<");
//Reference expected = absLink.getSource().getReference();
//System.out.println("[ElementsAddRemoveOrderChecker] processAddedGdeLink expected ref = " + expected.getPropertyValue(Property.METACLASS)); //$NON-NLS-1$
//for (Iterator it = myNodes.iterator(); it.hasNext();) {
// AbsNode node = (AbsNode)it.next();
// System.out.println("[ElementsAddRemoveOrderChecker] processAddedGdeLink actual = " + node.getReference().getPropertyValue(Property.METACLASS)); //$NON-NLS-1$
//}
//System.out.println("[ElementsAddRemoveOrderChecker] processAddedGdeLink <<<<"); //$NON-NLS-1$
throw new RuntimeException();
}
if (!myNodes.contains(absLink.getDestination())) {
//System.out.println("[ElementsAddRemoveOrderChecker] processAddedGdeLink link destination hasn't been added: link = " + absLink+"\n destination = "+absLink.getDestination()); //$NON-NLS-1$ //$NON-NLS-2$
throw new RuntimeException();
}
myLinks.add(absLink);
return true;
}
public boolean processRemovedGdeLink(AbsLink absLink) {
myLinks.remove(absLink);
return true;
}
public void finish() {
// myLinks.clear();
// myNodes.clear();
}
List findChildren(AbsNode node) {
ArrayList result = new ArrayList();
for (AbsNodeEnumeration subnodes = node.subnodes(); subnodes.hasMoreElements(); ) {
AbsNode next = subnodes.nextGdeNode();
if (myNodes.contains(next)) {
result.add(next);
}
}
for (Iterator it = myLinks.iterator(); it.hasNext();) {
AbsLink next = (AbsLink)it.next();
if (next.getSource() == node || next.getDestination() == node) {
result.add(next);
}
}
return result;
}
final Set myLinks = new HashSet();
final Set myNodes = new HashSet();
}