diff --git a/src/main/java/org/olat/core/gui/components/table/DefaultColumnDescriptor.java b/src/main/java/org/olat/core/gui/components/table/DefaultColumnDescriptor.java index 5c66b832bc1544bdd2456b9ac310342dca47de32..a4d005cc075af7c3caa3bf6fcf220b14a5925945 100644 --- a/src/main/java/org/olat/core/gui/components/table/DefaultColumnDescriptor.java +++ b/src/main/java/org/olat/core/gui/components/table/DefaultColumnDescriptor.java @@ -157,32 +157,39 @@ public class DefaultColumnDescriptor implements ColumnDescriptor { } else if (a instanceof Comparable && b instanceof Comparable) { return compareComparablesAndTimestamps(a, b); } else if (a instanceof Boolean && b instanceof Boolean) { // faster than string compare - return compareBooleansHandlingNulls(a, b); + return compareBooleans((Boolean)a, (Boolean)b); } else { // don't know how to compare, use the String value return a.toString().compareTo(b.toString()); } } + + protected int compareString(final String a, final String b) { + return collator.compare(a, b); + } - private int compareBooleansHandlingNulls(final Object a, final Object b) { - boolean ba = ((Boolean)a).booleanValue(); - boolean bb = ((Boolean)b).booleanValue(); + protected int compareBooleans(final Boolean a, final Boolean b) { + boolean ba = a.booleanValue(); + boolean bb = b.booleanValue(); return ba? (bb? 0: -1):(bb? 1: 0); } - private int compareComparablesAndTimestamps(final Object a, final Object b) { + protected int compareComparablesAndTimestamps(final Object a, final Object b) { // grmpf, we need to check on timestamp since Timestamp cannot compare dates (ClassCastException) // See also http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5103041 for the java 1.4/1.5 code bug - if (a instanceof Timestamp) { // a timestamp (a) cannot compare a date (b), but vice versa is ok. + if (a instanceof Timestamp && b instanceof Date) { // a timestamp (a) cannot compare a date (b), but vice versa is ok. Timestamp ta = (Timestamp)a; - Date aAsDate = new Date(ta.getTime()); // nanos get lost here, but milis should be enough in most cases, TODO:fj:c better solution here - return ((Comparable)aAsDate).compareTo(b); - //TODO:fj:a see also the todo in AuditInterceptor.java! - }else{ + Date aAsDate = new Date(ta.getTime()); + return aAsDate.compareTo((Date)b); + } else if (a instanceof Date && b instanceof Timestamp) { + Timestamp tb = (Timestamp)b; + Date bAsDate = new Date(tb.getTime()); + return ((Date)a).compareTo(bAsDate); + } else { return ((Comparable)a).compareTo(b); } } - private int compareNullObjects(final Object a, final Object b) { + protected int compareNullObjects(final Object a, final Object b) { boolean ba = (a == null); boolean bb = (b == null); return ba? (bb? 0: -1):(bb? 1: 0); diff --git a/src/main/java/org/olat/repository/RepositoryTableModel.java b/src/main/java/org/olat/repository/RepositoryTableModel.java index a4623f0e2c4f9b1abb943ad268ff4bc8af96aa12..ae41bea840f85543edcdde94df5446d93ce4a3db 100644 --- a/src/main/java/org/olat/repository/RepositoryTableModel.java +++ b/src/main/java/org/olat/repository/RepositoryTableModel.java @@ -98,7 +98,33 @@ public class RepositoryTableModel extends DefaultTableDataModel<RepositoryEntry> translator.getLocale(), ColumnDescriptor.ALIGNMENT_LEFT, acRenderer)); tableCtr.addColumnDescriptor(new RepositoryEntryTypeColumnDescriptor("table.header.typeimg", 1, null, translator.getLocale(), ColumnDescriptor.ALIGNMENT_LEFT)); - tableCtr.addColumnDescriptor(new DefaultColumnDescriptor("table.header.displayname", 2, enableDirectLaunch ? TABLE_ACTION_SELECT_ENTRY : null, translator.getLocale())); + + ColumnDescriptor nameColDesc = new DefaultColumnDescriptor("table.header.displayname", 2, enableDirectLaunch ? TABLE_ACTION_SELECT_ENTRY : null, translator.getLocale()) { + @Override + public int compareTo(int rowa, int rowb) { + Object o1 =table.getTableDataModel().getValueAt(rowa, 1); + Object o2 = table.getTableDataModel().getValueAt(rowb, 1); + + if(o1 == null || !(o1 instanceof RepositoryEntry)) return -1; + if(o2 == null || !(o2 instanceof RepositoryEntry)) return 1; + RepositoryEntry re1 = (RepositoryEntry)o1; + RepositoryEntry re2 = (RepositoryEntry)o2; + boolean c1 = RepositoryManager.getInstance().createRepositoryEntryStatus(re1.getStatusCode()).isClosed(); + boolean c2 = RepositoryManager.getInstance().createRepositoryEntryStatus(re2.getStatusCode()).isClosed(); + int result = (c2 == c1 ? 0 : (c1 ? 1 : -1));//same as Boolean compare + if(result == 0) { + Object a = table.getTableDataModel().getValueAt(rowa, dataColumn); + Object b = table.getTableDataModel().getValueAt(rowb, dataColumn); + if(a == null || !(a instanceof String)) return -1; + if(b == null || !(b instanceof String)) return 1; + String s1 = (String)a; + String s2 = (String)b; + result = compareString(s1, s2); + } + return result; + } + }; + tableCtr.addColumnDescriptor(nameColDesc); tableCtr.addColumnDescriptor(new DefaultColumnDescriptor("table.header.author", 3, null, translator.getLocale())); tableCtr.addColumnDescriptor(new DefaultColumnDescriptor("table.header.access", 4, null, translator.getLocale())); tableCtr.addColumnDescriptor(false, new DefaultColumnDescriptor("table.header.date", 5, null, translator.getLocale()));