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 2021/03/02 07:17:13 UTC
[isis] 05/11: ISIS-2553: using LogicalType instead of ObjectSpecId
(3rd iteration)
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
commit af65382c34efd4e13453301bc8fe6bdef31cfd4b
Author: Andi Huber <ah...@apache.org>
AuthorDate: Mon Mar 1 19:35:05 2021 +0100
ISIS-2553: using LogicalType instead of ObjectSpecId (3rd iteration)
---
.../java/org/apache/isis/applib/id/HasLogicalType.java | 3 +--
.../specimpl/ObjectSpecificationAbstract.java | 18 +++++-------------
.../isis/viewer/wicket/model/links/LinkAndLabel.java | 2 +-
.../viewer/wicket/model/models/ManagedObjectModel.java | 18 ++++++++++--------
.../isis/viewer/wicket/model/models/ScalarModel.java | 2 +-
5 files changed, 18 insertions(+), 25 deletions(-)
diff --git a/api/applib/src/main/java/org/apache/isis/applib/id/HasLogicalType.java b/api/applib/src/main/java/org/apache/isis/applib/id/HasLogicalType.java
index d840a16..60bd6f8 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/id/HasLogicalType.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/id/HasLogicalType.java
@@ -37,9 +37,8 @@ public interface HasLogicalType {
* bytecode enhancement.
*
* <p>
- * TODO[2553] ... no longer true
* The {@link ObjectSpecification} can be retrieved using
- * {@link SpecificationLoader#lookupBySpecIdElseLoad(String)}}.
+ * {@link SpecificationLoader#lookupBySpecIdElseLoad(String)}} passing the logical-type-name as argument.
*/
default String getLogicalTypeName() {
return getLogicalType().getLogicalTypeName();
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
index 5e6cb3c..17bc46a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
@@ -34,7 +34,6 @@ import javax.enterprise.inject.Vetoed;
import org.apache.isis.applib.Identifier;
import org.apache.isis.applib.id.LogicalType;
-import org.apache.isis.applib.id.ObjectSpecId;
import org.apache.isis.applib.services.metamodel.BeanSort;
import org.apache.isis.commons.collections.ImmutableEnumSet;
import org.apache.isis.commons.internal.base._Lazy;
@@ -186,7 +185,7 @@ implements ObjectSpecification {
private final boolean isAbstract;
// derived lazily, cached since immutable
- private _Lazy<ObjectSpecId> specIdLazy = _Lazy.threadSafe(this::lookupSpecId);
+ private _Lazy<LogicalType> logicalTypeLazy = _Lazy.threadSafe(this::lookupLogicalType);
private ObjectSpecification superclassSpec;
@@ -216,7 +215,7 @@ implements ObjectSpecification {
this.identifier = Identifier.classIdentifier(
LogicalType.lazy(
introspectedClass,
- ()->specIdLazy.get().asString()));
+ ()->logicalTypeLazy.get().getLogicalTypeName()));
this.facetProcessor = facetProcessor;
this.postProcessor = postProcessor;
@@ -228,24 +227,17 @@ implements ObjectSpecification {
return FeatureType.OBJECT;
}
-// @Override //TODO[2553]
-// @Deprecated //use getLogicalTypeName() instead
-// public ObjectSpecId getSpecId() {
-// return specIdLazy.get();
-// }
-
@Override
public LogicalType getLogicalType() {
- //TODO[2553] add memoization
- return LogicalType.eager(correspondingClass, specIdLazy.get().asString());
+ return logicalTypeLazy.get();
}
- private ObjectSpecId lookupSpecId() {
+ private LogicalType lookupLogicalType() {
val objectSpecIdFacet = getFacet(ObjectSpecIdFacet.class);
if(objectSpecIdFacet == null) {
throw new IllegalStateException("could not find an ObjectSpecIdFacet for " + this.getFullIdentifier());
}
- return objectSpecIdFacet.value();
+ return LogicalType.eager(correspondingClass, objectSpecIdFacet.value().asString());
}
/**
diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/links/LinkAndLabel.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/links/LinkAndLabel.java
index 0fd6e96..dd1acb4 100644
--- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/links/LinkAndLabel.java
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/links/LinkAndLabel.java
@@ -89,7 +89,7 @@ public final class LinkAndLabel extends LinkAndLabelAbstract {
this.named = target.getNamed();
this.actionHolder = (EntityModel) target.getActionHolder();
// make sure we do this without side-effects
- this.actionHolderLogicalType = actionHolder.getTypeOfSpecificationId()
+ this.actionHolderLogicalType = actionHolder.getLogicalElementType()
.orElseThrow(_Exceptions::unexpectedCodeReach);
this.objectActionId = target.getObjectAction().getId();
}
diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ManagedObjectModel.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ManagedObjectModel.java
index 41b3c53..0ead34e 100644
--- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ManagedObjectModel.java
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ManagedObjectModel.java
@@ -25,7 +25,6 @@ import javax.annotation.Nullable;
import org.apache.isis.applib.annotation.BookmarkPolicy;
import org.apache.isis.applib.id.LogicalType;
-import org.apache.isis.applib.id.ObjectSpecId;
import org.apache.isis.applib.services.bookmark.Bookmark;
import org.apache.isis.commons.internal.base._Casts;
import org.apache.isis.commons.internal.collections._Collections;
@@ -38,6 +37,7 @@ import org.apache.isis.core.runtime.context.IsisAppCommonContext;
import org.apache.isis.core.runtime.memento.ObjectMemento;
import lombok.NonNull;
+import lombok.Synchronized;
import lombok.val;
/**
@@ -104,7 +104,7 @@ extends ModelAbstract<ManagedObject> {
val pojos = adapter.getPojo();
memento = super.getMementoService()
- .mementoForPojos(_Casts.uncheckedCast(pojos), getTypeOfSpecificationId()
+ .mementoForPojos(_Casts.uncheckedCast(pojos), getLogicalElementType()
.orElseGet(()->adapter.getElementSpecification().get().getLogicalType()));
}
@@ -129,23 +129,25 @@ extends ModelAbstract<ManagedObject> {
/**
* free of side-effects, used for serialization
* @implNote overriding this must be consistent with {@link #getTypeOfSpecification()}
- * TODO[2553] rename to getLogicalElementType
*/
- public Optional<LogicalType> getTypeOfSpecificationId() {
+ public Optional<LogicalType> getLogicalElementType() {
return Optional.ofNullable(memento)
.map(ObjectMemento::getLogicalType);
}
private transient ObjectSpecification objectSpec;
+ private transient boolean isObjectSpecMemoized = false;
/**
* @implNote can be overridden by sub-models (eg {@link ScalarModel}) that know the type of
* the adapter without there being one. Overriding this must be consistent
- * with {@link #getTypeOfSpecificationId()}
+ * with {@link #getLogicalElementType()}
*/
+ @Synchronized
public ObjectSpecification getTypeOfSpecification() {
- if(objectSpec==null) {
- val specId = getTypeOfSpecificationId().orElse(null);
- objectSpec = super.getSpecificationLoader().lookupBySpecIdElseLoad(specId);
+ if(!isObjectSpecMemoized) {
+ val specId = getLogicalElementType().orElse(null);
+ objectSpec = super.getSpecificationLoader().lookupBySpecIdElseLoad(specId);
+ isObjectSpecMemoized = true;
}
return objectSpec;
}
diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
index dde6c25..9a881e6 100644
--- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
@@ -160,7 +160,7 @@ implements HasRenderingHints, ScalarUiModel, LinksProvider, FormExecutorContext
}
@Override
- public Optional<LogicalType> getTypeOfSpecificationId() {
+ public Optional<LogicalType> getLogicalElementType() {
return Optional.ofNullable(getScalarTypeSpec())
.map(ObjectSpecification::getLogicalType);
}