You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2020/01/30 12:00:00 UTC

[isis] 02/04: ISIS-2158: move sorting logic to ManagedObject (for possible reuse)

This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 5a2f0b13724048d84ad19ceca1e727f7695daae5
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Jan 30 12:23:51 2020 +0100

    ISIS-2158: move sorting logic to ManagedObject (for possible reuse)
---
 .../isis/core/metamodel/spec/ManagedObject.java    | 44 ++++++++++++++++++++++
 .../CollectionContentsSortableDataProvider.java    | 37 +-----------------
 2 files changed, 45 insertions(+), 36 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObject.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObject.java
index 3610570..9b9bdbf 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObject.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObject.java
@@ -22,6 +22,7 @@ package org.apache.isis.core.metamodel.spec;
 import java.lang.reflect.Method;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.List;
 import java.util.Set;
 import java.util.function.Function;
@@ -34,6 +35,7 @@ import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.domain.DomainObjectList;
 import org.apache.isis.applib.services.repository.EntityState;
 import org.apache.isis.core.commons.collections.Can;
+import org.apache.isis.core.commons.internal.base._NullSafe;
 import org.apache.isis.core.commons.internal.base._Tuples.Indexed;
 import org.apache.isis.core.commons.internal.collections._Arrays;
 import org.apache.isis.core.commons.internal.collections._Lists;
@@ -52,6 +54,7 @@ import org.apache.isis.core.metamodel.interactions.ObjectVisibilityContext;
 import org.apache.isis.core.metamodel.interactions.VisibilityContext;
 import org.apache.isis.core.metamodel.objectmanager.create.ObjectCreator;
 import org.apache.isis.core.metamodel.objectmanager.load.ObjectLoader;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoaderDefault;
 
@@ -356,6 +359,47 @@ public interface ManagedObject {
         return adapter.getPojo()==null;
     }
 
+    // -- COMPARE UTILITIES
+    
+    @NoArgsConstructor(access = AccessLevel.PRIVATE)
+    static final class CompareUtil {
+
+        public static int compare(@Nullable ManagedObject p, @Nullable ManagedObject q) {
+            return NATURAL_NULL_FIRST.compare(p, q);
+        }
+        
+        public static Comparator<ManagedObject> orderingBy(ObjectAssociation sortProperty, boolean ascending) {
+            
+            final Comparator<ManagedObject> comparator = ascending 
+                    ? NATURAL_NULL_FIRST 
+                            : NATURAL_NULL_FIRST.reversed();
+            
+            return (p, q) -> {
+                    val pSort = sortProperty.get(p, InteractionInitiatedBy.FRAMEWORK);
+                    val qSort = sortProperty.get(q, InteractionInitiatedBy.FRAMEWORK);
+                    return comparator.compare(pSort, qSort);
+            };
+            
+        }
+        
+        // -- PREDEFINED COMPARATOR
+        
+        private static final Comparator<ManagedObject> NATURAL_NULL_FIRST = new Comparator<ManagedObject>(){
+            @SuppressWarnings({ "unchecked", "rawtypes" })
+            @Override
+            public int compare(@Nullable ManagedObject p, @Nullable ManagedObject q) {
+                val pPojo = ManagedObject.unwrapSingle(p);
+                val qPojo = ManagedObject.unwrapSingle(q);
+                if(!(pPojo instanceof Comparable) || !(qPojo instanceof Comparable)) {
+                    return 0;
+                }
+                return _NullSafe.compareNullsFirst((Comparable)pPojo, (Comparable)qPojo);
+            }
+            
+        };
+        
+    }
+    
     // -- VISIBILITY UTILITIES
 
     @NoArgsConstructor(access = AccessLevel.PRIVATE)
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsSortableDataProvider.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsSortableDataProvider.java
index 5fb8758..950ad22 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsSortableDataProvider.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsSortableDataProvider.java
@@ -20,7 +20,6 @@
 package org.apache.isis.viewer.wicket.ui.components.collectioncontents.ajaxtable;
 
 import java.util.Collections;
-import java.util.Comparator;
 import java.util.Iterator;
 import java.util.List;
 import java.util.function.Predicate;
@@ -31,7 +30,6 @@ import org.apache.wicket.extensions.markup.html.repeater.util.SortableDataProvid
 import org.apache.wicket.model.IModel;
 
 import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.core.commons.internal.base._NullSafe;
 import org.apache.isis.core.commons.internal.collections._Lists;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.consent.InteractionResult;
@@ -115,7 +113,7 @@ public class CollectionContentsSortableDataProvider extends SortableDataProvider
         
         final ObjectAssociation sortProperty = lookupAssociationFor(sort);
         if(sortProperty != null) {
-            Collections.sort(copy, orderingBy(sortProperty, sort.isAscending()));
+            Collections.sort(copy, ManagedObject.CompareUtil.orderingBy(sortProperty, sort.isAscending()));
         }
         
         return copy;
@@ -158,38 +156,5 @@ public class CollectionContentsSortableDataProvider extends SortableDataProvider
                 Where.ALL_TABLES);
     }
 
-    private static Comparator<ManagedObject> orderingBy(
-            ObjectAssociation sortProperty, 
-            boolean ascending) {
-        
-        return new Comparator<ManagedObject>(){
-
-            @Override
-            public int compare(ManagedObject p, ManagedObject q) {
-                val pSort = sortProperty.get(p, InteractionInitiatedBy.FRAMEWORK);
-                val qSort = sortProperty.get(q, InteractionInitiatedBy.FRAMEWORK);
-                
-                return (ascending ? NATURAL_NULL_FIRST : NATURAL_NULL_FIRST.reversed())
-                        .compare(pSort, qSort);
-            }
-        };
-        
-    }
-
-    private static final Comparator<ManagedObject> NATURAL_NULL_FIRST = new Comparator<ManagedObject>(){
-        @SuppressWarnings({ "unchecked", "rawtypes" })
-        @Override
-        public int compare(ManagedObject p, ManagedObject q) {
-            val pPojo = ManagedObject.unwrapSingle(p);
-            val qPojo = ManagedObject.unwrapSingle(q);
-            if(!(pPojo instanceof Comparable) || !(qPojo instanceof Comparable)) {
-                return 0;
-            }
-            return _NullSafe.compareNullsFirst((Comparable)pPojo, (Comparable)qPojo);
-        }
-        
-    };
-
-
 
 }
\ No newline at end of file