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 2019/10/01 11:10:18 UTC

[isis] branch v2 updated: ISIS-2158: spec-loading: some refinement and polishing

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

ahuber pushed a commit to branch v2
in repository https://gitbox.apache.org/repos/asf/isis.git


The following commit(s) were added to refs/heads/v2 by this push:
     new 687291b  ISIS-2158: spec-loading: some refinement and polishing
687291b is described below

commit 687291bd3d7727530fa8cb077790e8c2d3dd9c98
Author: Andi Huber <ah...@apache.org>
AuthorDate: Tue Oct 1 13:10:08 2019 +0200

    ISIS-2158: spec-loading: some refinement and polishing
---
 .../DomainObjectAnnotationFacetFactory.java        |  2 +-
 .../ApplicationFeatureRepositoryDefault.java       |  2 +-
 .../services/layout/LayoutServiceDefault.java      |  2 +-
 .../services/metamodel/MetaModelExporter.java      |  2 +-
 .../metamodel/MetaModelServiceDefault.java         |  2 +-
 .../services/swagger/internal/Generation.java      |  4 +-
 .../isis/metamodel/spec/ObjectSpecification.java   |  7 +++
 .../metamodel/specloader/SpecificationLoader.java  |  5 +-
 .../specloader/SpecificationLoaderDefault.java     | 58 ++++++----------------
 .../specimpl/ObjectSpecificationAbstract.java      |  4 +-
 .../validator/MetaModelValidatorVisiting.java      |  2 +-
 .../ApplicationFeatureRepositoryDefaultTest.java   |  2 +-
 .../testspec/ObjectSpecificationStub.java          | 10 +++-
 .../system/session/IsisSessionFactoryDefault.java  |  2 +-
 .../validate/ValidateDomainModel.java              |  2 +-
 .../resources/DomainTypeResourceServerside.java    |  2 +-
 .../server/resources/HomePageReprRenderer.java     |  2 +-
 .../domainmodel/SpecloaderPerformanceTest.java     |  9 ++--
 18 files changed, 51 insertions(+), 68 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java
index 9ac97d0..e75f3d8 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java
@@ -510,7 +510,7 @@ implements MetaModelValidatorRefiner, PostConstructMethodCache, ObjectSpecIdFace
                 }
 
                 final Map<ObjectSpecId, ObjectSpecification> specById = _Maps.newHashMap();
-                for (final ObjectSpecification otherSpec : getSpecificationLoader().currentSpecifications()) {
+                for (final ObjectSpecification otherSpec : getSpecificationLoader().snapshotSpecifications()) {
 
                     if(thisSpec == otherSpec) {
                         continue;
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/appfeat/ApplicationFeatureRepositoryDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/appfeat/ApplicationFeatureRepositoryDefault.java
index 7a0578d..06bd936 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/appfeat/ApplicationFeatureRepositoryDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/appfeat/ApplicationFeatureRepositoryDefault.java
@@ -110,7 +110,7 @@ public class ApplicationFeatureRepositoryDefault implements ApplicationFeatureRe
     private Collection<ObjectSpecification> primeMetaModel() {
         serviceRegistry.streamRegisteredBeans()
         .forEach(bean->specificationLoader.loadSpecification(bean.getBeanClass()));
-        return specificationLoader.currentSpecifications();
+        return specificationLoader.snapshotSpecifications();
     }
 
     private void createApplicationFeaturesFor(final Collection<ObjectSpecification> specifications) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/layout/LayoutServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/layout/LayoutServiceDefault.java
index 29a60ec..0abe7df 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/layout/LayoutServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/layout/LayoutServiceDefault.java
@@ -85,7 +85,7 @@ public class LayoutServiceDefault implements LayoutService {
 
     @Override
     public byte[] toZip(final Style style) {
-        final Collection<ObjectSpecification> allSpecs = specificationLoader.currentSpecifications();
+        final Collection<ObjectSpecification> allSpecs = specificationLoader.snapshotSpecifications();
         final List<ObjectSpecification> domainObjectSpecs = _Lists
                 .filter(allSpecs, spec ->
                 !spec.isAbstract() &&
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/metamodel/MetaModelExporter.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/metamodel/MetaModelExporter.java
index 6c7648a..21caa92 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/metamodel/MetaModelExporter.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/metamodel/MetaModelExporter.java
@@ -82,7 +82,7 @@ class MetaModelExporter {
         // phase 1: create a domainClassType for each ObjectSpecification
         // these are added into a map for lookups in phase 2
         final Map<ObjectSpecification, DomainClassDto> domainClassByObjectSpec = _Maps.newHashMap();
-        for (final ObjectSpecification specification : specificationLookup.currentSpecifications()) {
+        for (final ObjectSpecification specification : specificationLookup.snapshotSpecifications()) {
             DomainClassDto domainClassType = asXsdType(specification, config);
             domainClassByObjectSpec.put(specification, domainClassType);
         }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/metamodel/MetaModelServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/metamodel/MetaModelServiceDefault.java
index 87b0705..3a3362c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/metamodel/MetaModelServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/metamodel/MetaModelServiceDefault.java
@@ -97,7 +97,7 @@ public class MetaModelServiceDefault implements MetaModelService {
     @Override
     public DomainModel getDomainModel() {
 
-        final Collection<ObjectSpecification> specifications = specificationLoader.currentSpecifications();
+        final Collection<ObjectSpecification> specifications = specificationLoader.snapshotSpecifications();
 
         final List<DomainMember> rows = _Lists.newArrayList();
         for (final ObjectSpecification spec : specifications) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/Generation.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/Generation.java
index fcb4e35..ac422b8 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/Generation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/Generation.java
@@ -128,7 +128,7 @@ class Generation {
     void appendServicePathsAndDefinitions() {
         // (previously we took a protective copy to avoid a concurrent modification exception,
         // but this is now done by SpecificationLoader itself)
-        for (val spec : specificationLoader.currentSpecifications()) {
+        for (val spec : specificationLoader.snapshotSpecifications()) {
 
             val domainServiceFacet = spec.getFacet(DomainServiceFacet.class);
             if (domainServiceFacet == null) {
@@ -180,7 +180,7 @@ class Generation {
     void appendObjectPathsAndDefinitions() {
         // (previously we took a protective copy to avoid a concurrent modification exception,
         // but this is now done by SpecificationLoader itself)
-        for (final ObjectSpecification objectSpec : specificationLoader.currentSpecifications()) {
+        for (final ObjectSpecification objectSpec : specificationLoader.snapshotSpecifications()) {
 
             final DomainServiceFacet domainServiceFacet = objectSpec.getFacet(DomainServiceFacet.class);
             if (domainServiceFacet != null) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/ObjectSpecification.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/ObjectSpecification.java
index 27f5e1b..3bb747c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/ObjectSpecification.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/ObjectSpecification.java
@@ -58,6 +58,7 @@ import org.apache.isis.metamodel.spec.feature.ObjectAssociationContainer;
 import org.apache.isis.metamodel.spec.feature.ObjectMember;
 import org.apache.isis.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.metamodel.specloader.classsubstitutor.ClassSubstitutor;
+import org.apache.isis.metamodel.specloader.specimpl.IntrospectionState;
 import org.apache.isis.metamodel.specloader.specimpl.MixedInMember;
 import org.apache.isis.security.authentication.AuthenticationSession;
 
@@ -427,5 +428,11 @@ ObjectAssociationContainer, Hierarchical,  DefaultProvider {
         
     }
 
+    /**
+     * Introspecting up to the level required.
+     * @since 2.0
+     */
+    void introspectUpTo(IntrospectionState upTo);
+
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/SpecificationLoader.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/SpecificationLoader.java
index 0a99de1..9534e44 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/SpecificationLoader.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/SpecificationLoader.java
@@ -18,6 +18,7 @@
  */
 package org.apache.isis.metamodel.specloader;
 
+import java.util.Collection;
 import java.util.List;
 
 import javax.annotation.Nullable;
@@ -52,9 +53,9 @@ public interface SpecificationLoader {
      *     ObjectSpec's being discovered, eg performing metamodel validation.
      * </p>
      * 
-     * @return snapshot of all the (currently) loaded specifications
+     * @return (defensive-copy) snapshot of all the (currently) loaded specifications
      */
-    List<ObjectSpecification> currentSpecifications();
+    Collection<ObjectSpecification> snapshotSpecifications();
 
     /**
      * Lookup a specification that has bean loaded before.
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/SpecificationLoaderDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/SpecificationLoaderDefault.java
index 53b1aa3..751fb93 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/SpecificationLoaderDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/SpecificationLoaderDefault.java
@@ -46,7 +46,6 @@ import org.apache.isis.metamodel.specloader.facetprocessor.FacetProcessor;
 import org.apache.isis.metamodel.specloader.postprocessor.PostProcessor;
 import org.apache.isis.metamodel.specloader.specimpl.FacetedMethodsBuilderContext;
 import org.apache.isis.metamodel.specloader.specimpl.IntrospectionState;
-import org.apache.isis.metamodel.specloader.specimpl.ObjectSpecificationAbstract;
 import org.apache.isis.metamodel.specloader.specimpl.dflt.ObjectSpecificationDefault;
 import org.apache.isis.metamodel.specloader.specimpl.standalonelist.ObjectSpecificationOnStandaloneList;
 import org.apache.isis.metamodel.specloader.validator.MetaModelValidator;
@@ -85,7 +84,7 @@ public class SpecificationLoaderDefault implements SpecificationLoader {
 
 
     private MetaModelValidator metaModelValidator;
-    private final SpecificationCacheDefault<ObjectSpecificationAbstract> cache = 
+    private final SpecificationCacheDefault<ObjectSpecification> cache = 
             new SpecificationCacheDefault<>();
     private PostProcessor postProcessor;
 
@@ -140,18 +139,17 @@ public class SpecificationLoaderDefault implements SpecificationLoader {
         postProcessor.init();
         metaModelValidator.init();
 
-
         // need to completely load services and mixins (synchronously)
         log.info("Loading all specs (up to state of {})", IntrospectionState.NOT_INTROSPECTED);
 
         val typeRegistry = IsisBeanTypeRegistry.current();
 
-        val specificationsFromRegistry = _Lists.<ObjectSpecificationAbstract>newArrayList();
-        val domainServiceSpecs = _Lists.<ObjectSpecificationAbstract>newArrayList();
-        val mixinSpecs = _Lists.<ObjectSpecificationAbstract>newArrayList();
+        val specificationsFromRegistry = _Lists.<ObjectSpecification>newArrayList();
+        val domainServiceSpecs = _Lists.<ObjectSpecification>newArrayList();
+        val mixinSpecs = _Lists.<ObjectSpecification>newArrayList();
 
         CommonDtoUtils.VALUE_TYPES.forEach(type->{
-            val spec = internalLoadSpecificationOrNull(type, IntrospectionState.NOT_INTROSPECTED);
+            val spec = loadSpecification(type, IntrospectionState.NOT_INTROSPECTED);
             if(spec!=null) specificationsFromRegistry.add(spec);
         });
 
@@ -160,7 +158,7 @@ public class SpecificationLoaderDefault implements SpecificationLoader {
             val type = entry.getKey();
             val sort = entry.getValue(); 
 
-            val spec = internalLoadSpecificationOrNull(type, IntrospectionState.NOT_INTROSPECTED);
+            val spec = loadSpecification(type, IntrospectionState.NOT_INTROSPECTED);
             if(spec!=null) specificationsFromRegistry.add(spec);
 
             switch (sort) {
@@ -174,7 +172,7 @@ public class SpecificationLoaderDefault implements SpecificationLoader {
                 return;
             case ENTITY:
                 typeRegistry.getEntityTypes().add(type);
-                mixinSpecs.add(spec);
+                mixinSpecs.add(spec); //XXX why?
                 return;
             case VIEW_MODEL:
                 typeRegistry.getViewModelTypes().add(type);
@@ -257,7 +255,7 @@ public class SpecificationLoaderDefault implements SpecificationLoader {
         loadSpecification(domainType);
     }
 
-    @Override
+    @Override @Nullable
     public ObjectSpecification loadSpecification(@Nullable final Class<?> type, final IntrospectionState upTo) {
 
         if(type==null) {
@@ -266,31 +264,6 @@ public class SpecificationLoaderDefault implements SpecificationLoader {
 
         requires(upTo, "upTo");
 
-        val spec = internalLoadSpecificationOrNull(type, upTo);
-        if(spec == null) {
-            return null;
-        }
-
-        // TODO: review, is this now needed?
-        //  We now create the ObjectSpecIdFacet immediately after creating the ObjectSpecification,
-        //  so the cache shouldn't need updating here also.
-        if(cache.isInitialized()) {
-            // umm.  It turns out that anonymous inner classes (eg org.estatio.dom.WithTitleGetter$ToString$1)
-            // don't have an ObjectSpecId; hence the guard.
-            if(spec.containsDoOpFacet(ObjectSpecIdFacet.class)) {
-                val specId = spec.getSpecId();
-                if (cache.getByObjectType(specId) == null) {
-                    cache.recache(spec);
-                }
-            }
-        }
-        return spec;
-    }
-
-    private ObjectSpecificationAbstract internalLoadSpecificationOrNull(
-            final Class<?> type,
-            final IntrospectionState upTo) {
-
         val substitutedType = classSubstitutor.getClass(type);
         if (substitutedType == null) {
             return null;
@@ -298,7 +271,7 @@ public class SpecificationLoaderDefault implements SpecificationLoader {
 
         val typeName = substitutedType.getName();
 
-        final ObjectSpecificationAbstract cachedSpec;
+        final ObjectSpecification cachedSpec;
         
         //XXX don't block on long running code ... 'spec.introspectUpTo(upTo);'
         synchronized (cache) {
@@ -307,14 +280,13 @@ public class SpecificationLoaderDefault implements SpecificationLoader {
         
         cachedSpec.introspectUpTo(upTo);
         return cachedSpec; 
-            
     }
 
     // -- LOOKUP
 
     @Override
-    public List<ObjectSpecification> currentSpecifications() {
-        return _Casts.uncheckedCast(cache.snapshotSpecs());
+    public Collection<ObjectSpecification> snapshotSpecifications() {
+        return cache.snapshotSpecs();
     }
 
     @Override
@@ -337,10 +309,10 @@ public class SpecificationLoaderDefault implements SpecificationLoader {
     /**
      * Creates the appropriate type of {@link ObjectSpecification}.
      */
-    private ObjectSpecificationAbstract createSpecification(final Class<?> cls) {
+    private ObjectSpecification createSpecification(final Class<?> cls) {
 
         // ... and create the specs
-        final ObjectSpecificationAbstract objectSpec;
+        final ObjectSpecification objectSpec;
         if (FreeStandingList.class.isAssignableFrom(cls)) {
 
             objectSpec = new ObjectSpecificationOnStandaloneList(facetProcessor, postProcessor);
@@ -400,7 +372,7 @@ public class SpecificationLoaderDefault implements SpecificationLoader {
     }
 
     private void introspect(
-            final Collection<ObjectSpecificationAbstract> specs, 
+            final Collection<ObjectSpecification> specs, 
             final IntrospectionState upTo) {
 
         val isConcurrentFromConfig = configuration.getReflector().getIntrospector().isParallelize();
@@ -450,7 +422,7 @@ public class SpecificationLoaderDefault implements SpecificationLoader {
 
 
     private void recache(final ObjectSpecification newSpec) {
-        cache.recache((ObjectSpecificationAbstract)newSpec);
+        cache.recache(newSpec);
     }
 
     // -- DEPS
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
index 85c7ad7..e5c2132 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
@@ -267,9 +267,7 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
         return fullName;
     }
 
-    /**
-     * Keeps introspecting up to the level required.
-     */
+    @Override
     public void introspectUpTo(final IntrospectionState upTo) {
         
         if(!isLessThan(upTo)) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/validator/MetaModelValidatorVisiting.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/validator/MetaModelValidatorVisiting.java
index a0db60f..8269ef3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/validator/MetaModelValidatorVisiting.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/validator/MetaModelValidatorVisiting.java
@@ -67,7 +67,7 @@ public class MetaModelValidatorVisiting extends MetaModelValidatorAbstract {
         // all currently known specs
         // (previously we took a protective copy to avoid a concurrent modification exception,
         // but this is now done by SpecificationLoader itself)
-        final Collection<ObjectSpecification> specsToValidate = getSpecificationLoader().currentSpecifications();
+        final Collection<ObjectSpecification> specsToValidate = getSpecificationLoader().snapshotSpecifications();
 
         // don't validate any specs already processed
         specsToValidate.removeAll(specsAlreadyValidated);
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/services/appfeat/ApplicationFeatureRepositoryDefaultTest.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/services/appfeat/ApplicationFeatureRepositoryDefaultTest.java
index f04f396..0443f14 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/services/appfeat/ApplicationFeatureRepositoryDefaultTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/services/appfeat/ApplicationFeatureRepositoryDefaultTest.java
@@ -269,7 +269,7 @@ public class ApplicationFeatureRepositoryDefaultTest {
                 allowing(mockServiceRegistry).streamRegisteredBeans();
                 will(returnValue(_Lists.newArrayList().stream()));
 
-                allowing(mockSpecificationLoader).currentSpecifications();
+                allowing(mockSpecificationLoader).snapshotSpecifications();
                 will(returnValue(_Lists.newArrayList()));
             }});
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/testspec/ObjectSpecificationStub.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/testspec/ObjectSpecificationStub.java
index 5d22d6f..a3706c7 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/testspec/ObjectSpecificationStub.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/testspec/ObjectSpecificationStub.java
@@ -45,6 +45,7 @@ import org.apache.isis.metamodel.spec.feature.Contributed;
 import org.apache.isis.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.metamodel.spec.feature.ObjectAssociation;
 import org.apache.isis.metamodel.spec.feature.ObjectMember;
+import org.apache.isis.metamodel.specloader.specimpl.IntrospectionState;
 import org.apache.isis.security.authentication.AuthenticationSession;
 
 public class ObjectSpecificationStub extends FacetHolderImpl implements ObjectSpecification {
@@ -330,12 +331,17 @@ public class ObjectSpecificationStub extends FacetHolderImpl implements ObjectSp
 
     @Override
     public BeanSort getBeanSort() {
-        return BeanSort.UNKNOWN; // [2033] not implemented yet
+        return BeanSort.UNKNOWN; // [2158] not implemented yet
     }
 
     @Override
     public boolean isExcludedFromMetamodel() {
-        return false; // [2133] not implemented yet
+        return false; // [2158] not implemented yet
+    }
+
+    @Override
+    public void introspectUpTo(IntrospectionState upTo) {
+        // [2158] not implemented yet
     }
 
 }
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/system/session/IsisSessionFactoryDefault.java b/core/runtime/src/main/java/org/apache/isis/runtime/system/session/IsisSessionFactoryDefault.java
index 5dc5554..1495979 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/system/session/IsisSessionFactoryDefault.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/system/session/IsisSessionFactoryDefault.java
@@ -173,7 +173,7 @@ public class IsisSessionFactoryDefault implements IsisSessionFactory {
 
         // (previously we took a protective copy to avoid a concurrent modification exception,
         // but this is now done by SpecificationLoader itself)
-        for (final ObjectSpecification objSpec : IsisContext.getSpecificationLoader().currentSpecifications()) {
+        for (final ObjectSpecification objSpec : IsisContext.getSpecificationLoader().snapshotSpecifications()) {
             final Class<?> correspondingClass = objSpec.getCorrespondingClass();
             if(correspondingClass.isEnum()) {
                 final Object[] enumConstants = correspondingClass.getEnumConstants();
diff --git a/core/testsupport/integtestsupport/src/main/java/org/apache/isis/integtestsupport/validate/ValidateDomainModel.java b/core/testsupport/integtestsupport/src/main/java/org/apache/isis/integtestsupport/validate/ValidateDomainModel.java
index 368928c..e9989da 100644
--- a/core/testsupport/integtestsupport/src/main/java/org/apache/isis/integtestsupport/validate/ValidateDomainModel.java
+++ b/core/testsupport/integtestsupport/src/main/java/org/apache/isis/integtestsupport/validate/ValidateDomainModel.java
@@ -54,7 +54,7 @@ public class ValidateDomainModel implements Runnable {
         val specificationLoader = IsisContext.getSpecificationLoader();
         this.validationFailures = specificationLoader.validate();
 
-        val objectSpecifications = specificationLoader.currentSpecifications();
+        val objectSpecifications = specificationLoader.snapshotSpecifications();
         
         if(log.isDebugEnabled()) {
             for (ObjectSpecification objectSpecification : objectSpecifications) {
diff --git a/core/viewer-restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainTypeResourceServerside.java b/core/viewer-restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainTypeResourceServerside.java
index 6aadcde..6a6d727 100644
--- a/core/viewer-restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainTypeResourceServerside.java
+++ b/core/viewer-restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainTypeResourceServerside.java
@@ -82,7 +82,7 @@ public class DomainTypeResourceServerside extends ResourceAbstract implements Do
         final RepresentationType representationType = RepresentationType.TYPE_LIST;
         init(representationType, Where.ANYWHERE, RepresentationService.Intent.NOT_APPLICABLE);
 
-        final Collection<ObjectSpecification> allSpecifications = getSpecificationLoader().currentSpecifications();
+        final Collection<ObjectSpecification> allSpecifications = getSpecificationLoader().snapshotSpecifications();
 
         final TypeListReprRenderer renderer = new TypeListReprRenderer(getResourceContext(), null, JsonRepresentation.newMap());
         renderer.with(allSpecifications).includesSelf();
diff --git a/core/viewer-restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/HomePageReprRenderer.java b/core/viewer-restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/HomePageReprRenderer.java
index 471552e..29c5b0b 100644
--- a/core/viewer-restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/HomePageReprRenderer.java
+++ b/core/viewer-restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/HomePageReprRenderer.java
@@ -64,7 +64,7 @@ public class HomePageReprRenderer extends ReprRendererAbstract<HomePageReprRende
         addLinkToMenuBars();
         addLinkToServices(metaModelContext.streamServiceAdapters());
         addLinkToVersion();
-        addLinkToDomainTypes(((ResourceContext)getRendererContext()).getSpecificationLoader().currentSpecifications());
+        addLinkToDomainTypes(((ResourceContext)getRendererContext()).getSpecificationLoader().snapshotSpecifications());
 
         // inks and extensions
         representation.mapPut("extensions", JsonRepresentation.newMap());
diff --git a/examples/smoketests/src/test/java/org/apache/isis/testdomain/domainmodel/SpecloaderPerformanceTest.java b/examples/smoketests/src/test/java/org/apache/isis/testdomain/domainmodel/SpecloaderPerformanceTest.java
index dab5cfe..a488140 100644
--- a/examples/smoketests/src/test/java/org/apache/isis/testdomain/domainmodel/SpecloaderPerformanceTest.java
+++ b/examples/smoketests/src/test/java/org/apache/isis/testdomain/domainmodel/SpecloaderPerformanceTest.java
@@ -24,15 +24,13 @@ import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.TestPropertySource;
 
+import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.config.IsisPresets;
-import org.apache.isis.integtestsupport.validate.ValidateDomainModel;
 import org.apache.isis.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.testdomain.Smoketest;
 import org.apache.isis.testdomain.conf.Configuration_headless;
 import org.apache.isis.testdomain.model.good.Configuration_usingValidDomain;
 
-import lombok.val;
-
 @Smoketest
 @SpringBootTest(
         classes = { 
@@ -50,11 +48,12 @@ import lombok.val;
 })
 class SpecloaderPerformanceTest {
     
+    @Inject private IsisConfiguration config;
     @Inject private SpecificationLoader specificationLoader;
     
-    //@Test under constr.
+    @Test //under constr.
     void repeatedSpecloading() {
-           
+        
         specificationLoader.shutdown();
         specificationLoader.init();
     }