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 2022/07/06 12:06:57 UTC

[isis] branch master updated: ISIS-3060: PostProcessor optimizations

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 471024935b ISIS-3060: PostProcessor optimizations
471024935b is described below

commit 471024935b9dd00bc77ddb42ff95105ea76b0a81
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Jul 6 14:06:48 2022 +0200

    ISIS-3060: PostProcessor optimizations
---
 .../CssClassFaFacetOnMemberPostProcessor.java      |  2 +-
 .../DeriveMixinMembersPostProcessor.java           | 59 ----------------------
 .../ObjectSpecificationPostProcessor.java          | 12 ++++-
 .../ObjectSpecificationPostProcessorAbstract.java  | 34 -------------
 .../all/DescribedAsFromTypePostProcessor.java      |  8 +--
 .../i18n/SynthesizeObjectNamingPostProcessor.java  |  2 +-
 .../all/i18n/TranslationPostProcessor.java         | 11 ++--
 .../authorization/AuthorizationPostProcessor.java  |  8 +--
 .../TweakDomainEventsForMixinPostProcessor.java    |  6 +--
 ...NavigationFacetFromHiddenTypePostProcessor.java |  6 +--
 .../object/ProjectionFacetsPostProcessor.java      |  2 +-
 .../param/ChoicesAndDefaultsPostProcessor.java     |  6 +--
 .../param/TypicalLengthFromTypePostProcessor.java  |  4 +-
 .../DisabledFromImmutablePostProcessor.java        |  4 +-
 .../dflt/ProgrammingModelFacetsJava11.java         |  5 --
 .../specloader/postprocessor/PostProcessor.java    | 54 ++++++++++++++++++--
 .../facets/TenantedAuthorizationPostProcessor.java |  8 +--
 17 files changed, 94 insertions(+), 137 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/annotprop/CssClassFaFacetOnMemberPostProcessor.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/annotprop/CssClassFaFacetOnMemberPostProcessor.java
index 732a029334..2524d0d467 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/annotprop/CssClassFaFacetOnMemberPostProcessor.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/annotprop/CssClassFaFacetOnMemberPostProcessor.java
@@ -38,7 +38,7 @@ extends ObjectSpecificationPostProcessorAbstract {
     }
 
     @Override
-    protected void doPostProcess(final ObjectSpecification objectSpecification, final ObjectAction objectAction) {
+    public void postProcessAction(final ObjectSpecification objectSpecification, final ObjectAction objectAction) {
 
         if(objectAction.isDeclaredOnMixin()) {
             return; // don't process mixin main method, instead process its peer
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/DeriveMixinMembersPostProcessor.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/DeriveMixinMembersPostProcessor.java
deleted file mode 100644
index 42b5ef3571..0000000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/DeriveMixinMembersPostProcessor.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.core.metamodel.postprocessors;
-
-import javax.inject.Inject;
-
-import org.apache.isis.core.metamodel.context.MetaModelContext;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.feature.MixedIn;
-
-import lombok.Getter;
-import lombok.NonNull;
-
-public class DeriveMixinMembersPostProcessor
-implements ObjectSpecificationPostProcessor {
-
-    @Getter(onMethod_ = {@Override})
-    private final @NonNull MetaModelContext metaModelContext;
-
-    @Inject
-    public DeriveMixinMembersPostProcessor(final MetaModelContext metaModelContext) {
-        this.metaModelContext = metaModelContext;
-    }
-
-    @Override
-    public void postProcess(final ObjectSpecification objectSpecification) {
-
-        // calling count on these 3 streams so these are actually consumed,
-        // as a side-effect the meta-model gets (further) populated
-
-        // all the actions of this type
-        objectSpecification.streamRuntimeActions(MixedIn.INCLUDED).count();
-
-        // and all the collections of this type
-        objectSpecification.streamCollections(MixedIn.INCLUDED).count();
-
-        // and all the properties of this type
-        objectSpecification.streamProperties(MixedIn.INCLUDED).count();
-
-    }
-
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/ObjectSpecificationPostProcessor.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/ObjectSpecificationPostProcessor.java
index bc2a3f0011..e7da0fade0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/ObjectSpecificationPostProcessor.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/ObjectSpecificationPostProcessor.java
@@ -20,14 +20,22 @@ package org.apache.isis.core.metamodel.postprocessors;
 
 import org.apache.isis.core.metamodel.context.HasMetaModelContext;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
+import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
+import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
+import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 
 public interface ObjectSpecificationPostProcessor
 extends HasMetaModelContext {
 
-    void postProcess(ObjectSpecification objectSpecification);
-
     default boolean isEnabled() {
         return true;
     }
 
+    default void postProcessObject(final ObjectSpecification objSpec) {};
+    default void postProcessAction(final ObjectSpecification objSpec, final ObjectAction act) {};
+    default void postProcessParameter(final ObjectSpecification objSpec, final ObjectAction act, final ObjectActionParameter param) {};
+    default void postProcessProperty(final ObjectSpecification objSpec, final OneToOneAssociation prop) {};
+    default void postProcessCollection(final ObjectSpecification objSpec, final OneToManyAssociation coll) {};
+
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/ObjectSpecificationPostProcessorAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/ObjectSpecificationPostProcessorAbstract.java
index 8d4c9c0797..a9bdabc6e0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/ObjectSpecificationPostProcessorAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/ObjectSpecificationPostProcessorAbstract.java
@@ -22,13 +22,8 @@ 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.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.ObjectActionParameter;
 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;
 import org.apache.isis.core.metamodel.specloader.specimpl.ObjectMemberAbstract;
 
 import lombok.Getter;
@@ -46,35 +41,6 @@ implements ObjectSpecificationPostProcessor {
         this.metaModelContext = metaModelContext;
     }
 
-    @Override
-    public final void postProcess(final ObjectSpecification objectSpecification) {
-
-        doPostProcess(objectSpecification);
-
-        objectSpecification.streamRuntimeActions(MixedIn.INCLUDED)
-        .forEach(act -> {
-
-            act.streamParameters()
-                .forEach(param -> doPostProcess(objectSpecification, act, param));
-
-            doPostProcess(objectSpecification, act);
-
-        });
-
-        objectSpecification.streamProperties(MixedIn.INCLUDED)
-        .forEach(prop -> doPostProcess(objectSpecification, prop));
-
-        objectSpecification.streamCollections(MixedIn.INCLUDED)
-        .forEach(coll -> doPostProcess(objectSpecification, coll));
-
-    }
-
-    protected void doPostProcess(final ObjectSpecification objSpec) {};
-    protected void doPostProcess(final ObjectSpecification objSpec, final ObjectAction act) {};
-    protected void doPostProcess(final ObjectSpecification objSpec, final ObjectAction act, final ObjectActionParameter param) {};
-    protected void doPostProcess(final ObjectSpecification objSpec, final OneToOneAssociation prop) {};
-    protected void doPostProcess(final ObjectSpecification objSpec, final OneToManyAssociation coll) {};
-
     /**
      * Use for domain-object-type agnostic facets only!
      * @see Facet#isObjectTypeSpecific()
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/all/DescribedAsFromTypePostProcessor.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/all/DescribedAsFromTypePostProcessor.java
index a27e3764d2..bc620fce4b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/all/DescribedAsFromTypePostProcessor.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/all/DescribedAsFromTypePostProcessor.java
@@ -44,7 +44,7 @@ extends ObjectSpecificationPostProcessorAbstract {
     }
 
     @Override
-    protected void doPostProcess(final ObjectSpecification objectSpecification, final ObjectAction objectAction) {
+    public void postProcessAction(final ObjectSpecification objectSpecification, final ObjectAction objectAction) {
         if(objectAction.containsNonFallbackFacet(MemberDescribedFacet.class)) {
             return;
         }
@@ -58,7 +58,7 @@ extends ObjectSpecificationPostProcessorAbstract {
     }
 
     @Override
-    protected void doPostProcess(final ObjectSpecification objectSpecification, final ObjectAction objectAction, final ObjectActionParameter parameter) {
+    public void postProcessParameter(final ObjectSpecification objectSpecification, final ObjectAction objectAction, final ObjectActionParameter parameter) {
         if(parameter.containsNonFallbackFacet(ParamDescribedFacet.class)) {
             return;
         }
@@ -72,12 +72,12 @@ extends ObjectSpecificationPostProcessorAbstract {
     }
 
     @Override
-    protected void doPostProcess(final ObjectSpecification objectSpecification, final OneToOneAssociation prop) {
+    public void postProcessProperty(final ObjectSpecification objectSpecification, final OneToOneAssociation prop) {
         handle(prop);
     }
 
     @Override
-    protected void doPostProcess(final ObjectSpecification objectSpecification, final OneToManyAssociation coll) {
+    public void postProcessCollection(final ObjectSpecification objectSpecification, final OneToManyAssociation coll) {
         handle(coll);
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/all/i18n/SynthesizeObjectNamingPostProcessor.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/all/i18n/SynthesizeObjectNamingPostProcessor.java
index d1d54efb21..4c3e50a07f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/all/i18n/SynthesizeObjectNamingPostProcessor.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/all/i18n/SynthesizeObjectNamingPostProcessor.java
@@ -43,7 +43,7 @@ extends ObjectSpecificationPostProcessorAbstract {
     }
 
     @Override
-    protected void doPostProcess(final ObjectSpecification objectSpecification) {
+    public void postProcessObject(final ObjectSpecification objectSpecification) {
 
         if(!(objectSpecification.isEntityOrViewModelOrAbstract()
                 || objectSpecification.isInjectable())) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/all/i18n/TranslationPostProcessor.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/all/i18n/TranslationPostProcessor.java
index 7dd4e61d53..4739a1412e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/all/i18n/TranslationPostProcessor.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/all/i18n/TranslationPostProcessor.java
@@ -54,7 +54,7 @@ extends ObjectSpecificationPostProcessorAbstract {
     }
 
     @Override
-    protected void doPostProcess(final ObjectSpecification objectSpec) {
+    public void postProcessObject(final ObjectSpecification objectSpec) {
         memoizeTranslations(
                 Stream.of(
                         objectSpec.lookupFacet(ObjectNamedFacet.class),
@@ -62,7 +62,7 @@ extends ObjectSpecificationPostProcessorAbstract {
     }
 
     @Override
-    protected void doPostProcess(final ObjectSpecification objectSpec, final ObjectAction act) {
+    public void postProcessAction(final ObjectSpecification objectSpec, final ObjectAction act) {
         memoizeTranslations(
                 Stream.of(
                         act.lookupFacet(MemberNamedFacet.class),
@@ -70,7 +70,7 @@ extends ObjectSpecificationPostProcessorAbstract {
     }
 
     @Override
-    protected void doPostProcess(
+    public void postProcessParameter(
             final ObjectSpecification objectSpecification,
             final ObjectAction objectAction,
             final ObjectActionParameter param) {
@@ -81,7 +81,7 @@ extends ObjectSpecificationPostProcessorAbstract {
     }
 
     @Override
-    protected void doPostProcess(final ObjectSpecification objectSpec, final OneToOneAssociation prop) {
+    public void postProcessProperty(final ObjectSpecification objectSpec, final OneToOneAssociation prop) {
         memoizeTranslations(
                 Stream.of(
                         prop.lookupFacet(MemberNamedFacet.class),
@@ -89,12 +89,11 @@ extends ObjectSpecificationPostProcessorAbstract {
     }
 
     @Override
-    protected void doPostProcess(final ObjectSpecification objectSpec, final OneToManyAssociation coll) {
+    public void postProcessCollection(final ObjectSpecification objectSpec, final OneToManyAssociation coll) {
         memoizeTranslations(
                 Stream.of(
                         coll.lookupFacet(MemberNamedFacet.class),
                         coll.lookupFacet(MemberDescribedFacet.class)));
-
     }
 
     // -- HELPER
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/allbutparam/authorization/AuthorizationPostProcessor.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/allbutparam/authorization/AuthorizationPostProcessor.java
index 48d40046db..3df026cb71 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/allbutparam/authorization/AuthorizationPostProcessor.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/allbutparam/authorization/AuthorizationPostProcessor.java
@@ -37,22 +37,22 @@ public class AuthorizationPostProcessor
     }
 
     @Override
-    protected void doPostProcess(final ObjectSpecification objectSpecification) {
+    public void postProcessObject(final ObjectSpecification objectSpecification) {
         addFacet(objectSpecification);
     }
 
     @Override
-    protected void doPostProcess(final ObjectSpecification objectSpecification, final ObjectAction act) {
+    public void postProcessAction(final ObjectSpecification objectSpecification, final ObjectAction act) {
         addFacet(act);
     }
 
     @Override
-    protected void doPostProcess(final ObjectSpecification objectSpecification, final OneToOneAssociation prop) {
+    public void postProcessProperty(final ObjectSpecification objectSpecification, final OneToOneAssociation prop) {
         addFacet(prop);
     }
 
     @Override
-    protected void doPostProcess(final ObjectSpecification objectSpecification, final OneToManyAssociation coll) {
+    public void postProcessCollection(final ObjectSpecification objectSpecification, final OneToManyAssociation coll) {
         addFacet(coll);
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/members/TweakDomainEventsForMixinPostProcessor.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/members/TweakDomainEventsForMixinPostProcessor.java
index 5d88b70251..b943c78aed 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/members/TweakDomainEventsForMixinPostProcessor.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/members/TweakDomainEventsForMixinPostProcessor.java
@@ -63,7 +63,7 @@ extends ObjectSpecificationPostProcessorAbstract {
     }
 
     @Override
-    protected void doPostProcess(final ObjectSpecification objectSpecification, final ObjectAction objectAction) {
+    public void postProcessAction(final ObjectSpecification objectSpecification, final ObjectAction objectAction) {
 
         if(objectAction instanceof ObjectActionMixedIn) {
             // unlike collection and property mixins, there is no need to create the DomainEventFacet, it will
@@ -86,7 +86,7 @@ extends ObjectSpecificationPostProcessorAbstract {
     }
 
     @Override
-    protected void doPostProcess(final ObjectSpecification objectSpecification, final OneToOneAssociation property) {
+    public void postProcessProperty(final ObjectSpecification objectSpecification, final OneToOneAssociation property) {
 
         if(property instanceof OneToOneAssociationMixedIn) {
             final OneToOneAssociationMixedIn propertyMixin = (OneToOneAssociationMixedIn) property;
@@ -127,7 +127,7 @@ extends ObjectSpecificationPostProcessorAbstract {
     }
 
     @Override
-    protected void doPostProcess(final ObjectSpecification objectSpecification, final OneToManyAssociation collection) {
+    public void postProcessCollection(final ObjectSpecification objectSpecification, final OneToManyAssociation collection) {
 
         if(collection instanceof OneToManyAssociationMixedIn) {
             final OneToManyAssociationMixedIn collectionMixin = (OneToManyAssociationMixedIn) collection;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/members/navigation/NavigationFacetFromHiddenTypePostProcessor.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/members/navigation/NavigationFacetFromHiddenTypePostProcessor.java
index 8501abc71d..30bffb9aef 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/members/navigation/NavigationFacetFromHiddenTypePostProcessor.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/members/navigation/NavigationFacetFromHiddenTypePostProcessor.java
@@ -43,17 +43,17 @@ public class NavigationFacetFromHiddenTypePostProcessor extends ObjectSpecificat
     }
 
     @Override
-    protected void doPostProcess(final ObjectSpecification objectSpecification, final ObjectAction act) {
+    public void postProcessAction(final ObjectSpecification objectSpecification, final ObjectAction act) {
         addFacetIfRequired(act, act.getReturnType());
     }
 
     @Override
-    protected void doPostProcess(final ObjectSpecification objectSpecification, final OneToOneAssociation prop) {
+    public void postProcessProperty(final ObjectSpecification objectSpecification, final OneToOneAssociation prop) {
         addFacetIfRequired(prop, prop.getElementType());
     }
 
     @Override
-    protected void doPostProcess(final ObjectSpecification objectSpecification, final OneToManyAssociation coll) {
+    public void postProcessCollection(final ObjectSpecification objectSpecification, final OneToManyAssociation coll) {
         addFacetIfRequired(coll, coll.getElementType());
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/object/ProjectionFacetsPostProcessor.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/object/ProjectionFacetsPostProcessor.java
index 7f35c6609d..4f6cb5ca9c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/object/ProjectionFacetsPostProcessor.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/object/ProjectionFacetsPostProcessor.java
@@ -45,7 +45,7 @@ extends ObjectSpecificationPostProcessorAbstract {
     }
 
     @Override
-    protected void doPostProcess(final ObjectSpecification objectSpecification) {
+    public void postProcessObject(final ObjectSpecification objectSpecification) {
         val projectionFacet = ProjectionFacetFromProjectingProperty.create(objectSpecification);
         if (projectionFacet == null) {
             return;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/param/ChoicesAndDefaultsPostProcessor.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/param/ChoicesAndDefaultsPostProcessor.java
index c97cc98d42..d73723c355 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/param/ChoicesAndDefaultsPostProcessor.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/param/ChoicesAndDefaultsPostProcessor.java
@@ -64,7 +64,7 @@ extends ObjectSpecificationPostProcessorAbstract {
     }
 
     @Override
-    protected void doPostProcess(
+    public void postProcessParameter(
             final ObjectSpecification objectSpecification,
             final ObjectAction objectAction,
             final ObjectActionParameter param) {
@@ -82,7 +82,7 @@ extends ObjectSpecificationPostProcessorAbstract {
     }
 
     @Override
-    protected void doPostProcess(
+    public void postProcessProperty(
             final ObjectSpecification objectSpecification,
             final OneToOneAssociation prop) {
         if(!hasMemberLevelDefaults(prop)) {
@@ -105,7 +105,7 @@ extends ObjectSpecificationPostProcessorAbstract {
     }
 
     @Override
-    protected void doPostProcess(
+    public void postProcessCollection(
             final ObjectSpecification objectSpecification,
             final OneToManyAssociation coll) {
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/param/TypicalLengthFromTypePostProcessor.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/param/TypicalLengthFromTypePostProcessor.java
index b3c9ebd61f..7c3fed7d76 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/param/TypicalLengthFromTypePostProcessor.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/param/TypicalLengthFromTypePostProcessor.java
@@ -40,7 +40,7 @@ extends ObjectSpecificationPostProcessorAbstract {
     }
 
     @Override
-    protected void doPostProcess(
+    public void postProcessParameter(
             final ObjectSpecification objectSpecification,
             final ObjectAction objectAction,
             final ObjectActionParameter parameter) {
@@ -57,7 +57,7 @@ extends ObjectSpecificationPostProcessorAbstract {
     }
 
     @Override
-    protected void doPostProcess(
+    public void postProcessProperty(
             final ObjectSpecification objectSpecification,
             final OneToOneAssociation property) {
         if(property.containsNonFallbackFacet(TypicalLengthFacet.class)) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/properties/DisabledFromImmutablePostProcessor.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/properties/DisabledFromImmutablePostProcessor.java
index f6e1e39d80..43ca18539e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/properties/DisabledFromImmutablePostProcessor.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/properties/DisabledFromImmutablePostProcessor.java
@@ -48,14 +48,14 @@ extends ObjectSpecificationPostProcessorAbstract {
     }
 
     @Override
-    protected void doPostProcess(final ObjectSpecification objectSpecification, final ObjectAction act) {
+    public void postProcessAction(final ObjectSpecification objectSpecification, final ObjectAction act) {
         // previously was also copying ImmutableFacet from spec onto Action (as for properties and collections ...
         // corresponds to CopyImmutableFacetOntoMembersFactory.  However, ImmutableFacet only ever disables for
         // properties and collections, so no point in copying over.
     }
 
     @Override
-    protected void doPostProcess(final ObjectSpecification objectSpecification, final OneToOneAssociation property) {
+    public void postProcessProperty(final ObjectSpecification objectSpecification, final OneToOneAssociation property) {
         if(property.containsNonFallbackFacet(DisabledFacet.class)) {
             return;
         }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava11.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava11.java
index ae0a2e4b51..440154c976 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava11.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava11.java
@@ -84,7 +84,6 @@ import org.apache.isis.core.metamodel.facets.properties.validating.method.Proper
 import org.apache.isis.core.metamodel.facets.value.semantics.ValueSemanticsAnnotationFacetFactory;
 import org.apache.isis.core.metamodel.methods.DomainIncludeAnnotationEnforcesMetamodelContributionValidator;
 import org.apache.isis.core.metamodel.methods.MethodByClassMap;
-import org.apache.isis.core.metamodel.postprocessors.DeriveMixinMembersPostProcessor;
 import org.apache.isis.core.metamodel.postprocessors.all.DescribedAsFromTypePostProcessor;
 import org.apache.isis.core.metamodel.postprocessors.all.i18n.SynthesizeObjectNamingPostProcessor;
 import org.apache.isis.core.metamodel.postprocessors.all.i18n.TranslationPostProcessor;
@@ -245,10 +244,6 @@ extends ProgrammingModelAbstract {
 
         val mmc = getMetaModelContext();
 
-        addPostProcessor(PostProcessingOrder.A0_BEFORE_BUILTIN, new DeriveMixinMembersPostProcessor(mmc));
-
-        // only after this point have any mixin members been resolved and are available on the ObjectSpecification.
-
         // must run before Object nouns are used
         addPostProcessor(PostProcessingOrder.A1_BUILTIN, new SynthesizeObjectNamingPostProcessor(mmc));
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/postprocessor/PostProcessor.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/postprocessor/PostProcessor.java
index 4285a2a495..7507392bf3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/postprocessor/PostProcessor.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/postprocessor/PostProcessor.java
@@ -22,6 +22,10 @@ import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.postprocessors.ObjectSpecificationPostProcessor;
 import org.apache.isis.core.metamodel.progmodel.ProgrammingModel;
 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.OneToManyAssociation;
+import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 
 import lombok.RequiredArgsConstructor;
 import lombok.val;
@@ -39,17 +43,61 @@ public class PostProcessor {
     }
 
     public void shutdown() {
-        enabledPostProcessors = null;
+        enabledPostProcessors = Can.empty();
     }
 
-    public void postProcess(ObjectSpecification objectSpecification) {
+    public void postProcess(final ObjectSpecification objectSpecification) {
+        // calling count on these 3 streams so these are actually consumed,
+        // as a side-effect the meta-model potentially gets further populated
+//        objectSpecification.streamRuntimeActions(MixedIn.INCLUDED).count();
+//        objectSpecification.streamCollections(MixedIn.INCLUDED).count();
+//        objectSpecification.streamProperties(MixedIn.INCLUDED).count();
 
+        postProcessObject(objectSpecification);
+
+        objectSpecification.streamRuntimeActions(MixedIn.INCLUDED)
+        .forEach(act->postProcessAction(objectSpecification, act));
+
+        objectSpecification.streamProperties(MixedIn.INCLUDED)
+        .forEach(prop->postProcessProperty(objectSpecification, prop));
+
+        objectSpecification.streamCollections(MixedIn.INCLUDED)
+        .forEach(coll->postProcessCollection(objectSpecification, coll));
+    }
+
+    // -- HELPER
+
+    private void postProcessObject(
+            final ObjectSpecification objectSpecification) {
         for (val postProcessor : enabledPostProcessors) {
+            postProcessor.postProcessObject(objectSpecification);
+        }
+    }
 
-            postProcessor.postProcess(objectSpecification);
+    private void postProcessAction(
+            final ObjectSpecification objectSpecification,
+            final ObjectAction act) {
+        for (val postProcessor : enabledPostProcessors) {
+            act.streamParameters().forEach(param ->
+                postProcessor.postProcessParameter(objectSpecification, act, param));
+            postProcessor.postProcessAction(objectSpecification, act);
+        }
+    }
 
+    private void postProcessProperty(
+            final ObjectSpecification objectSpecification,
+            final OneToOneAssociation prop) {
+        for (val postProcessor : enabledPostProcessors) {
+            postProcessor.postProcessProperty(objectSpecification, prop);
         }
+    }
 
+    private void postProcessCollection(
+            final ObjectSpecification objectSpecification,
+            final OneToManyAssociation coll) {
+        for (val postProcessor : enabledPostProcessors) {
+            postProcessor.postProcessCollection(objectSpecification, coll);
+        }
     }
 
 }
diff --git a/extensions/security/secman/integration/src/main/java/org/apache/isis/extensions/secman/integration/facets/TenantedAuthorizationPostProcessor.java b/extensions/security/secman/integration/src/main/java/org/apache/isis/extensions/secman/integration/facets/TenantedAuthorizationPostProcessor.java
index 80ca5c1cee..9a8bdaa8ea 100644
--- a/extensions/security/secman/integration/src/main/java/org/apache/isis/extensions/secman/integration/facets/TenantedAuthorizationPostProcessor.java
+++ b/extensions/security/secman/integration/src/main/java/org/apache/isis/extensions/secman/integration/facets/TenantedAuthorizationPostProcessor.java
@@ -74,22 +74,22 @@ extends ObjectSpecificationPostProcessorAbstract {
     }
 
     @Override
-    public void doPostProcess(final ObjectSpecification objectSpecification) {
+    public void postProcessObject(final ObjectSpecification objectSpecification) {
         FacetUtil.addFacetIfPresent(createFacet(objectSpecification.getCorrespondingClass(), objectSpecification));
     }
 
     @Override
-    protected void doPostProcess(final ObjectSpecification objectSpecification, final ObjectAction act) {
+    public void postProcessAction(final ObjectSpecification objectSpecification, final ObjectAction act) {
         addFacetTo(objectSpecification, act);
     }
 
     @Override
-    protected void doPostProcess(final ObjectSpecification objectSpecification, final OneToOneAssociation prop) {
+    public void postProcessProperty(final ObjectSpecification objectSpecification, final OneToOneAssociation prop) {
         addFacetTo(objectSpecification, prop);
     }
 
     @Override
-    protected void doPostProcess(final ObjectSpecification objectSpecification, final OneToManyAssociation coll) {
+    public void postProcessCollection(final ObjectSpecification objectSpecification, final OneToManyAssociation coll) {
         addFacetTo(objectSpecification, coll);
     }