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