This is an automated email from the ASF dual-hosted git repository. danhaywood pushed a commit to branch CAUSEWAY-3676 in repository https://gitbox.apache.org/repos/asf/causeway.git
commit a680b35aff34fd9842f25209782612705beecc45 Author: danhaywood <[email protected]> AuthorDate: Sat Jan 20 17:35:35 2024 +0000 CAUSEWAY-3676: introduces GqlvMemberHolder and subclasses; starting to move fetcher logic to members --- .../viewer/graphql/model/domain/GqlvAction.java | 10 ++-- .../graphql/model/domain/GqlvActionHolder.java | 4 ++ .../graphql/model/domain/GqlvAssociation.java | 61 ++++++++++++++++++++-- .../model/domain/GqlvAssociationHolder.java | 4 ++ .../graphql/model/domain/GqlvCollection.java | 16 ++++-- .../graphql/model/domain/GqlvCollectionHolder.java | 4 ++ .../graphql/model/domain/GqlvDomainObject.java | 55 +++---------------- .../model/domain/GqlvDomainObjectMutators.java | 15 ++++-- .../graphql/model/domain/GqlvDomainService.java | 4 +- .../viewer/graphql/model/domain/GqlvMember.java | 14 +++-- .../graphql/model/domain/GqlvMemberHolder.java | 7 +++ .../viewer/graphql/model/domain/GqlvProperty.java | 12 +++-- .../graphql/model/domain/GqlvPropertyHolder.java | 4 ++ 13 files changed, 143 insertions(+), 67 deletions(-) diff --git a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAction.java b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAction.java index 46680c1a42..5048fba08c 100644 --- a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAction.java +++ b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAction.java @@ -2,14 +2,18 @@ package org.apache.causeway.viewer.graphql.model.domain; import org.apache.causeway.core.metamodel.spec.feature.ObjectAction; +import graphql.schema.GraphQLCodeRegistry; import graphql.schema.GraphQLFieldDefinition; -public class GqlvAction extends GqlvMember<ObjectAction> { +public class GqlvAction extends GqlvMember<ObjectAction, GqlvActionHolder> { public GqlvAction( + final GqlvActionHolder holder, final ObjectAction objectAction, - final GraphQLFieldDefinition fieldDefinition) { - super(objectAction, fieldDefinition); + final GraphQLFieldDefinition fieldDefinition, + final GraphQLCodeRegistry.Builder codeRegistryBuilder + ) { + super(holder, objectAction, fieldDefinition, codeRegistryBuilder); } public ObjectAction getObjectAction() { diff --git a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionHolder.java b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionHolder.java new file mode 100644 index 0000000000..00293a11be --- /dev/null +++ b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionHolder.java @@ -0,0 +1,4 @@ +package org.apache.causeway.viewer.graphql.model.domain; + +public interface GqlvActionHolder extends GqlvMemberHolder { +} diff --git a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAssociation.java b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAssociation.java index a20feed24c..1e38e89de8 100644 --- a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAssociation.java +++ b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAssociation.java @@ -1,15 +1,32 @@ package org.apache.causeway.viewer.graphql.model.domain; +import org.apache.causeway.applib.services.metamodel.BeanSort; +import org.apache.causeway.core.metamodel.object.ManagedObject; +import org.apache.causeway.core.metamodel.spec.ObjectSpecification; import org.apache.causeway.core.metamodel.spec.feature.ObjectAssociation; +import org.apache.causeway.core.metamodel.specloader.SpecificationLoader; +import graphql.schema.DataFetcher; +import graphql.schema.GraphQLCodeRegistry; import graphql.schema.GraphQLFieldDefinition; +import graphql.schema.GraphQLObjectType; -public abstract class GqlvAssociation<T extends ObjectAssociation> extends GqlvMember<T> { +import static graphql.schema.FieldCoordinates.coordinates; + +public abstract class GqlvAssociation<T extends ObjectAssociation, H extends GqlvAssociationHolder> extends GqlvMember<T, H> { + + + private final SpecificationLoader specificationLoader; public GqlvAssociation( + final H holder, final T objectAssociation, - final GraphQLFieldDefinition fieldDefinition) { - super(objectAssociation, fieldDefinition); + final GraphQLFieldDefinition fieldDefinition, + final GraphQLCodeRegistry.Builder codeRegistryBuilder, + final SpecificationLoader specificationLoader + ) { + super(holder, objectAssociation, fieldDefinition, codeRegistryBuilder); + this.specificationLoader = specificationLoader; } /** @@ -18,4 +35,42 @@ public abstract class GqlvAssociation<T extends ObjectAssociation> extends GqlvM public T getObjectAssociation() { return getObjectMember(); } + + public void addDataFetcher() { + + final ObjectAssociation association = getObjectMember(); + final GraphQLFieldDefinition field = getFieldDefinition(); + + final GraphQLObjectType graphQLObjectType = getHolder().getGqlObjectType(); + + ObjectSpecification fieldObjectSpecification = association.getElementType(); + BeanSort beanSort = fieldObjectSpecification.getBeanSort(); + switch (beanSort) { + + case VALUE: //TODO: does this work for values as well? + + case VIEW_MODEL: + + case ENTITY: + + codeRegistryBuilder.dataFetcher( + coordinates(graphQLObjectType, field), + (DataFetcher<Object>) environment -> { + + Object domainObjectInstance = environment.getSource(); + + Class<?> domainObjectInstanceClass = domainObjectInstance.getClass(); + ObjectSpecification specification = specificationLoader.loadSpecification(domainObjectInstanceClass); + + ManagedObject owner = ManagedObject.adaptSingular(specification, domainObjectInstance); + ManagedObject managedObject = association.get(owner); + + return managedObject!=null ? managedObject.getPojo() : null; + }); + + break; + + } + } + } diff --git a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAssociationHolder.java b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAssociationHolder.java new file mode 100644 index 0000000000..ff635928a1 --- /dev/null +++ b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAssociationHolder.java @@ -0,0 +1,4 @@ +package org.apache.causeway.viewer.graphql.model.domain; + +public interface GqlvAssociationHolder extends GqlvMemberHolder { +} diff --git a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollection.java b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollection.java index 051ffaab0c..edd22e2c1a 100644 --- a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollection.java +++ b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollection.java @@ -1,18 +1,28 @@ package org.apache.causeway.viewer.graphql.model.domain; +import graphql.schema.GraphQLCodeRegistry; import graphql.schema.GraphQLFieldDefinition; import org.apache.causeway.core.metamodel.spec.feature.OneToManyAssociation; +import org.apache.causeway.core.metamodel.specloader.SpecificationLoader; -public class GqlvCollection extends GqlvAssociation<OneToManyAssociation> { +public class GqlvCollection extends GqlvAssociation<OneToManyAssociation, GqlvCollectionHolder> { public GqlvCollection( + final GqlvCollectionHolder domainObject, final OneToManyAssociation oneToManyAssociation, - final GraphQLFieldDefinition fieldDefinition) { - super(oneToManyAssociation, fieldDefinition); + final GraphQLFieldDefinition fieldDefinition, + final GraphQLCodeRegistry.Builder codeRegistryBuilder, + final SpecificationLoader specificationLoader + ) { + super(domainObject, oneToManyAssociation, fieldDefinition, codeRegistryBuilder, specificationLoader); } public OneToManyAssociation getOneToManyAssociation() { return getObjectAssociation(); } + + public void addDataFetcher() { + + } } diff --git a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollectionHolder.java b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollectionHolder.java new file mode 100644 index 0000000000..9ceb6c471f --- /dev/null +++ b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollectionHolder.java @@ -0,0 +1,4 @@ +package org.apache.causeway.viewer.graphql.model.domain; + +public interface GqlvCollectionHolder extends GqlvAssociationHolder { +} diff --git a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObject.java b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObject.java index 2cad9f1198..9712762d5b 100644 --- a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObject.java +++ b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObject.java @@ -10,14 +10,12 @@ import java.util.stream.Collectors; import org.apache.causeway.applib.services.bookmark.BookmarkService; import org.apache.causeway.applib.services.metamodel.BeanSort; import org.apache.causeway.commons.collections.Can; -import org.apache.causeway.core.metamodel.object.ManagedObject; import org.apache.causeway.core.metamodel.objectmanager.ObjectManager; import org.apache.causeway.core.metamodel.spec.ActionScope; import org.apache.causeway.core.metamodel.spec.ObjectSpecification; import org.apache.causeway.core.metamodel.spec.feature.MixedIn; import org.apache.causeway.core.metamodel.spec.feature.ObjectAction; import org.apache.causeway.core.metamodel.spec.feature.ObjectActionParameter; -import org.apache.causeway.core.metamodel.spec.feature.ObjectAssociation; import org.apache.causeway.core.metamodel.spec.feature.OneToManyAssociation; import org.apache.causeway.core.metamodel.spec.feature.OneToOneAssociation; import org.apache.causeway.core.metamodel.specloader.SpecificationLoader; @@ -30,7 +28,6 @@ import static graphql.schema.FieldCoordinates.coordinates; import static org.apache.causeway.viewer.graphql.model.types._Constants.GQL_INPUTTYPE_PREFIX; -import graphql.schema.DataFetcher; import graphql.schema.GraphQLCodeRegistry; import lombok.Getter; @@ -56,7 +53,7 @@ import static graphql.schema.GraphQLTypeReference.typeRef; /** * A wrapper around {@link ObjectSpecification} */ -public class GqlvDomainObject { +public class GqlvDomainObject implements GqlvActionHolder, GqlvPropertyHolder, GqlvCollectionHolder { @Getter private final GqlvDomainObjectMeta meta; @Getter private final GqlvDomainObjectMutators mutators; @@ -113,7 +110,7 @@ public class GqlvDomainObject { this.gqlObjectTypeBuilder = newObject().name(getLogicalTypeNameSanitized()); meta = new GqlvDomainObjectMeta(this, codeRegistryBuilder, bookmarkService, objectManager); - mutators = new GqlvDomainObjectMutators(this); + mutators = new GqlvDomainObjectMutators(this, codeRegistryBuilder); // input object type String inputTypeName = GQL_INPUTTYPE_PREFIX + getLogicalTypeNameSanitized(); @@ -172,7 +169,7 @@ public class GqlvDomainObject { break; } if (fieldDefinition != null) { - properties.add(new GqlvProperty(otoa, fieldDefinition)); + properties.add(new GqlvProperty(this, otoa, fieldDefinition, codeRegistryBuilder, specificationLoader)); } } @@ -207,7 +204,7 @@ public class GqlvDomainObject { } if (fieldDefinition != null) { - collections.add(new GqlvCollection(otom, fieldDefinition)); + collections.add(new GqlvCollection(this, otom, fieldDefinition, codeRegistryBuilder, specificationLoader)); } } @@ -256,7 +253,7 @@ public class GqlvDomainObject { final ObjectAction objectAction, final GraphQLFieldDefinition fieldDefinition) { getGqlObjectTypeBuilder().field(fieldDefinition); - safeActions.add(new GqlvAction(objectAction, fieldDefinition)); + safeActions.add(new GqlvAction(this, objectAction, fieldDefinition, codeRegistryBuilder)); } public void addNonSafeActionAsMutatorField( @@ -286,7 +283,7 @@ public class GqlvDomainObject { /** * @see #buildGqlObjectType() */ - GraphQLObjectType getGqlObjectType() { + public GraphQLObjectType getGqlObjectType() { if (gqlObjectType == null) { throw new IllegalStateException(String.format( "GraphQLObjectType has not yet been built for %s", getLogicalTypeName())); @@ -332,49 +329,13 @@ public class GqlvDomainObject { } public void addDataFetchersForProperties() { - getProperties().forEach(this::addDataFetcherForAssociation); + getProperties().forEach(property -> property.addDataFetcher()); } public void addDataFetchersForCollections() { - getCollections().forEach(this::addDataFetcherForAssociation); + getCollections().forEach(collection -> collection.addDataFetcher()); } - private void addDataFetcherForAssociation(final GqlvAssociation<?> property) { - - final ObjectAssociation association = property.getObjectMember(); - final GraphQLFieldDefinition field = property.getFieldDefinition(); - - final GraphQLObjectType graphQLObjectType = getGqlObjectType(); - - ObjectSpecification fieldObjectSpecification = association.getElementType(); - BeanSort beanSort = fieldObjectSpecification.getBeanSort(); - switch (beanSort) { - - case VALUE: //TODO: does this work for values as well? - - case VIEW_MODEL: - - case ENTITY: - - codeRegistryBuilder.dataFetcher( - coordinates(graphQLObjectType, field), - (DataFetcher<Object>) environment -> { - - Object domainObjectInstance = environment.getSource(); - - Class<?> domainObjectInstanceClass = domainObjectInstance.getClass(); - ObjectSpecification specification = specificationLoader.loadSpecification(domainObjectInstanceClass); - - ManagedObject owner = ManagedObject.adaptSingular(specification, domainObjectInstance); - ManagedObject managedObject = association.get(owner); - - return managedObject!=null ? managedObject.getPojo() : null; - }); - - break; - - } - } public void addDataFetchersForMutators() { diff --git a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObjectMutators.java b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObjectMutators.java index 71986cce55..b523344b82 100644 --- a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObjectMutators.java +++ b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObjectMutators.java @@ -1,5 +1,6 @@ package org.apache.causeway.viewer.graphql.model.domain; +import graphql.schema.GraphQLCodeRegistry; import graphql.schema.GraphQLFieldDefinition; import graphql.schema.GraphQLObjectType; @@ -12,9 +13,10 @@ import org.apache.causeway.core.metamodel.spec.feature.ObjectAction; import static graphql.schema.GraphQLObjectType.newObject; -public class GqlvDomainObjectMutators { +public class GqlvDomainObjectMutators implements GqlvActionHolder { private final GqlvDomainObject domainObject; + private final GraphQLCodeRegistry.Builder codeRegistryBuilder; final GraphQLObjectType.Builder mutatorsTypeBuilder; @@ -25,8 +27,11 @@ public class GqlvDomainObjectMutators { private Optional<GraphQLObjectType> mutatorsTypeIfAny; public GqlvDomainObjectMutators( - final GqlvDomainObject domainObject) { + final GqlvDomainObject domainObject, + final GraphQLCodeRegistry.Builder codeRegistryBuilder + ) { this.domainObject = domainObject; + this.codeRegistryBuilder = codeRegistryBuilder; mutatorsTypeBuilder = newObject().name(this.domainObject.getLogicalTypeNameSanitized() + "__DomainObject_mutators"); @@ -37,7 +42,7 @@ public class GqlvDomainObjectMutators { final GraphQLFieldDefinition fieldDefinition) { mutatorsTypeBuilder.field(fieldDefinition); - actions.add(new GqlvAction(objectAction, fieldDefinition)); + actions.add(new GqlvAction(domainObject, objectAction, fieldDefinition, codeRegistryBuilder)); } private final List<GqlvAction> actions = new ArrayList<>(); @@ -72,4 +77,8 @@ public class GqlvDomainObjectMutators { : Optional.empty(); } + @Override + public GraphQLObjectType getGqlObjectType() { + return mutatorsTypeIfAny.orElse(null); + } } diff --git a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainService.java b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainService.java index 5e70388021..ddbf1159fb 100644 --- a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainService.java +++ b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainService.java @@ -32,7 +32,7 @@ import org.apache.causeway.viewer.graphql.model.types.TypeMapper; import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition; import static graphql.schema.GraphQLObjectType.newObject; -public class GqlvDomainService { +public class GqlvDomainService implements GqlvActionHolder { private final ObjectSpecification serviceSpec; @Getter private final Object pojo; @@ -121,7 +121,7 @@ public class GqlvDomainService { gqlObjectTypeBuilder.field(fieldDefinition); // TODO: either safe or mutator - safeActions.add(new GqlvAction(objectAction, fieldDefinition)); + safeActions.add(new GqlvAction(this, objectAction, fieldDefinition, codeRegistryBuilder)); } diff --git a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMember.java b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMember.java index b94d93bef1..ee0179dedf 100644 --- a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMember.java +++ b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMember.java @@ -1,22 +1,30 @@ package org.apache.causeway.viewer.graphql.model.domain; import org.apache.causeway.core.metamodel.spec.feature.ObjectMember; -import org.apache.causeway.core.metamodel.spec.feature.OneToOneAssociation; + +import graphql.schema.GraphQLCodeRegistry; import lombok.Getter; import graphql.schema.GraphQLFieldDefinition; -public abstract class GqlvMember<T extends ObjectMember> { +public abstract class GqlvMember<T extends ObjectMember, H extends GqlvMemberHolder> { + @Getter private final H holder; @Getter private final T objectMember; @Getter private final GraphQLFieldDefinition fieldDefinition; + final GraphQLCodeRegistry.Builder codeRegistryBuilder; public GqlvMember( + final H holder, final T objectMember, - final GraphQLFieldDefinition fieldDefinition) { + final GraphQLFieldDefinition fieldDefinition, + final GraphQLCodeRegistry.Builder codeRegistryBuilder + ) { + this.holder = holder; this.objectMember = objectMember; this.fieldDefinition = fieldDefinition; + this.codeRegistryBuilder = codeRegistryBuilder; } public String getId() { diff --git a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMemberHolder.java b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMemberHolder.java new file mode 100644 index 0000000000..4d29b59656 --- /dev/null +++ b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMemberHolder.java @@ -0,0 +1,7 @@ +package org.apache.causeway.viewer.graphql.model.domain; + +import graphql.schema.GraphQLObjectType; + +public interface GqlvMemberHolder { + GraphQLObjectType getGqlObjectType(); +} diff --git a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvProperty.java b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvProperty.java index ff990ad41b..a58b926ada 100644 --- a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvProperty.java +++ b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvProperty.java @@ -1,15 +1,21 @@ package org.apache.causeway.viewer.graphql.model.domain; +import graphql.schema.GraphQLCodeRegistry; import graphql.schema.GraphQLFieldDefinition; import org.apache.causeway.core.metamodel.spec.feature.OneToOneAssociation; +import org.apache.causeway.core.metamodel.specloader.SpecificationLoader; -public class GqlvProperty extends GqlvAssociation<OneToOneAssociation> { +public class GqlvProperty extends GqlvAssociation<OneToOneAssociation, GqlvPropertyHolder> { public GqlvProperty( + final GqlvPropertyHolder domainObject, final OneToOneAssociation oneToOneAssociation, - final GraphQLFieldDefinition fieldDefinition) { - super(oneToOneAssociation, fieldDefinition); + final GraphQLFieldDefinition fieldDefinition, + final GraphQLCodeRegistry.Builder codeRegistryBuilder, + final SpecificationLoader specificationLoader + ) { + super(domainObject, oneToOneAssociation, fieldDefinition, codeRegistryBuilder, specificationLoader); } public OneToOneAssociation getOneToOneAssociation() { diff --git a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyHolder.java b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyHolder.java new file mode 100644 index 0000000000..51d0c328ad --- /dev/null +++ b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyHolder.java @@ -0,0 +1,4 @@ +package org.apache.causeway.viewer.graphql.model.domain; + +public interface GqlvPropertyHolder extends GqlvAssociationHolder { +}
