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/11/30 07:35:45 UTC
[isis] branch master updated: ISIS-2904: make ObjectAssociationContainer API more explicit, as to whether to include mixed in assoz.
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
The following commit(s) were added to refs/heads/master by this push:
new 201bae2 ISIS-2904: make ObjectAssociationContainer API more explicit, as to whether to include mixed in assoz.
201bae2 is described below
commit 201bae2e3b4b3733fff3f5f09aa510e54f652547
Author: Andi Huber <ah...@apache.org>
AuthorDate: Tue Nov 30 08:20:41 2021 +0100
ISIS-2904: make ObjectAssociationContainer API more explicit, as to
whether to include mixed in assoz.
---
.../interactions/managed/ManagedMember.java | 6 +--
.../isis/core/metamodel/spec/ManagedObjects.java | 12 ++++-
.../core/metamodel/spec/ObjectSpecification.java | 2 -
.../spec/feature/ObjectAssociationContainer.java | 55 ++++++++++++++--------
.../specloader/specimpl/ObjectMemberContainer.java | 12 ++---
.../specimpl/ObjectSpecificationAbstract.java | 8 ++--
.../testspec/ObjectSpecificationStub.java | 8 ++--
.../interaction/prop/PropertyInteractionWkt.java | 5 +-
8 files changed, 65 insertions(+), 43 deletions(-)
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ManagedMember.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ManagedMember.java
index ec2364b..e69e381 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ManagedMember.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ManagedMember.java
@@ -50,12 +50,10 @@ implements ManagedFeature {
@RequiredArgsConstructor
public static enum MemberType {
PROPERTY(OneToOneAssociation.class, (spec, propertyId)->
- spec.getAssociation(propertyId)
- .map(property->property.isOneToOneAssociation()?property:null)),
+ spec.getProperty(propertyId)),
COLLECTION(OneToManyAssociation.class, (spec, collectionId)->
- spec.getAssociation(collectionId)
- .map(collection->collection.isOneToManyAssociation()?collection:null)),
+ spec.getCollection(collectionId)),
ACTION(ObjectAction.class, (spec, actionId)->
spec.getAction(actionId));
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObjects.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObjects.java
index 885146b..e30f532 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObjects.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObjects.java
@@ -337,6 +337,7 @@ public final class ManagedObjects {
return _NullSafe.streamAutodetect(collectionOrArray)
.map(pojo->ManagedObject.of(elementSpec, pojo)) // pojo is nullable here
+//TODO cannot reattach if id is not memoized
.map(ManagedObjects.EntityUtil::reattach)
.filter(ManagedObjects.VisibilityUtil.filterOn(interactionInitiatedBy))
.collect(Can.toCan());
@@ -635,7 +636,16 @@ public final class ManagedObjects {
+ "otherwise cannot re-attach",
spec.getLogicalTypeName());
log.error(msg); // in case exception gets swallowed
- throw _Exceptions.illegalState(msg);
+ //throw _Exceptions.illegalState(msg);
+
+ val entityFacet = spec.getFacet(EntityFacet.class);
+
+ entityFacet.persist(spec, managedObject.getPojo());
+
+ _Assert.assertTrue(
+ entityFacet.getEntityState(managedObject.getPojo()).isAttached());
+ managedObject.getBookmark();
+ return managedObject;
}
val objectManager = managedObject.getObjectManager();
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java
index 411036d..b62198e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java
@@ -586,6 +586,4 @@ extends
objFeature.getFeatureIdentifier()));
}
-
-
}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociationContainer.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociationContainer.java
index 30d907f..e916ace 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociationContainer.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociationContainer.java
@@ -31,41 +31,56 @@ public interface ObjectAssociationContainer {
// -- ASSOCIATION LOOKUP, PROPERTIES/COLLECTIONS (INHERITANCE CONSIDERED)
/**
- * Same as {@link #getDeclaredAssociation(String)}, but also considering any inherited object members.
- * @param id
+ * Similar to {@link #getDeclaredAssociation(String, MixedIn)},
+ * but also considering any inherited object members.
*
* @implSpec If not found on the current 'type' search for the 'nearest' match in super-types,
* and if nothing found there, search the interfaces.
*/
- Optional<ObjectAssociation> getAssociation(String id);
+ Optional<ObjectAssociation> getAssociation(String id, MixedIn mixedIn);
- default ObjectAssociation getAssociationElseFail(final String id) {
- return getAssociation(id)
+ default ObjectAssociation getAssociationElseFail(final String id, final MixedIn mixedIn) {
+ return getAssociation(id, mixedIn)
.orElseThrow(()->_Exceptions.noSuchElement("id=%s", id));
}
- default Optional<OneToOneAssociation> getProperty(final String id) {
- return getAssociation(id)
+ default Optional<OneToOneAssociation> getProperty(final String id, final MixedIn mixedIn) {
+ return getAssociation(id, mixedIn)
.filter(ObjectAssociation.Predicates.PROPERTIES)
.map(OneToOneAssociation.class::cast);
}
- default OneToOneAssociation getPropertyElseFail(final String id) {
- return getProperty(id)
+ default OneToOneAssociation getPropertyElseFail(final String id, final MixedIn mixedIn) {
+ return getProperty(id, mixedIn)
.orElseThrow(()->_Exceptions.noSuchElement("id=%s", id));
}
- default Optional<OneToManyAssociation> getCollection(final String id) {
- return getAssociation(id)
+ default Optional<OneToManyAssociation> getCollection(final String id, final MixedIn mixedIn) {
+ return getAssociation(id, mixedIn)
.filter(ObjectAssociation.Predicates.COLLECTIONS)
.map(OneToManyAssociation.class::cast);
}
- default OneToManyAssociation getCollectionElseFail(final String id) {
- return getCollection(id)
+ default OneToManyAssociation getCollectionElseFail(final String id, final MixedIn mixedIn) {
+ return getCollection(id, mixedIn)
.orElseThrow(()->_Exceptions.noSuchElement("id=%s", id));
}
+ // -- MIXED-IN INCLUDED
+
+ default Optional<ObjectAssociation> getAssociation(final String id) {
+ return getAssociation(id, MixedIn.INCLUDED);}
+ default ObjectAssociation getAssociationElseFail(final String id) {
+ return getAssociationElseFail(id, MixedIn.INCLUDED);}
+ default Optional<OneToOneAssociation> getProperty(final String id) {
+ return getProperty(id, MixedIn.INCLUDED);}
+ default OneToOneAssociation getPropertyElseFail(final String id) {
+ return getPropertyElseFail(id, MixedIn.INCLUDED);}
+ default Optional<OneToManyAssociation> getCollection(final String id) {
+ return getCollection(id, MixedIn.INCLUDED);}
+ default OneToManyAssociation getCollectionElseFail(final String id) {
+ return getCollectionElseFail(id, MixedIn.INCLUDED);}
+
// -- ASSOCIATION LOOKUP, DECLARED PROPERTIES/COLLECTIONS (NO INHERITANCE CONSIDERED)
/**
@@ -76,7 +91,7 @@ public interface ObjectAssociationContainer {
* Throw a {@link ObjectSpecificationException} if no such association
* exists.
*/
- Optional<ObjectAssociation> getDeclaredAssociation(String id);
+ Optional<ObjectAssociation> getDeclaredAssociation(String id, MixedIn mixedIn);
// -- ASSOCIATION STREAMS (INHERITANCE CONSIDERED)
@@ -87,15 +102,15 @@ public interface ObjectAssociationContainer {
* @implSpec Walk through the type hierarchy nearest to farthest and add any ObjectAssociation to the stream,
* except don't add ObjectAssociations that already have been added (due to inheritance).
*/
- Stream<ObjectAssociation> streamAssociations(MixedIn contributed);
+ Stream<ObjectAssociation> streamAssociations(MixedIn mixedIn);
/**
* All {@link ObjectAssociation association}s that represent
* {@link OneToOneAssociation properties}.
*/
- default Stream<OneToOneAssociation> streamProperties(final MixedIn contributed) {
- return streamAssociations(contributed)
+ default Stream<OneToOneAssociation> streamProperties(final MixedIn mixedIn) {
+ return streamAssociations(mixedIn)
.filter(ObjectAssociation.Predicates.PROPERTIES)
.map(OneToOneAssociation.class::cast);
}
@@ -104,8 +119,8 @@ public interface ObjectAssociationContainer {
* All {@link ObjectAssociation association}s that represents
* {@link OneToManyAssociation collections}.
*/
- default Stream<OneToManyAssociation> streamCollections(final MixedIn contributed){
- return streamAssociations(contributed)
+ default Stream<OneToManyAssociation> streamCollections(final MixedIn mixedIn){
+ return streamAssociations(mixedIn)
.filter(ObjectAssociation.Predicates.COLLECTIONS)
.map(OneToManyAssociation.class::cast);
}
@@ -127,7 +142,7 @@ public interface ObjectAssociationContainer {
* unauthorized fields have been removed) use
* <tt>ObjectAssociationFilters#staticallyVisible(...)</tt>
*/
- Stream<ObjectAssociation> streamDeclaredAssociations(final MixedIn contributed);
+ Stream<ObjectAssociation> streamDeclaredAssociations(final MixedIn mixedIn);
}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberContainer.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberContainer.java
index 02d654f..81e271c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberContainer.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberContainer.java
@@ -55,14 +55,14 @@ implements
ObjectAssociationContainer,
Hierarchical {
- protected ObjectMemberContainer(MetaModelContext metaModelContext) {
+ protected ObjectMemberContainer(final MetaModelContext metaModelContext) {
super(metaModelContext);
}
// -- ACTIONS
@Override
- public Optional<ObjectAction> getAction(String id, @Nullable ActionType type) {
+ public Optional<ObjectAction> getAction(final String id, @Nullable final ActionType type) {
val declaredAction = getDeclaredAction(id); // no inheritance nor type considered
@@ -120,9 +120,9 @@ implements
// -- ASSOCIATIONS
@Override
- public Optional<ObjectAssociation> getAssociation(String id) {
+ public Optional<ObjectAssociation> getAssociation(final String id, final MixedIn mixedIn) {
- val declaredAssociation = getDeclaredAssociation(id); // no inheritance considered
+ val declaredAssociation = getDeclaredAssociation(id, mixedIn); // no inheritance considered
if(declaredAssociation.isPresent()) {
return declaredAssociation;
@@ -130,11 +130,11 @@ implements
return isTypeHierarchyRoot()
? Optional.empty() // stop searching
- : superclass().getAssociation(id);
+ : superclass().getAssociation(id, mixedIn);
}
@Override
- public Stream<ObjectAssociation> streamAssociations(MixedIn mixedIn) {
+ public Stream<ObjectAssociation> streamAssociations(final MixedIn mixedIn) {
if(isTypeHierarchyRoot()) {
return streamDeclaredAssociations(mixedIn); // stop going deeper
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 b414554..3d04e3e 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
@@ -654,10 +654,10 @@ implements ObjectSpecification {
// -- ASSOCIATIONS
@Override
- public Stream<ObjectAssociation> streamDeclaredAssociations(final MixedIn contributed) {
+ public Stream<ObjectAssociation> streamDeclaredAssociations(final MixedIn mixedIn) {
introspectUpTo(IntrospectionState.FULLY_INTROSPECTED);
- if(contributed.isIncluded()) {
+ if(mixedIn.isIncluded()) {
createMixedInAssociations(); // only if not already
synchronized(unmodifiableAssociations) {
return stream(unmodifiableAssociations.get());
@@ -687,9 +687,9 @@ implements ObjectSpecification {
}
@Override
- public Optional<ObjectAssociation> getDeclaredAssociation(final String id) {
+ public Optional<ObjectAssociation> getDeclaredAssociation(final String id, final MixedIn mixedIn) {
introspectUpTo(IntrospectionState.FULLY_INTROSPECTED);
- return streamDeclaredAssociations(MixedIn.INCLUDED)
+ return streamDeclaredAssociations(mixedIn)
.filter(objectAssociation->objectAssociation.getId().equals(id))
.findFirst();
}
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java
index 4ddbcd8..0153e9a 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java
@@ -116,7 +116,7 @@ implements ObjectSpecification {
}
@Override
- public Optional<ObjectAssociation> getDeclaredAssociation(final String name) {
+ public Optional<ObjectAssociation> getDeclaredAssociation(final String name, final MixedIn mixedIn) {
for (int i = 0; i < fields.size(); i++) {
if (fields.get(i).getId().equals(name)) {
return Optional.ofNullable(fields.get(i));
@@ -126,7 +126,7 @@ implements ObjectSpecification {
}
@Override
- public Stream<ObjectAssociation> streamDeclaredAssociations(final MixedIn contributed) {
+ public Stream<ObjectAssociation> streamDeclaredAssociations(final MixedIn mixedIn) {
return fields.stream();
}
@@ -361,9 +361,9 @@ implements ObjectSpecification {
}
@Override
- public Optional<ObjectAssociation> getAssociation(final String id) {
+ public Optional<ObjectAssociation> getAssociation(final String id, final MixedIn mixedIn) {
// poorly implemented, inheritance not supported
- return getDeclaredAssociation(id);
+ return getDeclaredAssociation(id, mixedIn);
}
@Override
diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/interaction/prop/PropertyInteractionWkt.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/interaction/prop/PropertyInteractionWkt.java
index 7d3e89f..2f31871 100644
--- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/interaction/prop/PropertyInteractionWkt.java
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/interaction/prop/PropertyInteractionWkt.java
@@ -77,8 +77,9 @@ extends HasBookmarkedOwnerAbstract<PropertyInteraction> {
return PropertyInteraction.wrap(
ManagedProperty.lookupProperty(getBookmarkedOwner(), memberId, where)
- .orElseThrow(()->_Exceptions.noSuchElement(memberId)));
-
+ .orElseThrow(()->_Exceptions.noSuchElement("property '%s' in %s",
+ memberId,
+ getBookmarkedOwner().getSpecification())));
}
@Override