You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2018/02/10 12:45:07 UTC

[isis] 01/02: ISIS-1585: defines a new PostProcessor API, similar to FacetFactory.

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

danhaywood pushed a commit to branch maint-1.16.1
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 865f6ab2481275827e41be6e08592fdeba8d28ec
Author: Dan Haywood <da...@haywood-associates.co.uk>
AuthorDate: Sat Feb 10 12:44:14 2018 +0000

    ISIS-1585: defines a new PostProcessor API, similar to FacetFactory.
    
    Also:
    - removes the postProcessing from FacetProcessor, since seemingly unused.
    - extracted out FacetFactorySet as a super-interface of ProgrammingModel
---
 .../isis/core/metamodel/facetapi/FeatureType.java  | 21 +-------
 ...rDefaultsFacetViaToggleBoxesPostProcessor.java} | 29 ++--------
 ...{ProgrammingModel.java => FacetFactorySet.java} |  9 ++--
 .../ObjectSpecificationPostProcessor.java          | 28 ++++++++++
 .../core/metamodel/progmodel/PostProcessorSet.java | 28 ++++++++++
 .../core/metamodel/progmodel/ProgrammingModel.java | 62 +---------------------
 .../metamodel/specloader/SpecificationLoader.java  | 19 +++----
 .../specloader/facetprocessor/FacetProcessor.java  | 11 +---
 .../specloader/postprocessor/PostProcessor.java    | 41 ++++++++++++++
 .../specloader/specimpl/FacetedMethodsBuilder.java | 12 -----
 .../specimpl/dflt/ObjectSpecificationDefault.java  |  5 +-
 .../dflt/ProgrammingModelFacetsJava5.java          | 20 ++++---
 12 files changed, 128 insertions(+), 157 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FeatureType.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FeatureType.java
index 7774792..f99bebf 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FeatureType.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FeatureType.java
@@ -28,7 +28,6 @@ import com.google.common.collect.ImmutableList;
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.core.commons.lang.StringExtensions;
 import org.apache.isis.core.metamodel.facets.FacetFactory;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 
 /**
  * Enumerates the features that a particular Facet can be applied to.
@@ -36,15 +35,7 @@ import org.apache.isis.core.metamodel.spec.ObjectSpecification;
  * <p>
  * The class-level feature processing is typically performed by {@link FacetFactory}s 
  * pertaining to {@link #OBJECT}, performed before the processing of class members.  
- * However, {@link FacetFactory}s can also be associated with {@link #OBJECT_POST_PROCESSING},
- * which is run after all members have been introspected. This is useful for facets
- * (eg the JDO <tt>Version</tt> annotation) that references class members.
- *  
- * <p>
- * TODO: should rationalize this and {@link ObjectSpecification#getResultType()}
- * . Note though that we don't distinguish value properties and reference
- * properties (and we probably shouldn't in {@link ObjectSpecification},
- * either).
+ *
  */
 public enum FeatureType {
 
@@ -94,15 +85,6 @@ public enum FeatureType {
         public Identifier identifierFor(final Class<?> type, final Method method) {
             return null;
         }
-    },
-    OBJECT_POST_PROCESSING("Object post processing") {
-        /**
-         * The supplied method can be null; at any rate it will be ignored.
-         */
-        @Override
-        public Identifier identifierFor(final Class<?> type, final Method method) {
-            return Identifier.classIdentifier(type);
-        }
     };
     
     public final static List<FeatureType> COLLECTIONS_ONLY = ImmutableList.of(COLLECTION);
@@ -118,7 +100,6 @@ public enum FeatureType {
     public final static List<FeatureType> OBJECTS_AND_COLLECTIONS = ImmutableList.of(OBJECT, COLLECTION);
     public final static List<FeatureType> OBJECTS_AND_ACTIONS = ImmutableList.of(OBJECT, ACTION);
     public final static List<FeatureType> OBJECTS_PROPERTIES_AND_COLLECTIONS = ImmutableList.of(OBJECT, PROPERTY, COLLECTION);
-    public final static List<FeatureType> OBJECTS_POST_PROCESSING_ONLY = ImmutableList.of(OBJECT_POST_PROCESSING);
 
     public static final List<FeatureType> ACTIONS_AND_PARAMETERS =
             ImmutableList.of(ACTION, ACTION_PARAMETER_SCALAR, ACTION_PARAMETER_COLLECTION);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/defaults/togglebox/ActionParameterDefaultsFacetViaToggleBoxesFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/defaults/togglebox/ActionParameterDefaultsFacetViaToggleBoxesPostProcessor.java
similarity index 83%
rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/defaults/togglebox/ActionParameterDefaultsFacetViaToggleBoxesFactory.java
rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/defaults/togglebox/ActionParameterDefaultsFacetViaToggleBoxesPostProcessor.java
index 3af6f2b..e43cefe 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/defaults/togglebox/ActionParameterDefaultsFacetViaToggleBoxesFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/defaults/togglebox/ActionParameterDefaultsFacetViaToggleBoxesPostProcessor.java
@@ -30,9 +30,9 @@ import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategoryProvider;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
-import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
+import org.apache.isis.core.metamodel.progmodel.ObjectSpecificationPostProcessor;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
+import org.apache.isis.core.metamodel.services.ServicesInjectorAware;
 import org.apache.isis.core.metamodel.spec.ActionType;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
@@ -43,30 +43,12 @@ import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 /**
  * Sets up all the {@link Facet}s for an action in a single shot.
  */
-public class ActionParameterDefaultsFacetViaToggleBoxesFactory extends FacetFactoryAbstract {
+public class ActionParameterDefaultsFacetViaToggleBoxesPostProcessor implements ObjectSpecificationPostProcessor,
+        ServicesInjectorAware {
 
     private DeploymentCategoryProvider deploymentCategoryProvider;
 
-    /**
-     * Note that the {@link Facet}s registered are the generic ones from
-     * noa-architecture (where they exist)
-     */
-    public ActionParameterDefaultsFacetViaToggleBoxesFactory() {
-        super(ImmutableList.of(FeatureType.OBJECT_POST_PROCESSING));
-    }
-
     @Override
-    public void process(final ProcessClassContext processClassContext) {
-        final ObjectSpecification objectSpecification = getSpecificationLoader()
-                .loadSpecification(processClassContext.getCls());
-        postProcess(objectSpecification);
-
-    }
-
-    /**
-     * NOT API.
-     * Called as special case in SpecificationLoader.
-     */
     public void postProcess(final ObjectSpecification objectSpecification) {
 
         // all the actions of this type
@@ -117,11 +99,8 @@ public class ActionParameterDefaultsFacetViaToggleBoxesFactory extends FacetFact
         return actionTypes;
     }
 
-
     @Override
     public void setServicesInjector(final ServicesInjector servicesInjector) {
-        super.setServicesInjector(servicesInjector);
         deploymentCategoryProvider = servicesInjector.getDeploymentCategoryProvider();
     }
-
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodel/ProgrammingModel.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodel/FacetFactorySet.java
similarity index 92%
copy from core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodel/ProgrammingModel.java
copy to core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodel/FacetFactorySet.java
index 44999b9..448c5d2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodel/ProgrammingModel.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodel/FacetFactorySet.java
@@ -24,13 +24,10 @@ import java.util.List;
 import org.apache.isis.core.commons.config.ConfigurationConstants;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.commons.factory.InstanceUtil;
-import org.apache.isis.core.metamodel.facetapi.MetaModelValidatorRefiner;
 import org.apache.isis.core.metamodel.facets.FacetFactory;
 import org.apache.isis.core.metamodel.specloader.ReflectorConstants;
 
-public interface ProgrammingModel extends MetaModelValidatorRefiner {
-
-    void init();
+public interface FacetFactorySet {
 
     List<FacetFactory> getList();
 
@@ -67,7 +64,7 @@ public interface ProgrammingModel extends MetaModelValidatorRefiner {
     class Util {
         private Util(){}
 
-        public static void includeFacetFactories(final IsisConfiguration configuration, final ProgrammingModel programmingModel) {
+        public static void includeFacetFactories(final IsisConfiguration configuration, final FacetFactorySet programmingModel) {
             final String[] facetFactoriesIncludeClassNames = configuration.getList(ReflectorConstants.FACET_FACTORY_INCLUDE_CLASS_NAME_LIST);
             if (facetFactoriesIncludeClassNames != null) {
                 for (final String facetFactoryClassName : facetFactoriesIncludeClassNames) {
@@ -77,7 +74,7 @@ public interface ProgrammingModel extends MetaModelValidatorRefiner {
             }
         }
 
-        public static void excludeFacetFactories(final IsisConfiguration configuration, final ProgrammingModel programmingModel) {
+        public static void excludeFacetFactories(final IsisConfiguration configuration, final FacetFactorySet programmingModel) {
             final String[] facetFactoriesExcludeClassNames = configuration.getList(ReflectorConstants.FACET_FACTORY_EXCLUDE_CLASS_NAME_LIST);
             for (final String facetFactoryClassName : facetFactoriesExcludeClassNames) {
                 final Class<? extends FacetFactory> facetFactory = InstanceUtil.loadClass(facetFactoryClassName, FacetFactory.class);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodel/ObjectSpecificationPostProcessor.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodel/ObjectSpecificationPostProcessor.java
new file mode 100644
index 0000000..fdef1e1
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodel/ObjectSpecificationPostProcessor.java
@@ -0,0 +1,28 @@
+/*
+ *  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.progmodel;
+
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+
+public interface ObjectSpecificationPostProcessor {
+
+    void postProcess(ObjectSpecification objectSpecification);
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodel/PostProcessorSet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodel/PostProcessorSet.java
new file mode 100644
index 0000000..dc6dee6
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodel/PostProcessorSet.java
@@ -0,0 +1,28 @@
+/*
+ *  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.progmodel;
+
+import java.util.List;
+
+public interface PostProcessorSet {
+
+    List<ObjectSpecificationPostProcessor> getPostProcessors();
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodel/ProgrammingModel.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodel/ProgrammingModel.java
index 44999b9..54937be 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodel/ProgrammingModel.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodel/ProgrammingModel.java
@@ -19,70 +19,10 @@
 
 package org.apache.isis.core.metamodel.progmodel;
 
-import java.util.List;
-
-import org.apache.isis.core.commons.config.ConfigurationConstants;
-import org.apache.isis.core.commons.config.IsisConfiguration;
-import org.apache.isis.core.commons.factory.InstanceUtil;
 import org.apache.isis.core.metamodel.facetapi.MetaModelValidatorRefiner;
-import org.apache.isis.core.metamodel.facets.FacetFactory;
-import org.apache.isis.core.metamodel.specloader.ReflectorConstants;
 
-public interface ProgrammingModel extends MetaModelValidatorRefiner {
+public interface ProgrammingModel extends FacetFactorySet, PostProcessorSet, MetaModelValidatorRefiner {
 
     void init();
 
-    List<FacetFactory> getList();
-
-    enum Position {
-        BEGINNING,END
-    }
-    void addFactory(Class<? extends FacetFactory> facetFactoryClass);
-    void addFactory(FacetFactory facetFactory);
-    void addFactory(Class<? extends FacetFactory> facetFactoryClass, Position position);
-    void addFactory(FacetFactory facetFactory, Position position);
-
-    void removeFactory(Class<? extends FacetFactory> facetFactoryClass);
-
-    /**
-     * Key used to lookup comma-separated list of {@link FacetFactory}s to
-     * include.
-     *
-     * @see #FACET_FACTORY_EXCLUDE_CLASS_NAME_LIST
-     */
-    String FACET_FACTORY_INCLUDE_CLASS_NAME_LIST = ConfigurationConstants.ROOT + "reflector.facets.include";
-
-    /**
-     * Key used to lookup comma-separated list of {@link FacetFactory}s to
-     * exclude.
-     *
-     * @see #FACET_FACTORY_INCLUDE_CLASS_NAME_LIST
-     */
-    String FACET_FACTORY_EXCLUDE_CLASS_NAME_LIST = ConfigurationConstants.ROOT + "reflector.facets.exclude";
-
-    /**
-     * This is a bit nasty, but currently the bootstrapping of the metamodel for integration tests vs the webapp differs;
-     * the intent of this class is to centralize some logic that should be applied in both cases.
-     */
-    class Util {
-        private Util(){}
-
-        public static void includeFacetFactories(final IsisConfiguration configuration, final ProgrammingModel programmingModel) {
-            final String[] facetFactoriesIncludeClassNames = configuration.getList(ReflectorConstants.FACET_FACTORY_INCLUDE_CLASS_NAME_LIST);
-            if (facetFactoriesIncludeClassNames != null) {
-                for (final String facetFactoryClassName : facetFactoriesIncludeClassNames) {
-                    final Class<? extends FacetFactory> facetFactory = InstanceUtil.loadClass(facetFactoryClassName, FacetFactory.class);
-                    programmingModel.addFactory(facetFactory);
-                }
-            }
-        }
-
-        public static void excludeFacetFactories(final IsisConfiguration configuration, final ProgrammingModel programmingModel) {
-            final String[] facetFactoriesExcludeClassNames = configuration.getList(ReflectorConstants.FACET_FACTORY_EXCLUDE_CLASS_NAME_LIST);
-            for (final String facetFactoryClassName : facetFactoriesExcludeClassNames) {
-                final Class<? extends FacetFactory> facetFactory = InstanceUtil.loadClass(facetFactoryClassName, FacetFactory.class);
-                programmingModel.removeFactory(facetFactory);
-            }
-        }
-    }
 }
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 8142104..cab0987 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
@@ -42,7 +42,6 @@ import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facets.FacetFactory;
 import org.apache.isis.core.metamodel.facets.object.autocomplete.AutoCompleteFacet;
 import org.apache.isis.core.metamodel.facets.object.objectspecid.ObjectSpecIdFacet;
-import org.apache.isis.core.metamodel.facets.param.defaults.togglebox.ActionParameterDefaultsFacetViaToggleBoxesFactory;
 import org.apache.isis.core.metamodel.layoutmetadata.LayoutMetadataReader;
 import org.apache.isis.core.metamodel.progmodel.ProgrammingModel;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
@@ -52,6 +51,7 @@ import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.specloader.classsubstitutor.ClassSubstitutor;
 import org.apache.isis.core.metamodel.specloader.facetprocessor.FacetProcessor;
+import org.apache.isis.core.metamodel.specloader.postprocessor.PostProcessor;
 import org.apache.isis.core.metamodel.specloader.specimpl.FacetedMethodsBuilderContext;
 import org.apache.isis.core.metamodel.specloader.specimpl.ObjectSpecificationAbstract;
 import org.apache.isis.core.metamodel.specloader.specimpl.dflt.ObjectSpecificationDefault;
@@ -99,6 +99,7 @@ public class SpecificationLoader implements ApplicationScopedComponent {
     private final MetaModelValidator metaModelValidator;
     private final SpecificationCacheDefault cache = new SpecificationCacheDefault();
     private final List<LayoutMetadataReader> layoutMetadataReaders;
+    private final PostProcessor postProcessor;
 
     public SpecificationLoader(
             final IsisConfiguration configuration,
@@ -114,6 +115,8 @@ public class SpecificationLoader implements ApplicationScopedComponent {
         this.metaModelValidator = metaModelValidator;
 
         this.facetProcessor = new FacetProcessor(programmingModel);
+        this.postProcessor = new PostProcessor(programmingModel, servicesInjector);
+
         this.layoutMetadataReaders = layoutMetadataReaders;
     }
 
@@ -151,6 +154,7 @@ public class SpecificationLoader implements ApplicationScopedComponent {
         // initialize subcomponents
         programmingModel.init();
         facetProcessor.init();
+        postProcessor.init();
         metaModelValidator.init(this);
 
         loadSpecificationsForServices();
@@ -457,24 +461,15 @@ public class SpecificationLoader implements ApplicationScopedComponent {
         specSpi.introspectTypeHierarchyAndMembers();
         specSpi.updateFromFacetValues();
         specSpi.setIntrospectionState(ObjectSpecificationAbstract.IntrospectionState.INTROSPECTED);
-
     }
 
     public void postProcess() {
 
-        //
-        // HMM.  Not possible to add this as a facet factory, because of
-        // inifinite loop (can't lookup actions of spec until fully processed).
-        // so, instead, calling as a one-off special-case in SpecificationLoader
-        //
-        final ActionParameterDefaultsFacetViaToggleBoxesFactory factory =
-                new ActionParameterDefaultsFacetViaToggleBoxesFactory();
-        factory.setServicesInjector(getServicesInjector());
-
         final Collection<ObjectSpecification> specs = allSpecifications();
         for (final ObjectSpecification spec : specs) {
-            factory.postProcess(spec);
+            postProcessor.postProcess(spec);
         }
+
     }
 
     //endregion
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/facetprocessor/FacetProcessor.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/facetprocessor/FacetProcessor.java
index 3e1d532..b17918f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/facetprocessor/FacetProcessor.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/facetprocessor/FacetProcessor.java
@@ -44,6 +44,7 @@ import org.apache.isis.core.metamodel.facets.MethodFilteringFacetFactory;
 import org.apache.isis.core.metamodel.facets.MethodPrefixBasedFacetFactory;
 import org.apache.isis.core.metamodel.facets.MethodRemoverConstants;
 import org.apache.isis.core.metamodel.facets.PropertyOrCollectionIdentifyingFacetFactory;
+import org.apache.isis.core.metamodel.progmodel.ObjectSpecificationPostProcessor;
 import org.apache.isis.core.metamodel.progmodel.ProgrammingModel;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
 import org.apache.isis.core.metamodel.services.ServicesInjectorAware;
@@ -268,16 +269,6 @@ public class FacetProcessor implements ServicesInjectorAware {
         }
     }
 
-    public void processPost(
-            final Class<?> cls, 
-            final Properties metadataProperties, 
-            final MethodRemover methodRemover, 
-            final FacetHolder facetHolder) {
-        final List<FacetFactory> factoryList = getFactoryListByFeatureType(FeatureType.OBJECT_POST_PROCESSING);
-        for (final FacetFactory facetFactory : factoryList) {
-            facetFactory.process(new ProcessClassContext(cls, metadataProperties, removerElseNullRemover(methodRemover), facetHolder));
-        }
-    }
 
     /**
      * Attaches all facets applicable to the provided {@link FeatureType type of
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
new file mode 100644
index 0000000..2a71659
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/postprocessor/PostProcessor.java
@@ -0,0 +1,41 @@
+package org.apache.isis.core.metamodel.specloader.postprocessor;
+
+import java.util.List;
+
+import org.apache.isis.core.metamodel.progmodel.ObjectSpecificationPostProcessor;
+import org.apache.isis.core.metamodel.progmodel.ProgrammingModel;
+import org.apache.isis.core.metamodel.services.ServicesInjector;
+import org.apache.isis.core.metamodel.services.ServicesInjectorAware;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+
+public class PostProcessor {
+
+    private final ProgrammingModel programmingModel;
+    private final ServicesInjector servicesInjector;
+    // populated at #init
+    List<ObjectSpecificationPostProcessor> postProcessors;
+
+    public PostProcessor(final ProgrammingModel programmingModel, final ServicesInjector servicesInjector) {
+        this.programmingModel = programmingModel;
+        this.servicesInjector = servicesInjector;
+    }
+
+    public void init() {
+        postProcessors = programmingModel.getPostProcessors();
+        for (final ObjectSpecificationPostProcessor postProcessor : postProcessors) {
+            if(postProcessor instanceof ServicesInjectorAware) {
+                final ServicesInjectorAware servicesInjectorAware = (ServicesInjectorAware) postProcessor;
+                servicesInjectorAware.setServicesInjector(servicesInjector);
+            }
+        }
+    }
+    public void postProcess(final ObjectSpecification objectSpecification) {
+
+        for (final ObjectSpecificationPostProcessor postProcessor : postProcessors) {
+            postProcessor.postProcess(objectSpecification);
+        }
+
+
+    }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/FacetedMethodsBuilder.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/FacetedMethodsBuilder.java
index 4f291a8..4446489 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/FacetedMethodsBuilder.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/FacetedMethodsBuilder.java
@@ -576,18 +576,6 @@ public class FacetedMethodsBuilder {
 
 
     // ////////////////////////////////////////////////////////////////////////////
-    // introspect class post processing
-    // ////////////////////////////////////////////////////////////////////////////
-
-    public void introspectClassPostProcessing(final Properties metadataProperties) {
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("introspecting {0}: class-level post-processing", getClassName());
-        }
-
-        getFacetProcessor().processPost(introspectedClass, metadataProperties, methodRemover, spec);
-    }
-
-    // ////////////////////////////////////////////////////////////////////////////
     // Helpers for finding and removing methods.
     // ////////////////////////////////////////////////////////////////////////////
 
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 5f1e2e4..65d2ff3 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
@@ -176,10 +176,7 @@ public class ObjectSpecificationDefault extends ObjectSpecificationAbstract impl
 
 
 
-        if(isNotIntrospected()) {
-            facetedMethodsBuilder.introspectClassPostProcessing(metadataProperties);    
-        }
-        
+
         if(isNotIntrospected()) {
             updateFromFacetValues();    
         }
diff --git a/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java b/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
index 302a8f8..a81b930 100644
--- a/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
+++ b/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
@@ -17,6 +17,10 @@
 
 package org.apache.isis.progmodels.dflt;
 
+import java.util.List;
+
+import com.google.common.collect.Lists;
+
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.facets.actions.action.ActionAnnotationFacetFactory;
 import org.apache.isis.core.metamodel.facets.actions.action.ActionChoicesForCollectionParameterFacetFactory;
@@ -133,6 +137,7 @@ import org.apache.isis.core.metamodel.facets.param.choices.method.ActionChoicesF
 import org.apache.isis.core.metamodel.facets.param.choices.methodnum.ActionParameterChoicesFacetViaMethodFactory;
 import org.apache.isis.core.metamodel.facets.param.defaults.fromtype.ActionParameterDefaultFacetDerivedFromTypeFactory;
 import org.apache.isis.core.metamodel.facets.param.defaults.methodnum.ActionParameterDefaultsFacetViaMethodFactory;
+import org.apache.isis.core.metamodel.facets.param.defaults.togglebox.ActionParameterDefaultsFacetViaToggleBoxesPostProcessor;
 import org.apache.isis.core.metamodel.facets.param.describedas.annotderived.DescribedAsFacetOnParameterAnnotationElseDerivedFromTypeFactory;
 import org.apache.isis.core.metamodel.facets.param.layout.ParameterLayoutFacetFactory;
 import org.apache.isis.core.metamodel.facets.param.mandatory.dflt.MandatoryFacetOnParametersDefaultFactory;
@@ -205,6 +210,7 @@ import org.apache.isis.core.metamodel.facets.value.timestamp.TimeStampValueFacet
 import org.apache.isis.core.metamodel.facets.value.timestampsql.JavaSqlTimeStampValueFacetUsingSemanticsProviderFactory;
 import org.apache.isis.core.metamodel.facets.value.url.URLValueFacetUsingSemanticsProviderFactory;
 import org.apache.isis.core.metamodel.facets.value.uuid.UUIDValueFacetUsingSemanticsProviderFactory;
+import org.apache.isis.core.metamodel.progmodel.ObjectSpecificationPostProcessor;
 import org.apache.isis.core.metamodel.progmodel.ProgrammingModelAbstract;
 
 public final class ProgrammingModelFacetsJava5 extends ProgrammingModelAbstract {
@@ -280,13 +286,6 @@ public final class ProgrammingModelFacetsJava5 extends ProgrammingModelAbstract
         addFactory(new ActionDefaultsFacetViaMethodFactory());
         addFactory(new ActionParameterDefaultsFacetViaMethodFactory());
 
-        //
-        // HMM.  Not possible to add this as a facet factory, because of
-        // inifinite loop (can't lookup actions of spec until fully processed).
-        // so, instead, calling as a one-off special-case in SpecificationLoader
-        //
-        //addFactory(new ActionParameterDefaultsFacetViaToggleBoxesFactory());
-
         // members in general
         
         addFactory(new NamedFacetStaticMethodFactory());
@@ -547,4 +546,11 @@ public final class ProgrammingModelFacetsJava5 extends ProgrammingModelAbstract
 
         addFactory(new ViewModelSemanticCheckingFacetFactory());
     }
+
+    @Override
+    public List<ObjectSpecificationPostProcessor> getPostProcessors() {
+        return Lists.<ObjectSpecificationPostProcessor>newArrayList(
+            new ActionParameterDefaultsFacetViaToggleBoxesPostProcessor()
+        );
+    }
 }

-- 
To stop receiving notification emails like this one, please contact
danhaywood@apache.org.