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 2021/09/03 10:41:52 UTC

[isis] branch master updated: ISIS-2774: remove duplicated SequenceComparator

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


The following commit(s) were added to refs/heads/master by this push:
     new 09429c7  ISIS-2774: remove duplicated SequenceComparator
09429c7 is described below

commit 09429c750a00240b1cdb70ea31945e21c0a5a0e6
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri Sep 3 12:41:41 2021 +0200

    ISIS-2774: remove duplicated SequenceComparator
---
 .../annotation/TitleAnnotationFacetFactory.java    | 130 ---------------------
 .../annotation/TitleFacetViaTitleAnnotation.java   |  35 +++---
 .../TitleAnnotationFacetFactoryTest.java           |   1 -
 3 files changed, 22 insertions(+), 144 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/annotation/TitleAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/annotation/TitleAnnotationFacetFactory.java
index 75262e2..30f22be 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/annotation/TitleAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/annotation/TitleAnnotationFacetFactory.java
@@ -19,19 +19,13 @@
 
 package org.apache.isis.core.metamodel.facets.object.title.annotation;
 
-import java.util.Comparator;
-import java.util.List;
-import java.util.stream.Collectors;
-
 import javax.inject.Inject;
 
 import org.apache.isis.applib.annotation.Title;
 import org.apache.isis.commons.collections.Can;
-import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facetapi.MetaModelRefiner;
-import org.apache.isis.core.metamodel.facets.Evaluators;
 import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
 import org.apache.isis.core.metamodel.facets.fallback.FallbackFacetFactory;
 import org.apache.isis.core.metamodel.facets.object.title.TitleFacet;
@@ -39,8 +33,6 @@ import org.apache.isis.core.metamodel.facets.object.title.methods.TitleFacetViaM
 import org.apache.isis.core.metamodel.progmodel.ProgrammingModel;
 import org.apache.isis.core.metamodel.specloader.validator.ValidationFailure;
 
-import lombok.AccessLevel;
-import lombok.Getter;
 import lombok.val;
 
 public class TitleAnnotationFacetFactory
@@ -64,77 +56,6 @@ implements MetaModelRefiner {
         addFacetIfPresent(TitleFacetViaTitleAnnotation.create(cls, facetHolder));
     }
 
-    // static comparator memoization
-    @Getter(lazy = true, value = AccessLevel.PACKAGE)
-    private static final Comparator<Evaluators.Evaluator<Title>> sequenceComparator =
-            new Comparator<Evaluators.Evaluator<Title>>() {
-                final Comparator<String> comparator = new SequenceComparator();
-
-                @Override
-                public int compare(final Evaluators.Evaluator<Title> o1, final Evaluators.Evaluator<Title> o2) {
-                    final Title a1 = o1.getAnnotation();
-                    final Title a2 = o2.getAnnotation();
-                    return comparator.compare(a1.sequence(), a2.sequence());
-                }
-            };
-
-
-    @Deprecated //FIXME[ISI-2774] I believe we have sequence comparators already else where (dewey order)
-    static class SequenceComparator implements Comparator<String> {
-
-        @Override
-        public int compare(final String sequence1, final String sequence2) {
-
-            final List<String> components1 = componentsFor(sequence1);
-            final List<String> components2 = componentsFor(sequence2);
-
-            final int size1 = components1.size();
-            final int size2 = components2.size();
-
-            if (size1 == 0 && size2 == 0) {
-                return 0;
-            }
-
-            // continue to loop until we run out of components.
-            int n = 0;
-            while (true) {
-                final int length = n + 1;
-                // check if run out of components in either side
-                if (size1 < length && size2 >= length) {
-                    return -1; // o1 before o2
-                }
-                if (size2 < length && size1 >= length) {
-                    return +1; // o2 before o1
-                }
-                if (size1 < length && size2 < length) {
-                    // run out of components
-                    return 0;
-                }
-                // we have this component on each side
-                int componentCompare = 0;
-                try {
-                    final Integer c1 = Integer.valueOf(components1.get(n));
-                    final Integer c2 = Integer.valueOf(components2.get(n));
-                    componentCompare = c1.compareTo(c2);
-                } catch (final NumberFormatException nfe) {
-                    // not integers compare as strings
-                    componentCompare = components1.get(n).compareTo(components2.get(n));
-                }
-
-                if (componentCompare != 0) {
-                    return componentCompare;
-                }
-                // this component is the same; lets look at the next
-                n++;
-            }
-        }
-
-        private static List<String> componentsFor(final String sequence) {
-            return _Strings.splitThenStream(sequence, ".").collect(Collectors.toList());
-        }
-    }
-
-
     /**
      * Violation if there is a class that has both a <tt>title()</tt> method
      * and also any declared (non-inherited) method annotated with <tt>@Title</tt>.
@@ -150,10 +71,6 @@ implements MetaModelRefiner {
 
         programmingModel.addVisitingValidatorSkipManagedBeans(objectSpec -> {
 
-//            final var objectSpec = (ObjectSpecificationAbstract)_objectSpec;
-//            final var cls = objectSpec.getCorrespondingClass();
-//            final var introspectionPolicy = objectSpec.getIntrospectionPolicy();
-
             final var titleFacetTopRank =
                 objectSpec
                 .getFacetRanking(TitleFacet.class)
@@ -176,56 +93,9 @@ implements MetaModelRefiner {
                         + "conflicting title facets %s",
                         objectSpec.getFeatureIdentifier().getClassName(),
                         conflictingFeatures.toString());
-
             }
 
-
-
-//
-//            final var titleMethod = MethodFinderUtils.findMethod(
-//                    MethodFinderOptions.objectSupport(introspectionPolicy),
-//                    cls, TITLE_METHOD_NAME, String.class, null);
-//            if (titleMethod == null) {
-//                return;
-//            }
-//
-//            // determine if cls contains an @Title annotated method, not inherited from superclass
-//            final ObjectSpecification superSpec = objectSpec.superclass();
-//            if (superSpec == null) {
-//                return;
-//            }
-//
-//            final var superIntrospectionPolicy = ((ObjectSpecificationAbstract)superSpec).getIntrospectionPolicy();
-//            final var superCls = superSpec.getCorrespondingClass();
-//
-//            //FIXME[ISIS-2774] also count declared fields that are @Title annotated
-//            if (countMethodsWithTitleAnnotation(introspectionPolicy, cls)
-//                    > 1L
-//                    //countMethodsWithTitleAnnotation(superIntrospectionPolicy, superCls)
-//                    ) {
-//                ValidationFailure.raiseFormatted(
-//                        objectSpec,
-//                        "%s: conflict for determining a strategy for retrieval of title for class, "
-//                        + "contains a method '%s' and an annotation '@%s' on a different members",
-//                        objectSpec.getFeatureIdentifier().getClassName(),
-//                        TITLE_METHOD_NAME,
-//                        Title.class.getName());
-//            }
-
         });
     }
 
-//    private static long countMethodsWithTitleAnnotation(
-//            final IntrospectionPolicy introspectionPolicy,
-//            final Class<?> cls) {
-//        return MethodFinderUtils.streamMethodsWithAnnotation(
-//                MethodFinderOptions.objectSupport(introspectionPolicy), cls, Title.class)
-//                // don't count methods that identify as title() methods
-//                .filter(method->
-//                        !
-//                        (method.getName().equals(MethodLiteralConstants.TITLE)
-//                                && method.getParameterCount() == 0))
-//                .count();
-//    }
-
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/annotation/TitleFacetViaTitleAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/annotation/TitleFacetViaTitleAnnotation.java
index 02a3497..6048623 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/annotation/TitleFacetViaTitleAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/annotation/TitleFacetViaTitleAnnotation.java
@@ -20,6 +20,7 @@
 package org.apache.isis.core.metamodel.facets.object.title.annotation;
 
 import java.lang.reflect.Method;
+import java.util.Comparator;
 import java.util.List;
 import java.util.Optional;
 import java.util.function.BiConsumer;
@@ -29,6 +30,7 @@ import org.apache.isis.applib.annotation.Title;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.collections._Lists;
+import org.apache.isis.commons.internal.compare._Comparators;
 import org.apache.isis.commons.internal.functions._Predicates;
 import org.apache.isis.commons.internal.reflection._Reflect.InterfacePolicy;
 import org.apache.isis.commons.internal.reflection._Reflect.TypeHierarchyPolicy;
@@ -40,6 +42,7 @@ import org.apache.isis.core.metamodel.facets.object.title.TitleFacet;
 import org.apache.isis.core.metamodel.facets.object.title.TitleFacetAbstract;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 
+import lombok.AccessLevel;
 import lombok.Getter;
 import lombok.NonNull;
 import lombok.val;
@@ -58,7 +61,7 @@ implements ImperativeFacet {
                 Title.class,
                 TypeHierarchyPolicy.EXCLUDE,
                 InterfacePolicy.INCLUDE)
-                .sorted(TitleAnnotationFacetFactory.getSequenceComparator())
+                .sorted(getSequenceComparator())
                 .map(TitleFacetViaTitleAnnotation.TitleComponent::of)
                 .collect(Can.toCan());
 
@@ -70,7 +73,6 @@ implements ImperativeFacet {
     }
 
     @Getter private final Can<TitleComponent> components;
-
     @Getter(onMethod_ = {@Override}) private final @NonNull Can<Method> methods;
 
     protected TitleFacetViaTitleAnnotation(final Can<TitleComponent> components, final FacetHolder holder) {
@@ -103,17 +105,6 @@ implements ImperativeFacet {
         return title(_Predicates.alwaysFalse(), targetAdapter);
     }
 
-    private String titleOf(final ManagedObject adapter) {
-        if (adapter == null) {
-            return null;
-        }
-        return adapter.titleString();
-    }
-
-    private static String abbreviated(final String str, final int maxLength) {
-        return str.length() < maxLength ? str : str.substring(0, maxLength - 3) + "...";
-    }
-
     @Override
     public String title(
             final Predicate<ManagedObject> skipTitlePartEvaluator,
@@ -173,6 +164,24 @@ implements ImperativeFacet {
 
     // -- HELPER
 
+    // static comparator memoization
+    @Getter(lazy = true, value = AccessLevel.PRIVATE)
+    private static final Comparator<Evaluators.Evaluator<Title>> sequenceComparator =
+        (eval1, eval2) -> _Comparators.deweyOrderCompare(
+                            eval1.getAnnotation().sequence(),
+                            eval2.getAnnotation().sequence());
+
+    private String titleOf(final ManagedObject adapter) {
+        if (adapter == null) {
+            return null;
+        }
+        return adapter.titleString();
+    }
+
+    private static String abbreviated(final String str, final int maxLength) {
+        return str.length() < maxLength ? str : str.substring(0, maxLength - 3) + "...";
+    }
+
     public static class TitleComponent {
 
         public static TitleComponent of(final Evaluators.Evaluator<Title> titleEvaluator) {
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/title/annotation/TitleAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/title/annotation/TitleAnnotationFacetFactoryTest.java
index 64df7e7..905dab7 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/title/annotation/TitleAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/title/annotation/TitleAnnotationFacetFactoryTest.java
@@ -220,7 +220,6 @@ extends AbstractFacetFactoryJUnit4TestCase {
 
     }
 
-    //@Ignore //FIXME[ISI-2774] to re-instate
     @SuppressWarnings("unchecked")
     @Test
     public void titleAnnotatedMethodsSomeOfWhichReturnNulls() throws Exception {