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 2020/02/14 15:57:14 UTC

[isis] branch master updated: ISIS-2223: more mitigations: introduces an ImmutableEnumSet

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 7b46c54  ISIS-2223: more mitigations: introduces an ImmutableEnumSet
7b46c54 is described below

commit 7b46c54c400319ff80537c056a7daf7e23d29416
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri Feb 14 16:57:00 2020 +0100

    ISIS-2223: more mitigations: introduces an ImmutableEnumSet
---
 .../examples/services/wrapper/WrapperFactory.java  | 10 ++--
 .../isis/applib/util/schema/CommonDtoUtils.java    |  2 +-
 .../core/commons/collections/ImmutableEnumSet.java | 70 ++++++++++++++++++++++
 .../isis/core/commons/internal/debug/_Probe.java   |  2 +-
 .../environment/IsisSystemEnvironment.java         |  3 +-
 .../isis/core/metamodel/commons/ClassUtil.java     |  2 +-
 .../apache/isis/core/metamodel/consent/Allow.java  |  2 +-
 .../apache/isis/core/metamodel/consent/Veto.java   |  2 +-
 .../isis/core/metamodel/facetapi/FeatureType.java  | 39 ++++++------
 .../isis/core/metamodel/facets/FacetFactory.java   |  4 +-
 .../metamodel/facets/FacetFactoryAbstract.java     |  7 +--
 .../MethodPrefixBasedFacetFactoryAbstract.java     |  5 +-
 .../facets/OrphanedSupportingMethodValidator.java  |  4 +-
 ...rCollectionIdentifyingFacetFactoryAbstract.java |  5 +-
 .../facets/AbstractFacetFactoryJUnit4TestCase.java |  8 +--
 .../metamodel/facets/AbstractFacetFactoryTest.java |  6 +-
 .../apache/isis/core/metamodel/facets/Utils.java   |  4 +-
 .../facets/FacetsFacetAnnotationFactoryTest.java   | 11 ++--
 .../SupportingMethodValidatorRefinerFactory.java   |  4 +-
 19 files changed, 127 insertions(+), 63 deletions(-)

diff --git a/api/applib/src/main/adoc/modules/applib-svc/examples/services/wrapper/WrapperFactory.java b/api/applib/src/main/adoc/modules/applib-svc/examples/services/wrapper/WrapperFactory.java
index d30f340..687bb46 100644
--- a/api/applib/src/main/adoc/modules/applib-svc/examples/services/wrapper/WrapperFactory.java
+++ b/api/applib/src/main/adoc/modules/applib-svc/examples/services/wrapper/WrapperFactory.java
@@ -100,30 +100,30 @@ public interface WrapperFactory {
         /**
          * Validate all business rules and then execute. May throw exceptions in order to fail fast. 
          */
-        public static EnumSet<ExecutionMode> EXECUTE = EnumSet.noneOf(ExecutionMode.class); 
+        public static final EnumSet<ExecutionMode> EXECUTE = EnumSet.noneOf(ExecutionMode.class); 
 
         /**
          * Skip all business rules and then execute, does throw an exception if execution fails.
          */
-        public static EnumSet<ExecutionMode> SKIP_RULES = EnumSet.of(SKIP_RULE_VALIDATION);
+        public static final EnumSet<ExecutionMode> SKIP_RULES = EnumSet.of(SKIP_RULE_VALIDATION);
         
         /**
          * Validate all business rules but do not execute, throw an exception if validation 
          * fails. 
          */
-        public static EnumSet<ExecutionMode> NO_EXECUTE = EnumSet.of(SKIP_EXECUTION);
+        public static final EnumSet<ExecutionMode> NO_EXECUTE = EnumSet.of(SKIP_EXECUTION);
         
         /**
          * Validate all business rules and then execute, but don't throw an exception if validation 
          * or execution fails.
          */
-        public static EnumSet<ExecutionMode> TRY = EnumSet.of(SWALLOW_EXCEPTIONS); 
+        public static final EnumSet<ExecutionMode> TRY = EnumSet.of(SWALLOW_EXCEPTIONS); 
         
         /**
          * Skips all steps.
          * @since 2.0
          */
-        public static EnumSet<ExecutionMode> NOOP = EnumSet.of(SKIP_RULE_VALIDATION, SKIP_EXECUTION);
+        public static final EnumSet<ExecutionMode> NOOP = EnumSet.of(SKIP_RULE_VALIDATION, SKIP_EXECUTION);
         
     }
 
diff --git a/api/applib/src/main/java/org/apache/isis/applib/util/schema/CommonDtoUtils.java b/api/applib/src/main/java/org/apache/isis/applib/util/schema/CommonDtoUtils.java
index 76f0189..a8deee6 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/util/schema/CommonDtoUtils.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/util/schema/CommonDtoUtils.java
@@ -110,7 +110,7 @@ public final class CommonDtoUtils {
                     entry(Clob.class, ValueType.CLOB)
                     );
 
-    public static Set<Class<?>> VALUE_TYPES = valueTypeByClass.keySet();
+    public final static Set<Class<?>> VALUE_TYPES = valueTypeByClass.keySet();
 
     public static ValueType asValueType(final Class<?> type) {
         final ValueType valueType = valueTypeByClass.get(type);
diff --git a/core/commons/src/main/java/org/apache/isis/core/commons/collections/ImmutableEnumSet.java b/core/commons/src/main/java/org/apache/isis/core/commons/collections/ImmutableEnumSet.java
new file mode 100644
index 0000000..d595ee6
--- /dev/null
+++ b/core/commons/src/main/java/org/apache/isis/core/commons/collections/ImmutableEnumSet.java
@@ -0,0 +1,70 @@
+package org.apache.isis.core.commons.collections;
+
+import java.util.EnumSet;
+import java.util.Iterator;
+
+/**
+ * Immutable variant of {@link EnumSet}
+ * 
+ * @since 2.0
+ */
+public final class ImmutableEnumSet<E extends Enum<E>> 
+implements Iterable<E>, java.io.Serializable {
+
+    private static final long serialVersionUID = 1L;
+    
+    private final EnumSet<E> delegate;
+
+    private ImmutableEnumSet(EnumSet<E> delegate) {
+        this.delegate = delegate;
+    }
+
+    public static <E extends Enum<E>> ImmutableEnumSet<E> from(EnumSet<E> delegate) {
+        return new ImmutableEnumSet<>(delegate);
+    }
+    
+    public static <E extends Enum<E>> ImmutableEnumSet<E> noneOf(Class<E> enumType) {
+        return from(EnumSet.noneOf(enumType));
+    }
+
+    public static <E extends Enum<E>> ImmutableEnumSet<E> of(E e1) {
+        return from(EnumSet.of(e1));
+    }
+    
+    public static <E extends Enum<E>> ImmutableEnumSet<E> of(E e1, E e2) {
+        return from(EnumSet.of(e1, e2));
+    }
+    
+    public static <E extends Enum<E>> ImmutableEnumSet<E> of(E e1, E e2, E e3) {
+        return from(EnumSet.of(e1, e2, e3));
+    }
+    
+    public static <E extends Enum<E>> ImmutableEnumSet<E> of(E e1, E e2, E e3, E e4) {
+        return from(EnumSet.of(e1, e2, e3, e4));
+    }
+
+    public static <E extends Enum<E>> ImmutableEnumSet<E> complementOf(ImmutableEnumSet<E> other) {
+        return from(EnumSet.complementOf(other.delegate));
+    }
+    
+    public static <E extends Enum<E>> ImmutableEnumSet<E> allOf(Class<E> enumType) {
+        return from(EnumSet.allOf(enumType));
+    }
+    
+    public boolean contains(E element) {
+        return delegate.contains(element);
+    }
+    
+    public EnumSet<E> toEnumSet() {
+        return delegate.clone();
+    }
+    
+    @Override
+    public Iterator<E> iterator() {
+        return delegate.iterator();
+    }
+
+
+
+
+}
diff --git a/core/commons/src/main/java/org/apache/isis/core/commons/internal/debug/_Probe.java b/core/commons/src/main/java/org/apache/isis/core/commons/internal/debug/_Probe.java
index df0eb69..4f8844c 100644
--- a/core/commons/src/main/java/org/apache/isis/core/commons/internal/debug/_Probe.java
+++ b/core/commons/src/main/java/org/apache/isis/core/commons/internal/debug/_Probe.java
@@ -124,7 +124,7 @@ public class _Probe {
 
     // -- INDENTING
 
-    public int currentIndent = 0;
+    private int currentIndent = 0;
 
     // -- PRINTING
 
diff --git a/core/commons/src/main/java/org/apache/isis/core/commons/internal/environment/IsisSystemEnvironment.java b/core/commons/src/main/java/org/apache/isis/core/commons/internal/environment/IsisSystemEnvironment.java
index 001b18e..57cd6cb 100644
--- a/core/commons/src/main/java/org/apache/isis/core/commons/internal/environment/IsisSystemEnvironment.java
+++ b/core/commons/src/main/java/org/apache/isis/core/commons/internal/environment/IsisSystemEnvironment.java
@@ -112,8 +112,7 @@ public class IsisSystemEnvironment {
     @EventListener(ApplicationFailedEvent.class)
     public void onContextRefreshed(ApplicationFailedEvent event) {
         // happens eg. when DN finds non enhanced entity classes 
-        log.error("Application failed to start");
-        event.getException().printStackTrace();
+        log.error("Application failed to start", event.getException());
     }
     
     
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/ClassUtil.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/ClassUtil.java
index a6a7183..a5b89d2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/ClassUtil.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/ClassUtil.java
@@ -38,7 +38,7 @@ public final class ClassUtil {
 
     static final String JAVA_CLASS_PREFIX = "java.";
 
-    private static Map<String, Class<?>> builtInClasses = new HashMap<String, Class<?>>();
+    private final static Map<String, Class<?>> builtInClasses = new HashMap<String, Class<?>>();
 
     static {
         put(void.class);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/consent/Allow.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/consent/Allow.java
index e48ffb0..5dfc204 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/consent/Allow.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/consent/Allow.java
@@ -28,7 +28,7 @@ public class Allow extends ConsentAbstract {
 
     private static final long serialVersionUID = 1L;
 
-    public static Allow DEFAULT = new Allow();
+    public static final Allow DEFAULT = new Allow();
 
     private Allow() {
         this((String) null);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/consent/Veto.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/consent/Veto.java
index f6272c6..6f182a8 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/consent/Veto.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/consent/Veto.java
@@ -27,7 +27,7 @@ public class Veto extends ConsentAbstract {
 
     private static final long serialVersionUID = 1L;
 
-    public static Veto DEFAULT = new Veto("Vetoed by default");
+    public static final Veto DEFAULT = new Veto("Vetoed by default");
 
     /**
      * Called by DnD viewer; we should instead find a way to put the calling
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 9831836..8dbfaa2 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
@@ -21,9 +21,9 @@ package org.apache.isis.core.metamodel.facetapi;
 
 import java.beans.Introspector;
 import java.lang.reflect.Method;
-import java.util.EnumSet;
 
 import org.apache.isis.applib.Identifier;
+import org.apache.isis.core.commons.collections.ImmutableEnumSet;
 import org.apache.isis.core.metamodel.commons.StringExtensions;
 import org.apache.isis.core.metamodel.facets.FacetFactory;
 
@@ -85,34 +85,33 @@ public enum FeatureType {
         }
     };
 
-    public final static EnumSet<FeatureType> COLLECTIONS_ONLY = EnumSet.of(COLLECTION);
-    public final static EnumSet<FeatureType> COLLECTIONS_AND_ACTIONS = EnumSet.of(COLLECTION, ACTION);
-    public final static EnumSet<FeatureType> ACTIONS_ONLY = EnumSet.of(ACTION);
-    public final static EnumSet<FeatureType> PARAMETERS_ONLY = EnumSet.of(ACTION_PARAMETER_SCALAR, ACTION_PARAMETER_COLLECTION);
-    public final static EnumSet<FeatureType> PROPERTIES_ONLY = EnumSet.of(PROPERTY);
-    public final static EnumSet<FeatureType> PROPERTIES_AND_ACTIONS = EnumSet.of(PROPERTY, ACTION);
-    public final static EnumSet<FeatureType> OBJECTS_ONLY = EnumSet.of(OBJECT);
-    public final static EnumSet<FeatureType> MEMBERS = EnumSet.of(PROPERTY, COLLECTION, ACTION);
-    public final static EnumSet<FeatureType> OBJECTS_AND_PROPERTIES = EnumSet.of(OBJECT, PROPERTY);
-    public final static EnumSet<FeatureType> PROPERTIES_AND_COLLECTIONS = EnumSet.of(PROPERTY, COLLECTION);
-    public final static EnumSet<FeatureType> OBJECTS_AND_COLLECTIONS = EnumSet.of(OBJECT, COLLECTION);
-    public final static EnumSet<FeatureType> OBJECTS_AND_ACTIONS = EnumSet.of(OBJECT, ACTION);
-    public final static EnumSet<FeatureType> OBJECTS_PROPERTIES_AND_COLLECTIONS = EnumSet.of(OBJECT, PROPERTY, COLLECTION);
-    public static final EnumSet<FeatureType> ACTIONS_AND_PARAMETERS =
-            EnumSet.of(ACTION, ACTION_PARAMETER_SCALAR, ACTION_PARAMETER_COLLECTION);
+    public final static ImmutableEnumSet<FeatureType> COLLECTIONS_ONLY = ImmutableEnumSet.of(COLLECTION);
+    public final static ImmutableEnumSet<FeatureType> COLLECTIONS_AND_ACTIONS = ImmutableEnumSet.of(COLLECTION, ACTION);
+    public final static ImmutableEnumSet<FeatureType> ACTIONS_ONLY = ImmutableEnumSet.of(ACTION);
+    public final static ImmutableEnumSet<FeatureType> PARAMETERS_ONLY = ImmutableEnumSet.of(ACTION_PARAMETER_SCALAR, ACTION_PARAMETER_COLLECTION);
+    public final static ImmutableEnumSet<FeatureType> PROPERTIES_ONLY = ImmutableEnumSet.of(PROPERTY);
+    public final static ImmutableEnumSet<FeatureType> PROPERTIES_AND_ACTIONS = ImmutableEnumSet.of(PROPERTY, ACTION);
+    public final static ImmutableEnumSet<FeatureType> OBJECTS_ONLY = ImmutableEnumSet.of(OBJECT);
+    public final static ImmutableEnumSet<FeatureType> MEMBERS = ImmutableEnumSet.of(PROPERTY, COLLECTION, ACTION);
+    public final static ImmutableEnumSet<FeatureType> OBJECTS_AND_PROPERTIES = ImmutableEnumSet.of(OBJECT, PROPERTY);
+    public final static ImmutableEnumSet<FeatureType> PROPERTIES_AND_COLLECTIONS = ImmutableEnumSet.of(PROPERTY, COLLECTION);
+    public final static ImmutableEnumSet<FeatureType> OBJECTS_AND_COLLECTIONS = ImmutableEnumSet.of(OBJECT, COLLECTION);
+    public final static ImmutableEnumSet<FeatureType> OBJECTS_AND_ACTIONS = ImmutableEnumSet.of(OBJECT, ACTION);
+    public final static ImmutableEnumSet<FeatureType> OBJECTS_PROPERTIES_AND_COLLECTIONS = ImmutableEnumSet.of(OBJECT, PROPERTY, COLLECTION);
+    public final static ImmutableEnumSet<FeatureType> ACTIONS_AND_PARAMETERS = ImmutableEnumSet.of(ACTION, ACTION_PARAMETER_SCALAR, ACTION_PARAMETER_COLLECTION);
 
     /**
      * Use of this is discouraged; instead use multiple {@link FacetFactory}s
      * for different features.
      */
-    public final static EnumSet<FeatureType> EVERYTHING_BUT_PARAMETERS = 
-            EnumSet.complementOf(
-                    EnumSet.of(ACTION_PARAMETER_SCALAR, ACTION_PARAMETER_COLLECTION));
+    public final static ImmutableEnumSet<FeatureType> EVERYTHING_BUT_PARAMETERS = 
+            ImmutableEnumSet.complementOf(
+                    ImmutableEnumSet.of(ACTION_PARAMETER_SCALAR, ACTION_PARAMETER_COLLECTION));
     /**
      * Use of this is discouraged; instead use multiple {@link FacetFactory}s
      * for different features.
      */
-    public final static EnumSet<FeatureType> EVERYTHING = EnumSet.allOf(FeatureType.class); 
+    public final static ImmutableEnumSet<FeatureType> EVERYTHING = ImmutableEnumSet.allOf(FeatureType.class); 
 
     private final String name;
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetFactory.java
index 48aafac..22acf30 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetFactory.java
@@ -22,12 +22,12 @@ package org.apache.isis.core.metamodel.facets;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Method;
 import java.lang.reflect.Parameter;
-import java.util.EnumSet;
 import java.util.Optional;
 import java.util.function.Consumer;
 import java.util.function.Predicate;
 import java.util.function.Supplier;
 
+import org.apache.isis.core.commons.collections.ImmutableEnumSet;
 import org.apache.isis.core.commons.internal.exceptions._Exceptions;
 import org.apache.isis.core.commons.internal.reflection._Annotations;
 import org.apache.isis.core.metamodel.facetapi.Facet;
@@ -137,7 +137,7 @@ public interface FacetFactory {
      * the meta-model.
      * 
      */
-    EnumSet<FeatureType> getFeatureTypes();
+    ImmutableEnumSet<FeatureType> getFeatureTypes();
 
 
     // //////////////////////////////////////
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetFactoryAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetFactoryAbstract.java
index 0d770c7..876d64b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetFactoryAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetFactoryAbstract.java
@@ -19,8 +19,7 @@
 
 package org.apache.isis.core.metamodel.facets;
 
-import java.util.EnumSet;
-
+import org.apache.isis.core.commons.collections.ImmutableEnumSet;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.context.MetaModelContextAware;
 import org.apache.isis.core.metamodel.facetapi.Facet;
@@ -37,9 +36,9 @@ implements FacetFactory, MetaModelContextAware, MetaModelContext.Delegating {
     private MetaModelContext metaModelContext;
     
     @Getter(onMethod = @__({@Override}))
-    private final EnumSet<FeatureType> featureTypes;
+    private final ImmutableEnumSet<FeatureType> featureTypes;
 
-    public FacetFactoryAbstract(EnumSet<FeatureType> featureTypes) {
+    public FacetFactoryAbstract(ImmutableEnumSet<FeatureType> featureTypes) {
         this.featureTypes = featureTypes;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/MethodPrefixBasedFacetFactoryAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/MethodPrefixBasedFacetFactoryAbstract.java
index 8fab89e..cd6cd0e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/MethodPrefixBasedFacetFactoryAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/MethodPrefixBasedFacetFactoryAbstract.java
@@ -18,9 +18,8 @@
  */
 package org.apache.isis.core.metamodel.facets;
 
-import java.util.EnumSet;
-
 import org.apache.isis.core.commons.collections.Can;
+import org.apache.isis.core.commons.collections.ImmutableEnumSet;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.progmodel.ProgrammingModel;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
@@ -47,7 +46,7 @@ implements MethodPrefixBasedFacetFactory {
     }
 
     public MethodPrefixBasedFacetFactoryAbstract(
-            @NonNull final EnumSet<FeatureType> featureTypes, 
+            @NonNull final ImmutableEnumSet<FeatureType> featureTypes, 
             @NonNull final OrphanValidation orphanValidation, 
             @NonNull final Can<String> prefixes) {
         
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/OrphanedSupportingMethodValidator.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/OrphanedSupportingMethodValidator.java
index a6fde45..4e301e3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/OrphanedSupportingMethodValidator.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/OrphanedSupportingMethodValidator.java
@@ -19,11 +19,11 @@
 package org.apache.isis.core.metamodel.facets;
 
 import java.lang.reflect.Method;
-import java.util.EnumSet;
 import java.util.HashSet;
 import java.util.List;
 import java.util.stream.Collectors;
 
+import org.apache.isis.core.commons.collections.ImmutableEnumSet;
 import org.apache.isis.core.commons.internal.collections._Lists;
 import org.apache.isis.core.commons.internal.collections._Sets;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -45,7 +45,7 @@ extends FacetFactoryAbstract
 implements MetaModelRefiner {
 
     public OrphanedSupportingMethodValidator() {
-        super(EnumSet.noneOf(FeatureType.class)); // does not contribute any facets
+        super(ImmutableEnumSet.noneOf(FeatureType.class)); // does not contribute any facets
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/PropertyOrCollectionIdentifyingFacetFactoryAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/PropertyOrCollectionIdentifyingFacetFactoryAbstract.java
index 8b80a27..e59da48 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/PropertyOrCollectionIdentifyingFacetFactoryAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/PropertyOrCollectionIdentifyingFacetFactoryAbstract.java
@@ -19,9 +19,8 @@
 
 package org.apache.isis.core.metamodel.facets;
 
-import java.util.EnumSet;
-
 import org.apache.isis.core.commons.collections.Can;
+import org.apache.isis.core.commons.collections.ImmutableEnumSet;
 import org.apache.isis.core.commons.internal.collections._Collections;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 
@@ -30,7 +29,7 @@ extends MethodPrefixBasedFacetFactoryAbstract
 implements PropertyOrCollectionIdentifyingFacetFactory {
 
     public PropertyOrCollectionIdentifyingFacetFactoryAbstract(
-            final EnumSet<FeatureType> featureTypes, 
+            final ImmutableEnumSet<FeatureType> featureTypes, 
             final Can<String> prefixes) {
         
         super(featureTypes, OrphanValidation.DONT_VALIDATE, prefixes);
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryJUnit4TestCase.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryJUnit4TestCase.java
index e284c7f..553334c 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryJUnit4TestCase.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryJUnit4TestCase.java
@@ -20,7 +20,6 @@
 package org.apache.isis.core.metamodel.facets;
 
 import java.lang.reflect.Method;
-import java.util.EnumSet;
 import java.util.Optional;
 
 import org.jmock.Expectations;
@@ -33,6 +32,9 @@ import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
+import org.apache.isis.core.commons.collections.ImmutableEnumSet;
+import org.apache.isis.core.internaltestsupport.jmocking.JUnitRuleMockery2;
+import org.apache.isis.core.internaltestsupport.jmocking.JUnitRuleMockery2.Mode;
 import org.apache.isis.core.metamodel.MetaModelContext_forTesting;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
@@ -49,8 +51,6 @@ import org.apache.isis.core.metamodel.spec.feature.OneToOneActionParameter;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.security.authentication.AuthenticationSessionProvider;
-import org.apache.isis.core.internaltestsupport.jmocking.JUnitRuleMockery2;
-import org.apache.isis.core.internaltestsupport.jmocking.JUnitRuleMockery2.Mode;
 
 public abstract class AbstractFacetFactoryJUnit4TestCase {
 
@@ -139,7 +139,7 @@ public abstract class AbstractFacetFactoryJUnit4TestCase {
         return Utils.contains(types, type);
     }
 
-    protected static boolean contains(final EnumSet<FeatureType> featureTypes, final FeatureType featureType) {
+    protected static boolean contains(final ImmutableEnumSet<FeatureType> featureTypes, final FeatureType featureType) {
         return Utils.contains(featureTypes, featureType);
     }
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryTest.java
index 8a47449..17049bf 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryTest.java
@@ -20,13 +20,14 @@
 package org.apache.isis.core.metamodel.facets;
 
 import java.lang.reflect.Method;
-import java.util.EnumSet;
 
 import org.jmock.Expectations;
 import org.junit.Rule;
 
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.services.i18n.TranslationService;
+import org.apache.isis.core.commons.collections.ImmutableEnumSet;
+import org.apache.isis.core.internaltestsupport.jmocking.JUnitRuleMockery2;
 import org.apache.isis.core.metamodel.MetaModelContext_forTesting;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.context.MetaModelContextAware;
@@ -38,7 +39,6 @@ import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.security.authentication.AuthenticationSession;
 import org.apache.isis.core.security.authentication.AuthenticationSessionProvider;
-import org.apache.isis.core.internaltestsupport.jmocking.JUnitRuleMockery2;
 
 import junit.framework.TestCase;
 
@@ -149,7 +149,7 @@ public abstract class AbstractFacetFactoryTest extends TestCase {
         return Utils.contains(types, type);
     }
 
-    protected static boolean contains(final EnumSet<FeatureType> featureTypes, final FeatureType featureType) {
+    protected static boolean contains(final ImmutableEnumSet<FeatureType> featureTypes, final FeatureType featureType) {
         return Utils.contains(featureTypes, featureType);
     }
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/Utils.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/Utils.java
index 42c1a64..870b4da 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/Utils.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/Utils.java
@@ -20,8 +20,8 @@
 package org.apache.isis.core.metamodel.facets;
 
 import java.lang.reflect.Method;
-import java.util.EnumSet;
 
+import org.apache.isis.core.commons.collections.ImmutableEnumSet;
 import org.apache.isis.core.commons.internal._Constants;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 
@@ -40,7 +40,7 @@ class Utils {
         return false;
     }
 
-    protected static boolean contains(EnumSet<FeatureType> featureTypes, final FeatureType featureType) {
+    protected static boolean contains(ImmutableEnumSet<FeatureType> featureTypes, final FeatureType featureType) {
         if(featureTypes==null || featureType==null) {
             return false;
         }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/facets/FacetsFacetAnnotationFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/facets/FacetsFacetAnnotationFactoryTest.java
index d6e9f00..07a2cf1 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/facets/FacetsFacetAnnotationFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/facets/FacetsFacetAnnotationFactoryTest.java
@@ -19,9 +19,8 @@
 
 package org.apache.isis.core.metamodel.facets.object.facets;
 
-import java.util.EnumSet;
-
 import org.apache.isis.applib.annotation.Facets;
+import org.apache.isis.core.commons.collections.ImmutableEnumSet;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryTest;
@@ -49,8 +48,8 @@ public class FacetsFacetAnnotationFactoryTest extends AbstractFacetFactoryTest {
 
     public static class CustomerFacetFactory implements FacetFactory {
         @Override
-        public EnumSet<FeatureType> getFeatureTypes() {
-            return null;
+        public ImmutableEnumSet<FeatureType> getFeatureTypes() {
+            return ImmutableEnumSet.noneOf(FeatureType.class);
         }
 
         @Override
@@ -68,8 +67,8 @@ public class FacetsFacetAnnotationFactoryTest extends AbstractFacetFactoryTest {
 
     public static class CustomerFacetFactory2 implements FacetFactory {
         @Override
-        public EnumSet<FeatureType> getFeatureTypes() {
-            return null;
+        public ImmutableEnumSet<FeatureType> getFeatureTypes() {
+            return ImmutableEnumSet.noneOf(FeatureType.class);
         }
 
         @Override
diff --git a/incubator/core/model/src/main/java/org/apache/isis/incubator/model/metamodel/facets/SupportingMethodValidatorRefinerFactory.java b/incubator/core/model/src/main/java/org/apache/isis/incubator/model/metamodel/facets/SupportingMethodValidatorRefinerFactory.java
index 44bd7cd..a7d6056 100644
--- a/incubator/core/model/src/main/java/org/apache/isis/incubator/model/metamodel/facets/SupportingMethodValidatorRefinerFactory.java
+++ b/incubator/core/model/src/main/java/org/apache/isis/incubator/model/metamodel/facets/SupportingMethodValidatorRefinerFactory.java
@@ -19,12 +19,12 @@
 package org.apache.isis.incubator.model.metamodel.facets;
 
 import java.lang.reflect.Method;
-import java.util.EnumSet;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 import java.util.stream.Collectors;
 
+import org.apache.isis.core.commons.collections.ImmutableEnumSet;
 import org.apache.isis.core.commons.internal.collections._Lists;
 import org.apache.isis.core.commons.internal.collections._Sets;
 import org.apache.isis.core.metamodel.commons.MethodUtil;
@@ -47,7 +47,7 @@ extends FacetFactoryAbstract
 implements MetaModelRefiner {
 
     public SupportingMethodValidatorRefinerFactory() {
-        super(EnumSet.noneOf(FeatureType.class)); // does not contribute any facets
+        super(ImmutableEnumSet.noneOf(FeatureType.class)); // does not contribute any facets
     }
 
     @Override