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 d93ffb5e69f00e59d0567d1600a09f76726b9f89
Author: danhaywood <[email protected]>
AuthorDate: Sat Jan 20 18:05:18 2024 +0000

    CAUSEWAY-3676: towards introducing mutators type for domain service
---
 .../graphql/model/domain/GqlvDomainObject.java     | 49 +++++++++-------------
 .../graphql/model/domain/GqlvDomainService.java    | 28 +++++--------
 .../{GqlvDomainObjectMeta.java => GqlvMeta.java}   | 25 ++++++-----
 ...DomainObjectMutators.java => GqlvMutators.java} | 19 +++++----
 .../graphql/model/domain/GqlvMutatorsHolder.java   |  9 ++++
 .../integration/GraphQlSourceForCauseway.java      |  4 +-
 6 files changed, 63 insertions(+), 71 deletions(-)

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 d673811f8d..7747e5e7fe 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
@@ -18,23 +18,19 @@ 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.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.registry.GraphQLTypeRegistry;
+import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
 import org.apache.causeway.viewer.graphql.model.types._Constants;
 import org.apache.causeway.viewer.graphql.model.util._LTN;
-import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
-
-import static graphql.schema.FieldCoordinates.coordinates;
 
 import static 
org.apache.causeway.viewer.graphql.model.types._Constants.GQL_INPUTTYPE_PREFIX;
 
-import graphql.schema.GraphQLCodeRegistry;
-
 import lombok.Getter;
 import lombok.val;
 
 import graphql.Scalars;
 import graphql.schema.GraphQLArgument;
+import graphql.schema.GraphQLCodeRegistry;
 import graphql.schema.GraphQLFieldDefinition;
 import graphql.schema.GraphQLInputObjectType;
 import graphql.schema.GraphQLList;
@@ -53,34 +49,29 @@ import static graphql.schema.GraphQLTypeReference.typeRef;
 /**
  * A wrapper around {@link ObjectSpecification}
  */
-public class GqlvDomainObject implements GqlvActionHolder, GqlvPropertyHolder, 
GqlvCollectionHolder {
+public class GqlvDomainObject implements GqlvActionHolder, GqlvPropertyHolder, 
GqlvCollectionHolder, GqlvMutatorsHolder {
 
-    @Getter private final GqlvDomainObjectMeta meta;
-    @Getter private final GqlvDomainObjectMutators mutators;
-
-    private final ObjectSpecification objectSpec;
+    @Getter private final ObjectSpecification objectSpecification;
     private final GraphQLCodeRegistry.Builder codeRegistryBuilder;
-    private final SpecificationLoader specificationLoader;
+
+    @Getter private final GqlvMeta meta;
+    @Getter private final GqlvMutators mutators;
 
     @Getter private final GraphQLObjectType.Builder gqlObjectTypeBuilder;
     @Getter private final GraphQLInputObjectType gqlInputObjectType;
 
     String getLogicalTypeName() {
-        return objectSpec.getLogicalTypeName();
+        return objectSpecification.getLogicalTypeName();
     }
 
     public String getLogicalTypeNameSanitized() {
-        return _LTN.sanitized(objectSpec);
+        return _LTN.sanitized(objectSpecification);
     }
 
     public BeanSort getBeanSort() {
-        return objectSpec.getBeanSort();
+        return objectSpecification.getBeanSort();
     }
 
-
-
-
-
     private final List<GqlvProperty> properties = new ArrayList<>();
     public List<GqlvProperty> getProperties() {return 
Collections.unmodifiableList(properties);}
 
@@ -99,18 +90,16 @@ public class GqlvDomainObject implements GqlvActionHolder, 
GqlvPropertyHolder, G
 
 
     public GqlvDomainObject(
-            final ObjectSpecification objectSpec,
+            final ObjectSpecification objectSpecification,
             final GraphQLCodeRegistry.Builder codeRegistryBuilder,
             final BookmarkService bookmarkService,
-            final ObjectManager objectManager,
-            final SpecificationLoader specificationLoader) {
-        this.objectSpec = objectSpec;
+            final ObjectManager objectManager) {
+        this.objectSpecification = objectSpecification;
         this.codeRegistryBuilder = codeRegistryBuilder;
-        this.specificationLoader = specificationLoader;
         this.gqlObjectTypeBuilder = 
newObject().name(getLogicalTypeNameSanitized());
 
-        meta = new GqlvDomainObjectMeta(this, codeRegistryBuilder, 
bookmarkService, objectManager);
-        mutators = new GqlvDomainObjectMutators(this, codeRegistryBuilder);
+        meta = new GqlvMeta(this, codeRegistryBuilder, bookmarkService, 
objectManager);
+        mutators = new GqlvMutators(this, codeRegistryBuilder);
 
         // input object type
         String inputTypeName = GQL_INPUTTYPE_PREFIX + 
getLogicalTypeNameSanitized();
@@ -131,7 +120,7 @@ public class GqlvDomainObject implements GqlvActionHolder, 
GqlvPropertyHolder, G
 
 
     public void addPropertiesAsFields() {
-        
objectSpec.streamProperties(MixedIn.INCLUDED).forEach(this::addPropertyAsField);
+        
objectSpecification.streamProperties(MixedIn.INCLUDED).forEach(this::addPropertyAsField);
     }
 
 
@@ -175,7 +164,7 @@ public class GqlvDomainObject implements GqlvActionHolder, 
GqlvPropertyHolder, G
 
 
     public void addCollectionsAsLists() {
-        
objectSpec.streamCollections(MixedIn.INCLUDED).forEach(this::addCollection);
+        
objectSpecification.streamCollections(MixedIn.INCLUDED).forEach(this::addCollection);
     }
 
     private void addCollection(OneToManyAssociation otom) {
@@ -308,7 +297,7 @@ public class GqlvDomainObject implements GqlvActionHolder, 
GqlvPropertyHolder, G
 
     public void addActionsAsFields() {
 
-        objectSpec.streamActions(ActionScope.PRODUCTION, MixedIn.INCLUDED)
+        objectSpecification.streamActions(ActionScope.PRODUCTION, 
MixedIn.INCLUDED)
                 .forEach(this::addAction);
 
         Optional<GraphQLObjectType> mutatorsTypeIfAny = 
buildMutatorsTypeIfAny();
@@ -339,7 +328,7 @@ public class GqlvDomainObject implements GqlvActionHolder, 
GqlvPropertyHolder, G
 
     public void addDataFetchersForMutators() {
 
-        // TODO: something similar to addFetchers for safe actions, but 
applied to GqlvDomainObjectMutators instead; perhaps they share a common 
interface?
+        // TODO: something similar to addFetchers for safe actions, but 
applied to GqlvMutators instead; perhaps they share a common interface?
 
         // earlier code...
 
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 35a15d9b95..5afe4b6ccf 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
@@ -16,27 +16,21 @@ import java.util.stream.Collectors;
 
 import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
-import org.apache.causeway.core.metamodel.specloader.SpecificationLoader;
 import org.apache.causeway.viewer.graphql.model.util._LTN;
 import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
 
 import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
 import static graphql.schema.GraphQLObjectType.newObject;
 
-public class GqlvDomainService implements GqlvActionHolder {
+public class GqlvDomainService implements GqlvActionHolder, GqlvMutatorsHolder 
{
 
-    private final ObjectSpecification serviceSpec;
+    @Getter private final ObjectSpecification objectSpecification;
     @Getter private final Object pojo;
     private final GraphQLCodeRegistry.Builder codeRegistryBuilder;
-    private final SpecificationLoader specificationLoader;
-
+    private final GqlvMutators mutators;
 
     private String getLogicalTypeName() {
-        return serviceSpec.getLogicalTypeName();
-    }
-
-    public String getLogicalTypeNameSanitized() {
-        return _LTN.sanitized(serviceSpec);
+        return objectSpecification.getLogicalTypeName();
     }
 
     private final GraphQLObjectType.Builder gqlObjectTypeBuilder;
@@ -44,17 +38,17 @@ public class GqlvDomainService implements GqlvActionHolder {
     private GraphQLObjectType gqlObjectType;
 
     public GqlvDomainService(
-            final ObjectSpecification serviceSpec,
+            final ObjectSpecification objectSpecification,
             final Object pojo,
-            final GraphQLCodeRegistry.Builder codeRegistryBuilder,
-            final SpecificationLoader specificationLoader
+            final GraphQLCodeRegistry.Builder codeRegistryBuilder
     ) {
-        this.serviceSpec = serviceSpec;
+        this.objectSpecification = objectSpecification;
         this.pojo = pojo;
         this.codeRegistryBuilder = codeRegistryBuilder;
-        this.specificationLoader = specificationLoader;
 
-        this.gqlObjectTypeBuilder = 
newObject().name(_LTN.sanitized(serviceSpec));
+        this.mutators = new GqlvMutators(this, codeRegistryBuilder);
+
+        this.gqlObjectTypeBuilder = 
newObject().name(_LTN.sanitized(objectSpecification));
     }
 
 
@@ -87,7 +81,7 @@ public class GqlvDomainService implements GqlvActionHolder {
 
     public GraphQLFieldDefinition createTopLevelQueryField() {
         return newFieldDefinition()
-                .name(_LTN.sanitized(serviceSpec))
+                .name(_LTN.sanitized(objectSpecification))
                 .type(gqlObjectTypeBuilder)
                 .build();
     }
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObjectMeta.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMeta.java
similarity index 79%
rename from 
incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObjectMeta.java
rename to 
incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMeta.java
index ea43a45056..f3f7cc9724 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObjectMeta.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMeta.java
@@ -14,14 +14,13 @@ import lombok.val;
 import org.apache.causeway.applib.services.bookmark.BookmarkService;
 import org.apache.causeway.applib.services.metamodel.BeanSort;
 import org.apache.causeway.core.metamodel.objectmanager.ObjectManager;
-import org.apache.causeway.viewer.graphql.model.parts.GqlvMeta;
 
 import static graphql.schema.FieldCoordinates.coordinates;
 import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
 import static graphql.schema.GraphQLNonNull.nonNull;
 import static graphql.schema.GraphQLObjectType.newObject;
 
-public class GqlvDomainObjectMeta {
+public class GqlvMeta {
 
     @UtilityClass
     static class Fields {
@@ -49,7 +48,7 @@ public class GqlvDomainObjectMeta {
 
     @Getter private final GraphQLFieldDefinition metaField;
 
-    public GqlvDomainObjectMeta(
+    public GqlvMeta(
             final GqlvDomainObject domainObject,
             final GraphQLCodeRegistry.Builder codeRegistryBuilder,
             final BookmarkService bookmarkService,
@@ -70,10 +69,10 @@ public class GqlvDomainObjectMeta {
 
     private GraphQLObjectType metaType() {
         val metaTypeBuilder = 
newObject().name(domainObject.getLogicalTypeNameSanitized() + "__meta");
-        metaTypeBuilder.field(GqlvDomainObjectMeta.Fields.id);
-        metaTypeBuilder.field(GqlvDomainObjectMeta.Fields.logicalTypeName);
+        metaTypeBuilder.field(GqlvMeta.Fields.id);
+        metaTypeBuilder.field(GqlvMeta.Fields.logicalTypeName);
         if (domainObject.getBeanSort() == BeanSort.ENTITY) {
-            metaTypeBuilder.field(GqlvDomainObjectMeta.Fields.version);
+            metaTypeBuilder.field(GqlvMeta.Fields.version);
         }
         return metaTypeBuilder.build();
     }
@@ -84,29 +83,29 @@ public class GqlvDomainObjectMeta {
                 coordinates(domainObject.getGqlObjectType(), getMetaField()),
                 (DataFetcher<Object>) environment -> {
                     return bookmarkService.bookmarkFor(environment.getSource())
-                            .map(bookmark -> new GqlvMeta(bookmark, 
bookmarkService, objectManager))
+                            .map(bookmark -> new 
org.apache.causeway.viewer.graphql.model.parts.GqlvMeta(bookmark, 
bookmarkService, objectManager))
                             .orElse(null); //TODO: is this correct ?
                 });
 
         codeRegistryBuilder.dataFetcher(
-                coordinates(getMetaType(), GqlvDomainObjectMeta.Fields.id),
+                coordinates(getMetaType(), GqlvMeta.Fields.id),
                 (DataFetcher<Object>) environment -> {
-                    GqlvMeta gqlvMeta = environment.getSource();
+                    org.apache.causeway.viewer.graphql.model.parts.GqlvMeta 
gqlvMeta = environment.getSource();
                     return gqlvMeta.id();
                 });
 
         codeRegistryBuilder.dataFetcher(
-                coordinates(getMetaType(), 
GqlvDomainObjectMeta.Fields.logicalTypeName),
+                coordinates(getMetaType(), GqlvMeta.Fields.logicalTypeName),
                 (DataFetcher<Object>) environment -> {
-                    GqlvMeta gqlvMeta = environment.getSource();
+                    org.apache.causeway.viewer.graphql.model.parts.GqlvMeta 
gqlvMeta = environment.getSource();
                     return gqlvMeta.logicalTypeName();
                 });
 
         if (domainObject.getBeanSort() == BeanSort.ENTITY) {
             codeRegistryBuilder.dataFetcher(
-                    coordinates(getMetaType(), 
GqlvDomainObjectMeta.Fields.version),
+                    coordinates(getMetaType(), GqlvMeta.Fields.version),
                     (DataFetcher<Object>) environment -> {
-                        GqlvMeta gqlvMeta = environment.getSource();
+                        
org.apache.causeway.viewer.graphql.model.parts.GqlvMeta gqlvMeta = 
environment.getSource();
                         return gqlvMeta.version();
                     });
         }
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/GqlvMutators.java
similarity index 76%
rename from 
incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObjectMutators.java
rename to 
incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMutators.java
index c64d0cf46b..3632357a4f 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/GqlvMutators.java
@@ -10,12 +10,13 @@ import java.util.List;
 import java.util.Optional;
 
 import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
+import org.apache.causeway.viewer.graphql.model.util._LTN;
 
 import static graphql.schema.GraphQLObjectType.newObject;
 
-public class GqlvDomainObjectMutators implements GqlvActionHolder {
+public class GqlvMutators implements GqlvActionHolder {
 
-    private final GqlvDomainObject domainObject;
+    private final GqlvMutatorsHolder holder;
     private final GraphQLCodeRegistry.Builder codeRegistryBuilder;
 
     final GraphQLObjectType.Builder mutatorsTypeBuilder;
@@ -26,14 +27,14 @@ public class GqlvDomainObjectMutators implements 
GqlvActionHolder {
     @SuppressWarnings("OptionalUsedAsFieldOrParameterType")
     private Optional<GraphQLObjectType> mutatorsTypeIfAny;
 
-    public GqlvDomainObjectMutators(
-            final GqlvDomainObject domainObject,
+    public GqlvMutators(
+            final GqlvMutatorsHolder holder,
             final GraphQLCodeRegistry.Builder codeRegistryBuilder
     ) {
-        this.domainObject = domainObject;
+        this.holder = holder;
         this.codeRegistryBuilder = codeRegistryBuilder;
 
-        mutatorsTypeBuilder = 
newObject().name(this.domainObject.getLogicalTypeNameSanitized() + 
"__mutators");
+        mutatorsTypeBuilder = 
newObject().name(_LTN.sanitized(this.holder.getObjectSpecification()) + 
"__mutators");
 
     }
 
@@ -42,7 +43,7 @@ public class GqlvDomainObjectMutators implements 
GqlvActionHolder {
             final GraphQLFieldDefinition fieldDefinition) {
 
         mutatorsTypeBuilder.field(fieldDefinition);
-        actions.add(new GqlvAction(domainObject, objectAction, 
fieldDefinition, codeRegistryBuilder));
+        actions.add(new GqlvAction(holder, objectAction, fieldDefinition, 
codeRegistryBuilder));
     }
 
     private final List<GqlvAction> actions = new ArrayList<>();
@@ -59,7 +60,7 @@ public class GqlvDomainObjectMutators implements 
GqlvActionHolder {
     public Optional<GraphQLObjectType> getMutatorsTypeIfAny() {
         //noinspection OptionalAssignedToNull
         if (mutatorsTypeIfAny == null) {
-            throw new IllegalArgumentException(String.format("Gql MutatorsType 
has not yet been built for %s", domainObject.getLogicalTypeName()));
+            throw new IllegalArgumentException(String.format("Gql MutatorsType 
has not yet been built for %s", 
holder.getObjectSpecification().getLogicalTypeName()));
         }
         return mutatorsTypeIfAny;
     }
@@ -70,7 +71,7 @@ public class GqlvDomainObjectMutators implements 
GqlvActionHolder {
     public Optional<GraphQLObjectType> buildMutatorsTypeIfAny() {
         //noinspection OptionalAssignedToNull
         if (mutatorsTypeIfAny != null) {
-            throw new IllegalArgumentException("Gql MutatorsType has already 
been built for " + domainObject.getLogicalTypeName());
+            throw new IllegalArgumentException("Gql MutatorsType has already 
been built for " + holder.getObjectSpecification().getLogicalTypeName());
         }
         return mutatorsTypeIfAny = hasActions()
                 ? Optional.of(mutatorsTypeBuilder.build())
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMutatorsHolder.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMutatorsHolder.java
new file mode 100644
index 0000000000..f87df03c4b
--- /dev/null
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMutatorsHolder.java
@@ -0,0 +1,9 @@
+package org.apache.causeway.viewer.graphql.model.domain;
+
+import graphql.schema.GraphQLObjectType;
+
+import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
+
+public interface GqlvMutatorsHolder extends GqlvActionHolder {
+    ObjectSpecification getObjectSpecification();
+}
diff --git 
a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/integration/GraphQlSourceForCauseway.java
 
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/integration/GraphQlSourceForCauseway.java
index dba564d034..6a815581b3 100644
--- 
a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/integration/GraphQlSourceForCauseway.java
+++ 
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/integration/GraphQlSourceForCauseway.java
@@ -172,7 +172,7 @@ public class GraphQlSourceForCauseway implements 
GraphQlSource {
             final GqlvTopLevelQuery topLevelQueryStructure,
             final GraphQLCodeRegistry.Builder codeRegistryBuilder) {
 
-        val domainService = new GqlvDomainService(objectSpec, service, 
codeRegistryBuilder, specificationLoader);
+        val domainService = new GqlvDomainService(objectSpec, service, 
codeRegistryBuilder);
 
         List<ObjectAction> objectActionList = 
objectSpec.streamRuntimeActions(MixedIn.INCLUDED)
                 .map(ObjectAction.class::cast)
@@ -196,7 +196,7 @@ public class GraphQlSourceForCauseway implements 
GraphQlSource {
             final ObjectSpecification objectSpec,
             final GraphQLCodeRegistry.Builder codeRegistryBuilder) {
 
-        val gqlvDomainObject = new GqlvDomainObject(objectSpec, 
codeRegistryBuilder, bookmarkService, objectManager, specificationLoader);
+        val gqlvDomainObject = new GqlvDomainObject(objectSpec, 
codeRegistryBuilder, bookmarkService, objectManager);
 
         gqlvDomainObject.addPropertiesAsFields();
         gqlvDomainObject.addCollectionsAsLists();

Reply via email to