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();
}