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
The following commit(s) were added to refs/heads/CAUSEWAY-3676 by this push:
new 2eb625faa2 CAUSEWAY-3676: combines GqlvObjectStructure and Behaviour
2eb625faa2 is described below
commit 2eb625faa2ef7495720a9e5de44879b5baf64969
Author: danhaywood <[email protected]>
AuthorDate: Sat Jan 20 10:17:57 2024 +0000
CAUSEWAY-3676: combines GqlvObjectStructure and Behaviour
---
.../graphql/viewer/source/GqlvObjectBehaviour.java | 159 ---------------------
.../graphql/viewer/source/GqlvObjectStructure.java | 156 +++++++++++++++++++-
.../graphql/viewer/source/ObjectTypeFactory.java | 27 ++--
3 files changed, 165 insertions(+), 177 deletions(-)
diff --git
a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/GqlvObjectBehaviour.java
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/GqlvObjectBehaviour.java
deleted file mode 100644
index fe4a96e6e0..0000000000
---
a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/GqlvObjectBehaviour.java
+++ /dev/null
@@ -1,159 +0,0 @@
-package org.apache.causeway.viewer.graphql.viewer.source;
-
-
-import java.util.Set;
-
-import org.apache.causeway.applib.services.bookmark.BookmarkService;
-import org.apache.causeway.applib.services.metamodel.BeanSort;
-import org.apache.causeway.core.metamodel.object.ManagedObject;
-import org.apache.causeway.core.metamodel.objectmanager.ObjectManager;
-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 org.apache.causeway.viewer.graphql.model.parts.GqlvAssociation;
-import org.apache.causeway.viewer.graphql.model.parts.GqlvProperty;
-
-import lombok.RequiredArgsConstructor;
-
-import graphql.schema.DataFetcher;
-import graphql.schema.GraphQLCodeRegistry;
-import graphql.schema.GraphQLFieldDefinition;
-import graphql.schema.GraphQLObjectType;
-import graphql.schema.GraphQLType;
-
-import static graphql.schema.FieldCoordinates.coordinates;
-import static graphql.schema.GraphQLObjectType.newObject;
-
-@RequiredArgsConstructor
-public class GqlvObjectBehaviour {
-
- private final GqlvObjectStructure structure;
- private final GraphQLCodeRegistry.Builder codeRegistryBuilder;
- private final BookmarkService bookmarkService;
- private final ObjectManager objectManager;
- private final SpecificationLoader specificationLoader;
-
-
- public void createAndRegisterDataFetchersForMetaData() {
-
- codeRegistryBuilder.dataFetcher(
- coordinates(structure.getGqlObjectType(),
structure.getMetaField()),
- (DataFetcher<Object>) environment -> {
- return bookmarkService.bookmarkFor(environment.getSource())
- .map(bookmark -> new GqlvMeta(bookmark,
bookmarkService, objectManager))
- .orElse(null); //TODO: is this correct ?
- });
-
- codeRegistryBuilder.dataFetcher(
- coordinates(structure.getMetaType(),
GqlvObjectStructure.Fields.id),
- (DataFetcher<Object>) environment -> {
- GqlvMeta gqlvMeta = environment.getSource();
- return gqlvMeta.id();
- });
-
- codeRegistryBuilder.dataFetcher(
- coordinates(structure.getMetaType(),
GqlvObjectStructure.Fields.logicalTypeName),
- (DataFetcher<Object>) environment -> {
- GqlvMeta gqlvMeta = environment.getSource();
- return gqlvMeta.logicalTypeName();
- });
-
- if (structure.getBeanSort() == BeanSort.ENTITY) {
- codeRegistryBuilder.dataFetcher(
- coordinates(structure.getMetaType(),
GqlvObjectStructure.Fields.version),
- (DataFetcher<Object>) environment -> {
- GqlvMeta gqlvMeta = environment.getSource();
- return gqlvMeta.version();
- });
- }
-
- }
-
-
- public void createAndRegisterDataFetchersForField() {
-
structure.getProperties().forEach(this::createAndRegisterDataFetcherForAssociation);
- }
-
- void createAndRegisterDataFetchersForCollection() {
- structure.getCollections().forEach(
- this::createAndRegisterDataFetcherForAssociation);
- }
-
- private void createAndRegisterDataFetcherForAssociation(final
GqlvAssociation<?> property) {
-
- final ObjectAssociation association = property.getObjectMember();
- final GraphQLFieldDefinition field = property.getFieldDefinition();
-
- final GraphQLObjectType graphQLObjectType =
structure.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 createAndRegisterDataFetchersForMutators() {
-
- // something like:
-
-//
codeRegistryBuilder.dataFetcher(FieldCoordinates.coordinates(graphQLTypeReference,
gql_mutations), new DataFetcher<Object>() {
-// @Override
-// public Object get(DataFetchingEnvironment environment)
throws Exception {
-//
-// Bookmark bookmark =
bookmarkService.bookmarkFor(environment.getSource()).orElse(null);
-// if (bookmark == null) return null; //TODO: is this
correct ?
-// return new GqlvMutations(bookmark, bookmarkService,
mutatorsTypeFields);
-// }
-// });
-//
-// // for each field something like
-//
codeRegistryBuilder.dataFetcher(FieldCoordinates.coordinates(mutatorsType,
idField), new DataFetcher<Object>() {
-// @Override
-// public Object get(DataFetchingEnvironment environment)
throws Exception {
-//
-// GqlvMeta gqlMeta = environment.getSource();
-//
-// return gqlMeta.id();
-// }
-// });
-
-
- }
-
-
- GraphQLObjectType createAndRegisterMutatorsType(
- final Set<GraphQLType> graphQLObjectTypes) {
-
- //TODO: this is not going to work, because we need to dynamically add
fields
- String mutatorsTypeName = structure.getLogicalTypeNameSanitized() +
"__DomainObject_mutators";
- GraphQLObjectType.Builder mutatorsTypeBuilder =
newObject().name(mutatorsTypeName);
- GraphQLObjectType mutatorsType = mutatorsTypeBuilder.build();
- graphQLObjectTypes.add(mutatorsType);
- return mutatorsType;
- }
-
-}
diff --git
a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/GqlvObjectStructure.java
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/GqlvObjectStructure.java
index 37a08e28b6..dfc2780ea0 100644
---
a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/GqlvObjectStructure.java
+++
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/GqlvObjectStructure.java
@@ -4,23 +4,35 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
+import java.util.Set;
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;
import org.apache.causeway.viewer.graphql.model.parts.GqlvAction;
+import org.apache.causeway.viewer.graphql.model.parts.GqlvAssociation;
import org.apache.causeway.viewer.graphql.model.parts.GqlvCollection;
import org.apache.causeway.viewer.graphql.model.parts.GqlvProperty;
+import static graphql.schema.FieldCoordinates.coordinates;
+
import static
org.apache.causeway.viewer.graphql.viewer.source._Constants.GQL_INPUTTYPE_PREFIX;
+import graphql.schema.DataFetcher;
+import graphql.schema.GraphQLCodeRegistry;
+
import lombok.Getter;
import lombok.val;
import lombok.experimental.UtilityClass;
@@ -65,7 +77,12 @@ public class GqlvObjectStructure {
.type(Scalars.GraphQLString).build();
}
- @Getter private final ObjectSpecification objectSpec;
+ private final ObjectSpecification objectSpec;
+ private final GraphQLCodeRegistry.Builder codeRegistryBuilder;
+ private final BookmarkService bookmarkService;
+ private final ObjectManager objectManager;
+ private final SpecificationLoader specificationLoader;
+
@Getter private final GraphQLFieldDefinition metaField;
@Getter private final GraphQLObjectType.Builder gqlObjectTypeBuilder;
@Getter private final GraphQLInputObjectType gqlInputObjectType;
@@ -115,8 +132,18 @@ public class GqlvObjectStructure {
@SuppressWarnings("OptionalUsedAsFieldOrParameterType")
private Optional<GraphQLObjectType> mutatorsTypeIfAny;
- public GqlvObjectStructure(final ObjectSpecification objectSpec) {
+
+ public GqlvObjectStructure(
+ final ObjectSpecification objectSpec,
+ final GraphQLCodeRegistry.Builder codeRegistryBuilder,
+ final BookmarkService bookmarkService,
+ final ObjectManager objectManager,
+ final SpecificationLoader specificationLoader) {
this.objectSpec = objectSpec;
+ this.codeRegistryBuilder = codeRegistryBuilder;
+ this.bookmarkService = bookmarkService;
+ this.objectManager = objectManager;
+ this.specificationLoader = specificationLoader;
this.gqlObjectTypeBuilder =
newObject().name(getLogicalTypeNameSanitized());
// object type's meta field
@@ -336,7 +363,7 @@ public class GqlvObjectStructure {
void addActionsAsFields() {
- getObjectSpec().streamActions(ActionScope.PRODUCTION, MixedIn.INCLUDED)
+ objectSpec.streamActions(ActionScope.PRODUCTION, MixedIn.INCLUDED)
.forEach(this::addAction);
Optional<GraphQLObjectType> mutatorsTypeIfAny =
buildMutatorsTypeIfAny();
@@ -351,4 +378,127 @@ public class GqlvObjectStructure {
});
}
+
+ public void createAndRegisterDataFetchersForMetaData() {
+
+ codeRegistryBuilder.dataFetcher(
+ coordinates(getGqlObjectType(), getMetaField()),
+ (DataFetcher<Object>) environment -> {
+ return bookmarkService.bookmarkFor(environment.getSource())
+ .map(bookmark -> new GqlvMeta(bookmark,
bookmarkService, objectManager))
+ .orElse(null); //TODO: is this correct ?
+ });
+
+ codeRegistryBuilder.dataFetcher(
+ coordinates(getMetaType(), GqlvObjectStructure.Fields.id),
+ (DataFetcher<Object>) environment -> {
+ GqlvMeta gqlvMeta = environment.getSource();
+ return gqlvMeta.id();
+ });
+
+ codeRegistryBuilder.dataFetcher(
+ coordinates(getMetaType(),
GqlvObjectStructure.Fields.logicalTypeName),
+ (DataFetcher<Object>) environment -> {
+ GqlvMeta gqlvMeta = environment.getSource();
+ return gqlvMeta.logicalTypeName();
+ });
+
+ if (getBeanSort() == BeanSort.ENTITY) {
+ codeRegistryBuilder.dataFetcher(
+ coordinates(getMetaType(),
GqlvObjectStructure.Fields.version),
+ (DataFetcher<Object>) environment -> {
+ GqlvMeta gqlvMeta = environment.getSource();
+ return gqlvMeta.version();
+ });
+ }
+
+ }
+
+
+ public void createAndRegisterDataFetchersForField() {
+
getProperties().forEach(this::createAndRegisterDataFetcherForAssociation);
+ }
+
+ void createAndRegisterDataFetchersForCollection() {
+ getCollections().forEach(
+ this::createAndRegisterDataFetcherForAssociation);
+ }
+
+ private void createAndRegisterDataFetcherForAssociation(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 createAndRegisterDataFetchersForMutators() {
+
+ // something like:
+
+//
codeRegistryBuilder.dataFetcher(FieldCoordinates.coordinates(graphQLTypeReference,
gql_mutations), new DataFetcher<Object>() {
+// @Override
+// public Object get(DataFetchingEnvironment environment)
throws Exception {
+//
+// Bookmark bookmark =
bookmarkService.bookmarkFor(environment.getSource()).orElse(null);
+// if (bookmark == null) return null; //TODO: is this
correct ?
+// return new GqlvMutations(bookmark, bookmarkService,
mutatorsTypeFields);
+// }
+// });
+//
+// // for each field something like
+//
codeRegistryBuilder.dataFetcher(FieldCoordinates.coordinates(mutatorsType,
idField), new DataFetcher<Object>() {
+// @Override
+// public Object get(DataFetchingEnvironment environment)
throws Exception {
+//
+// GqlvMeta gqlMeta = environment.getSource();
+//
+// return gqlMeta.id();
+// }
+// });
+
+
+ }
+
+
+ GraphQLObjectType createAndRegisterMutatorsType(
+ final Set<GraphQLType> graphQLObjectTypes) {
+
+ //TODO: this is not going to work, because we need to dynamically add
fields
+ String mutatorsTypeName = getLogicalTypeNameSanitized() +
"__DomainObject_mutators";
+ GraphQLObjectType.Builder mutatorsTypeBuilder =
newObject().name(mutatorsTypeName);
+ GraphQLObjectType mutatorsType = mutatorsTypeBuilder.build();
+ graphQLObjectTypes.add(mutatorsType);
+ return mutatorsType;
+ }
+
}
diff --git
a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/ObjectTypeFactory.java
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/ObjectTypeFactory.java
index 642571b749..5153368ecd 100644
---
a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/ObjectTypeFactory.java
+++
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/ObjectTypeFactory.java
@@ -53,31 +53,28 @@ public class ObjectTypeFactory {
final ObjectSpecification objectSpec,
final GraphQLCodeRegistry.Builder codeRegistryBuilder) {
- val gqlvObjectStructure = new GqlvObjectStructure(objectSpec);
+ val gqlvDomainObject = new GqlvObjectStructure(objectSpec,
codeRegistryBuilder, bookmarkService, objectManager, specificationLoader);
-
graphQLTypeRegistry.addTypeIfNotAlreadyPresent(gqlvObjectStructure.getMetaField().getType());
-
graphQLTypeRegistry.addTypeIfNotAlreadyPresent(gqlvObjectStructure.getGqlInputObjectType());
+
graphQLTypeRegistry.addTypeIfNotAlreadyPresent(gqlvDomainObject.getMetaField().getType());
+
graphQLTypeRegistry.addTypeIfNotAlreadyPresent(gqlvDomainObject.getGqlInputObjectType());
- gqlvObjectStructure.addPropertiesAsFields();
- gqlvObjectStructure.addCollectionsAsLists();
- gqlvObjectStructure.addActionsAsFields();
+ gqlvDomainObject.addPropertiesAsFields();
+ gqlvDomainObject.addCollectionsAsLists();
+ gqlvDomainObject.addActionsAsFields();
- gqlvObjectStructure.getMutatorsTypeIfAny()
+ gqlvDomainObject.getMutatorsTypeIfAny()
.ifPresent(graphQLTypeRegistry::addTypeIfNotAlreadyPresent);
// build and register object type
- GraphQLObjectType graphQLObjectType =
gqlvObjectStructure.buildGqlObjectType();
+ GraphQLObjectType graphQLObjectType =
gqlvDomainObject.buildGqlObjectType();
graphQLTypeRegistry.addTypeIfNotAlreadyPresent(graphQLObjectType);
- GqlvObjectBehaviour gqlvObjectBehaviour =
- new GqlvObjectBehaviour(gqlvObjectStructure,
codeRegistryBuilder, bookmarkService, objectManager, specificationLoader);
-
// create and register data fetchers
- gqlvObjectBehaviour.createAndRegisterDataFetchersForMetaData();
- gqlvObjectBehaviour.createAndRegisterDataFetchersForMutators();
+ gqlvDomainObject.createAndRegisterDataFetchersForMetaData();
+ gqlvDomainObject.createAndRegisterDataFetchersForMutators();
- gqlvObjectBehaviour.createAndRegisterDataFetchersForField();
- gqlvObjectBehaviour.createAndRegisterDataFetchersForCollection();
+ gqlvDomainObject.createAndRegisterDataFetchersForField();
+ gqlvDomainObject.createAndRegisterDataFetchersForCollection();
}
}