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/01/23 20:32:12 UTC

[isis] branch master updated: ISIS-2492: use assoc. streams with inheritance support where applicable

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 7f96045  ISIS-2492: use assoc. streams with inheritance support where applicable
7f96045 is described below

commit 7f960458914d4b8c1153c74b46944e0492deee08
Author: Andi Huber <ah...@apache.org>
AuthorDate: Sat Jan 23 21:31:56 2021 +0100

    ISIS-2492: use assoc. streams with inheritance support where applicable
---
 .../BookmarkPolicyFacetFallbackFactory.java        |  3 ---
 .../DomainServiceFacetAnnotationFactory.java       |  6 ++----
 .../create/ObjectCreator_builtinHandlers.java      |  2 +-
 .../services/grid/GridSystemServiceAbstract.java   | 14 ++-----------
 .../core/metamodel/spec/feature/ObjectAction.java  |  2 +-
 .../spec/feature/ObjectAssociationContainer.java   |  8 --------
 .../specimpl/dflt/ObjectSpecificationDefault.java  |  1 -
 .../core/metamodel/util/snapshot/XmlSnapshot.java  |  4 ++--
 .../command/CommandExecutorServiceDefault.java     | 15 +++-----------
 .../changetracking/EntityChangeTrackerDefault.java |  7 +------
 .../integration/metamodel/JdoPropertyUtils.java    |  2 +-
 ...DerivedFromJdoColumnAnnotationFacetFactory.java |  6 +-----
 ...ndatoryFromJdoColumnAnnotationFacetFactory.java |  2 +-
 ...DerivedFromJdoColumnAnnotationFacetFactory.java |  2 +-
 .../excel/applib/dom/util/ExcelConverter.java      | 23 +++++++++++-----------
 .../domainobjects/DomainObjectReprRenderer.java    |  2 +-
 .../domaintypes/DomainTypeReprRenderer.java        |  7 +++----
 .../rendering/service/swagger/internal/Util.java   |  6 ++----
 .../resources/DomainTypeResourceServerside.java    |  4 ++--
 .../resources/ObjectAdapterUpdateHelper.java       | 22 ++++++++++-----------
 .../wicket/model/models/BookmarkTreeNode.java      |  9 ++++-----
 .../CollectionContentsAsAjaxTablePanel.java        |  2 +-
 .../CollectionContentsSortableDataProvider.java    |  2 +-
 .../summary/CollectionContentsAsSummary.java       |  2 +-
 .../CollectionContentsAsSummaryFactory.java        |  2 +-
 .../components/entity/fieldset/PropertyGroup.java  |  2 +-
 26 files changed, 55 insertions(+), 102 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/bookmarkpolicy/bookmarkable/BookmarkPolicyFacetFallbackFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/bookmarkpolicy/bookmarkable/BookmarkPolicyFacetFallbackFactory.java
index 8232480..bf646ff 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/bookmarkpolicy/bookmarkable/BookmarkPolicyFacetFallbackFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/bookmarkpolicy/bookmarkable/BookmarkPolicyFacetFallbackFactory.java
@@ -19,8 +19,6 @@
 
 package org.apache.isis.core.metamodel.facets.object.bookmarkpolicy.bookmarkable;
 
-import java.util.stream.Stream;
-
 import org.apache.isis.applib.annotation.BookmarkPolicy;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facetapi.MetaModelRefiner;
@@ -30,7 +28,6 @@ import org.apache.isis.core.metamodel.facets.object.bookmarkpolicy.BookmarkPolic
 import org.apache.isis.core.metamodel.facets.object.bookmarkpolicy.BookmarkPolicyFacetFallback;
 import org.apache.isis.core.metamodel.progmodel.ProgrammingModel;
 import org.apache.isis.core.metamodel.spec.feature.MixedIn;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 
 public class BookmarkPolicyFacetFallbackFactory extends FacetFactoryAbstract
 implements MetaModelRefiner {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotationFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotationFactory.java
index 120ef9e..de15e67 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotationFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotationFactory.java
@@ -20,7 +20,6 @@ package org.apache.isis.core.metamodel.facets.object.domainservice.annotation;
 
 
 import java.util.stream.Collectors;
-import java.util.stream.Stream;
 
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
@@ -92,9 +91,8 @@ implements MetaModelRefiner {
                         return;
                     }
 
-                    final Stream<ObjectAssociation> associations = thisSpec.streamDeclaredAssociations(MixedIn.EXCLUDED);
-
-                    final String associationNames = associations
+                    final String associationNames = thisSpec
+                            .streamAssociations(MixedIn.EXCLUDED)
                             .map(ObjectAssociation::getName)
                             // it's okay to have an "association" called "Id" (corresponding to getId() method)
                             .filter(associationName->!"Id".equalsIgnoreCase(associationName))
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/create/ObjectCreator_builtinHandlers.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/create/ObjectCreator_builtinHandlers.java
index 5814ddc..ea2cd0d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/create/ObjectCreator_builtinHandlers.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/create/ObjectCreator_builtinHandlers.java
@@ -100,7 +100,7 @@ final class ObjectCreator_builtinHandlers {
         private ManagedObject initializePropertiesAndDoCallback(ManagedObject adapter) {
 
             // initialize new object
-            adapter.getSpecification().streamDeclaredAssociations(MixedIn.EXCLUDED)
+            adapter.getSpecification().streamAssociations(MixedIn.EXCLUDED)
             .forEach(field->field.toDefault(adapter));
 
              val pojo = adapter.getPojo();
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridSystemServiceAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridSystemServiceAbstract.java
index da4eda7..21dc89f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridSystemServiceAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridSystemServiceAbstract.java
@@ -38,7 +38,6 @@ import org.apache.isis.applib.services.grid.GridSystemService;
 import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.applib.services.jaxb.JaxbService;
 import org.apache.isis.applib.services.message.MessageService;
-import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.commons.internal.collections._Sets;
 import org.apache.isis.core.config.environment.IsisSystemEnvironment;
 import org.apache.isis.core.metamodel.facetapi.Facet;
@@ -79,7 +78,6 @@ import org.apache.isis.core.metamodel.facets.properties.propertylayout.Unchangin
 import org.apache.isis.core.metamodel.layout.LayoutFacetUtil.MetamodelToGridOverridingVisitor;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.MixedIn;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
 import org.apache.isis.core.metamodel.spec.feature.ObjectMember;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
@@ -325,19 +323,11 @@ implements GridSystemService<G> {
     }
 
     protected static Stream<OneToOneAssociation> getOneToOneAssociations(final ObjectSpecification objectSpec) {
-        @SuppressWarnings("rawtypes")
-        Stream associations = objectSpec
-        .streamDeclaredAssociations(MixedIn.INCLUDED)
-        .filter(ObjectAssociation.Predicates.PROPERTIES);
-        return _Casts.uncheckedCast(associations);
+        return objectSpec.streamProperties(MixedIn.INCLUDED);
     }
 
     protected static Stream<OneToManyAssociation> getOneToManyAssociations(final ObjectSpecification objectSpec) {
-        @SuppressWarnings("rawtypes")
-        Stream associations = objectSpec
-        .streamDeclaredAssociations(MixedIn.INCLUDED)
-        .filter(ObjectAssociation.Predicates.COLLECTIONS);
-        return _Casts.uncheckedCast(associations);
+        return objectSpec.streamCollections(MixedIn.INCLUDED);
     }
 
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java
index 550322d..38bcdb0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java
@@ -595,7 +595,7 @@ public interface ObjectAction extends ObjectMember {
 
             final Set<String> associationNamesAndIds = _Sets.newHashSet(); 
 
-            adapterSpec.streamDeclaredAssociations(MixedIn.INCLUDED)
+            adapterSpec.streamAssociations(MixedIn.INCLUDED)
             .forEach(ass->{
                 associationNamesAndIds.add(_Strings.lower(ass.getName()));
                 associationNamesAndIds.add(_Strings.lower(ass.getId()));
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociationContainer.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociationContainer.java
index a6c8112..35ecef8 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociationContainer.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociationContainer.java
@@ -35,11 +35,9 @@ public interface ObjectAssociationContainer {
      * 
      * @implSpec If not found on the current 'type' search for the 'nearest' match in super-types, 
      * and if nothing found there, search the interfaces.  
-     * TODO make sure callers don't instead want the non recursive variant
      */
     Optional<ObjectAssociation> getAssociation(String id);
     
-    // TODO make sure callers don't instead want the non recursive variant
     default ObjectAssociation getAssociationElseFail(String id) {
         return getAssociation(id)
                 .orElseThrow(()->_Exceptions.noSuchElement("id=%s", id));
@@ -53,7 +51,6 @@ public interface ObjectAssociationContainer {
      *
      * Throw a {@link ObjectSpecificationException} if no such association
      * exists.
-     * TODO make sure callers don't instead want the recursive variant
      */
     Optional<ObjectAssociation> getDeclaredAssociation(String id);
     
@@ -65,9 +62,6 @@ public interface ObjectAssociationContainer {
      * 
      * @implSpec Walk through the type hierarchy nearest to farthest and add any ObjectAssociation to the stream, 
      * except don't add ObjectAssociations that already have been added (due to inheritance).
-     * 
-     * TODO make sure callers don't instead want the non-recursive variant
-     * 
      */
     Stream<ObjectAssociation> streamAssociations(MixedIn contributed);
     
@@ -75,7 +69,6 @@ public interface ObjectAssociationContainer {
     /**
      * All {@link ObjectAssociation association}s that represent
      * {@link OneToOneAssociation properties}.
-     * TODO make sure callers don't instead want the non recursive variant
      */
     default Stream<OneToOneAssociation> streamProperties(MixedIn contributed) {
         return streamAssociations(contributed)
@@ -86,7 +79,6 @@ public interface ObjectAssociationContainer {
     /**
      * All {@link ObjectAssociation association}s that represents
      * {@link OneToManyAssociation collections}.
-     * TODO make sure callers don't instead want the non recursive variant
      */
     default Stream<OneToManyAssociation> streamCollections(MixedIn contributed){
         return streamAssociations(contributed)
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
index fe02cab..09e7624 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
@@ -35,7 +35,6 @@ import org.apache.isis.commons.internal.collections._Maps;
 import org.apache.isis.core.metamodel.commons.StringExtensions;
 import org.apache.isis.core.metamodel.commons.ToString;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
-import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.FacetedMethod;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/util/snapshot/XmlSnapshot.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/util/snapshot/XmlSnapshot.java
index 9f7b12f..c3bd5ee 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/util/snapshot/XmlSnapshot.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/util/snapshot/XmlSnapshot.java
@@ -484,7 +484,7 @@ public class XmlSnapshot implements Snapshot {
 
         if (field instanceof OneToOneAssociation) {
 
-            if (field.getSpecification().streamDeclaredAssociations(MixedIn.INCLUDED).limit(1).count() == 0L) {
+            if (field.getSpecification().streamAssociations(MixedIn.INCLUDED).limit(1).count() == 0L) {
                 if (log.isDebugEnabled()) {
                     log.debug("includeField(Pl, Vec, Str): field is value; done");
                 }
@@ -653,7 +653,7 @@ public class XmlSnapshot implements Snapshot {
 
         isisMetaModel.setAttributesForClass(element, oidAsString(adapter).toString());
 
-        final List<ObjectAssociation> fields = nos.streamDeclaredAssociations(MixedIn.INCLUDED)
+        final List<ObjectAssociation> fields = nos.streamAssociations(MixedIn.INCLUDED)
                 .collect(Collectors.toList());
         if (log.isDebugEnabled()) {
             log.debug("objectToElement(NO): processing fields");
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/command/CommandExecutorServiceDefault.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/command/CommandExecutorServiceDefault.java
index 16ebd95..2e58fe5 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/command/CommandExecutorServiceDefault.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/command/CommandExecutorServiceDefault.java
@@ -20,7 +20,6 @@ package org.apache.isis.core.runtimeservices.command;
 
 import java.sql.Timestamp;
 import java.util.List;
-import java.util.Objects;
 import java.util.Optional;
 import java.util.regex.Pattern;
 import java.util.stream.Stream;
@@ -63,7 +62,6 @@ import org.apache.isis.core.metamodel.objectmanager.load.ObjectLoader;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ManagedObjects;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.feature.MixedIn;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
@@ -354,17 +352,10 @@ public class CommandExecutorServiceDefault implements CommandExecutorService {
             final ObjectSpecification specification,
             final String localPropertyId) {
 
-        final Stream<ObjectAssociation> associations = specification.streamDeclaredAssociations(MixedIn.INCLUDED);
-
-        return associations
-                .filter(association->
-                            Objects.equals(association.getId(), localPropertyId) &&
-                            association instanceof OneToOneAssociation
-                        )
-                .findAny()
-                .map(association->(OneToOneAssociation) association)
+        return specification.getAssociation(localPropertyId)
+                .filter(ObjectAssociation::isOneToOneAssociation)
+                .map(OneToOneAssociation.class::cast)
                 .orElse(null);
-
     }
 
     private Can<ManagedObject> argAdaptersFor(final ActionDto actionDto) {
diff --git a/core/transaction/src/main/java/org/apache/isis/core/transaction/changetracking/EntityChangeTrackerDefault.java b/core/transaction/src/main/java/org/apache/isis/core/transaction/changetracking/EntityChangeTrackerDefault.java
index e2561b3..fdf4fbd 100644
--- a/core/transaction/src/main/java/org/apache/isis/core/transaction/changetracking/EntityChangeTrackerDefault.java
+++ b/core/transaction/src/main/java/org/apache/isis/core/transaction/changetracking/EntityChangeTrackerDefault.java
@@ -68,8 +68,6 @@ import org.apache.isis.core.metamodel.facets.object.publish.entitychange.EntityC
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ManagedObjects.EntityUtil;
 import org.apache.isis.core.metamodel.spec.feature.MixedIn;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.isis.core.transaction.changetracking.events.IsisTransactionPlaceholder;
 import org.apache.isis.core.transaction.events.TransactionBeforeCompletionEvent;
 
@@ -267,10 +265,7 @@ implements
 
         log.debug("enlist entity's property changes for auditing {}", entity);
 
-        entity.getSpecification()
-        .streamDeclaredAssociations(MixedIn.EXCLUDED)
-        .filter(ObjectAssociation.Predicates.PROPERTIES)
-        .map(OneToOneAssociation.class::cast)
+        entity.getSpecification().streamProperties(MixedIn.EXCLUDED)
         .filter(property->!property.isNotPersisted())
         .map(property->AdapterAndProperty.of(entity, property))
         .filter(aap->!enlistedEntityPropertiesForAuditing.containsKey(aap)) // already enlisted, so ignore
diff --git a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/metamodel/JdoPropertyUtils.java b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/metamodel/JdoPropertyUtils.java
index 5b11732..7045f72 100644
--- a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/metamodel/JdoPropertyUtils.java
+++ b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/metamodel/JdoPropertyUtils.java
@@ -63,7 +63,7 @@ public final class JdoPropertyUtils {
 
 
         final List<ObjectAssociation> propertyList = objSpec
-                .streamDeclaredAssociations(MixedIn.EXCLUDED)
+                .streamAssociations(MixedIn.EXCLUDED)
                 .filter(predicate)
                 .limit(2)
                 .collect(Collectors.toList());
diff --git a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/BigDecimalDerivedFromJdoColumnAnnotationFacetFactory.java b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/BigDecimalDerivedFromJdoColumnAnnotationFacetFactory.java
index 7f80434..3065680 100644
--- a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/BigDecimalDerivedFromJdoColumnAnnotationFacetFactory.java
+++ b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/BigDecimalDerivedFromJdoColumnAnnotationFacetFactory.java
@@ -19,7 +19,6 @@
 package org.apache.isis.persistence.jdo.metamodel.facets.prop.column;
 
 import java.math.BigDecimal;
-import java.util.stream.Stream;
 
 import javax.jdo.annotations.Column;
 import javax.jdo.annotations.IdentityType;
@@ -124,10 +123,7 @@ implements MetaModelRefiner {
                     return;
                 }
 
-                final Stream<ObjectAssociation> associations = objectSpec.streamDeclaredAssociations(MixedIn.EXCLUDED)
-                        .filter(ObjectAssociation.Predicates.PROPERTIES);
-
-                associations
+                objectSpec.streamProperties(MixedIn.EXCLUDED)
                 // skip checks if annotated with JDO @NotPersistent
                 .filter(association->!association.containsNonFallbackFacet(JdoNotPersistentFacet.class))
                 .forEach(association->{
diff --git a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/MandatoryFromJdoColumnAnnotationFacetFactory.java b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/MandatoryFromJdoColumnAnnotationFacetFactory.java
index a1aae29..c811a9a 100644
--- a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/MandatoryFromJdoColumnAnnotationFacetFactory.java
+++ b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/MandatoryFromJdoColumnAnnotationFacetFactory.java
@@ -142,7 +142,7 @@ implements MetaModelRefiner {
                 }
 
                 final Stream<ObjectAssociation> associations = objectSpec
-                        .streamDeclaredAssociations(MixedIn.EXCLUDED)
+                        .streamAssociations(MixedIn.EXCLUDED)
                         .filter(ObjectAssociation.Predicates.PROPERTIES);
 
                 associations
diff --git a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/MaxLengthDerivedFromJdoColumnAnnotationFacetFactory.java b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/MaxLengthDerivedFromJdoColumnAnnotationFacetFactory.java
index 6a00d34..85a9a5e 100644
--- a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/MaxLengthDerivedFromJdoColumnAnnotationFacetFactory.java
+++ b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/MaxLengthDerivedFromJdoColumnAnnotationFacetFactory.java
@@ -114,7 +114,7 @@ implements MetaModelRefiner {
                 }
 
                 final Stream<ObjectAssociation> associations = objectSpec
-                        .streamDeclaredAssociations(MixedIn.EXCLUDED)
+                        .streamAssociations(MixedIn.EXCLUDED)
                         .filter(ObjectAssociation.Predicates.PROPERTIES);
 
                 associations.forEach(association->{
diff --git a/subdomains/excel/applib/src/main/java/org/apache/isis/subdomains/excel/applib/dom/util/ExcelConverter.java b/subdomains/excel/applib/src/main/java/org/apache/isis/subdomains/excel/applib/dom/util/ExcelConverter.java
index 0dde58f..89412d7 100644
--- a/subdomains/excel/applib/src/main/java/org/apache/isis/subdomains/excel/applib/dom/util/ExcelConverter.java
+++ b/subdomains/excel/applib/src/main/java/org/apache/isis/subdomains/excel/applib/dom/util/ExcelConverter.java
@@ -32,7 +32,6 @@ import java.util.Set;
 import java.util.UUID;
 import java.util.function.Predicate;
 import java.util.stream.Collectors;
-import java.util.stream.Stream;
 
 import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
 import org.apache.poi.ss.usermodel.Cell;
@@ -156,7 +155,7 @@ class ExcelConverter {
 
         final List<ManagedObject> adapters = domainObjects.stream().map(objectManager::adapt).collect(Collectors.toList());
 
-        final List<ObjectAssociation> propertyList = objectSpec.streamDeclaredAssociations(MixedIn.INCLUDED)
+        final List<ObjectAssociation> propertyList = objectSpec.streamAssociations(MixedIn.INCLUDED)
                                                         .filter(VISIBLE_PROPERTIES)
                                                         .collect(Collectors.toList());
 
@@ -248,7 +247,7 @@ class ExcelConverter {
 
         final ObjectSpecification objectSpec = specificationLoader.loadSpecification(factory.getCls());
 
-        final List<ObjectAssociation> propertyList = objectSpec.streamDeclaredAssociations(MixedIn.INCLUDED)
+        final List<ObjectAssociation> propertyList = objectSpec.streamAssociations(MixedIn.INCLUDED)
                 .filter(VISIBLE_PROPERTIES)
                 .collect(Collectors.toList());
 
@@ -543,15 +542,15 @@ class ExcelConverter {
         throw new IllegalArgumentException(String.format("Could not locate sheet named any of: '%s'", sheetNames));
     }
 
-    private static OneToOneAssociation getAssociation(final ObjectSpecification objectSpec, final String propertyNameOrId) {
-        final Stream<ObjectAssociation> associations = objectSpec.streamDeclaredAssociations(MixedIn.INCLUDED);
-        return associations
-                .filter(OneToOneAssociation.class::isInstance)
-                .map(OneToOneAssociation.class::cast)
-                .filter(association -> propertyNameOrId.equalsIgnoreCase(association.getName())
-                                    || propertyNameOrId.equalsIgnoreCase(association.getId()))
-                .findFirst()
-                .orElse(null);
+    private static OneToOneAssociation getAssociation(
+            final ObjectSpecification objectSpec, 
+            final String propertyNameOrId) {
+        
+        return objectSpec.streamProperties(MixedIn.INCLUDED)
+        .filter(association -> propertyNameOrId.equalsIgnoreCase(association.getName())
+                            || propertyNameOrId.equalsIgnoreCase(association.getId()))
+        .findFirst()
+        .orElse(null);
     }
 
     @ToString(of = {"name", "type", "currentValue"})
diff --git a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainObjectReprRenderer.java b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainObjectReprRenderer.java
index f071cd7..35504c1 100644
--- a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainObjectReprRenderer.java
+++ b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainObjectReprRenderer.java
@@ -290,7 +290,7 @@ public class DomainObjectReprRenderer extends ReprRendererAbstract<DomainObjectR
         final JsonRepresentation appendTo =
                 mode.isUpdatePropertiesLinkArgs() ? representation : JsonRepresentation.newMap();
         final List<ObjectAssociation> associations = objectAdapter.getSpecification()
-                .streamDeclaredAssociations(MixedIn.INCLUDED)
+                .streamAssociations(MixedIn.INCLUDED)
                 .collect(Collectors.toList());
 
         addProperties(objectAdapter, appendTo, associations);
diff --git a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domaintypes/DomainTypeReprRenderer.java b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domaintypes/DomainTypeReprRenderer.java
index 051dd14..901ac61 100644
--- a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domaintypes/DomainTypeReprRenderer.java
+++ b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domaintypes/DomainTypeReprRenderer.java
@@ -26,7 +26,6 @@ import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.MixedIn;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
@@ -97,9 +96,9 @@ public class DomainTypeReprRenderer extends ReprRendererAbstract<DomainTypeReprR
     private void addMembers() {
         final JsonRepresentation membersList = JsonRepresentation.newArray();
         representation.mapPut("members", membersList);
-        final Stream<ObjectAssociation> associations = objectSpecification.streamDeclaredAssociations(MixedIn.EXCLUDED);
-
-        associations.forEach(association->{
+        
+        objectSpecification.streamAssociations(MixedIn.EXCLUDED)
+        .forEach(association->{
             if (association.isOneToOneAssociation()) {
                 final OneToOneAssociation property = (OneToOneAssociation) association;
                 final LinkBuilder linkBuilder = PropertyDescriptionReprRenderer.newLinkToBuilder(getResourceContext(), Rel.PROPERTY, objectSpecification, property);
diff --git a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/swagger/internal/Util.java b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/swagger/internal/Util.java
index 45ab194..a91e47d 100644
--- a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/swagger/internal/Util.java
+++ b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/swagger/internal/Util.java
@@ -130,12 +130,10 @@ public final class Util {
             final ObjectSpecification objectSpecification,
             final Predicate<ObjectAssociation> associationPredicate, final SwaggerService.Visibility visibility) {
 
-        final List<ObjectAssociation> list =
-                objectSpecification.streamDeclaredAssociations(MixedIn.INCLUDED)
+        return objectSpecification.streamAssociations(MixedIn.INCLUDED)
                 .filter(associationPredicate.and(associationsWith(visibility)))
+                .map(x->_Casts.<T>uncheckedCast(x))
                 .collect(Collectors.toList());
-
-        return _Casts.uncheckedCast(list);
     }
 
     static List<ObjectAction> actionsOf(
diff --git a/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/DomainTypeResourceServerside.java b/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/DomainTypeResourceServerside.java
index b8569a6..e84c6bf 100644
--- a/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/DomainTypeResourceServerside.java
+++ b/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/DomainTypeResourceServerside.java
@@ -165,7 +165,7 @@ public class DomainTypeResourceServerside extends ResourceAbstract implements Do
             throw RestfulObjectsApplicationException.create(HttpStatusCode.NOT_FOUND);
         }
 
-        val objectMember = parentSpec.getDeclaredAssociation(propertyId)
+        val objectMember = parentSpec.getAssociation(propertyId)
                 .orElseThrow(()->RestfulObjectsApplicationException.create(HttpStatusCode.NOT_FOUND));
         
         if (objectMember.isOneToManyAssociation()) {
@@ -193,7 +193,7 @@ public class DomainTypeResourceServerside extends ResourceAbstract implements Do
             throw RestfulObjectsApplicationException.create(HttpStatusCode.NOT_FOUND);
         }
 
-        val objectMember = parentSpec.getDeclaredAssociation(collectionId)
+        val objectMember = parentSpec.getAssociation(collectionId)
                 .orElseThrow(()->RestfulObjectsApplicationException.create(HttpStatusCode.NOT_FOUND));
         
         if (objectMember.isOneToOneAssociation()) {
diff --git a/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/ObjectAdapterUpdateHelper.java b/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/ObjectAdapterUpdateHelper.java
index 52832a7..b840757 100644
--- a/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/ObjectAdapterUpdateHelper.java
+++ b/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/ObjectAdapterUpdateHelper.java
@@ -18,8 +18,7 @@
  */
 package org.apache.isis.viewer.restfulobjects.viewer.resources;
 
-import java.util.stream.Stream;
-
+import org.apache.isis.commons.internal.base._Refs;
 import org.apache.isis.core.metamodel.consent.Consent;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
@@ -30,6 +29,8 @@ import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
 import org.apache.isis.viewer.restfulobjects.viewer.context.ResourceContext;
 
+import lombok.val;
+
 /**
  * Utility class that encapsulates the logic for updating an
  * {@link ManagedObject}'s with the
@@ -62,17 +63,16 @@ public class ObjectAdapterUpdateHelper {
             final JsonRepresentation propertiesMap,
             final Intent intent) {
 
-        final ObjectSpecification objectSpec = objectAdapter.getSpecification();
-        final Stream<ObjectAssociation> properties = objectSpec.streamDeclaredAssociations(MixedIn.EXCLUDED)
-                .filter(ObjectAssociation.Predicates.PROPERTIES);
-
-        final boolean[] allOk = {true}; // simply a non-thread-safe value reference
-
-        properties.forEach(association->{
-            allOk[0] &= copyOverProperty(association, propertiesMap, intent);
+        val allOk = _Refs.booleanRef(true); // simply a non-thread-safe boolean reference
+        
+        objectAdapter.getSpecification().streamAssociations(MixedIn.EXCLUDED)
+        .filter(ObjectAssociation.Predicates.PROPERTIES) // properties only
+        .forEach(association->{
+            
+            allOk.update(ok->ok &= copyOverProperty(association, propertiesMap, intent));
         });
 
-        return allOk[0];
+        return allOk.isTrue();
     }
 
     private boolean copyOverProperty(
diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/BookmarkTreeNode.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/BookmarkTreeNode.java
index 3d1236e..7dc751c 100644
--- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/BookmarkTreeNode.java
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/BookmarkTreeNode.java
@@ -197,11 +197,10 @@ public class BookmarkTreeNode implements Serializable {
         if(candidateBookmarkableModel instanceof EntityModel) {
             val entityModel = (EntityModel) candidateBookmarkableModel;
             val candidateAdapter = entityModel.getObject();
-            final Stream<ObjectAssociation> properties = candidateAdapter.getSpecification()
-                    .streamDeclaredAssociations(MixedIn.EXCLUDED)
-                    .filter(ObjectAssociation.Predicates.REFERENCE_PROPERTIES);
-
-            properties
+            
+            candidateAdapter.getSpecification()
+            .streamAssociations(MixedIn.EXCLUDED)
+            .filter(ObjectAssociation.Predicates.REFERENCE_PROPERTIES) // properties only
             .map(objectAssoc->{
                 val parentAdapter = 
                         objectAssoc.get(candidateAdapter, InteractionInitiatedBy.USER);
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
index 5efc760..78e4d8e 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
@@ -204,7 +204,7 @@ implements CollectionCountProvider {
                 .and(associationDoesNotReferenceParent(parentSpecIfAny));
 
         final Stream<? extends ObjectAssociation> propertyList = 
-                typeOfSpec.streamDeclaredAssociations(MixedIn.INCLUDED)
+                typeOfSpec.streamAssociations(MixedIn.INCLUDED)
                 .filter(predicate);
 
         final Map<String, ObjectAssociation> propertyById = _Maps.newLinkedHashMap();
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 ac13c06..baa9a90 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
@@ -127,7 +127,7 @@ public class CollectionContentsSortableDataProvider extends SortableDataProvider
         val elementSpec = model.getTypeOfSpecification();
         val sortPropertyId = sort.getProperty();
 
-        return elementSpec.getDeclaredAssociation(sortPropertyId).orElse(null); // eg invalid propertyId
+        return elementSpec.getAssociation(sortPropertyId).orElse(null); // eg invalid propertyId
     }
 
     private Predicate<ManagedObject> ignoreHidden() {
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/summary/CollectionContentsAsSummary.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/summary/CollectionContentsAsSummary.java
index f9843c1..1174470 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/summary/CollectionContentsAsSummary.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/summary/CollectionContentsAsSummary.java
@@ -86,7 +86,7 @@ public class CollectionContentsAsSummary extends PanelAbstract<EntityCollectionM
         addOrReplace(feedback);
 
         final Stream<ObjectAssociation> numberAssociations = elementSpec
-                .streamDeclaredAssociations(MixedIn.EXCLUDED)
+                .streamAssociations(MixedIn.EXCLUDED)
                 .filter(CollectionContentsAsSummaryFactory.OF_TYPE_BIGDECIMAL);
 
         final RepeatingView repeating = new RepeatingView(ID_REPEATING_SUMMARY);
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/summary/CollectionContentsAsSummaryFactory.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/summary/CollectionContentsAsSummaryFactory.java
index 4f8e569..ed85583 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/summary/CollectionContentsAsSummaryFactory.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/summary/CollectionContentsAsSummaryFactory.java
@@ -65,7 +65,7 @@ public class CollectionContentsAsSummaryFactory extends ComponentFactoryAbstract
         }
         final EntityCollectionModel entityCollectionModel = (EntityCollectionModel) model;
         final ObjectSpecification elementSpec = entityCollectionModel.getTypeOfSpecification();
-        final Stream<ObjectAssociation> associations = elementSpec.streamDeclaredAssociations(MixedIn.EXCLUDED);
+        final Stream<ObjectAssociation> associations = elementSpec.streamAssociations(MixedIn.EXCLUDED);
 
         return appliesIf(associations.anyMatch(OF_TYPE_BIGDECIMAL));
     }
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/fieldset/PropertyGroup.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/fieldset/PropertyGroup.java
index f9550cd..9f4ce91 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/fieldset/PropertyGroup.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/fieldset/PropertyGroup.java
@@ -174,7 +174,7 @@ public class PropertyGroup extends PanelAbstract<EntityModel> implements HasDyna
                 .filter(propertyLayoutData -> propertyLayoutData.getMetadataError() == null)
                 .map(propertyLayoutData -> 
                     adapter.getSpecification()
-                    .getDeclaredAssociation(propertyLayoutData.getId())
+                    .getAssociation(propertyLayoutData.getId())
                     .orElse(null)
                 )
                 .filter(_NullSafe::isPresent)