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);
 }