This is an automated email from the ASF dual-hosted git repository.
ahuber pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/causeway.git
The following commit(s) were added to refs/heads/main by this push:
new 78e5c4824f5 CAUSEWAY-3859: Java record refactoring (part 51)
78e5c4824f5 is described below
commit 78e5c4824f534855ca48c861bae440f8ca06f8ed
Author: Andi Huber <[email protected]>
AuthorDate: Wed Feb 26 12:39:03 2025 +0100
CAUSEWAY-3859: Java record refactoring (part 51)
---
.../metamodel/object/BookmarkedObjectHolder.java | 85 +++++++++++
.../wicket/model/models/ManagedObjectModel.java | 165 ---------------------
.../viewer/wicket/model/models/UiObjectWkt.java | 4 +-
.../model/models/coll/CollectionModelAbstract.java | 4 +-
.../models/interaction/BookmarkedObjectWkt.java | 46 +++---
.../interaction/HasBookmarkedOwnerAbstract.java | 4 +-
6 files changed, 110 insertions(+), 198 deletions(-)
diff --git
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/BookmarkedObjectHolder.java
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/BookmarkedObjectHolder.java
new file mode 100644
index 00000000000..89b1aa334b3
--- /dev/null
+++
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/BookmarkedObjectHolder.java
@@ -0,0 +1,85 @@
+/*
+ * 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.object;
+
+import java.io.Serializable;
+import java.util.Objects;
+
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
+import org.apache.causeway.applib.services.bookmark.Bookmark;
+import org.apache.causeway.core.metamodel.context.MetaModelContext;
+import org.apache.causeway.core.metamodel.objectmanager.ObjectManager;
+
+/**
+ * Transiently holds a detachable {@link ManagedObject},
+ * that is lazily created based on the given immutable {@link Bookmark}.
+ */
+public final class BookmarkedObjectHolder implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ private final Bookmark bookmark;
+ private transient ManagedObject managedObject;
+
+ public BookmarkedObjectHolder(final @NonNull Bookmark bookmark, final
@Nullable ManagedObject managedObject) {
+ this.bookmark = bookmark;
+ this.managedObject = managedObject;
+ }
+
+ public Bookmark bookmark() {
+ return bookmark;
+ }
+
+ public ManagedObject managedObject() {
+ return managedObject!=null
+ ? managedObject
+ : (this.managedObject =
objectManager().loadObjectElseFail(bookmark));
+ }
+
+ public void detach() {
+ this.managedObject = null;
+ }
+
+ // -- CONTRACT
+
+ @Override
+ public final int hashCode() {
+ return bookmark.hashCode();
+ }
+
+ @Override
+ public final boolean equals(final Object obj) {
+ return obj instanceof BookmarkedObjectHolder other
+ ? Objects.equals(this.bookmark, other.bookmark)
+ : false;
+ }
+
+ @Override
+ public String toString() {
+ return "ManagedObjectHolder[%s]".formatted(bookmark);
+ }
+
+ // -- HELPER
+
+ private ObjectManager objectManager() {
+ return MetaModelContext.instanceElseFail().getObjectManager();
+ }
+
+}
diff --git
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/ManagedObjectModel.java
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/ManagedObjectModel.java
deleted file mode 100644
index 04dfd099106..00000000000
---
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/ManagedObjectModel.java
+++ /dev/null
@@ -1,165 +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.viewer.wicket.model.models;
-
-import java.util.Objects;
-import java.util.Optional;
-
-import org.jspecify.annotations.Nullable;
-
-import org.apache.causeway.applib.id.LogicalType;
-import org.apache.causeway.applib.services.bookmark.Bookmark;
-import org.apache.causeway.core.metamodel.object.ManagedObject;
-import org.apache.causeway.core.metamodel.object.ManagedObjects;
-import org.apache.causeway.core.metamodel.object.PackedManagedObject;
-import org.apache.causeway.core.metamodel.objectmanager.memento.ObjectMemento;
-import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
-
-import lombok.Synchronized;
-
-/**
- * @since 2.0
- */
-public final class ManagedObjectModel
-extends ModelAbstract<ManagedObject> {
-
- private static final long serialVersionUID = 1L;
-
- private ObjectMemento memento;
-
- protected ManagedObjectModel() {
- this(null);
- }
-
- protected ManagedObjectModel(
- final @Nullable ObjectMemento initialMemento) {
- super();
- this.memento = initialMemento;
- }
-
- @Override
- protected ManagedObject load() {
- if (memento == null) {
- return null;
- }
- return getObjectManager().demementify(memento);
- }
-
- @Override
- public void setObject(final ManagedObject adapter) {
-
- if(ManagedObjects.isNullOrUnspecifiedOrEmpty(adapter)) {
- super.setObject(null);
- memento = null;
- return;
- }
-
- super.setObject(adapter);
-
- if(adapter instanceof PackedManagedObject) {
- setObjectCollection((PackedManagedObject)adapter);
- } else {
- memento = adapter.getMemento().orElseThrow();
- }
- }
-
- public void setObjectCollection(final PackedManagedObject adapter) {
-
- if(ManagedObjects.isNullOrUnspecifiedOrEmpty(adapter)) {
- super.setObject(null);
- memento = null;
- return;
- }
-
- super.setObject(adapter);
- memento = adapter.getMemento().orElseThrow();
- }
-
- public final Bookmark asBookmarkIfSupported() {
- return memento!=null
- ? memento.bookmark()
- : null;
- }
-
- public final String oidStringIfSupported() {
- return memento!=null
- ? memento.toString()
- : null;
- }
-
- /**
- * free of side-effects, used for serialization
- * @implNote overriding this must be consistent with {@link
#getTypeOfSpecification()}
- */
- public Optional<LogicalType> getLogicalElementType() {
- return Optional.ofNullable(memento)
- .map(ObjectMemento::logicalType);
- }
-
- private transient ObjectSpecification elementTypeSpec;
- private transient boolean isObjectSpecMemoized = false;
- /**
- * @implNote can be overridden by sub-models (eg {@link UiAttributeWkt})
that know the type of
- * the adapter without there being one. Overriding this must be consistent
- * with {@link #getLogicalElementType()}
- */
- @Synchronized
- public ObjectSpecification getTypeOfSpecification() {
- if(!isObjectSpecMemoized) {
- var logicalType = getLogicalElementType().orElse(null);
- elementTypeSpec =
super.getSpecificationLoader().specForLogicalType(logicalType).orElse(null);
- isObjectSpecMemoized = true;
- }
- return elementTypeSpec;
- }
-
- public boolean isEmpty() {
- return memento == null;
- }
-
- // -- CONTRACT
-
- @Override
- public final int hashCode() {
- return Objects.hashCode(memento);
- }
-
- @Override
- public final boolean equals(final Object obj) {
- if(obj instanceof ManagedObjectModel) {
- var other = (ManagedObjectModel) obj;
- return Objects.equals(this.memento, other.memento);
- }
- return false;
- }
-
- // -- DEPRECATIONS
-
-// private ObjectMemento memento() {
-// return memento;
-// }
-//
-// private void memento(final ObjectMemento memento) {
-// var manageObject =
super.getMetaModelContext().reconstructObject(memento);
-// super.setObject(manageObject);
-// this.memento = memento;
-// this.elementTypeSpec = null; // invalidate
-// }
-
-}
diff --git
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/UiObjectWkt.java
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/UiObjectWkt.java
index fefef975110..065d3360c3d 100644
---
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/UiObjectWkt.java
+++
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/UiObjectWkt.java
@@ -225,11 +225,11 @@ public UiAttributeWkt getPropertyModel(
// (that is loading entities only if required),
// this guard only triggers, once the first property model gets looked
up;
// in other words: this guard only works if every entity has at least
a property
- var ownerPojo = bookmarkedObjectModel.asManagedObject()
+ var ownerPojo = bookmarkedObjectModel.managedObject()
.getPojo();
if(ownerPojo==null) {
throw new ObjectNotFoundException(
- bookmarkedObjectModel.getBookmark().identifier());
+ bookmarkedObjectModel.bookmark().identifier());
}
var propIdentifier = property.getFeatureIdentifier();
diff --git
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/coll/CollectionModelAbstract.java
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/coll/CollectionModelAbstract.java
index c2b4f6c658b..3935c887441 100644
---
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/coll/CollectionModelAbstract.java
+++
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/coll/CollectionModelAbstract.java
@@ -70,7 +70,7 @@ protected CollectionModelAbstract(
@Override
protected DataTableInteractive load() {
- var tableInteractive =
tableMemento.getDataTableModel(bookmarkedObject.asManagedObject());
+ var tableInteractive =
tableMemento.getDataTableModel(bookmarkedObject.managedObject());
tableMemento.setupBindings(tableInteractive);
return tableInteractive;
}
@@ -98,7 +98,7 @@ public Identifier getIdentifier() {
@Override
public final ManagedObject getParentObject() {
- return bookmarkedObject.asManagedObject();
+ return bookmarkedObject.managedObject();
}
/* XXX[CAUSEWAY-3798] do not override (as it was for the hidden table)
diff --git
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/interaction/BookmarkedObjectWkt.java
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/interaction/BookmarkedObjectWkt.java
index 645c9d27580..fe184a6f69a 100644
---
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/interaction/BookmarkedObjectWkt.java
+++
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/interaction/BookmarkedObjectWkt.java
@@ -18,59 +18,51 @@
*/
package org.apache.causeway.viewer.wicket.model.models.interaction;
+import org.apache.wicket.model.IModel;
+import org.jspecify.annotations.NonNull;
import org.jspecify.annotations.Nullable;
import org.apache.causeway.applib.services.bookmark.Bookmark;
import org.apache.causeway.commons.internal.exceptions._Exceptions;
import org.apache.causeway.core.metamodel.object.ManagedObject;
-import org.apache.causeway.viewer.wicket.model.models.ModelAbstract;
-
-import lombok.Getter;
-import org.jspecify.annotations.NonNull;
+import org.apache.causeway.core.metamodel.object.BookmarkedObjectHolder;
-public final class BookmarkedObjectWkt
-extends ModelAbstract<ManagedObject> {
-
- private static final long serialVersionUID = 1L;
- @Getter private final @NonNull Bookmark bookmark;
+public record BookmarkedObjectWkt(
+ @NonNull BookmarkedObjectHolder moHolder)
+implements IModel<ManagedObject> {
/** overwrites any current cache entry, only safe when no other
views/models reference the same ManagedObject */
public static BookmarkedObjectWkt ofAdapter(
final @NonNull ManagedObject domainObject) {
var bookmark = domainObject.getBookmarkElseFail();
- return new BookmarkedObjectWkt(bookmark, domainObject);
+ return new BookmarkedObjectWkt(new BookmarkedObjectHolder(bookmark,
domainObject));
}
public static BookmarkedObjectWkt ofBookmark(final @Nullable Bookmark
bookmark) {
- return new BookmarkedObjectWkt(bookmark);
+ return new BookmarkedObjectWkt(new BookmarkedObjectHolder(bookmark,
null));
}
- private BookmarkedObjectWkt(final @NonNull Bookmark bookmark) {
- super();
- this.bookmark = bookmark;
+ public Bookmark bookmark() {
+ return moHolder.bookmark();
}
- private BookmarkedObjectWkt(
- final @NonNull Bookmark bookmark,
- final @Nullable ManagedObject domainObject) {
- super(domainObject);
- this.bookmark = bookmark;
+ public ManagedObject managedObject() {
+ return moHolder.managedObject();
}
- public final ManagedObject asManagedObject() {
- var entityOrViewmodel = super.getObject();
- return entityOrViewmodel;
+ @Override
+ public ManagedObject getObject() {
+ return managedObject();
}
@Override
- public final void setObject(final ManagedObject object) {
- throw _Exceptions.unsupportedOperation("ManagedObjectWkt is
immuatable");
+ public void setObject(final ManagedObject object) {
+ throw _Exceptions.unsupportedOperation("BookmarkedObjectWkt is
immuatable");
}
@Override
- protected final ManagedObject load() {
- var adapter =
getMetaModelContext().getObjectManager().loadObjectElseFail(bookmark);
- return adapter;
+ public void detach() {
+ moHolder.detach();
}
}
diff --git
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/interaction/HasBookmarkedOwnerAbstract.java
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/interaction/HasBookmarkedOwnerAbstract.java
index d8ae56b384d..49ade1b5d58 100644
---
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/interaction/HasBookmarkedOwnerAbstract.java
+++
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/interaction/HasBookmarkedOwnerAbstract.java
@@ -39,12 +39,12 @@ public abstract class HasBookmarkedOwnerAbstract<T>
@Override
public final Bookmark getOwnerBookmark() {
- return bookmarkedObject.getBookmark();
+ return bookmarkedObject.bookmark();
}
@Override
public final ManagedObject getBookmarkedOwner() {
- return bookmarkedObject.asManagedObject();
+ return bookmarkedObject.managedObject();
}
public final BookmarkedObjectWkt bookmarkedObjectModel() {