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 acac2b2721c7918c540e80f14ac9b87781e5df45
Author: danhaywood <[email protected]>
AuthorDate: Mon Feb 12 11:47:32 2024 +0000

    CAUSEWAY-3676: wip, refactors
---
 .../viewer/graphql/model/domain/GqlvAction.java    | 33 +++++++++++----
 .../graphql/model/domain/GqlvActionInvoke.java     |  5 ++-
 .../graphql/model/domain/GqlvActionParam.java      | 49 ++++++++++++++++------
 .../model/domain/GqlvActionParamAutoComplete.java  |  5 ++-
 .../model/domain/GqlvActionParamChoices.java       |  5 ++-
 .../model/domain/GqlvActionParamDefault.java       |  5 ++-
 .../model/domain/GqlvActionParamDisabled.java      |  5 ++-
 .../model/domain/GqlvActionParamHidden.java        |  5 ++-
 .../model/domain/GqlvActionParamValidate.java      |  5 ++-
 .../graphql/model/domain/GqlvActionParams.java     | 17 ++++----
 .../graphql/model/domain/GqlvActionValidity.java   | 17 +++-----
 .../graphql/model/domain/GqlvAssociationGet.java   | 15 +++----
 .../graphql/model/domain/GqlvCollection.java       | 20 +++++----
 .../graphql/model/domain/GqlvDomainObject.java     | 17 +++++---
 .../graphql/model/domain/GqlvDomainService.java    | 27 ++++++------
 .../viewer/graphql/model/domain/GqlvHolder.java    |  5 ---
 .../viewer/graphql/model/domain/GqlvMember.java    |  1 +
 .../graphql/model/domain/GqlvMemberDisabled.java   |  7 ++--
 .../graphql/model/domain/GqlvMemberHidden.java     |  7 ++--
 .../viewer/graphql/model/domain/GqlvMeta.java      |  2 -
 .../model/domain/GqlvMutationForAction.java        |  5 ++-
 .../model/domain/GqlvMutationForProperty.java      |  5 ++-
 .../viewer/graphql/model/domain/GqlvProperty.java  | 41 +++++++++++++-----
 .../model/domain/GqlvPropertyAutoComplete.java     |  5 ++-
 .../graphql/model/domain/GqlvPropertyChoices.java  |  5 ++-
 .../graphql/model/domain/GqlvPropertySet.java      | 21 ++++------
 .../graphql/model/domain/GqlvPropertyValidate.java |  5 ++-
 .../viewer/graphql/model/domain/GqlvScenario.java  | 11 ++---
 .../graphql/model/domain/GqlvScenarioGiven.java    | 20 +++++----
 .../graphql/model/domain/GqlvScenarioName.java     |  5 ++-
 .../viewer/toplevel/GqlvTopLevelMutation.java      | 15 ++++---
 .../graphql/viewer/toplevel/GqlvTopLevelQuery.java | 18 ++++----
 32 files changed, 242 insertions(+), 166 deletions(-)

diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAction.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAction.java
index e684fd972a..cf6f34c507 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAction.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAction.java
@@ -83,22 +83,36 @@ public class GqlvAction
         this.gqlObjectTypeBuilder = 
newObject().name(TypeNames.actionTypeNameFor(holder.getObjectSpecification(), 
objectAction));
 
         this.hidden = new GqlvMemberHidden<>(this, context);
+        addField(hidden.getField());
         this.disabled = new GqlvMemberDisabled<>(this, context);
+        addField(disabled.getField());
         this.validate = new GqlvActionValidity(this, context);
+        addField(validate.getField());
 
         val variant = 
context.causewayConfiguration.getViewer().getGraphql().getApiVariant();
-        this.invoke = objectAction.getSemantics().isSafeInNature() || variant 
== QUERY_WITH_MUTATIONS_NON_SPEC_COMPLIANT
-                ? new GqlvActionInvoke(this, context)
-                : null;
+        if (objectAction.getSemantics().isSafeInNature() || variant == 
QUERY_WITH_MUTATIONS_NON_SPEC_COMPLIANT) {
+            this.invoke = new GqlvActionInvoke(this, context);
+            GraphQLFieldDefinition invokeField = this.invoke.getField();
+            if (invokeField != null) {
+                addField(invokeField);
+            }
+        } else {
+            this.invoke = null;
+        }
         val params = new GqlvActionParams(this, context);
-        this.params = params.hasParams() ? params : null;
+        if (params.hasParams()) {
+            this.params = params;
+            addField(params.getField());
+        } else {
+            this.params = null;
+        }
 
         this.gqlObjectType = gqlObjectTypeBuilder.build();
 
-        this.field = holder.addField(newFieldDefinition()
+        this.field = newFieldDefinition()
                 .name(objectAction.getId())
                 .type(gqlObjectTypeBuilder)
-                .build());
+                .build();
     }
 
     public Can<ManagedObject> argumentManagedObjectsFor(
@@ -244,9 +258,10 @@ public class GqlvAction
         return getObjectMember();
     }
 
-    @Override
-    public GraphQLFieldDefinition addField(GraphQLFieldDefinition field) {
-        gqlObjectTypeBuilder.field(field);
+    private GraphQLFieldDefinition addField(GraphQLFieldDefinition field) {
+        if (field != null) {
+            gqlObjectTypeBuilder.field(field);
+        }
         return field;
     }
 
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionInvoke.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionInvoke.java
index b12284119b..0b004088dc 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionInvoke.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionInvoke.java
@@ -44,6 +44,7 @@ import 
org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojo;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectActionProvider;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectSpecificationProvider;
 
+import lombok.Getter;
 import lombok.val;
 import lombok.extern.log4j.Log4j2;
 
@@ -52,7 +53,7 @@ public class GqlvActionInvoke {
 
     private final Holder holder;
     private final Context context;
-    private final GraphQLFieldDefinition field;
+    @Getter private final GraphQLFieldDefinition field;
 
     public GqlvActionInvoke(
             final Holder holder,
@@ -68,7 +69,7 @@ public class GqlvActionInvoke {
                     .name(fieldNameForSemanticsOf(objectAction))
                     .type(type);
             holder.addGqlArguments(objectAction, fieldBuilder, 
TypeMapper.InputContext.INVOKE, objectAction.getParameterCount());
-            this.field = holder.addField(fieldBuilder.build());
+            this.field = fieldBuilder.build();
         } else {
             this.field = null;
         }
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParam.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParam.java
index 2d9ab9c06d..d1c1dd27ab 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParam.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParam.java
@@ -60,7 +60,7 @@ public class GqlvActionParam
     private final GraphQLObjectType gqlObjectType;
 
     private final GqlvActionParamHidden hidden;
-    private final GqlvActionParamDisabled validate;
+    private final GqlvActionParamDisabled disabled;
     /**
      * Populated iff there are choices for this param
      */
@@ -73,9 +73,9 @@ public class GqlvActionParam
      * Populated iff there is a default for this param
      */
     private final GqlvActionParamDefault default_;
-    private final GqlvActionParamValidate disabled;
+    private final GqlvActionParamValidate validate;
 
-    private final GraphQLFieldDefinition field;
+    @Getter private final GraphQLFieldDefinition field;
 
     public GqlvActionParam(
             final Holder holder,
@@ -89,21 +89,43 @@ public class GqlvActionParam
         this.gqlObjectTypeBuilder = 
newObject().name(TypeNames.actionParamTypeNameFor(holder.getObjectSpecification(),
 objectActionParameter));
 
         this.hidden = new GqlvActionParamHidden(this, context);
-        this.disabled = new GqlvActionParamValidate(this, context);
+        addField(hidden.getField());
+        this.disabled = new GqlvActionParamDisabled(this, context);
+        addField(disabled.getField());
+
         val choices = new GqlvActionParamChoices(this, context);
-        this.choices = choices.hasChoices() ? choices : null;
+        addField(choices.getField());
+        if (choices.hasChoices()) {
+            this.choices = choices;
+        } else {
+            this.choices = null;
+        }
+
         val autoComplete = new GqlvActionParamAutoComplete(this, context);
-        this.autoComplete = autoComplete.hasAutoComplete() ? autoComplete : 
null;
+        addField(autoComplete.getField());
+        if (autoComplete.hasAutoComplete()) {
+            this.autoComplete = autoComplete;
+        } else {
+            this.autoComplete = null;
+        }
+
         val default_ = new GqlvActionParamDefault(this, context);
-        this.default_ = default_.hasDefault() ? default_ : null;
-        this.validate = new GqlvActionParamDisabled(this, context);
+        addField(default_.getField());
+        if (default_.hasDefault()) {
+            this.default_ = default_;
+        } else {
+            this.default_ = null;
+        }
+
+        this.validate = new GqlvActionParamValidate(this, context);
+        addField(validate.getField());
 
         this.gqlObjectType = gqlObjectTypeBuilder.build();
 
-        this.field = holder.addField(newFieldDefinition()
+        this.field = newFieldDefinition()
                         .name(objectActionParameter.getId())
                         .type(gqlObjectTypeBuilder)
-                        .build());
+                        .build();
     }
 
     @Override
@@ -121,9 +143,10 @@ public class GqlvActionParam
         return holder.getObjectAction();
     }
 
-    @Override
-    public GraphQLFieldDefinition addField(GraphQLFieldDefinition field) {
-        gqlObjectTypeBuilder.field(field);
+    private GraphQLFieldDefinition addField(GraphQLFieldDefinition field) {
+        if (field != null) {
+            gqlObjectTypeBuilder.field(field);
+        }
         return field;
     }
 
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamAutoComplete.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamAutoComplete.java
index f519510de8..f9adb7bbbd 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamAutoComplete.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamAutoComplete.java
@@ -45,6 +45,7 @@ package org.apache.causeway.viewer.graphql.model.domain;
  import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectActionProvider;
  import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectSpecificationProvider;
 
+ import lombok.Getter;
  import lombok.val;
  import lombok.extern.log4j.Log4j2;
 
@@ -59,7 +60,7 @@ package org.apache.causeway.viewer.graphql.model.domain;
      /**
       * Populated iff there is an autocomplete for this parameter.
       */
-     private final GraphQLFieldDefinition field;
+     @Getter private final GraphQLFieldDefinition field;
 
      public GqlvActionParamAutoComplete(
              final Holder holder,
@@ -78,7 +79,7 @@ package org.apache.causeway.viewer.graphql.model.domain;
                      .name(SEARCH_PARAM_NAME)
                      
.type(nonNull(context.typeMapper.scalarTypeFor(String.class))))
                      .build();
-             this.field = holder.addField(fieldBuilder.build());
+             this.field = fieldBuilder.build();
          } else {
              this.field = null;
          }
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamChoices.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamChoices.java
index d6dc002eaa..68066bcc3f 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamChoices.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamChoices.java
@@ -43,6 +43,7 @@ package org.apache.causeway.viewer.graphql.model.domain;
  import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectActionProvider;
  import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectSpecificationProvider;
 
+ import lombok.Getter;
  import lombok.val;
  import lombok.extern.log4j.Log4j2;
 
@@ -55,7 +56,7 @@ package org.apache.causeway.viewer.graphql.model.domain;
      /**
       * Populated iff there are choices for this parameter.
       */
-     private final GraphQLFieldDefinition field;
+     @Getter private final GraphQLFieldDefinition field;
 
      public GqlvActionParamChoices(
              final Holder holder,
@@ -70,7 +71,7 @@ package org.apache.causeway.viewer.graphql.model.domain;
                      .name("choices")
                      
.type(GraphQLList.list(context.typeMapper.outputTypeFor(elementType)));
              holder.addGqlArguments(holder.getObjectAction(), fieldBuilder, 
TypeMapper.InputContext.CHOICES, holder.getParamNum());
-             this.field = holder.addField(fieldBuilder.build());
+             this.field = fieldBuilder.build();
          } else {
              this.field = null;
          }
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamDefault.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamDefault.java
index b69b092b08..4d76b79dd2 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamDefault.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamDefault.java
@@ -39,6 +39,7 @@ package org.apache.causeway.viewer.graphql.model.domain;
  import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectActionProvider;
  import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectSpecificationProvider;
 
+ import lombok.Getter;
  import lombok.val;
  import lombok.extern.log4j.Log4j2;
 
@@ -51,7 +52,7 @@ package org.apache.causeway.viewer.graphql.model.domain;
      /**
       * Populated iff there are choices for this parameter.
       */
-     private final GraphQLFieldDefinition field;
+     @Getter private final GraphQLFieldDefinition field;
 
      public GqlvActionParamDefault(
              final Holder holder,
@@ -67,7 +68,7 @@ package org.apache.causeway.viewer.graphql.model.domain;
                      .name("default")
                      .type(context.typeMapper.outputTypeFor(elementType));
              holder.addGqlArguments(holder.getObjectAction(), fieldBuilder, 
TypeMapper.InputContext.DEFAULT, holder.getParamNum());
-             this.field = holder.addField(fieldBuilder.build());
+             this.field = fieldBuilder.build();
          } else {
              this.field = null;
          }
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamDisabled.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamDisabled.java
index 5ebea26bf6..e3662dfd1d 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamDisabled.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamDisabled.java
@@ -35,6 +35,7 @@ import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectActionParamete
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectActionProvider;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectSpecificationProvider;
 
+import lombok.Getter;
 import lombok.val;
 import lombok.extern.log4j.Log4j2;
 
@@ -45,7 +46,7 @@ public class GqlvActionParamDisabled {
     private final Holder holder;
     private final Context context;
 
-    private final GraphQLFieldDefinition field;
+    @Getter private final GraphQLFieldDefinition field;
 
     public GqlvActionParamDisabled(
             final Holder holder,
@@ -57,7 +58,7 @@ public class GqlvActionParamDisabled {
                 .name("disabled")
                 .type(context.typeMapper.scalarTypeFor(String.class));
         holder.addGqlArguments(holder.getObjectAction(), fieldBuilder, 
TypeMapper.InputContext.DISABLE, holder.getParamNum()+1);
-        this.field = holder.addField(fieldBuilder.build());
+        this.field = fieldBuilder.build();
     }
 
 
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamHidden.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamHidden.java
index 6c62bd3b04..7ef7359fa5 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamHidden.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamHidden.java
@@ -35,6 +35,7 @@ package org.apache.causeway.viewer.graphql.model.domain;
  import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectActionProvider;
  import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectSpecificationProvider;
 
+ import lombok.Getter;
  import lombok.val;
  import lombok.extern.log4j.Log4j2;
 
@@ -44,7 +45,7 @@ public class GqlvActionParamHidden {
     private final Holder holder;
     private final Context context;
 
-    private final GraphQLFieldDefinition field;
+    @Getter private final GraphQLFieldDefinition field;
 
     public GqlvActionParamHidden(
             final Holder holder,
@@ -56,7 +57,7 @@ public class GqlvActionParamHidden {
                 .name("hidden")
                 .type(context.typeMapper.scalarTypeFor(boolean.class));
         holder.addGqlArguments(holder.getObjectAction(), fieldBuilder, 
TypeMapper.InputContext.DISABLE, holder.getParamNum());
-        this.field = holder.addField(fieldBuilder.build());
+        this.field = fieldBuilder.build();
     }
 
 
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamValidate.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamValidate.java
index 7edf570c52..04aa28c81c 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamValidate.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParamValidate.java
@@ -35,6 +35,7 @@ import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectActionParamete
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectActionProvider;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectSpecificationProvider;
 
+import lombok.Getter;
 import lombok.val;
 import lombok.extern.log4j.Log4j2;
 
@@ -44,7 +45,7 @@ public class GqlvActionParamValidate {
     private final Holder holder;
     private final Context context;
 
-    private final GraphQLFieldDefinition field;
+    @Getter private final GraphQLFieldDefinition field;
 
     public GqlvActionParamValidate(
             final Holder holder,
@@ -56,7 +57,7 @@ public class GqlvActionParamValidate {
                 .name("validity")
                 .type(context.typeMapper.scalarTypeFor(String.class));
         holder.addGqlArgument(holder.getObjectAction(), fieldBuilder, 
TypeMapper.InputContext.DISABLE, holder.getParamNum());
-        this.field = holder.addField(fieldBuilder.build());
+        this.field = fieldBuilder.build();
     }
 
 
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParams.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParams.java
index b3ec3f35ed..7f864793c4 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParams.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionParams.java
@@ -58,7 +58,7 @@ public class GqlvActionParams implements 
GqlvActionParam.Holder {
     /**
      * Populated iff {@link #hasParams()}
      */
-    private final GraphQLFieldDefinition field;
+    @Getter private final GraphQLFieldDefinition field;
 
     private final Map<String, GqlvActionParam> params = new LinkedHashMap<>();
 
@@ -77,10 +77,10 @@ public class GqlvActionParams implements 
GqlvActionParam.Holder {
         this.gqlObjectType = gqlObjectTypeBuilder.build();
 
         this.field = hasParams() ?
-                holder.addField(newFieldDefinition()
+                newFieldDefinition()
                     .name("params")
                     .type(gqlObjectTypeBuilder)
-                    .build())
+                    .build()
                 : null;
     }
 
@@ -104,13 +104,16 @@ public class GqlvActionParams implements 
GqlvActionParam.Holder {
     }
 
     void addParam(ObjectActionParameter objectActionParameter, int paramNum) {
-        params.put(objectActionParameter.getId(), new GqlvActionParam(this, 
objectActionParameter, context, paramNum));
+        GqlvActionParam gqlvActionParam = new GqlvActionParam(this, 
objectActionParameter, context, paramNum);
+        addField(gqlvActionParam.getField());
+        params.put(objectActionParameter.getId(), gqlvActionParam);
     }
 
 
-     @Override
-    public GraphQLFieldDefinition addField(GraphQLFieldDefinition field) {
-        gqlObjectTypeBuilder.field(field);
+    private GraphQLFieldDefinition addField(GraphQLFieldDefinition field) {
+        if (field != null) {
+            gqlObjectTypeBuilder.field(field);
+        }
         return field;
     }
 
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionValidity.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionValidity.java
index ea20bab613..bb03187654 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionValidity.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvActionValidity.java
@@ -38,6 +38,7 @@ import 
org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojo;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectActionProvider;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectSpecificationProvider;
 
+import lombok.Getter;
 import lombok.val;
 import lombok.extern.log4j.Log4j2;
 
@@ -46,7 +47,7 @@ public class GqlvActionValidity {
 
     private final Holder holder;
     private final Context context;
-    private final GraphQLFieldDefinition field;
+    @Getter private final GraphQLFieldDefinition field;
 
     public GqlvActionValidity(
             final Holder holder,
@@ -54,26 +55,20 @@ public class GqlvActionValidity {
     ) {
         this.holder = holder;
         this.context = context;
-        this.field = fieldDefinition(holder);
-    }
-
-    private GraphQLFieldDefinition fieldDefinition(final Holder holder) {
 
         val objectAction = holder.getObjectAction();
 
-        GraphQLFieldDefinition fieldDefinition = null;
-        GraphQLOutputType type = 
context.typeMapper.scalarTypeFor(String.class);
+        GraphQLOutputType type = 
this.context.typeMapper.scalarTypeFor(String.class);
         if (type != null) {
             val fieldBuilder = newFieldDefinition()
                     .name("validate")
                     .type(type);
 
             holder.addGqlArguments(objectAction, fieldBuilder, 
TypeMapper.InputContext.VALIDATE, objectAction.getParameterCount());
-            fieldDefinition = fieldBuilder.build();
-
-            holder.addField(fieldDefinition);
+            this.field = fieldBuilder.build();
+        } else {
+            this.field = null;
         }
-        return fieldDefinition;
     }
 
     public void addDataFetcher() {
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAssociationGet.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAssociationGet.java
index b36b804e61..743e6ad346 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAssociationGet.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAssociationGet.java
@@ -31,35 +31,30 @@ import 
org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojo;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectAssociationProvider;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectSpecificationProvider;
 
+import lombok.Getter;
 import lombok.val;
 
 public abstract class GqlvAssociationGet<T extends ObjectAssociation> {
 
     final Holder<T> holder;
     final Context context;
-    final GraphQLFieldDefinition field;
+    @Getter final GraphQLFieldDefinition field;
 
     public GqlvAssociationGet(
             final Holder<T> holder,
             final Context context) {
         this.holder = holder;
         this.context = context;
-        this.field = fieldDefinition(holder);
-    }
-
-    GraphQLFieldDefinition fieldDefinition(final Holder<T> holder) {
 
-        GraphQLFieldDefinition fieldDefinition = null;
         GraphQLOutputType type = outputTypeFor(holder);
         if (type != null) {
             val fieldBuilder = newFieldDefinition()
                     .name("get")
                     .type(type);
-            fieldDefinition = fieldBuilder.build();
-
-            holder.addField(fieldDefinition);
+            this.field = fieldBuilder.build();
+        } else {
+            this.field = null;
         }
-        return fieldDefinition;
     }
 
     abstract GraphQLOutputType outputTypeFor(Holder<T> holder);
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollection.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollection.java
index f1cb35e937..ca5ece1651 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollection.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollection.java
@@ -51,18 +51,19 @@ public class GqlvCollection
         this.gqlObjectTypeBuilder = 
newObject().name(TypeNames.collectionTypeNameFor(holder.getObjectSpecification(),
 oneToManyAssociation));
 
         this.hidden = new GqlvMemberHidden<>(this, context);
+        addField(hidden.getField());
         this.disabled = new GqlvMemberDisabled<>(this, context);
+        addField(disabled.getField());
         this.get = new GqlvCollectionGet(this, context);
+        addField(get.getField());
 
         this.gqlObjectType = gqlObjectTypeBuilder.build();
 
         setField(
-            holder.addField(
-                newFieldDefinition()
-                    .name(oneToManyAssociation.getId())
-                    .type(gqlObjectTypeBuilder)
-                    .build()
-            )
+            newFieldDefinition()
+                .name(oneToManyAssociation.getId())
+                .type(gqlObjectTypeBuilder)
+                .build()
         );
     }
 
@@ -75,9 +76,10 @@ public class GqlvCollection
         return getObjectAssociation();
     }
 
-    @Override
-    public GraphQLFieldDefinition addField(GraphQLFieldDefinition field) {
-        gqlObjectTypeBuilder.field(field);
+    private GraphQLFieldDefinition addField(GraphQLFieldDefinition field) {
+        if (field != null) {
+            gqlObjectTypeBuilder.field(field);
+        }
         return field;
     }
 
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObject.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObject.java
index cc05e527bb..3079192058 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObject.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObject.java
@@ -95,6 +95,7 @@ public class GqlvDomainObject
         this.gqlObjectTypeBuilder = 
newObject().name(TypeNames.objectTypeNameFor(objectSpecification));
 
         this.meta = new GqlvMeta(this, context);
+        addField(meta.getField());
 
         GraphQLInputObjectType.Builder inputTypeBuilder = 
newInputObject().name(TypeNames.inputTypeNameFor(objectSpecification));
         inputTypeBuilder
@@ -142,7 +143,9 @@ public class GqlvDomainObject
 
         objectSpecification.streamActions(context.getActionScope(), 
MixedIn.INCLUDED)
                 .forEach(objectAction -> {
-                    actions.put(objectAction.getId(), new GqlvAction(this, 
objectAction, context));
+                    GqlvAction gqlvAction = new GqlvAction(this, objectAction, 
context);
+                    addField(gqlvAction.getField());
+                    actions.put(objectAction.getId(), gqlvAction);
                 });
     }
 
@@ -154,20 +157,24 @@ public class GqlvDomainObject
     }
 
     private void addProperty(final OneToOneAssociation otoa) {
-        properties.put(otoa.getId(), new GqlvProperty(this, otoa, context));
+        GqlvProperty gqlvProperty = new GqlvProperty(this, otoa, context);
+        addField(gqlvProperty.getField());
+        properties.put(otoa.getId(), gqlvProperty);
     }
 
     private void addCollection(OneToManyAssociation otom) {
         GqlvCollection collection = new GqlvCollection(this, otom, context);
+        addField(collection.getField());
         if (collection.hasFieldDefinition()) {
             collections.put(otom.getId(), collection);
         }
     }
 
 
-    @Override
-    public GraphQLFieldDefinition addField(GraphQLFieldDefinition field) {
-        gqlObjectTypeBuilder.field(field);
+    private GraphQLFieldDefinition addField(GraphQLFieldDefinition field) {
+        if (field != null) {
+            gqlObjectTypeBuilder.field(field);
+        }
         return field;
     }
 
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainService.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainService.java
index f7ffc3c04d..f29919d5e8 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainService.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainService.java
@@ -51,7 +51,7 @@ public class GqlvDomainService implements GqlvAction.Holder {
 
     private final GraphQLObjectType.Builder gqlObjectTypeBuilder;
 
-    @Getter private GraphQLFieldDefinition field;
+    @Getter private final GraphQLFieldDefinition field;
 
 
     String getLogicalTypeName() {
@@ -91,7 +91,12 @@ public class GqlvDomainService implements GqlvAction.Holder {
 
         if (hasActions()) {
             gqlObjectType = gqlObjectTypeBuilder.build();
-            addFieldFor(holder);
+            this.field = newFieldDefinition()
+                    
.name(TypeNames.objectTypeNameFor(this.objectSpecification))
+                    .type(gqlObjectType)
+                    .build();
+        } else {
+            this.field = null;
         }
     }
 
@@ -110,13 +115,16 @@ public class GqlvDomainService implements 
GqlvAction.Holder {
     }
 
     private void addAction(final ObjectAction objectAction) {
-        actions.put(objectAction.getId(), new GqlvAction(this, objectAction, 
context));
+        GqlvAction gqlvAction = new GqlvAction(this, objectAction, context);
+        addField(gqlvAction.getField());
+        actions.put(objectAction.getId(), gqlvAction);
     }
 
 
-    @Override
-    public GraphQLFieldDefinition addField(GraphQLFieldDefinition field) {
-        gqlObjectTypeBuilder.field(field);
+    private GraphQLFieldDefinition addField(GraphQLFieldDefinition field) {
+        if (field != null) {
+            gqlObjectTypeBuilder.field(field);
+        }
         return field;
     }
 
@@ -129,13 +137,6 @@ public class GqlvDomainService implements 
GqlvAction.Holder {
         return coordinates(gqlObjectType, fieldDefinition);
     }
 
-    public void addFieldFor(Holder holder) {
-        holder.addField(this.field = newFieldDefinition()
-                .name(TypeNames.objectTypeNameFor(objectSpecification))
-                .type(gqlObjectType)
-                .build());
-    }
-
     public void addDataFetchers() {
         context.codeRegistryBuilder.dataFetcher(
                 holder.coordinatesFor(getField()),
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvHolder.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvHolder.java
index 805eaa79f5..588d9dd7e0 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvHolder.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvHolder.java
@@ -23,11 +23,6 @@ import graphql.schema.GraphQLFieldDefinition;
 
 public interface GqlvHolder {
 
-    /**
-     * Called while building out the structure
-     */
-    GraphQLFieldDefinition addField(GraphQLFieldDefinition fieldDefinition);
-
     /**
      * Called while registering the fetchers.
      */
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMember.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMember.java
index 6b0aab0465..425ae899a7 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMember.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMember.java
@@ -34,6 +34,7 @@ public abstract class GqlvMember<T extends ObjectMember, H 
extends GqlvMember.Ho
     @Getter private final T objectMember;
 
     final Context context;
+
     @Getter @Setter(AccessLevel.PACKAGE)
     GraphQLFieldDefinition field;
 
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMemberDisabled.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMemberDisabled.java
index 9c0be5b258..351f45ee60 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMemberDisabled.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMemberDisabled.java
@@ -32,6 +32,7 @@ import 
org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojo;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectMemberProvider;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectSpecificationProvider;
 
+import lombok.Getter;
 import lombok.val;
 import lombok.extern.log4j.Log4j2;
 
@@ -40,7 +41,7 @@ public class GqlvMemberDisabled<T extends ObjectMember> {
 
     private final Holder<T> holder;
     private final Context context;
-    private final GraphQLFieldDefinition field;
+    @Getter private final GraphQLFieldDefinition field;
 
     public GqlvMemberDisabled(
             final Holder<T> holder,
@@ -49,10 +50,10 @@ public class GqlvMemberDisabled<T extends ObjectMember> {
         this.holder = holder;
         this.context = context;
 
-        this.field = holder.addField(newFieldDefinition()
+        this.field = newFieldDefinition()
                 .name("disabled")
                 .type(this.context.typeMapper.scalarTypeFor(String.class))
-                .build());
+                .build();
     }
 
     public void addDataFetcher() {
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMemberHidden.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMemberHidden.java
index a60a09b057..b1f95f7993 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMemberHidden.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMemberHidden.java
@@ -32,6 +32,7 @@ import 
org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojo;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectMemberProvider;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectSpecificationProvider;
 
+import lombok.Getter;
 import lombok.val;
 import lombok.extern.log4j.Log4j2;
 
@@ -40,7 +41,7 @@ public class GqlvMemberHidden<T extends ObjectMember> {
 
     private final Holder<T> holder;
     private final Context context;
-    private final GraphQLFieldDefinition field;
+    @Getter private final GraphQLFieldDefinition field;
 
     public GqlvMemberHidden(
             final Holder<T> holder,
@@ -49,10 +50,10 @@ public class GqlvMemberHidden<T extends ObjectMember> {
         this.holder = holder;
         this.context = context;
 
-        this.field = holder.addField(newFieldDefinition()
+        this.field = newFieldDefinition()
                 .name("hidden")
                 .type(this.context.typeMapper.scalarTypeFor(boolean.class))
-                .build());
+                .build();
     }
 
     public void addDataFetcher() {
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMeta.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMeta.java
index bf0c5f2e1a..fb9950c52c 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMeta.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMeta.java
@@ -81,8 +81,6 @@ public class GqlvMeta {
                         .type(objectType)
                         .build();
 
-        holder.addField(field);
-
         context.graphQLTypeRegistry.addTypeIfNotAlreadyPresent(objectType);
     }
 
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMutationForAction.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMutationForAction.java
index 950b781b52..879af596cc 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMutationForAction.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMutationForAction.java
@@ -46,6 +46,7 @@ import 
org.apache.causeway.viewer.graphql.model.context.Context;
 import org.apache.causeway.viewer.graphql.model.exceptions.DisabledException;
 import org.apache.causeway.viewer.graphql.model.exceptions.HiddenException;
 
+import lombok.Getter;
 import lombok.val;
 import lombok.extern.log4j.Log4j2;
 
@@ -56,7 +57,7 @@ public class GqlvMutationForAction {
     private final ObjectSpecification objectSpec;
     private final ObjectAction objectAction;
     private final Context context;
-    private final GraphQLFieldDefinition field;
+    @Getter private final GraphQLFieldDefinition field;
     private String argumentName;
 
     public GqlvMutationForAction(
@@ -77,7 +78,7 @@ public class GqlvMutationForAction {
                     .name(fieldName(objectSpec, objectAction))
                     .type(type);
             addGqlArguments(fieldBuilder);
-            this.field = holder.addField(fieldBuilder.build());
+            this.field = fieldBuilder.build();
         } else {
             this.field = null;
         }
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMutationForProperty.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMutationForProperty.java
index 90d696c0c4..f16a8e81ac 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMutationForProperty.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvMutationForProperty.java
@@ -38,6 +38,7 @@ import 
org.apache.causeway.viewer.graphql.model.exceptions.HiddenException;
 import org.apache.causeway.viewer.graphql.model.exceptions.InvalidException;
 import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
 
+import lombok.Getter;
 import lombok.val;
 
 //@Log4j2
@@ -47,7 +48,7 @@ public class GqlvMutationForProperty {
     private final ObjectSpecification objectSpec;
     private final OneToOneAssociation oneToOneAssociation;
     private final Context context;
-    private final GraphQLFieldDefinition field;
+    @Getter private final GraphQLFieldDefinition field;
     private String argumentName;
 
     public GqlvMutationForProperty(
@@ -68,7 +69,7 @@ public class GqlvMutationForProperty {
                     .name(fieldName(objectSpec, oneToOneAssociation))
                     .type(type);
             addGqlArguments(fieldBuilder);
-            this.field = holder.addField(fieldBuilder.build());
+            this.field = fieldBuilder.build();
         } else {
             this.field = null;
         }
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvProperty.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvProperty.java
index e816386fba..d3cbadea51 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvProperty.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvProperty.java
@@ -73,17 +73,37 @@ public class GqlvProperty
         this.gqlObjectTypeBuilder = 
newObject().name(TypeNames.propertyTypeNameFor(this.holder.getObjectSpecification(),
 oneToOneAssociation));
 
         this.hidden = new GqlvMemberHidden<>(this, context);
+        addField(hidden.getField());
+
         this.disabled = new GqlvMemberDisabled<>(this, context);
+        addField(disabled.getField());
+
         this.get = new GqlvPropertyGet(this, context);
+        addField(get.getField());
+
         this.validate = new GqlvPropertyValidate(this, context);
+        addField(this.validate.getField());
+
         val choices = new GqlvPropertyChoices(this, context);
-        this.choices = choices.hasChoices() ? choices : null;
+        if (choices.hasChoices()) {
+            addField(choices.getField());
+            this.choices = choices;
+        } else {
+            this.choices = null;
+        }
+
         val autoComplete = new GqlvPropertyAutoComplete(this, context);
-        this.autoComplete = autoComplete.hasAutoComplete() ? autoComplete : 
null;
+        if (autoComplete.hasAutoComplete()) {
+            addField(autoComplete.getField());
+            this.autoComplete = autoComplete;
+        } else {
+            this.autoComplete = null;
+        }
 
         val variant = 
context.causewayConfiguration.getViewer().getGraphql().getApiVariant();
         if (variant == 
CausewayConfiguration.Viewer.Graphql.ApiVariant.QUERY_WITH_MUTATIONS_NON_SPEC_COMPLIANT)
 {
             this.set = new GqlvPropertySet(this, context);
+            addField(set.getField());
         } else {
             this.set = null;
         }
@@ -92,12 +112,10 @@ public class GqlvProperty
         this.gqlObjectType = gqlObjectTypeBuilder.build();
 
         setField(
-            this.holder.addField(
-                newFieldDefinition()
-                    .name(oneToOneAssociation.getId())
-                    .type(gqlObjectTypeBuilder)
-                    .build()
-            )
+            newFieldDefinition()
+                .name(oneToOneAssociation.getId())
+                .type(gqlObjectTypeBuilder)
+                .build()
         );
     }
 
@@ -127,9 +145,10 @@ public class GqlvProperty
         return getObjectAssociation();
     }
 
-    @Override
-    public GraphQLFieldDefinition addField(GraphQLFieldDefinition field) {
-        gqlObjectTypeBuilder.field(field);
+    private GraphQLFieldDefinition addField(GraphQLFieldDefinition field) {
+        if (field != null) {
+            gqlObjectTypeBuilder.field(field);
+        }
         return field;
     }
 
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyAutoComplete.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyAutoComplete.java
index 3e45de4c2c..0cab63dd5f 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyAutoComplete.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyAutoComplete.java
@@ -36,6 +36,7 @@ import 
org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojo;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectSpecificationProvider;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.OneToOneAssociationProvider;
 
+import lombok.Getter;
 import lombok.val;
 
 public class GqlvPropertyAutoComplete {
@@ -47,7 +48,7 @@ public class GqlvPropertyAutoComplete {
     /**
      * Populated iff there are choices for this property
      */
-    final GraphQLFieldDefinition field;
+    @Getter final GraphQLFieldDefinition field;
 
     public GqlvPropertyAutoComplete(
             final Holder holder,
@@ -65,7 +66,7 @@ public class GqlvPropertyAutoComplete {
                             .name(SEARCH_PARAM_NAME)
                             
.type(nonNull(context.typeMapper.scalarTypeFor(String.class))))
                     .build();
-            this.field = holder.addField(fieldBuilder.build());
+            this.field = fieldBuilder.build();
         } else {
             this.field = null;
         }
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyChoices.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyChoices.java
index ebb5ef2a58..d4ec81e429 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyChoices.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyChoices.java
@@ -36,6 +36,7 @@ import 
org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojo;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectSpecificationProvider;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.OneToOneAssociationProvider;
 
+import lombok.Getter;
 import lombok.val;
 
 public class GqlvPropertyChoices {
@@ -45,7 +46,7 @@ public class GqlvPropertyChoices {
     /**
      * Populated iff there are choices for this property
      */
-    final GraphQLFieldDefinition field;
+    @Getter final GraphQLFieldDefinition field;
 
     public GqlvPropertyChoices(
             final Holder holder,
@@ -60,7 +61,7 @@ public class GqlvPropertyChoices {
                     .name("choices")
                     
.type(GraphQLList.list(context.typeMapper.outputTypeFor(elementType)));
             holder.addGqlArgument(otoa, fieldBuilder, 
TypeMapper.InputContext.CHOICES);
-            this.field = holder.addField(fieldBuilder.build());
+            this.field = fieldBuilder.build();
         } else {
             this.field = null;
         }
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertySet.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertySet.java
index 6496ec1a41..fb563ef73b 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertySet.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertySet.java
@@ -39,36 +39,31 @@ import 
org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojo;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectSpecificationProvider;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.OneToOneAssociationProvider;
 
+import lombok.Getter;
 import lombok.val;
 
 public class GqlvPropertySet {
 
     final Holder holder;
     final Context context;
-    final GraphQLFieldDefinition field;
+    @Getter final GraphQLFieldDefinition field;
 
     public GqlvPropertySet(
             final Holder holder,
             final Context context) {
         this.holder = holder;
         this.context = context;
-        this.field = fieldDefinition(holder);
-    }
-
-    GraphQLFieldDefinition fieldDefinition(final Holder holder) {
 
-        GraphQLFieldDefinition fieldDefinition = null;
-        GraphQLOutputType type = outputTypeFor(holder);
-        if (type != null) {
+        GraphQLOutputType graphQLOutputType = outputTypeFor(holder);
+        if (graphQLOutputType != null) {
             val fieldBuilder = newFieldDefinition()
                     .name("set")
-                    .type(type);
+                    .type(graphQLOutputType);
             holder.addGqlArgument(holder.getOneToOneAssociation(), 
fieldBuilder, TypeMapper.InputContext.INVOKE);
-            fieldDefinition = fieldBuilder.build();
-
-            holder.addField(fieldDefinition);
+            this.field = fieldBuilder.build();
+        } else {
+            this.field = null;
         }
-        return fieldDefinition;
     }
 
     GraphQLOutputType outputTypeFor(Holder holder) {
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyValidate.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyValidate.java
index 899183573c..1392f77ff8 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyValidate.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyValidate.java
@@ -32,13 +32,14 @@ import 
org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojo;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectSpecificationProvider;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.OneToOneAssociationProvider;
 
+import lombok.Getter;
 import lombok.val;
 
 public class GqlvPropertyValidate {
 
     final Holder holder;
     private final Context context;
-    final GraphQLFieldDefinition field;
+    @Getter final GraphQLFieldDefinition field;
 
     public GqlvPropertyValidate(
             final Holder holder,
@@ -51,7 +52,7 @@ public class GqlvPropertyValidate {
                 .type(context.typeMapper.scalarTypeFor(String.class));
         holder.addGqlArgument(holder.getOneToOneAssociation(), fieldBuilder, 
TypeMapper.InputContext.VALIDATE);
 
-        this.field = holder.addField(fieldBuilder.build());
+        this.field = fieldBuilder.build();
     }
 
     void addDataFetcher() {
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvScenario.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvScenario.java
index a9eceac23b..a957e38e8d 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvScenario.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvScenario.java
@@ -64,7 +64,9 @@ public class GqlvScenario implements GqlvScenarioName.Holder, 
GqlvScenarioGiven.
         this.gqlObjectTypeBuilder = newObject().name("Scenario");
 
         this.scenarioName = new GqlvScenarioName(this, context);
+        addField(scenarioName.getField());
         this.scenarioGiven = new GqlvScenarioGiven(this, context);
+        addField(scenarioGiven.getField());
 
         this.gqlObjectType = gqlObjectTypeBuilder.build();
 
@@ -76,14 +78,13 @@ public class GqlvScenario implements 
GqlvScenarioName.Holder, GqlvScenarioGiven.
                                                 .type(Scalars.GraphQLString)
                             )
                             .build();
-
-        holder.addField(field);
     }
 
 
-    @Override
-    public GraphQLFieldDefinition addField(GraphQLFieldDefinition field) {
-        gqlObjectTypeBuilder.field(field);
+    private GraphQLFieldDefinition addField(GraphQLFieldDefinition field) {
+        if (field != null) {
+            gqlObjectTypeBuilder.field(field);
+        }
         return field;
     }
 
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvScenarioGiven.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvScenarioGiven.java
index 4ebfa15b05..da0d4b5e5c 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvScenarioGiven.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvScenarioGiven.java
@@ -19,11 +19,11 @@ public class GqlvScenarioGiven implements 
GqlvDomainService.Holder, GqlvDomainOb
 
     private static final String OBJECT_TYPE_NAME = "Given";
 
-    final GraphQLObjectType.Builder objectTypeBuilder;
+    final GraphQLObjectType.Builder gqlObjectTypeBuilder;
     @Getter private final GraphQLObjectType objectType;
 
     private final Holder holder;
-    private final GraphQLFieldDefinition field;
+    @Getter private final GraphQLFieldDefinition field;
 
     private final List<GqlvDomainService> domainServices = new ArrayList<>();
     private final List<GqlvDomainObject> domainObjects = new ArrayList<>();
@@ -34,7 +34,7 @@ public class GqlvScenarioGiven implements 
GqlvDomainService.Holder, GqlvDomainOb
 
         this.holder = holder;
 
-        this.objectTypeBuilder = newObject().name(OBJECT_TYPE_NAME);
+        this.gqlObjectTypeBuilder = newObject().name(OBJECT_TYPE_NAME);
 
         context.objectSpecifications().forEach(objectSpec -> {
             switch (objectSpec.getBeanSort()) {
@@ -53,7 +53,9 @@ public class GqlvScenarioGiven implements 
GqlvDomainService.Holder, GqlvDomainOb
             if (Objects.requireNonNull(objectSpec.getBeanSort()) == 
BeanSort.MANAGED_BEAN_CONTRIBUTING) { // @DomainService
                 
context.serviceRegistry.lookupBeanById(objectSpec.getLogicalTypeName())
                         .ifPresent(servicePojo -> {
-                            
domainServices.add(GqlvDomainService.of(objectSpec, this, servicePojo, 
context));
+                            GqlvDomainService gqlvDomainService = 
GqlvDomainService.of(objectSpec, this, servicePojo, context);
+                            addField(gqlvDomainService.getField());
+                            domainServices.add(gqlvDomainService);
                         });
             }
         });
@@ -64,10 +66,9 @@ public class GqlvScenarioGiven implements 
GqlvDomainService.Holder, GqlvDomainOb
         }
 
 
-        objectType = objectTypeBuilder.build();
+        objectType = gqlObjectTypeBuilder.build();
 
         this.field = 
GraphQLFieldDefinition.newFieldDefinition().name("Given").type(objectType).build();
-        this.holder.addField(field);
     }
 
 
@@ -76,9 +77,10 @@ public class GqlvScenarioGiven implements 
GqlvDomainService.Holder, GqlvDomainOb
         return FieldCoordinates.coordinates(objectType, fieldDefinition);
     }
 
-    @Override
-    public GraphQLFieldDefinition addField(GraphQLFieldDefinition field) {
-        objectTypeBuilder.field(field);
+    private GraphQLFieldDefinition addField(GraphQLFieldDefinition field) {
+        if (field != null) {
+            gqlObjectTypeBuilder.field(field);
+        }
         return field;
     }
 
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvScenarioName.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvScenarioName.java
index d5164f23e2..d6ee87f989 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvScenarioName.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvScenarioName.java
@@ -5,6 +5,8 @@ import graphql.schema.DataFetcher;
 import graphql.schema.DataFetchingEnvironment;
 import graphql.schema.GraphQLFieldDefinition;
 
+import lombok.Getter;
+
 import static graphql.schema.GraphQLObjectType.newObject;
 
 import org.apache.causeway.viewer.graphql.model.context.Context;
@@ -13,7 +15,7 @@ public class GqlvScenarioName  {
 
     private final Holder holder;
     private final Context context;
-    private final GraphQLFieldDefinition field;
+    @Getter private final GraphQLFieldDefinition field;
 
     public GqlvScenarioName(
             final GqlvScenarioName.Holder holder,
@@ -23,7 +25,6 @@ public class GqlvScenarioName  {
         this.context = context;
 
         this.field = 
GraphQLFieldDefinition.newFieldDefinition().name("Name").type(Scalars.GraphQLString).build();
-        this.holder.addField(field);
     }
 
     public void addDataFetchers() {
diff --git 
a/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/toplevel/GqlvTopLevelMutation.java
 
b/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/toplevel/GqlvTopLevelMutation.java
index 4bce77cc6c..219111640a 100644
--- 
a/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/toplevel/GqlvTopLevelMutation.java
+++ 
b/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/toplevel/GqlvTopLevelMutation.java
@@ -56,16 +56,21 @@ public class GqlvTopLevelMutation
 
 
     public void addAction(ObjectSpecification objectSpec, final ObjectAction 
objectAction) {
-        actions.add(new GqlvMutationForAction(this, objectSpec, objectAction, 
context));
+        val gqlvMutationForAction = new GqlvMutationForAction(this, 
objectSpec, objectAction, context);
+        addField(gqlvMutationForAction.getField());
+        actions.add(gqlvMutationForAction);
     }
 
     public void addProperty(ObjectSpecification objectSpec, final 
OneToOneAssociation property) {
-        properties.add(new GqlvMutationForProperty(this, objectSpec, property, 
context));
+        val gqlvMutationForProperty = new GqlvMutationForProperty(this, 
objectSpec, property, context);
+        addField(gqlvMutationForProperty.getField());
+        properties.add(gqlvMutationForProperty);
     }
 
-    @Override
-    public GraphQLFieldDefinition addField(GraphQLFieldDefinition field) {
-        gqlObjectTypeBuilder.field(field);
+    private GraphQLFieldDefinition addField(GraphQLFieldDefinition field) {
+        if (field != null) {
+            gqlObjectTypeBuilder.field(field);
+        }
         return field;
     }
 
diff --git 
a/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/toplevel/GqlvTopLevelQuery.java
 
b/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/toplevel/GqlvTopLevelQuery.java
index 7e7946cf1b..bc1e97bcfe 100644
--- 
a/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/toplevel/GqlvTopLevelQuery.java
+++ 
b/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/toplevel/GqlvTopLevelQuery.java
@@ -20,7 +20,7 @@ public class GqlvTopLevelQuery implements 
GqlvDomainService.Holder, GqlvDomainOb
 
     private static final String OBJECT_TYPE_NAME = "Query";
 
-    final GraphQLObjectType.Builder objectTypeBuilder;
+    final GraphQLObjectType.Builder gqlObjectTypeBuilder;
     @Getter private final GraphQLObjectType objectType;
 
     private final List<GqlvDomainService> domainServices = new ArrayList<>();
@@ -30,7 +30,7 @@ public class GqlvTopLevelQuery implements 
GqlvDomainService.Holder, GqlvDomainOb
 
     public GqlvTopLevelQuery(final Context context) {
 
-        this.objectTypeBuilder = newObject().name(OBJECT_TYPE_NAME);
+        this.gqlObjectTypeBuilder = newObject().name(OBJECT_TYPE_NAME);
 
         context.objectSpecifications().forEach(objectSpec -> {
             switch (objectSpec.getBeanSort()) {
@@ -51,7 +51,9 @@ public class GqlvTopLevelQuery implements 
GqlvDomainService.Holder, GqlvDomainOb
                 case MANAGED_BEAN_CONTRIBUTING: // @DomainService
                     
context.serviceRegistry.lookupBeanById(objectSpec.getLogicalTypeName())
                             .ifPresent(servicePojo -> {
-                                
domainServices.add(GqlvDomainService.of(objectSpec, this, servicePojo, 
context));
+                                GqlvDomainService gqlvDomainService = 
GqlvDomainService.of(objectSpec, this, servicePojo, context);
+                                addField(gqlvDomainService.getField());
+                                domainServices.add(gqlvDomainService);
                             });
                     break;
             }
@@ -63,8 +65,9 @@ public class GqlvTopLevelQuery implements 
GqlvDomainService.Holder, GqlvDomainOb
         }
 
         scenario = new GqlvScenario(this, context);
+        addField(scenario.getField());
 
-        objectType = objectTypeBuilder.build();
+        objectType = gqlObjectTypeBuilder.build();
     }
 
 
@@ -73,9 +76,10 @@ public class GqlvTopLevelQuery implements 
GqlvDomainService.Holder, GqlvDomainOb
         return FieldCoordinates.coordinates(OBJECT_TYPE_NAME, 
fieldDefinition.getName());
     }
 
-    @Override
-    public GraphQLFieldDefinition addField(GraphQLFieldDefinition field) {
-        objectTypeBuilder.field(field);
+    private GraphQLFieldDefinition addField(GraphQLFieldDefinition field) {
+        if (field != null) {
+            gqlObjectTypeBuilder.field(field);
+        }
         return field;
     }
 

Reply via email to