From 7c1f98faab335f132ee72ff91fbe3d4f06c6bd92 Mon Sep 17 00:00:00 2001
From: srosse <stephane.rosse@frentix.com>
Date: Mon, 25 Feb 2019 09:04:20 +0100
Subject: [PATCH] OO-3909: hardened the tree visitor to handle possible "null"
 nodes

---
 .../org/olat/core/util/tree/TreeVisitor.java  | 10 ++++---
 .../MergedCourseElementDataContainer.java     | 29 ++++++-------------
 2 files changed, 15 insertions(+), 24 deletions(-)

diff --git a/src/main/java/org/olat/core/util/tree/TreeVisitor.java b/src/main/java/org/olat/core/util/tree/TreeVisitor.java
index c94258ede02..cc2e47a59bd 100644
--- a/src/main/java/org/olat/core/util/tree/TreeVisitor.java
+++ b/src/main/java/org/olat/core/util/tree/TreeVisitor.java
@@ -61,10 +61,12 @@ public class TreeVisitor {
 		if (!visitChildrenFirst) {
 			v.visit(node);
 		}
-		int chdCnt = node.getChildCount();
-		for (int i = 0; i < chdCnt; i++) {
-			INode chd = node.getChildAt(i);
-			doVisit(chd);
+		if(node != null) {
+			int chdCnt = node.getChildCount();
+			for (int i = 0; i < chdCnt; i++) {
+				INode chd = node.getChildAt(i);
+				doVisit(chd);
+			}
 		}
 		if (visitChildrenFirst) {
 			v.visit(node);
diff --git a/src/main/java/org/olat/course/folder/MergedCourseElementDataContainer.java b/src/main/java/org/olat/course/folder/MergedCourseElementDataContainer.java
index 39f9a3bdcec..2af53d3dda9 100644
--- a/src/main/java/org/olat/course/folder/MergedCourseElementDataContainer.java
+++ b/src/main/java/org/olat/course/folder/MergedCourseElementDataContainer.java
@@ -31,9 +31,7 @@ import org.olat.core.id.IdentityEnvironment;
 import org.olat.core.logging.OLog;
 import org.olat.core.logging.Tracing;
 import org.olat.core.util.StringHelper;
-import org.olat.core.util.nodes.INode;
 import org.olat.core.util.tree.TreeVisitor;
-import org.olat.core.util.tree.Visitor;
 import org.olat.core.util.vfs.MergeSource;
 import org.olat.core.util.vfs.NamedContainerImpl;
 import org.olat.core.util.vfs.Quota;
@@ -92,12 +90,9 @@ public class MergedCourseElementDataContainer extends MergeSource {
 		ICourse course = CourseFactory.loadCourse(courseId);
 		AtomicInteger count = new AtomicInteger(0);
 		if(identityEnv == null) {
-			new TreeVisitor(new Visitor() {
-				@Override
-				public void visit(INode node) {
-					if(node instanceof PFCourseNode || node instanceof BCCourseNode) {
-						count.incrementAndGet();
-					}
+			new TreeVisitor(node -> {
+				if(node instanceof PFCourseNode || node instanceof BCCourseNode) {
+					count.incrementAndGet();
 				}
 			}, course.getRunStructure().getRootNode(), true).visitAll();
 		} else if(course instanceof PersistingCourseImpl) {
@@ -107,18 +102,12 @@ public class MergedCourseElementDataContainer extends MergeSource {
 			CourseNode rootCn = userCourseEnv.getCourseEnvironment().getRunStructure().getRootNode();
 			NodeEvaluation rootNodeEval = rootCn.eval(userCourseEnv.getConditionInterpreter(), treeEval, new VisibleTreeFilter());
 	
-			new TreeVisitor(new Visitor() {
-				@Override
-				public void visit(INode node) {
-					if(node instanceof TreeNode) {
-						
-						if(((TreeNode)node).getUserObject() instanceof NodeEvaluation) {
-							NodeEvaluation nodeEval = (NodeEvaluation)((TreeNode)node).getUserObject();
-							if(nodeEval != null
-									&& (nodeEval.getCourseNode() instanceof PFCourseNode || nodeEval.getCourseNode() instanceof BCCourseNode)) {
-								count.incrementAndGet();
-							}
-						}
+			new TreeVisitor(node -> {
+				if(node instanceof TreeNode && ((TreeNode)node).getUserObject() instanceof NodeEvaluation) {
+					NodeEvaluation nodeEval = (NodeEvaluation)((TreeNode)node).getUserObject();
+					if(nodeEval != null
+							&& (nodeEval.getCourseNode() instanceof PFCourseNode || nodeEval.getCourseNode() instanceof BCCourseNode)) {
+						count.incrementAndGet();
 					}
 				}
 			}, rootNodeEval.getTreeNode(), true).visitAll();
-- 
GitLab