Bug 579067 - DataTree toString implementations for debug

Change-Id: I8ad33daa9f69e1c9d9d5ca83e9797601a60418b8
Signed-off-by: Joerg Kubitz <jkubitz-eclipse@gmx.de>
Reviewed-on: https://git.eclipse.org/r/c/platform/eclipse.platform.resources/+/190589
Tested-by: Platform Bot <platform-bot@eclipse.org>
Reviewed-by: Mickael Istria <mistria@redhat.com>
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/dtree/AbstractDataTreeNode.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/dtree/AbstractDataTreeNode.java
index d91da64..6d9f006 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/dtree/AbstractDataTreeNode.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/dtree/AbstractDataTreeNode.java
@@ -14,6 +14,8 @@
  *******************************************************************************/
 package org.eclipse.core.internal.dtree;
 
+import java.util.Arrays;
+import java.util.stream.Collectors;
 import org.eclipse.core.internal.utils.Messages;
 import org.eclipse.core.internal.utils.StringPool;
 import org.eclipse.core.runtime.IPath;
@@ -589,8 +591,37 @@
 	 * for debugging purposes only (no NLS support needed)
 	 */
 	@Override
-	public String toString() {
-		return "an AbstractDataTreeNode(" + this.getName() + ") with " + getChildren().length + " children."; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+	final public String toString() {
+		return toShortString(); // $NON-NLS-1$
+	}
+	// example output:
+	// "DataTreeNode with 3 children
+	//	   leftOfRoot DataTreeNode with 3 children
+	//	      new DataTreeNode
+	//	      three DataTreeNode
+	//	      two DataTreeNode
+	//	   newTopLevel DataTreeNode
+	//	   rightOfRoot DataTreeNode with 1 children
+	//	      rightOfRight DataTreeNode"
+	String toLongString() {
+		return toShortString() + "\n" + getChildrenString(1); //$NON-NLS-1$
+	}
+
+	// example output:
+	// "rightOfRoot DataTreeNode with 1 children"
+	String toShortString() {
+		return (getName() == null ? "" : getName() + " ") + this.getClass().getSimpleName() //$NON-NLS-1$ //$NON-NLS-2$
+				+ (getChildren().length == 0 ? "" //$NON-NLS-1$
+				: (" with " + getChildren().length + " children"));//$NON-NLS-1$ //$NON-NLS-2$
+	}
+
+	private String getChildrenString(int depth) {
+		int MAXDEPTH = 2; // draw only some levels
+		String indent = "   ".repeat(depth); //$NON-NLS-1$
+		return (depth > MAXDEPTH ? "" //$NON-NLS-1$
+				: (Arrays.stream(getChildren())
+						.map(n -> indent + n.toShortString() + "\n" + n.getChildrenString(depth + 1)) //$NON-NLS-1$
+						.collect(Collectors.joining())));
 	}
 
 	/**
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/dtree/DataDeltaNode.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/dtree/DataDeltaNode.java
index 8ac8d77..fd56ced 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/dtree/DataDeltaNode.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/dtree/DataDeltaNode.java
@@ -106,15 +106,6 @@
 	}
 
 	/**
-	 * Returns a unicode representation of the node.  This method is used
-	 * for debugging purposes only (no NLS support needed)
-	 */
-	@Override
-	public String toString() {
-		return "a DataDeltaNode(" + this.getName() + ") with " + getChildren().length + " children."; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-	}
-
-	/**
 	 * Returns a constant describing the type of node.
 	 */
 	@Override
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/dtree/DataTreeNode.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/dtree/DataTreeNode.java
index 8cfb072..8d8a72a 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/dtree/DataTreeNode.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/dtree/DataTreeNode.java
@@ -350,18 +350,6 @@
 			((IStringPoolParticipant) o).shareStrings(set);
 	}
 
-	/**
-	 * Returns a unicode representation of the node.  This method is used
-	 * for debugging purposes only (no NLS support needed)
-	 */
-	@Override
-	public String toString() {
-		return "a DataTreeNode(" + this.getName() + ") with " + getChildren().length + " children."; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-	}
-
-	/**
-	 * Returns a constant describing the type of node.
-	 */
 	@Override
 	int type() {
 		return T_COMPLETE_NODE;
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/dtree/DeletedNode.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/dtree/DeletedNode.java
index e4e532b..5647027 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/dtree/DeletedNode.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/dtree/DeletedNode.java
@@ -110,15 +110,6 @@
 	}
 
 	/**
-	 * Return a unicode representation of the node.  This method
-	 * is used for debugging purposes only (no NLS please)
-	 */
-	@Override
-	public String toString() {
-		return "a DeletedNode(" + this.getName() + ")"; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
 	 * Returns a string describing the type of node.
 	 */
 	@Override
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/dtree/DeltaDataTree.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/dtree/DeltaDataTree.java
index 68b20fd..9ad72e6 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/dtree/DeltaDataTree.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/dtree/DeltaDataTree.java
@@ -977,4 +977,12 @@
 				root.storeStrings(set);
 		}
 	}
-}
+
+	/** for debugging purposes only */
+	@Override
+	public String toString() {
+		return this.getClass().getSimpleName() + " " + Integer.toHexString(System.identityHashCode(this)) + " parent=" //$NON-NLS-1$ //$NON-NLS-2$
+				+ (parent == null ? null : Integer.toHexString(System.identityHashCode(parent))) + " rootNode=" //$NON-NLS-1$
+				+ rootNode.toShortString();
+	}
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/dtree/NoDataDeltaNode.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/dtree/NoDataDeltaNode.java
index 9f21a6a..a4933cd 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/dtree/NoDataDeltaNode.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/dtree/NoDataDeltaNode.java
@@ -118,15 +118,6 @@
 	}
 
 	/**
-	 * Returns a unicode representation of the node.  This method is used
-	 * for debugging purposes only (no NLS support needed)
-	 */
-	@Override
-	public String toString() {
-		return "a NoDataDeltaNode(" + this.getName() + ") with " + getChildren().length + " children."; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-	}
-
-	/**
 	 * Return a constant describing the type of node.
 	 */
 	@Override
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/FileStoreRoot.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/FileStoreRoot.java
index e55c025..9993e69 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/FileStoreRoot.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/localstore/FileStoreRoot.java
@@ -209,4 +209,10 @@
 		}
 		return canonicalRoot;
 	}
+
+	/** for debugging only **/
+	@Override
+	public String toString() {
+		return root.toString();
+	}
 }
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/ResourceInfo.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/ResourceInfo.java
index 466f925..6032633 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/ResourceInfo.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/ResourceInfo.java
@@ -488,4 +488,10 @@
 		output.writeInt(getContentId());
 		output.writeLong(modStamp);
 	}
+
+	/** for debugging only **/
+	@Override
+	public String toString() {
+		return "" + fileStoreRoot + " modStamp=" + modStamp; //$NON-NLS-1$ //$NON-NLS-2$
+	}
 }