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 2018/09/13 18:38:43 UTC

[isis] 04/04: ISIS-1976: removing guava Function idioms from MM

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

ahuber pushed a commit to branch ISIS-1976-rethink-object-adapters
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 00e9e00de1606ba8b4b7b20a5107d1acb7176680
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Sep 13 20:36:39 2018 +0200

    ISIS-1976: removing guava Function idioms from MM
    
    Task-Url: https://issues.apache.org/jira/browse/ISIS-1976
---
 .../java/org/apache/isis/applib/util/ToString.java |  42 +++++-
 .../isis/core/commons/lang/ClassFunctions.java     |   2 +-
 .../isis/core/commons/lang/ListExtensions.java     |   2 +-
 .../core/metamodel/facets/DomainEventHelper.java   |  15 ++-
 .../ignore/javalang/RemoveMethodsFacetFactory.java |  12 +-
 .../annotation/TitleAnnotationFacetFactory.java    |   4 +-
 .../annotation/TitleFacetViaTitleAnnotation.java   |  11 +-
 .../core/metamodel/facets/value/JodaFunctions.java |   2 +-
 .../value/datejodalocal/JodaLocalDateUtil.java     |   5 +-
 .../datetimejodalocal/JodaLocalDateTimeUtil.java   |   5 +-
 .../core/metamodel/services/ServicesInjector.java  |   8 ++
 .../services/appfeat/ApplicationFeatureId.java     | 143 ++++++++-------------
 .../services/swagger/internal/Generation.java      |   9 +-
 .../swagger/internal/ValuePropertyFactory.java     |  21 ++-
 .../spec/feature/ObjectActionParameter.java        |  18 +--
 .../metamodel/specloader/SpecificationLoader.java  |  22 +---
 .../MetaModelValidatorToCheckModuleExtent.java     |  24 ++--
 .../TitleFacetViaTitleAnnotationTest.java          |   7 +-
 .../services/appfeat/ApplicationFeatureIdTest.java |   3 +-
 .../IsisComponentProvider.java                     |   3 +-
 20 files changed, 175 insertions(+), 183 deletions(-)

diff --git a/core/applib/src/main/java/org/apache/isis/applib/util/ToString.java b/core/applib/src/main/java/org/apache/isis/applib/util/ToString.java
index 418d8f8..ce1a9fa 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/util/ToString.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/util/ToString.java
@@ -16,7 +16,7 @@
  */
 package org.apache.isis.applib.util;
 
-import java.util.Iterator;
+import java.util.BitSet;
 import java.util.List;
 import java.util.Objects;
 import java.util.function.Function;
@@ -36,13 +36,21 @@ public class ToString<T> {
     public static <T> ToString<T> toString(String name, Function<? super T, ?> getter) {
         Objects.requireNonNull(name);
         Objects.requireNonNull(getter);
-        return new ToString<>(name, getter);
+        return new ToString<>(name, getter, false);
+    }
+    
+    public static <T> ToString<T> toStringOmmitIfAbsent(String name, Function<? super T, ?> getter) {
+        Objects.requireNonNull(name);
+        Objects.requireNonNull(getter);
+        return new ToString<>(name, getter, true);
     }
 
     private final List<String> names = _Lists.newArrayList();
     private final List<Function<? super T, ?>> getters = _Lists.newArrayList();
+    private final BitSet ommitIfAbsent = new BitSet();
 
-    private ToString(String name, Function<? super T, ?> getter) {
+    private ToString(String name, Function<? super T, ?> getter, boolean ommitIfAbsent) {
+        addBit(ommitIfAbsent);
         names.add(name);
         getters.add(getter);
     }
@@ -50,6 +58,16 @@ public class ToString<T> {
     public ToString<T> thenToString(String name, Function<? super T, ?> getter){
         Objects.requireNonNull(name);
         Objects.requireNonNull(getter);
+        addBit(false);
+        names.add(name);
+        getters.add(getter);
+        return this;
+    }
+    
+    public ToString<T> thenToStringOmmitIfAbsent(String name, Function<? super T, ?> getter){
+        Objects.requireNonNull(name);
+        Objects.requireNonNull(getter);
+        addBit(true);
         names.add(name);
         getters.add(getter);
         return this;
@@ -71,19 +89,33 @@ public class ToString<T> {
 
         Objects.requireNonNull(valueToStringFunction);
 
-        final Iterator<String> nameIterator = names.iterator();
+        final int[] index = {-1}; // value reference
 
         return String.format("%s{%s}",
 
+                //ommitIfAbsent.toString(),
                 target.getClass().getSimpleName(),
 
                 getters.stream()
+                .peek(__->index[0]++)
                 .map(getter->getter.apply(target))
+                .filter(value->value!=null || !ommitIfAbsent.get(index[0]))
                 .map(valueToStringFunction)
-                .map(valueLiteral->nameIterator.next()+"="+valueLiteral)
+                .map(valueLiteral->names.get(index[0])+"="+valueLiteral)
                 .collect(Collectors.joining(", "))
 
                 );
     }
+    
+    // -- HELPER
+    
+    private void addBit(boolean bit) {
+        final int index = names.size();
+        if(bit) {
+            ommitIfAbsent.set(index);
+        } else {
+            ommitIfAbsent.clear(index);
+        }
+    }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/commons/lang/ClassFunctions.java b/core/metamodel/src/main/java/org/apache/isis/core/commons/lang/ClassFunctions.java
index 1b3148d..eedf06d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/commons/lang/ClassFunctions.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/commons/lang/ClassFunctions.java
@@ -20,7 +20,7 @@ package org.apache.isis.core.commons.lang;
 
 import javax.annotation.Nullable;
 
-import com.google.common.base.Function;
+import java.util.function.Function;
 
 public final class ClassFunctions {
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/commons/lang/ListExtensions.java b/core/metamodel/src/main/java/org/apache/isis/core/commons/lang/ListExtensions.java
index 8c34ed7..1957741 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/commons/lang/ListExtensions.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/commons/lang/ListExtensions.java
@@ -101,7 +101,7 @@ public final class ListExtensions {
     public static <T> Collection<T> filtered(final List<Object> extendee, final Class<T> type) {
         return Collections2.transform(
                 Collections2.filter(extendee, ClassPredicates.isOfType(type)::test),
-                ClassFunctions.castTo(type));
+                ClassFunctions.castTo(type)::apply);
     }
 
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/DomainEventHelper.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/DomainEventHelper.java
index 61c6bf5..4581989 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/DomainEventHelper.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/DomainEventHelper.java
@@ -24,6 +24,7 @@ import java.lang.reflect.InvocationTargetException;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
@@ -88,8 +89,18 @@ public class DomainEventHelper {
                     event.setActionSemantics(objectAction.getSemantics());
 
                     final List<ObjectActionParameter> parameters = objectAction.getParameters();
-                    event.setParameterNames(immutableList(Iterables.transform(parameters, ObjectActionParameter.Functions.GET_NAME)));
-                    event.setParameterTypes(immutableList(Iterables.transform(parameters, ObjectActionParameter.Functions.GET_TYPE)));
+                    
+                    final List<String> parameterNames = parameters.stream()
+                            .map(ObjectActionParameter.Functions.GET_NAME)
+                            .collect(Collectors.toList());
+
+                    final List<Class<?>> parameterTypes = parameters.stream()
+                            .map(ObjectActionParameter.Functions.GET_TYPE)
+                            .collect(Collectors.toList());
+                    
+                    
+                    event.setParameterNames(Collections.unmodifiableList(parameterNames));
+                    event.setParameterTypes(Collections.unmodifiableList(parameterTypes));
                 }
             }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/ignore/javalang/RemoveMethodsFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/ignore/javalang/RemoveMethodsFacetFactory.java
index 6378b72..eb9287a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/ignore/javalang/RemoveMethodsFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/ignore/javalang/RemoveMethodsFacetFactory.java
@@ -22,6 +22,7 @@ package org.apache.isis.core.metamodel.facets.object.ignore.javalang;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
 import java.util.List;
+import java.util.stream.Stream;
 
 import com.google.common.collect.Lists;
 
@@ -94,18 +95,17 @@ public class RemoveMethodsFacetFactory extends FacetFactoryAbstract {
 
         }
 
-        final List<Class<?>> serviceClasses = getSpecificationLoader().allServiceClasses();
-        for (Class<? extends Object> serviceClass : serviceClasses) {
-
-            // removeInjectMethods(processClassContext);
+        getSpecificationLoader().streamServiceClasses()
+        .forEach(serviceClass->{
+         // removeInjectMethods(processClassContext);
             Method[] methods2 = processClassContext.getCls().getMethods();
             for (Method method : methods2) {
                 if(injectorMethodEvaluator.isInjectorMethodFor(method, serviceClass)) {
                     processClassContext.removeMethod(method);
                 }
             }
-        }
-
+        });
+        
 
         removeSuperclassMethods(processClassContext.getCls(), processClassContext);
 
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 9e6ae7f..21c0259 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
@@ -28,6 +28,7 @@ import com.google.common.base.Splitter;
 import com.google.common.collect.Lists;
 
 import org.apache.isis.applib.annotation.Title;
+import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -69,7 +70,8 @@ public class TitleAnnotationFacetFactory extends FacetFactoryAbstract implements
         }
 
         sort(evaluators);
-        final List<TitleFacetViaTitleAnnotation.TitleComponent> titleComponents = Lists.transform(evaluators, TitleFacetViaTitleAnnotation.TitleComponent.FROM_EVALUATORS);
+        final List<TitleFacetViaTitleAnnotation.TitleComponent> titleComponents = 
+                _Lists.transform(evaluators, TitleFacetViaTitleAnnotation.TitleComponent.FROM_EVALUATORS);
         FacetUtil.addFacet(new TitleFacetViaTitleAnnotation(titleComponents, facetHolder, adapterProvider));
     }
 
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 7efd7e8..ae4e5d9 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,8 +20,8 @@
 package org.apache.isis.core.metamodel.facets.object.title.annotation;
 
 import java.util.List;
+import java.util.function.Function;
 
-import com.google.common.base.Function;
 import com.google.common.base.Objects;
 import com.google.common.base.Strings;
 
@@ -42,13 +42,8 @@ public class TitleFacetViaTitleAnnotation extends TitleFacetAbstract {
     private final ObjectAdapterProvider adapterProvider;
 
     public static class TitleComponent {
-        public static final Function<? super Annotations.Evaluator<Title>, ? extends TitleComponent> FROM_EVALUATORS = new Function<Annotations.Evaluator<Title>, TitleComponent>() {
-            @Override
-            public TitleComponent apply(final Annotations.Evaluator<Title> titleEvaluator) {
-                return TitleComponent.of(titleEvaluator);
-            }
-        };
-
+        public static final Function<Annotations.Evaluator<Title>, TitleComponent> FROM_EVALUATORS = 
+            titleEvaluator -> TitleComponent.of(titleEvaluator);
 
         private final String prepend;
         private final String append;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/JodaFunctions.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/JodaFunctions.java
index c6e0869..62b5002 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/JodaFunctions.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/JodaFunctions.java
@@ -21,7 +21,7 @@ package org.apache.isis.core.metamodel.facets.value;
 
 import java.util.Locale;
 
-import com.google.common.base.Function;
+import java.util.function.Function;
 
 import org.joda.time.format.DateTimeFormatter;
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datejodalocal/JodaLocalDateUtil.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datejodalocal/JodaLocalDateUtil.java
index 84ee785..e8dad69 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datejodalocal/JodaLocalDateUtil.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datejodalocal/JodaLocalDateUtil.java
@@ -23,11 +23,10 @@ import java.util.List;
 import java.util.Locale;
 import java.util.StringTokenizer;
 
-import com.google.common.collect.Iterables;
-
 import org.joda.time.LocalDate;
 import org.joda.time.format.DateTimeFormatter;
 
+import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.core.metamodel.facets.object.parseable.TextEntryParseException;
 import org.apache.isis.core.metamodel.facets.value.JodaFunctions;
 
@@ -40,7 +39,7 @@ public final class JodaLocalDateUtil  {
             List<DateTimeFormatter> parseFormatters) {
         final Locale locale = Locale.getDefault();
 
-        Iterable<DateTimeFormatter> elements = Iterables.transform(parseFormatters, JodaFunctions.withLocale(locale));
+        Iterable<DateTimeFormatter> elements = _Lists.transform(parseFormatters, JodaFunctions.withLocale(locale));
         LocalDate parsedDate = parseDate(dateStr, elements);
         return parsedDate;
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datetimejodalocal/JodaLocalDateTimeUtil.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datetimejodalocal/JodaLocalDateTimeUtil.java
index f6d6400..633807e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datetimejodalocal/JodaLocalDateTimeUtil.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datetimejodalocal/JodaLocalDateTimeUtil.java
@@ -23,11 +23,10 @@ import java.util.List;
 import java.util.Locale;
 import java.util.StringTokenizer;
 
-import com.google.common.collect.Iterables;
-
 import org.joda.time.LocalDateTime;
 import org.joda.time.format.DateTimeFormatter;
 
+import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.core.metamodel.facets.object.parseable.TextEntryParseException;
 import org.apache.isis.core.metamodel.facets.value.JodaFunctions;
 
@@ -40,7 +39,7 @@ public final class JodaLocalDateTimeUtil  {
             List<DateTimeFormatter> parseFormatters) {
         final Locale locale = Locale.getDefault();
 
-        Iterable<DateTimeFormatter> elements = Iterables.transform(parseFormatters, JodaFunctions.withLocale(locale));
+        Iterable<DateTimeFormatter> elements = _Lists.transform(parseFormatters, JodaFunctions.withLocale(locale));
         return parseDateTime(dateStr, elements);
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjector.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjector.java
index 444211e..bac0712 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjector.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjector.java
@@ -215,6 +215,14 @@ public class ServicesInjector implements ApplicationScopedComponent {
     }
     
     /**
+     * @return Stream of all currently registered service types.
+     */
+    public Stream<Class<?>> streamRegisteredServiceTypes() {
+        return serviceByConcreteType.get().keySet().stream();
+    }
+    
+    
+    /**
      * @return Stream of all currently registered service instances.
      */
     public Stream<Object> streamRegisteredServiceInstances() {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureId.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureId.java
index 5ef0bb0..2304b55 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureId.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureId.java
@@ -18,30 +18,33 @@
  */
 package org.apache.isis.core.metamodel.services.appfeat;
 
+import static java.util.Comparator.comparing;
+import static java.util.Comparator.naturalOrder;
+import static java.util.Comparator.nullsFirst;
+
 import java.io.Serializable;
 import java.nio.charset.Charset;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.Iterator;
 import java.util.List;
-
-import javax.annotation.Nullable;
-
-import com.google.common.base.Joiner;
-import com.google.common.base.Objects;
-
 import java.util.function.Function;
 import java.util.function.Predicate;
+
+import com.google.common.base.Joiner;
 import com.google.common.base.Splitter;
 import com.google.common.base.Strings;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Ordering;
 import com.google.common.io.BaseEncoding;
 
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.annotation.Value;
 import org.apache.isis.applib.services.appfeat.ApplicationMemberType;
+import org.apache.isis.applib.util.Equality;
+import org.apache.isis.applib.util.Hashing;
+import org.apache.isis.applib.util.ObjectContracts;
 import org.apache.isis.applib.util.TitleBuffer;
+import org.apache.isis.applib.util.ToString;
+import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 
 /**
@@ -58,6 +61,8 @@ public class ApplicationFeatureId implements Comparable<ApplicationFeatureId>, S
 
     // //////////////////////////////////////
 
+    private static final long serialVersionUID = 1L;
+
     // -- factory methods
     public static ApplicationFeatureId newFeature(final ApplicationFeatureType featureType, final String fullyQualifiedName) {
         switch (featureType) {
@@ -278,7 +283,7 @@ public class ApplicationFeatureId implements Comparable<ApplicationFeatureId>, S
             }
 
             final Iterable<String> split = Splitter.on(".").split(packageName);
-            final List<String> parts = Lists.newArrayList(split); // eg [aaa,bbb,ccc]
+            final List<String> parts = _Lists.newArrayList(split); // eg [aaa,bbb,ccc]
             parts.remove(parts.size()-1); // remove last, eg [aaa,bbb]
 
             final String parentPackageName = Joiner.on(".").join(parts); // eg aaa.bbb
@@ -388,6 +393,7 @@ public class ApplicationFeatureId implements Comparable<ApplicationFeatureId>, S
         }
 
         static class ApplicationFeatureIdComparator implements Comparator<ApplicationFeatureId>, Serializable {
+            private static final long serialVersionUID = 1L;
 
             @Override
             public int compare(final ApplicationFeatureId o1, final ApplicationFeatureId o2) {
@@ -416,7 +422,7 @@ public class ApplicationFeatureId implements Comparable<ApplicationFeatureId>, S
     }
 
     private static List<ApplicationFeatureId> pathIds(final ApplicationFeatureId id) {
-        final List<ApplicationFeatureId> featureIds = Lists.newArrayList();
+        final List<ApplicationFeatureId> featureIds = _Lists.newArrayList();
         return Collections.unmodifiableList(appendParents(id, featureIds));
     }
 
@@ -433,101 +439,58 @@ public class ApplicationFeatureId implements Comparable<ApplicationFeatureId>, S
 
     // -- equals, hashCode, compareTo, toString
 
-    private final static Ordering<ApplicationFeatureId> byType = Ordering.natural()
-            .nullsFirst().onResultOf(new com.google.common.base.Function<ApplicationFeatureId, ApplicationFeatureType>() {
-                @Nullable @Override public ApplicationFeatureType apply(@Nullable final ApplicationFeatureId input) {
-                    return input != null ? input.getType() : null;
-                }
-            });
-    private final static Ordering<ApplicationFeatureId> byPackageName = Ordering.natural()
-            .nullsFirst().onResultOf(new com.google.common.base.Function<ApplicationFeatureId, String>() {
-                @Nullable @Override public String apply(@Nullable final ApplicationFeatureId input) {
-                    return input != null ? input.getPackageName() : null;
-                }
-            });
-    private final static Ordering<ApplicationFeatureId> byClassName = Ordering.natural()
-            .nullsFirst().onResultOf(new com.google.common.base.Function<ApplicationFeatureId, String>() {
-                @Nullable @Override public String apply(@Nullable final ApplicationFeatureId input) {
-                    return input != null ? input.getClassName(): null;
-                }
-            });
-    private final static Ordering<ApplicationFeatureId> byMemberName = Ordering.natural()
-            .nullsFirst().onResultOf(new com.google.common.base.Function<ApplicationFeatureId, String>() {
-                @Nullable @Override public String apply(@Nullable final ApplicationFeatureId input) {
-                    return input != null ? input.getMemberName() : null;
-                }
-            });
-    private final static Ordering<ApplicationFeatureId> applicationFeatureIdOrdering =
-            byType
-            .compound(byPackageName)
-            .compound(byClassName)
-            .compound(byMemberName)
-            .nullsFirst();
-
-
+    private final static Comparator<ApplicationFeatureId> byType =
+            comparing(ApplicationFeatureId::getType, nullsFirst(naturalOrder()));
+    private final static Comparator<ApplicationFeatureId> byPackageName =
+            comparing(ApplicationFeatureId::getPackageName, nullsFirst(naturalOrder()));
+    private final static Comparator<ApplicationFeatureId> byClassName =
+            comparing(ApplicationFeatureId::getClassName, nullsFirst(naturalOrder()));
+    private final static Comparator<ApplicationFeatureId> byMemberName =
+            comparing(ApplicationFeatureId::getMemberName, nullsFirst(naturalOrder()));
+    
+    private final static Comparator<ApplicationFeatureId> applicationFeatureIdOrdering =
+            Comparator.nullsFirst(byType)
+            .thenComparing(byPackageName)
+            .thenComparing(byClassName)
+            .thenComparing(byMemberName);
+
+    private final static Equality<ApplicationFeatureId> equality =
+            ObjectContracts.checkEquals(ApplicationFeatureId::getType)
+            .thenCheckEquals(ApplicationFeatureId::getPackageName)
+            .thenCheckEquals(ApplicationFeatureId::getClassName)
+            .thenCheckEquals(ApplicationFeatureId::getMemberName);
+
+     private final static Hashing<ApplicationFeatureId> hashing =
+            ObjectContracts.hashing(ApplicationFeatureId::getType)
+            .thenHashing(ApplicationFeatureId::getPackageName)
+            .thenHashing(ApplicationFeatureId::getClassName)
+            .thenHashing(ApplicationFeatureId::getMemberName);
+
+     private final static ToString<ApplicationFeatureId> toString =
+            ObjectContracts.toString("type", ApplicationFeatureId::getType)
+            .thenToString("packageName", ApplicationFeatureId::getPackageName)
+            .thenToStringOmmitIfAbsent("className", ApplicationFeatureId::getClassName)
+            .thenToStringOmmitIfAbsent("memberName", ApplicationFeatureId::getMemberName);
+
+    
     @Override
     public int compareTo(final ApplicationFeatureId other) {
-
-        // https://issues.apache.org/jira/browse/ISIS-1590
-        // not using our ObjectContracts helper for efficiency.
-
         return applicationFeatureIdOrdering.compare(this, other);
     }
 
     @Override
     public boolean equals(final Object o) {
-
-        // https://issues.apache.org/jira/browse/ISIS-1590
-        // not using our ObjectContracts helper for efficiency.
-
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-
-        final ApplicationFeatureId that = (ApplicationFeatureId) o;
-
-        if (className != null ? !className.equals(that.className) : that.className != null) return false;
-        if (memberName != null ? !memberName.equals(that.memberName) : that.memberName != null) return false;
-        if (packageName != null ? !packageName.equals(that.packageName) : that.packageName != null) return false;
-        return type == that.type;
+        return equality.equals(this, o);
     }
 
     @Override
     public int hashCode() {
-
-        // https://issues.apache.org/jira/browse/ISIS-1590
-        // not using our ObjectContracts helper for efficiency.
-
-        int result = type != null ? type.hashCode() : 0;
-        result = 31 * result + (packageName != null ? packageName.hashCode() : 0);
-        result = 31 * result + (className != null ? className.hashCode() : 0);
-        result = 31 * result + (memberName != null ? memberName.hashCode() : 0);
-        return result;
+        return hashing.hashCode(this);
     }
 
     @Override
     public String toString() {
-
-        // https://issues.apache.org/jira/browse/ISIS-1590
-        // not using our ObjectContracts helper for efficiency.
-
-        final Objects.ToStringHelper stringHelper = Objects.toStringHelper(this);
-        switch (type) {
-        case PACKAGE:
-            stringHelper.add("type", getType());
-            stringHelper.add("packageName", getPackageName());
-            return stringHelper.toString();
-        case CLASS:
-            stringHelper.add("type", getType());
-            stringHelper.add("packageName", getPackageName());
-            stringHelper.add("className", getClassName());
-            return stringHelper.toString();
-        case MEMBER:
-            stringHelper.add("type", getType());
-            stringHelper.add("packageName", getPackageName());
-            stringHelper.add("memberName", getMemberName());
-            return stringHelper.toString();
-        }
-        throw new IllegalStateException("Unknown feature type " + type);
+        return toString.toString(this);
     }
 
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/swagger/internal/Generation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/swagger/internal/Generation.java
index c68f0c3..7a93ed9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/swagger/internal/Generation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/swagger/internal/Generation.java
@@ -27,7 +27,7 @@ import java.util.stream.Collectors;
 
 import javax.annotation.Nullable;
 
-import com.google.common.base.Function;
+import java.util.function.Function;
 import com.google.common.base.Joiner;
 import com.google.common.base.Strings;
 import com.google.common.collect.FluentIterable;
@@ -177,11 +177,8 @@ class Generation {
     @SuppressWarnings("unused")
     private void debugAllLoadedClasses(final Collection<ObjectSpecification> allSpecs) {
         final ImmutableList<String> specs = FluentIterable.from(allSpecs)
-                .transform(new Function<ObjectSpecification, String>() {
-                    @Nullable @Override public String apply(@Nullable final ObjectSpecification objectSpecification) {
-                        return objectSpecification.getCorrespondingClass().getName();
-                    }
-                })
+                .transform((final ObjectSpecification objectSpecification)->
+                        objectSpecification.getCorrespondingClass().getName())
                 .toSortedList(Ordering.natural());
         final String all = Joiner.on(",").join(specs);
         System.out.println(all);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/swagger/internal/ValuePropertyFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/swagger/internal/ValuePropertyFactory.java
index 5537ef0..26909f3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/swagger/internal/ValuePropertyFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/swagger/internal/ValuePropertyFactory.java
@@ -25,20 +25,21 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.UUID;
+import java.util.function.Function;
 import java.util.function.Supplier;
 
 import javax.annotation.Nullable;
 
-import org.apache.isis.commons.internal.context._Plugin;
-import org.apache.isis.core.metamodel.services.swagger.internal.ValuePropertyPlugin.ValuePropertyCollector;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+
 import org.joda.time.DateTime;
 import org.joda.time.LocalDate;
 import org.joda.time.LocalDateTime;
 
-import com.google.common.base.Function;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
+import org.apache.isis.commons.internal.collections._Lists;
+import org.apache.isis.commons.internal.context._Plugin;
+import org.apache.isis.core.metamodel.services.swagger.internal.ValuePropertyPlugin.ValuePropertyCollector;
 
 import io.swagger.models.properties.BooleanProperty;
 import io.swagger.models.properties.ByteArrayProperty;
@@ -121,12 +122,8 @@ public class ValuePropertyFactory {
             final StringProperty property = new StringProperty();
             final Object[] enumConstants = cls.getEnumConstants();
 
-            final List<String> enumNames = Lists.newArrayList(
-                    Iterables.transform(Arrays.asList(enumConstants), new Function<Object, String>() {
-                        @Nullable @Override public String apply(@Nullable final Object input) {
-                            return ((Enum<?>)input).name();
-                        }
-                    }));
+            final List<String> enumNames = _Lists.transform(
+                    Arrays.asList(enumConstants), input->((Enum<?>)input).name());
             property.setEnum(enumNames);
             return property;
         }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionParameter.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionParameter.java
index d137cd0..103ac37 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionParameter.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionParameter.java
@@ -27,7 +27,7 @@ import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
 import org.apache.isis.core.metamodel.interactions.ActionArgValidityContext;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 
-import com.google.common.base.Function;
+import java.util.function.Function;
 import java.util.function.Predicate;
 
 /**
@@ -130,16 +130,12 @@ public interface ObjectActionParameter extends ObjectFeature, CurrentHolder {
 
 
     public static class Functions {
-        public static final Function<ObjectActionParameter, String> GET_NAME = new Function<ObjectActionParameter, String>() {
-            @Override public String apply(final ObjectActionParameter input) {
-                return input.getName();
-            }
-        };
-        public static final Function<ObjectActionParameter, Class<?>> GET_TYPE = new Function<ObjectActionParameter, Class<?>>() {
-            @Override public Class<?> apply(final ObjectActionParameter input) {
-                return input.getSpecification().getCorrespondingClass();
-            }
-        };
+        public static final Function<ObjectActionParameter, String> GET_NAME =
+                ObjectActionParameter::getName;
+        
+        public static final Function<ObjectActionParameter, Class<?>> GET_TYPE = 
+                (final ObjectActionParameter input) ->
+                    input.getSpecification().getCorrespondingClass();
 
         private Functions(){}
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java
index a8d2cda..c2a9cce 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java
@@ -17,12 +17,11 @@
 package org.apache.isis.core.metamodel.specloader;
 
 import java.util.Collection;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.stream.Stream;
 
-import com.google.common.base.Function;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 
@@ -147,12 +146,13 @@ public class SpecificationLoader implements ApplicationScopedComponent {
     }
 
     private void loadSpecificationsForServices() {
-        for (final Class<?> serviceClass : allServiceClasses()) {
+        streamServiceClasses()
+        .forEach(serviceClass->{
             final DomainService domainService = serviceClass.getAnnotation(DomainService.class);
             final NatureOfService nature = domainService != null ? domainService.nature() : NatureOfService.DOMAIN;
             // will 'markAsService'
-            internalLoadSpecification(serviceClass, nature);
-        }
+            internalLoadSpecification(serviceClass, nature); 
+        });
     }
 
     private void loadSpecificationsForMixins() {
@@ -474,16 +474,8 @@ public class SpecificationLoader implements ApplicationScopedComponent {
     // -- getServiceClasses, isServiceClass
 
     @Programmatic
-    public List<Class<?>> allServiceClasses() {
-        List<Class<?>> serviceClasses = Lists
-                .transform(this.servicesInjector.getRegisteredServices(), new Function<Object, Class<?>>(){
-                    @Override
-                    public Class<?> apply(Object o) {
-                        return o.getClass();
-                    }
-                });
-        // take a copy, to allow eg I18nFacetFactory to add in default implementations of missing services.
-        return Collections.unmodifiableList(Lists.newArrayList(serviceClasses));
+    public Stream<Class<?>> streamServiceClasses() {
+        return servicesInjector.streamRegisteredServiceTypes();
     }
 
     @Programmatic
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/validator/MetaModelValidatorToCheckModuleExtent.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/validator/MetaModelValidatorToCheckModuleExtent.java
index dab5ff6..962412b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/validator/MetaModelValidatorToCheckModuleExtent.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/validator/MetaModelValidatorToCheckModuleExtent.java
@@ -18,11 +18,15 @@
  */
 package org.apache.isis.core.metamodel.specloader.validator;
 
+import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
-import com.google.common.base.Function;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
 import com.google.common.base.Joiner;
 import com.google.common.collect.FluentIterable;
 import com.google.common.collect.ImmutableList;
@@ -111,7 +115,7 @@ public class MetaModelValidatorToCheckModuleExtent extends MetaModelValidatorCom
                     return;
                 }
 
-                ImmutableList<String> modulePackageNames = modulePackageNamesFrom(appManifest);
+                final Set<String> modulePackageNames = modulePackageNamesFrom(appManifest);
 
                 final Set<String> domainObjectPackageNames = domainObjectClassNamesByPackage.keySet();
                 for (final String pkg : domainObjectPackageNames) {
@@ -127,18 +131,14 @@ public class MetaModelValidatorToCheckModuleExtent extends MetaModelValidatorCom
                 }
             }
 
-            private ImmutableList<String> modulePackageNamesFrom(final AppManifest appManifest) {
-                List<Class<?>> modules = appManifest.getModules();
-                return FluentIterable.from(modules)
-                        .transform(new Function<Class<?>, String>() {
-                            @Override
-                            public String apply(final Class<?> aClass) {
-                                return aClass.getPackage().getName();
-                            }
-                        }).toList();
+            private Set<String> modulePackageNamesFrom(final AppManifest appManifest) {
+                final List<Class<?>> modules = appManifest.getModules();
+                return modules.stream()
+                        .map(aClass->aClass.getPackage().getName())
+                        .collect(Collectors.toCollection(HashSet::new));
             }
 
-            private boolean isWithinSomeModule(final ImmutableList<String> modulePackageNames, final String pkg) {
+            private boolean isWithinSomeModule(final Set<String> modulePackageNames, final String pkg) {
                 for (final String modulePackageName : modulePackageNames) {
                     if(pkg.startsWith(modulePackageName)) {
                         return true;
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/title/annotation/TitleFacetViaTitleAnnotationTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/title/annotation/TitleFacetViaTitleAnnotationTest.java
index c00a0e7..5a80443 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/title/annotation/TitleFacetViaTitleAnnotationTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/title/annotation/TitleFacetViaTitleAnnotationTest.java
@@ -24,8 +24,6 @@ import static org.junit.Assert.assertThat;
 
 import java.util.List;
 
-import com.google.common.collect.Lists;
-
 import org.jmock.Expectations;
 import org.jmock.Sequence;
 import org.jmock.auto.Mock;
@@ -33,6 +31,7 @@ import org.junit.Rule;
 import org.junit.Test;
 
 import org.apache.isis.applib.annotation.Title;
+import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -92,7 +91,7 @@ public class TitleFacetViaTitleAnnotationTest {
 
         TitleAnnotationFacetFactory.sort(evaluatorList);
 
-        final List<TitleComponent> components = Lists.transform(evaluatorList, TitleComponent.FROM_EVALUATORS);
+        final List<TitleComponent> components = _Lists.transform(evaluatorList, TitleComponent.FROM_EVALUATORS);
         final TitleFacetViaTitleAnnotation facet = new TitleFacetViaTitleAnnotation(components, mockFacetHolder, mockAdapterManager);
         final NormalDomainObject normalPojo = new NormalDomainObject();
         final Sequence sequence = context.sequence("in-title-element-order");
@@ -122,7 +121,7 @@ public class TitleFacetViaTitleAnnotationTest {
         final List<Annotations.Evaluator<Title>> evaluators = Annotations
                 .getEvaluators(DomainObjectWithProblemInItsAnnotatedTitleMethod.class, Title.class);
 
-        final List<TitleComponent> components = Lists.transform(evaluators, TitleComponent.FROM_EVALUATORS);
+        final List<TitleComponent> components = _Lists.transform(evaluators, TitleComponent.FROM_EVALUATORS);
         final TitleFacetViaTitleAnnotation facet = new TitleFacetViaTitleAnnotation(components, mockFacetHolder, mockAdapterManager);
         final DomainObjectWithProblemInItsAnnotatedTitleMethod screwedPojo = new DomainObjectWithProblemInItsAnnotatedTitleMethod();
         context.checking(new Expectations() {
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureIdTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureIdTest.java
index 2ce01bf..3eacc44 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureIdTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureIdTest.java
@@ -464,7 +464,8 @@ public class ApplicationFeatureIdTest {
         public void members() throws Exception {
             feature1 = ApplicationFeatureId.newMember("com.mycompany.Bar#b");
 
-            assertThat(feature1.toString(), is(equalTo("ApplicationFeatureId{type=MEMBER, packageName=com.mycompany, memberName=b}")));
+            assertThat(feature1.toString(), is(equalTo("ApplicationFeatureId{type=MEMBER, "
+                    + "packageName=com.mycompany, className=Bar, memberName=b}")));
         }
 
         @Test
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProvider.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProvider.java
index f0c172c..41c5c40 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProvider.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProvider.java
@@ -32,6 +32,7 @@ import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.Mixin;
 import org.apache.isis.applib.annotation.Nature;
 import org.apache.isis.applib.fixturescripts.FixtureScript;
+import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.commons.config.IsisConfigurationDefault;
 import org.apache.isis.core.commons.factory.InstanceUtil;
@@ -232,7 +233,7 @@ public abstract class IsisComponentProvider {
                     "If an appManifest is provided then it must return a non-empty set of modules");
         }
 
-        return Iterables.transform(modules, ClassFunctions.packageNameOf());
+        return _Lists.transform(modules, ClassFunctions.packageNameOf());
     }
 
     protected String classNamesFrom(final List<?> objectsOrClasses) {