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

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


The following commit(s) were added to refs/heads/v3 by this push:
     new c517e418b10 CAUSEWAY-2297: ditch CollectionMemento (instead make 
one2many-assoc serializable)
c517e418b10 is described below

commit c517e418b10f906a66dfb00d0f76eb66ecc0ac27
Author: Andi Huber <[email protected]>
AuthorDate: Sat Nov 23 18:45:14 2024 +0100

    CAUSEWAY-2297: ditch CollectionMemento (instead make one2many-assoc
    serializable)
---
 .../spec/feature/OneToManyAssociation.java         |  8 ---
 .../spec/feature/memento/CollectionMemento.java    | 82 ----------------------
 .../specimpl/OneToManyAssociationDefault.java      | 31 +++++++-
 .../specimpl/OneToManyAssociationMixedIn.java      |  1 +
 .../domainmodel/DomainModelTest_serialization.java | 27 +++++--
 5 files changed, 52 insertions(+), 97 deletions(-)

diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/feature/OneToManyAssociation.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/feature/OneToManyAssociation.java
index 1ccd1f4667c..44c92221db7 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/feature/OneToManyAssociation.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/feature/OneToManyAssociation.java
@@ -23,18 +23,10 @@ import java.util.stream.Stream;
 import org.apache.causeway.commons.internal.compare._Comparators;
 import org.apache.causeway.commons.internal.functions._Predicates;
 import 
org.apache.causeway.core.metamodel.facets.members.layout.order.LayoutOrderFacet;
-import 
org.apache.causeway.core.metamodel.spec.feature.memento.CollectionMemento;
 
 public interface OneToManyAssociation
 extends ObjectAssociation, OneToManyFeature {
 
-    /**
-     * Returns a serializable representation of this collection.
-     */
-    default CollectionMemento getMemento() {
-        return CollectionMemento.forCollection(this);
-    }
-
     // -- ASSOCIATED ACTIONS
 
     /**
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/feature/memento/CollectionMemento.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/feature/memento/CollectionMemento.java
deleted file mode 100644
index 39b0a60fd2a..00000000000
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/spec/feature/memento/CollectionMemento.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.causeway.core.metamodel.spec.feature.memento;
-
-import java.io.Serializable;
-import java.util.function.Supplier;
-
-import org.apache.causeway.applib.Identifier;
-import org.apache.causeway.core.metamodel.spec.feature.OneToManyAssociation;
-import org.apache.causeway.core.metamodel.specloader.SpecificationLoader;
-
-import lombok.AccessLevel;
-import lombok.AllArgsConstructor;
-import lombok.EqualsAndHashCode;
-import lombok.Getter;
-import lombok.NonNull;
-import lombok.Synchronized;
-
-/**
- * {@link Serializable} representation of an {@link OneToManyAssociation}
- * (a parented collection of entities).
- *
- * @implNote thread-safe memoization
- *
- * @since 2.0 {index}
- */
-@EqualsAndHashCode
-@AllArgsConstructor(access = AccessLevel.PROTECTED)
-public class CollectionMemento implements Serializable {
-
-    private static final long serialVersionUID = 1L;
-
-    @EqualsAndHashCode.Include
-    @Getter private final Identifier identifier;
-
-    // -- FACTORY
-
-    public static CollectionMemento forCollection(final @NonNull 
OneToManyAssociation collection) {
-        return new CollectionMemento(
-                collection.getFeatureIdentifier(),
-                collection);
-    }
-
-    // -- LOAD/UNMARSHAL
-
-    @EqualsAndHashCode.Exclude
-    private transient OneToManyAssociation collection;
-
-    @Synchronized
-    public OneToManyAssociation getCollection(final @NonNull 
Supplier<SpecificationLoader> specLoader) {
-        if (collection == null) {
-            collection = specLoader.get()
-                    
.specForLogicalTypeElseFail(getIdentifier().getLogicalType())
-                    
.getCollectionElseFail(getIdentifier().getMemberLogicalName());
-        }
-        return collection;
-    }
-
-    // -- OBJECT CONTRACT
-
-    @Override
-    public String toString() {
-        return getIdentifier().getLogicalTypeName() + "#" + 
getIdentifier().getMemberLogicalName();
-    }
-
-}
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/specloader/specimpl/OneToManyAssociationDefault.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/specloader/specimpl/OneToManyAssociationDefault.java
index f9fbe8c06d4..fe3300b41c1 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/specloader/specimpl/OneToManyAssociationDefault.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/specloader/specimpl/OneToManyAssociationDefault.java
@@ -18,6 +18,10 @@
  */
 package org.apache.causeway.core.metamodel.specloader.specimpl;
 
+import java.io.InvalidObjectException;
+import java.io.ObjectInputStream;
+import java.io.Serializable;
+
 import org.apache.causeway.applib.Identifier;
 import org.apache.causeway.applib.annotation.Collection;
 import org.apache.causeway.applib.annotation.CollectionLayout;
@@ -27,6 +31,7 @@ import 
org.apache.causeway.commons.internal.exceptions._Exceptions;
 import 
org.apache.causeway.commons.internal.reflection._GenericResolver.ResolvedType;
 import org.apache.causeway.core.metamodel.commons.ToString;
 import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
+import org.apache.causeway.core.metamodel.context.MetaModelContext;
 import org.apache.causeway.core.metamodel.facetapi.FeatureType;
 import org.apache.causeway.core.metamodel.facets.FacetedMethod;
 import org.apache.causeway.core.metamodel.facets.collections.CollectionFacet;
@@ -45,7 +50,8 @@ import lombok.Getter;
 
 public class OneToManyAssociationDefault
 extends ObjectAssociationAbstract
-implements OneToManyAssociation {
+implements OneToManyAssociation, Serializable {
+    private static final long serialVersionUID = 1L;
 
     public static OneToManyAssociationDefault forMethod(final FacetedMethod 
facetedMethod) {
         return new OneToManyAssociationDefault(
@@ -193,4 +199,27 @@ implements OneToManyAssociation {
                 || methodFacade.synthesize(CollectionLayout.class).isPresent();
     }
 
+    // -- SERIALIZATION PROXY
+
+    protected final Object writeReplace() {
+        return new SerializationProxy(this);
+    }
+
+    protected final void readObject(final ObjectInputStream stream) throws 
InvalidObjectException {
+        throw new InvalidObjectException("Proxy required");
+    }
+
+    protected record SerializationProxy(Identifier identifier) implements 
Serializable {
+        SerializationProxy(final OneToManyAssociationDefault collection) {
+            this(collection.getFeatureIdentifier());
+        }
+        private Object readResolve() {
+            return MetaModelContext.instanceElseFail()
+                .getSpecificationLoader()
+                .specForLogicalTypeElseFail(identifier.getLogicalType())
+                .getCollectionElseFail(
+                        identifier.getMemberLogicalName());
+        }
+    }
+
 }
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/specloader/specimpl/OneToManyAssociationMixedIn.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/specloader/specimpl/OneToManyAssociationMixedIn.java
index 9355df2f50a..33a97ec2d1e 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/specloader/specimpl/OneToManyAssociationMixedIn.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/specloader/specimpl/OneToManyAssociationMixedIn.java
@@ -46,6 +46,7 @@ import lombok.Getter;
 public class OneToManyAssociationMixedIn
 extends OneToManyAssociationDefault
 implements MixedInMember {
+    private static final long serialVersionUID = 1L;
 
     // -- FACTORIES
 
diff --git 
a/regressiontests/domainmodel/src/test/java/org/apache/causeway/testdomain/domainmodel/DomainModelTest_serialization.java
 
b/regressiontests/domainmodel/src/test/java/org/apache/causeway/testdomain/domainmodel/DomainModelTest_serialization.java
index 7570c0fcf4d..10d589633e1 100644
--- 
a/regressiontests/domainmodel/src/test/java/org/apache/causeway/testdomain/domainmodel/DomainModelTest_serialization.java
+++ 
b/regressiontests/domainmodel/src/test/java/org/apache/causeway/testdomain/domainmodel/DomainModelTest_serialization.java
@@ -32,6 +32,8 @@ import 
org.apache.causeway.core.config.presets.CausewayPresets;
 import org.apache.causeway.core.metamodel.specloader.SpecificationLoader;
 import 
org.apache.causeway.core.metamodel.specloader.specimpl.ObjectActionDefault;
 import 
org.apache.causeway.core.metamodel.specloader.specimpl.ObjectActionMixedIn;
+import 
org.apache.causeway.core.metamodel.specloader.specimpl.OneToManyAssociationDefault;
+import 
org.apache.causeway.core.metamodel.specloader.specimpl.OneToManyAssociationMixedIn;
 import org.apache.causeway.testdomain.conf.Configuration_headless;
 import 
org.apache.causeway.testdomain.model.good.Configuration_usingValidDomain;
 import org.apache.causeway.testdomain.model.good.ProperMemberSupport;
@@ -44,7 +46,6 @@ import 
org.apache.causeway.testing.integtestsupport.applib.CausewayIntegrationTe
 
         },
         properties = {
-                
//"causeway.core.meta-model.introspector.policy=annotation_optional",
                 "causeway.core.meta-model.introspector.mode=FULL",
                 "causeway.applib.annotation.domain-object.editing=TRUE",
                 
"causeway.core.meta-model.validator.explicit-object-type=FALSE" // does not 
override any of the imports
@@ -60,17 +61,31 @@ class DomainModelTest_serialization extends 
CausewayIntegrationTestAbstract {
     @Test
     void objectActionDefault_shouldBe_Serializable() {
         var holderSpec = 
specificationLoader.specForTypeElseFail(ProperMemberSupport.class);
-        var act = (ObjectActionDefault) 
holderSpec.getDeclaredAction("hideMe").orElseThrow();
+        var act = (ObjectActionDefault) holderSpec.getActionElseFail("hideMe");
         assertEquals(ObjectActionDefault.class, act.getClass());
         _SerializationTester.assertEqualsOnRoundtrip(act);
     }
-
     @Test
     void objectActionMixedIn_shouldBe_Serializable() {
         var holderSpec = 
specificationLoader.specForTypeElseFail(ProperMemberSupport.class);
-        var mixin = (ObjectActionMixedIn) 
holderSpec.getDeclaredAction("openRestApi").orElseThrow(); // built-in mixin 
support
-        assertEquals(ObjectActionMixedIn.class, mixin.getClass());
-        _SerializationTester.assertEqualsOnRoundtrip(mixin);
+        var act = (ObjectActionMixedIn) 
holderSpec.getActionElseFail("action1");
+        assertEquals(ObjectActionMixedIn.class, act.getClass());
+        _SerializationTester.assertEqualsOnRoundtrip(act);
+    }
+
+    @Test
+    void oneToManyAssociationDefault_shouldBe_Serializable() {
+        var holderSpec = 
specificationLoader.specForTypeElseFail(ProperMemberSupport.class);
+        var coll = (OneToManyAssociationDefault) 
holderSpec.getCollectionElseFail("myColl");
+        assertEquals(OneToManyAssociationDefault.class, coll.getClass());
+        _SerializationTester.assertEqualsOnRoundtrip(coll);
+    }
+    @Test
+    void oneToManyAssociationMixedIn_shouldBe_Serializable() {
+        var holderSpec = 
specificationLoader.specForTypeElseFail(ProperMemberSupport.class);
+        var coll = (OneToManyAssociationMixedIn) 
holderSpec.getCollectionElseFail("collection1");
+        assertEquals(OneToManyAssociationMixedIn.class, coll.getClass());
+        _SerializationTester.assertEqualsOnRoundtrip(coll);
     }
 
 }

Reply via email to