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 2022/08/29 21:35:06 UTC

[isis] 08/10: ISIS-3190: excludes all non-annotated methods from metamodel if ENCAPSULATION_ENABLED is set as the introspection policy.

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

danhaywood pushed a commit to tag saveit
in repository https://gitbox.apache.org/repos/asf/isis.git

commit bbcba4e5d0a52a6b8f2e0a0032d09d503940f6a0
Author: Dan Haywood <da...@haywood-associates.co.uk>
AuthorDate: Mon Aug 29 10:54:51 2022 +0100

    ISIS-3190: excludes all non-annotated methods from metamodel if ENCAPSULATION_ENABLED is set as the introspection policy.
---
 .../beans/IsisBeanTypeClassifierDefault.java       |  6 +--
 .../progmodel/ProgrammingModelConstants.java       | 43 +++++++++++++++++-----
 .../_testing/MetaModelContext_forTesting.java      |  2 +-
 .../RemoveAnnotatedMethodsFacetFactory.java        | 40 ++++++++++++++++----
 .../classsubstitutor/ClassSubstitutorAbstract.java |  2 +-
 5 files changed, 70 insertions(+), 23 deletions(-)

diff --git a/core/config/src/main/java/org/apache/isis/core/config/beans/IsisBeanTypeClassifierDefault.java b/core/config/src/main/java/org/apache/isis/core/config/beans/IsisBeanTypeClassifierDefault.java
index daded0f1c4..c67d426003 100644
--- a/core/config/src/main/java/org/apache/isis/core/config/beans/IsisBeanTypeClassifierDefault.java
+++ b/core/config/src/main/java/org/apache/isis/core/config/beans/IsisBeanTypeClassifierDefault.java
@@ -33,7 +33,7 @@ import org.apache.isis.applib.id.LogicalType;
 import org.apache.isis.applib.services.metamodel.BeanSort;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.reflection._Annotations;
-import org.apache.isis.core.config.progmodel.ProgrammingModelConstants.TypeVetoMarker;
+import org.apache.isis.core.config.progmodel.ProgrammingModelConstants.TypeExcludeMarker;
 
 import lombok.AccessLevel;
 import lombok.NonNull;
@@ -78,7 +78,7 @@ implements IsisBeanTypeClassifier {
         }
 
         // handle vetoing ...
-        if(TypeVetoMarker.anyMatchOn(type)) {
+        if(TypeExcludeMarker.anyMatchOn(type)) {
             return IsisBeanMetaData.isisManaged(BeanSort.VETOED, type); // reject
         }
 
@@ -163,4 +163,4 @@ implements IsisBeanTypeClassifier {
         return activeProfiles.contains(profile);
     }
 
-}
\ No newline at end of file
+}
diff --git a/core/config/src/main/java/org/apache/isis/core/config/progmodel/ProgrammingModelConstants.java b/core/config/src/main/java/org/apache/isis/core/config/progmodel/ProgrammingModelConstants.java
index a161a9ad7f..1ffef8a1c4 100644
--- a/core/config/src/main/java/org/apache/isis/core/config/progmodel/ProgrammingModelConstants.java
+++ b/core/config/src/main/java/org/apache/isis/core/config/progmodel/ProgrammingModelConstants.java
@@ -69,18 +69,18 @@ import lombok.val;
 
 public final class ProgrammingModelConstants {
 
-    // -- TYPE VETO MARKERS (EXLUDE FROM DOMAIN)
+    // -- TYPE EXCLUDE MARKERS
 
     @Getter
     @RequiredArgsConstructor
-    public enum TypeVetoMarker {
-        DOMAIN_EXLCUDE(Domain.Exclude.class),
+    public enum TypeExcludeMarker {
+        DOMAIN_EXCLUDE(Domain.Exclude.class),
         VETO(Vetoed.class);
         private final Class<? extends Annotation> annotationType;
 
         public static boolean anyMatchOn(final Class<?> type) {
-            for(TypeVetoMarker vetoMarker : TypeVetoMarker.values()) {
-                if(_Annotations.synthesize(type, vetoMarker.getAnnotationType()).isPresent()) {
+            for(TypeExcludeMarker excludeMarker : TypeExcludeMarker.values()) {
+                if(_Annotations.synthesize(type, excludeMarker.getAnnotationType()).isPresent()) {
                     return true;
                 }
             }
@@ -88,12 +88,35 @@ public final class ProgrammingModelConstants {
         }
     }
 
-    // -- METHOD VETO MARKERS (EXLUDE FROM DOMAIN)
+    // -- METHOD INCLUDE MARKERS
 
+    /**
+     * Ensure included.
+     */
     @Getter
     @RequiredArgsConstructor
-    public enum MethodVetoMarker {
-        DOMAIN_EXLCUDE(Domain.Exclude.class),
+    public enum MethodIncludeMarker {
+        DOMAIN_INCLUDE(Domain.Include.class),
+        ;
+        private final Class<? extends Annotation> annotationType;
+
+        public static boolean anyMatchOn(final Method method) {
+            for(MethodIncludeMarker includeMarker : MethodIncludeMarker.values()) {
+                if(_Annotations.synthesize(method, includeMarker.getAnnotationType()).isPresent()) {
+                    return true;
+                }
+            }
+            return false;
+        }
+    }
+
+
+    // -- METHOD EXCLUDE MARKERS
+
+    @Getter
+    @RequiredArgsConstructor
+    public enum MethodExcludeMarker {
+        DOMAIN_EXCLUDE(Domain.Exclude.class),
         PRE_DESTROY_JAVAX(javax.annotation.PreDestroy.class),
         POST_CONSTRUCT_JAVAX(javax.annotation.PostConstruct.class),
         //PRE_DESTROY__JAKARTA(jakarta.annotation.PreDestroy.class),
@@ -102,8 +125,8 @@ public final class ProgrammingModelConstants {
         private final Class<? extends Annotation> annotationType;
 
         public static boolean anyMatchOn(final Method method) {
-            for(MethodVetoMarker vetoMarker : MethodVetoMarker.values()) {
-                if(_Annotations.synthesize(method, vetoMarker.getAnnotationType()).isPresent()) {
+            for(MethodExcludeMarker excludeMarker : MethodExcludeMarker.values()) {
+                if(_Annotations.synthesize(method, excludeMarker.getAnnotationType()).isPresent()) {
                     return true;
                 }
             }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/_testing/MetaModelContext_forTesting.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/_testing/MetaModelContext_forTesting.java
index 3f92fd2134..ddaf0d4f79 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/_testing/MetaModelContext_forTesting.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/_testing/MetaModelContext_forTesting.java
@@ -504,7 +504,7 @@ implements MetaModelContext {
                         "Cannot get service instance of type '%s'",
                         managedBeanAdapter.getBeanClass()));
 
-        if(ProgrammingModelConstants.TypeVetoMarker.anyMatchOn(managedBeanAdapter.getBeanClass())) {
+        if(ProgrammingModelConstants.TypeExcludeMarker.anyMatchOn(managedBeanAdapter.getBeanClass())) {
             return Optional.empty();
         }
         return Optional.of(ManagedObject.lazy(getSpecificationLoader(), servicePojo));
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/ignore/annotation/RemoveAnnotatedMethodsFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/ignore/annotation/RemoveAnnotatedMethodsFacetFactory.java
index 6794f18ee4..6e56642fb6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/ignore/annotation/RemoveAnnotatedMethodsFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/ignore/annotation/RemoveAnnotatedMethodsFacetFactory.java
@@ -20,11 +20,14 @@ package org.apache.isis.core.metamodel.facets.object.ignore.annotation;
 
 import javax.inject.Inject;
 
-import org.apache.isis.core.config.progmodel.ProgrammingModelConstants.MethodVetoMarker;
+import org.apache.isis.core.config.progmodel.ProgrammingModelConstants;
+import org.apache.isis.core.config.progmodel.ProgrammingModelConstants.MethodExcludeMarker;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
 
+import lombok.val;
+
 public class RemoveAnnotatedMethodsFacetFactory
 extends FacetFactoryAbstract {
 
@@ -35,13 +38,34 @@ extends FacetFactoryAbstract {
 
     @Override
     public void process(final ProcessClassContext processClassContext) {
-        getClassCache()
-        .streamPublicMethods(processClassContext.getCls())
-        .forEach(method->{
-            if(MethodVetoMarker.anyMatchOn(method)) {
-                processClassContext.removeMethod(method);
-            }
-        });
+
+        val policy = getMetaModelContext().getConfiguration().getCore().getMetaModel().getIntrospector().getPolicy();
+        switch (policy) {
+            case ENCAPSULATION_ENABLED:
+                getClassCache().streamPublicOrDeclaredMethods(processClassContext.getCls())
+                        .forEach(method -> {
+                            if (!ProgrammingModelConstants.MethodIncludeMarker.anyMatchOn(method)) {
+                                processClassContext.removeMethod(method);
+                            }
+                        });
+                break;
+
+            case ANNOTATION_REQUIRED:
+                // TODO: this could probably be more precise and insist on @Domain.Include for members.
+
+            case ANNOTATION_OPTIONAL:
+
+                getClassCache()
+                        .streamPublicMethods(processClassContext.getCls())
+                        .forEach(method->{
+                            if(MethodExcludeMarker.anyMatchOn(method)) {
+                                processClassContext.removeMethod(method);
+                            }
+                        });
+
+                break;
+        }
+
 
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/classsubstitutor/ClassSubstitutorAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/classsubstitutor/ClassSubstitutorAbstract.java
index 0e1f86d009..2732b36350 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/classsubstitutor/ClassSubstitutorAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/classsubstitutor/ClassSubstitutorAbstract.java
@@ -130,7 +130,7 @@ public abstract class ClassSubstitutorAbstract implements ClassSubstitutor {
         }
 
         // ignore vetoed types
-        if(ProgrammingModelConstants.TypeVetoMarker.anyMatchOn(cls)) {
+        if(ProgrammingModelConstants.TypeExcludeMarker.anyMatchOn(cls)) {
             return true;
         }