Skip to content

Commit

Permalink
CAUSEWAY-3859: Java record refactoring (part 51)
Browse files Browse the repository at this point in the history
  • Loading branch information
andi-huber committed Feb 26, 2025
1 parent ac86f6c commit 78e5c48
Show file tree
Hide file tree
Showing 6 changed files with 110 additions and 198 deletions.
Original file line number Diff line number Diff line change
@@ -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();
}

}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down

0 comments on commit 78e5c48

Please sign in to comment.