private DiffNode compare(ITypedElement left, ITypedElement right) { if (left.getType().equals(ITypedElement.FOLDER_TYPE)) { // return new MyDiffContainer(null, left,right); DiffNode diffNode = new DiffNode(null, Differencer.CHANGE, null, left, right); ITypedElement[] lc = (ITypedElement[]) ((IStructureComparator) left).getChildren(); ITypedElement[] rc = (ITypedElement[]) ((IStructureComparator) right).getChildren(); int li = 0; int ri = 0; while (li < lc.length && ri < rc.length) { ITypedElement ln = lc[li]; ITypedElement rn = rc[ri]; int compareTo = ln.getName().compareTo(rn.getName()); // TODO: Git ordering! if (compareTo == 0) { if (!ln.equals(rn)) diffNode.add(compare(ln, rn)); ++li; ++ri; } else if (compareTo < 0) { DiffNode childDiffNode = new DiffNode(Differencer.ADDITION, null, ln, null); diffNode.add(childDiffNode); if (ln.getType().equals(ITypedElement.FOLDER_TYPE)) { ITypedElement[] children = (ITypedElement[]) ((IStructureComparator) ln).getChildren(); if (children != null && children.length > 0) { for (ITypedElement child : children) { childDiffNode.add(addDirectoryFiles(child, Differencer.ADDITION)); } } } ++li; } else { DiffNode childDiffNode = new DiffNode(Differencer.DELETION, null, null, rn); diffNode.add(childDiffNode); if (rn.getType().equals(ITypedElement.FOLDER_TYPE)) { ITypedElement[] children = (ITypedElement[]) ((IStructureComparator) rn).getChildren(); if (children != null && children.length > 0) { for (ITypedElement child : children) { childDiffNode.add(addDirectoryFiles(child, Differencer.DELETION)); } } } ++ri; } } while (li < lc.length) { ITypedElement ln = lc[li]; DiffNode childDiffNode = new DiffNode(Differencer.ADDITION, null, ln, null); diffNode.add(childDiffNode); if (ln.getType().equals(ITypedElement.FOLDER_TYPE)) { ITypedElement[] children = (ITypedElement[]) ((IStructureComparator) ln).getChildren(); if (children != null && children.length > 0) { for (ITypedElement child : children) { childDiffNode.add(addDirectoryFiles(child, Differencer.ADDITION)); } } } ++li; } while (ri < rc.length) { ITypedElement rn = rc[ri]; DiffNode childDiffNode = new DiffNode(Differencer.DELETION, null, null, rn); diffNode.add(childDiffNode); if (rn.getType().equals(ITypedElement.FOLDER_TYPE)) { ITypedElement[] children = (ITypedElement[]) ((IStructureComparator) rn).getChildren(); if (children != null && children.length > 0) { for (ITypedElement child : children) { childDiffNode.add(addDirectoryFiles(child, Differencer.DELETION)); } } } ++ri; } return diffNode; } return new DiffNode(left, right); }