From efd5fd615b2a419453ca2401ac08e1fc03d1ac14 Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Tue, 18 Sep 2012 15:00:43 +0200
Subject: [PATCH] FXOLAT-461: order by VFSItem, not MetaTagged

---
 .../bc/meta/tagged/MetaTaggedComparator.java  | 54 ++++++++++++++++++
 .../bc/meta/tagged/TitleComparator.java       | 30 +++++-----
 .../folder/OlatRootFolderTreeModel.java       | 56 ++++---------------
 3 files changed, 82 insertions(+), 58 deletions(-)
 create mode 100644 src/main/java/org/olat/core/commons/modules/bc/meta/tagged/MetaTaggedComparator.java

diff --git a/src/main/java/org/olat/core/commons/modules/bc/meta/tagged/MetaTaggedComparator.java b/src/main/java/org/olat/core/commons/modules/bc/meta/tagged/MetaTaggedComparator.java
new file mode 100644
index 00000000000..9903de27991
--- /dev/null
+++ b/src/main/java/org/olat/core/commons/modules/bc/meta/tagged/MetaTaggedComparator.java
@@ -0,0 +1,54 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.core.commons.modules.bc.meta.tagged;
+
+import java.text.Collator;
+import java.util.Comparator;
+import java.util.Locale;
+
+import org.olat.core.commons.modules.bc.meta.MetaInfo;
+import org.olat.core.commons.modules.bc.meta.MetaTitleComparator;
+
+/**
+ * Compares the title of two meta tagged objects.
+ * 
+ * <P>
+ * Initial Date: Jul 9, 2009 <br>
+ * 
+ * @author gwassmann
+ */
+public class MetaTaggedComparator implements Comparator<MetaTagged> {
+	private final Comparator<MetaInfo> comparator;
+
+	public MetaTaggedComparator(Collator collator) {
+		comparator = new MetaTitleComparator(collator);
+	}
+
+	public MetaTaggedComparator(Locale locale) {
+		this(Collator.getInstance(locale));
+	}
+
+	public int compare(MetaTagged i1, MetaTagged i2) {
+		MetaInfo m1 = i1.getMetaInfo();
+		MetaInfo m2 = i2.getMetaInfo();
+		return comparator.compare(m1, m2);
+
+	}
+}
diff --git a/src/main/java/org/olat/core/commons/modules/bc/meta/tagged/TitleComparator.java b/src/main/java/org/olat/core/commons/modules/bc/meta/tagged/TitleComparator.java
index 2e78fb2e8ed..f2bac687cba 100644
--- a/src/main/java/org/olat/core/commons/modules/bc/meta/tagged/TitleComparator.java
+++ b/src/main/java/org/olat/core/commons/modules/bc/meta/tagged/TitleComparator.java
@@ -25,31 +25,35 @@ import java.util.Locale;
 
 import org.olat.core.commons.modules.bc.meta.MetaInfo;
 import org.olat.core.commons.modules.bc.meta.MetaTitleComparator;
+import org.olat.core.util.vfs.VFSItem;
 
 /**
- * Compares the title of two meta tagged objects.
+ * Compare the title or the filename
  * 
- * <P>
- * Initial Date: Jul 9, 2009 <br>
- * 
- * @author gwassmann
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
  */
-public class TitleComparator implements Comparator<MetaTagged> {
+public class TitleComparator implements Comparator<VFSItem> {
 	private final Collator collator;
+	private final MetaTitleComparator comparator;
 
 	public TitleComparator(Collator collator) {
 		this.collator = collator;
+		comparator = new MetaTitleComparator(collator);
 	}
 
 	public TitleComparator(Locale locale) {
-		this.collator = Collator.getInstance(locale);
+		this(Collator.getInstance(locale));
 	}
 
-	public int compare(MetaTagged one, MetaTagged two) {
-		MetaInfo that = one.getMetaInfo();
-		MetaInfo other = two.getMetaInfo();
-		// Delegate!
-		MetaTitleComparator comparator = new MetaTitleComparator(collator);
-		return comparator.compare(that, other);
+	public int compare(VFSItem i1, VFSItem i2) {
+		if(i1 instanceof MetaTagged && i2 instanceof MetaTagged) {
+			MetaInfo m1 = ((MetaTagged)i1).getMetaInfo();
+			MetaInfo m2 = ((MetaTagged)i2).getMetaInfo();
+			return comparator.compare(m1, m2);
+		}
+		
+		String t1 = i1.getName();
+		String t2 = i2.getName();
+		return collator.compare(t1, t2);
 	}
 }
diff --git a/src/main/java/org/olat/core/gui/control/generic/folder/OlatRootFolderTreeModel.java b/src/main/java/org/olat/core/gui/control/generic/folder/OlatRootFolderTreeModel.java
index c753cc4f217..b2ff45ad73b 100644
--- a/src/main/java/org/olat/core/gui/control/generic/folder/OlatRootFolderTreeModel.java
+++ b/src/main/java/org/olat/core/gui/control/generic/folder/OlatRootFolderTreeModel.java
@@ -24,14 +24,12 @@
 */
 package org.olat.core.gui.control.generic.folder;
 
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
 
 import org.olat.core.commons.modules.bc.meta.MetaInfo;
 import org.olat.core.commons.modules.bc.meta.MetaInfoFactory;
-import org.olat.core.commons.modules.bc.meta.tagged.MetaTagged;
 import org.olat.core.commons.modules.bc.vfs.OlatRootFolderImpl;
 import org.olat.core.gui.components.tree.GenericTreeModel;
 import org.olat.core.util.StringHelper;
@@ -62,7 +60,7 @@ public class OlatRootFolderTreeModel extends GenericTreeModel {
 	static final long serialVersionUID = 1L;
 
 	private VFSItemFilter filter;
-	private Comparator<MetaTagged> comparator;
+	private Comparator<VFSItem> comparator;
 
 	public OlatRootFolderTreeModel(OlatRootFolderImpl root) {
 		setRootNode(createNode(root));
@@ -79,7 +77,7 @@ public class OlatRootFolderTreeModel extends GenericTreeModel {
 	}
 
 	public OlatRootFolderTreeModel(OlatRootFolderImpl root,
-			VFSItemFilter filter, Comparator<MetaTagged> comparator) {
+			VFSItemFilter filter, Comparator<VFSItem> comparator) {
 		this.filter = filter;
 		this.comparator = comparator;
 		setRootNode(createNode(root));
@@ -94,55 +92,23 @@ public class OlatRootFolderTreeModel extends GenericTreeModel {
 	 * @param root
 	 */
 	protected void makeChildren(OlatRootFolderTreeNode node, OlatRootFolderImpl root) {
-		List<MetaTagged> children = castToMetaTaggables(root.getItems(filter));
+		List<VFSItem> children = root.getItems(filter);
 		if (comparator != null) {
 			Collections.sort(children, comparator);
 		}
-		for (OlatRelPathImpl child : castToRelPathItems(children)) {
+		for (VFSItem child : children) {
 			// create a node for each child and add it
-			OlatRootFolderTreeNode childNode = createNode(child);
-			node.addChild(childNode);
-			if (child instanceof OlatRootFolderImpl) {
-				// add the child's children recursively
-				makeChildren(childNode, (OlatRootFolderImpl) child);
+			if(child instanceof OlatRelPathImpl) {
+				OlatRootFolderTreeNode childNode = createNode((OlatRelPathImpl)child);
+				node.addChild(childNode);
+				if (child instanceof OlatRootFolderImpl) {
+					// add the child's children recursively
+					makeChildren(childNode, (OlatRootFolderImpl) child);
+				}
 			}
 		}
 	}
 
-	/**
-	 * Cast the list of VFSItems to a list of OlatRelPathImpl instances.
-	 * 
-	 * @param items
-	 * @return The OlatRelPathImpl list
-	 */
-	private List<OlatRelPathImpl> castToRelPathItems(List<MetaTagged> items) {
-		List<OlatRelPathImpl> relPathItems = new ArrayList<OlatRelPathImpl>(
-				items.size());
-		for (MetaTagged item : items) {
-			if (item instanceof OlatRelPathImpl) {
-				relPathItems.add((OlatRelPathImpl) item);
-			}
-		}
-		return relPathItems;
-	}
-
-	/**
-	 * Cast the list of VFSItems to a list of OlatRelPathImpl instances.
-	 * 
-	 * @param items
-	 * @return The OlatRelPathImpl list
-	 */
-	private List<MetaTagged> castToMetaTaggables(List<VFSItem> items) {
-		List<MetaTagged> relPathItems = new ArrayList<MetaTagged>(items
-				.size());
-		for (VFSItem item : items) {
-			if (item instanceof MetaTagged) {
-				relPathItems.add((MetaTagged) item);
-			}
-		}
-		return relPathItems;
-	}
-
 	/**
 	 * Create a node out of a relative path vfs item. The user object is set to
 	 * the relative path.
-- 
GitLab