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