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 2f816efb5f077180c6d628f3ae7db68015f3e8d6
Author: danhaywood <[email protected]>
AuthorDate: Tue Mar 12 17:20:51 2024 +0000

    CAUSEWAY-3676: reworks to use an SPI instead of annotation
---
 .../viewer/graphql/model/domain/TypeNames.java     | 24 +++++++++-------------
 .../domain/common/query/ObjectFeatureUtils.java    |  7 +------
 .../rich/mutation/RichMutationForAction.java       | 11 ++++------
 .../rich/mutation/RichMutationForProperty.java     |  6 +++---
 .../model/domain/rich/query/RichAction.java        |  8 ++++----
 .../domain/rich/query/RichActionInvokeArgsArg.java |  3 +--
 .../domain/rich/query/RichActionParamsParam.java   |  3 +--
 .../query/RichActionParamsParamAutoComplete.java   |  7 ++++---
 .../rich/query/RichActionParamsParamChoices.java   |  7 ++++---
 .../rich/query/RichActionParamsParamDefault.java   |  5 +++--
 .../rich/query/RichActionParamsParamDisabled.java  |  5 +++--
 .../rich/query/RichActionParamsParamHidden.java    |  7 ++++---
 .../rich/query/RichActionParamsParamValidate.java  |  5 +++--
 .../domain/rich/query/RichActionValidity.java      |  3 +--
 .../model/domain/rich/query/RichCollection.java    |  3 +--
 .../model/domain/rich/query/RichProperty.java      |  5 ++---
 .../rich/query/RichPropertyGetBlobBytes.java       |  9 +++++---
 .../rich/query/RichPropertyGetClobChars.java       |  9 +++++---
 .../model/domain/rich/query/RichPropertySet.java   |  3 +--
 .../domain/rich/query/RichPropertyValidate.java    |  3 +--
 .../simple/mutation/SimpleMutationForAction.java   | 11 ++++------
 .../simple/mutation/SimpleMutationForProperty.java |  6 +++---
 .../model/domain/simple/query/SimpleAction.java    | 11 ++++------
 .../domain/simple/query/SimpleCollection.java      |  3 +--
 .../model/domain/simple/query/SimpleProperty.java  |  3 +--
 .../simple/query/SimplePropertyLobBytes.java       |  9 +++++---
 .../simple/query/SimplePropertyLobChars.java       |  9 +++++---
 27 files changed, 88 insertions(+), 97 deletions(-)

diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/TypeNames.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/TypeNames.java
index 4fa5bf1e1f..e57f1461b0 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/TypeNames.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/TypeNames.java
@@ -19,12 +19,7 @@
 package org.apache.causeway.viewer.graphql.model.domain;
 
 import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
-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.ObjectMember;
-import org.apache.causeway.core.metamodel.spec.feature.OneToManyAssociation;
-import org.apache.causeway.core.metamodel.spec.feature.OneToOneAssociation;
-import 
org.apache.causeway.viewer.graphql.model.domain.common.query.ObjectFeatureUtils;
+import org.apache.causeway.core.metamodel.spec.feature.*;
 
 import lombok.experimental.UtilityClass;
 
@@ -71,56 +66,57 @@ public final class TypeNames {
             final ObjectSpecification owningType,
             final ObjectAction oa,
             final SchemaType schemaType) {
-        return objectTypeNameFor(owningType, schemaType) + "__" + 
ObjectFeatureUtils.asciiIdFor(oa) + "__gqlv_action_invoke";
+        return objectTypeNameFor(owningType, schemaType) + "__" + oa.asciiId() 
+ "__gqlv_action_invoke";
     }
 
     public static String actionParamsTypeNameFor(
             final ObjectSpecification owningType,
             final ObjectAction oa,
             final SchemaType schemaType) {
-        return objectTypeNameFor(owningType, schemaType) + "__" + 
ObjectFeatureUtils.asciiIdFor(oa) + "__gqlv_action_params";
+        return objectTypeNameFor(owningType, schemaType) + "__" + oa.asciiId() 
+ "__gqlv_action_params";
     }
 
     public static String actionArgsTypeNameFor(
             final ObjectSpecification owningType,
             final ObjectAction oa,
             final SchemaType schemaType) {
-        return objectTypeNameFor(owningType, schemaType) + "__" + 
ObjectFeatureUtils.asciiIdFor(oa) + "__gqlv_action_args";
+        return objectTypeNameFor(owningType, schemaType) + "__" + oa.asciiId() 
+ "__gqlv_action_args";
     }
 
     public static String actionParamTypeNameFor(
             final ObjectSpecification owningType,
             final ObjectActionParameter oap,
             final SchemaType schemaType) {
-        return objectTypeNameFor(owningType, schemaType) + "__" + 
ObjectFeatureUtils.asciiIdFor(oap.getAction()) + "__" + 
ObjectFeatureUtils.asciiIdFor(oap) + "__gqlv_action_parameter";
+        final ObjectFeature objectFeature = oap.getAction();
+        return objectTypeNameFor(owningType, schemaType) + "__" + 
objectFeature.asciiId() + "__" + oap.asciiId() + "__gqlv_action_parameter";
     }
 
     public static String propertyTypeNameFor(
             final ObjectSpecification owningType,
             final OneToOneAssociation otoa,
             final SchemaType schemaType) {
-        return objectTypeNameFor(owningType, schemaType) + "__" + 
ObjectFeatureUtils.asciiIdFor(otoa) + "__gqlv_property";
+        return objectTypeNameFor(owningType, schemaType) + "__" + 
otoa.asciiId() + "__gqlv_property";
     }
 
     public static String propertyLobTypeNameFor(
             final ObjectSpecification owningType,
             final OneToOneAssociation otoa,
             final SchemaType schemaType) {
-        return objectTypeNameFor(owningType, schemaType) + "__" + 
ObjectFeatureUtils.asciiIdFor(otoa) + "__gqlv_property_lob";
+        return objectTypeNameFor(owningType, schemaType) + "__" + 
otoa.asciiId() + "__gqlv_property_lob";
     }
 
     public static String collectionTypeNameFor(
             final ObjectSpecification owningType,
             final OneToManyAssociation otma,
             final SchemaType schemaType) {
-        return objectTypeNameFor(owningType, schemaType) + "__" + 
ObjectFeatureUtils.asciiIdFor(otma) + "__gqlv_collection";
+        return objectTypeNameFor(owningType, schemaType) + "__" + 
otma.asciiId() + "__gqlv_collection";
     }
 
     public static String memberTypeNameFor(
             final ObjectSpecification owningType,
             final ObjectMember objectMember,
             final SchemaType schemaType) {
-        return objectTypeNameFor(owningType, schemaType) + "__" + 
ObjectFeatureUtils.asciiIdFor(objectMember) + "__gqlv_member";
+        return objectTypeNameFor(owningType, schemaType) + "__" + 
objectMember.asciiId() + "__gqlv_member";
     }
 
     private static String sanitized(final String name) {
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/common/query/ObjectFeatureUtils.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/common/query/ObjectFeatureUtils.java
index c6f890a074..fecaae4647 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/common/query/ObjectFeatureUtils.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/common/query/ObjectFeatureUtils.java
@@ -29,7 +29,6 @@ import 
org.apache.causeway.core.metamodel.object.ManagedObject;
 import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 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.ObjectFeature;
 import org.apache.causeway.viewer.graphql.model.context.Context;
 import org.apache.causeway.viewer.graphql.model.domain.Environment;
 import org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojo;
@@ -109,7 +108,7 @@ public class ObjectFeatureUtils {
         return parameters
                 .map(oap -> {
                     final ObjectSpecification elementType = 
oap.getElementType();
-                    Object argumentValue = argumentPojos.get(asciiIdFor(oap));
+                    Object argumentValue = argumentPojos.get(oap.asciiId());
                     Object pojoOrPojoList;
 
                     switch (elementType.getBeanSort()) {
@@ -152,10 +151,6 @@ public class ObjectFeatureUtils {
                 });
     }
 
-    public static String asciiIdFor(final ObjectFeature objectFeature) {
-        return objectFeature.getId();
-    }
-
     private static ManagedObject adaptValue(
             final ObjectActionParameter oap,
             final Object argumentValue,
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/mutation/RichMutationForAction.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/mutation/RichMutationForAction.java
index 057634f681..ca5ec125b7 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/mutation/RichMutationForAction.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/mutation/RichMutationForAction.java
@@ -31,6 +31,7 @@ import graphql.schema.GraphQLType;
 
 import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
 
+import org.apache.causeway.core.metamodel.spec.feature.*;
 import org.springframework.lang.Nullable;
 
 import org.apache.causeway.applib.annotation.Where;
@@ -40,10 +41,6 @@ import 
org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.causeway.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
 import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
-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.OneToManyActionParameter;
-import org.apache.causeway.core.metamodel.spec.feature.OneToOneActionParameter;
 import org.apache.causeway.viewer.graphql.model.context.Context;
 import org.apache.causeway.viewer.graphql.model.domain.Environment;
 import org.apache.causeway.viewer.graphql.model.domain.Element;
@@ -93,7 +90,7 @@ public class RichMutationForAction extends Element {
     private static String fieldName(
             final ObjectSpecification objectSpecification,
             final ObjectAction oa) {
-        return TypeNames.objectTypeFieldNameFor(objectSpecification) + "__" + 
ObjectFeatureUtils.asciiIdFor(oa);
+        return TypeNames.objectTypeFieldNameFor(objectSpecification) + "__" + 
oa.asciiId();
     }
 
     @Nullable
@@ -229,7 +226,7 @@ public class RichMutationForAction extends Element {
     // adapted from SimpleAction
     GraphQLArgument gqlArgumentFor(final OneToOneActionParameter otoap) {
         return GraphQLArgument.newArgument()
-                .name(ObjectFeatureUtils.asciiIdFor(otoap))
+                .name(otoap.asciiId())
                 .type(context.typeMapper.inputTypeFor(otoap, 
TypeMapper.InputContext.INVOKE, SchemaType.RICH))
                 .build();
     }
@@ -237,7 +234,7 @@ public class RichMutationForAction extends Element {
     // adapted from SimpleAction
     GraphQLArgument gqlArgumentFor(final OneToManyActionParameter otmap) {
         return GraphQLArgument.newArgument()
-                .name(ObjectFeatureUtils.asciiIdFor(otmap))
+                .name(otmap.asciiId())
                 .type(context.typeMapper.inputTypeFor(otmap, SchemaType.RICH))
                 .build();
     }
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/mutation/RichMutationForProperty.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/mutation/RichMutationForProperty.java
index eedce83511..8ced7f1b7c 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/mutation/RichMutationForProperty.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/mutation/RichMutationForProperty.java
@@ -82,7 +82,7 @@ public class RichMutationForProperty extends Element {
     private static String fieldName(
             final ObjectSpecification objectSpecification,
             final OneToOneAssociation otoa) {
-        return TypeNames.objectTypeFieldNameFor(objectSpecification) + "__" + 
ObjectFeatureUtils.asciiIdFor(otoa);
+        return TypeNames.objectTypeFieldNameFor(objectSpecification) + "__" + 
otoa.asciiId();
     }
 
     @Override
@@ -123,7 +123,7 @@ public class RichMutationForProperty extends Element {
         val managedObject = ManagedObject.adaptSingular(objectSpec, 
sourcePojo);
 
         Map<String, Object> arguments = dataFetchingEnvironment.getArguments();
-        Object argumentValue = 
arguments.get(ObjectFeatureUtils.asciiIdFor(oneToOneAssociation));
+        Object argumentValue = arguments.get(oneToOneAssociation.asciiId());
         ManagedObject argumentManagedObject = 
ManagedObject.adaptProperty(oneToOneAssociation, argumentValue);
 
         val visibleConsent = oneToOneAssociation.isVisible(managedObject, 
InteractionInitiatedBy.USER, Where.ANYWHERE);
@@ -160,7 +160,7 @@ public class RichMutationForProperty extends Element {
 
         fieldBuilder.argument(
                 GraphQLArgument.newArgument()
-                        
.name(ObjectFeatureUtils.asciiIdFor(oneToOneAssociation))
+                        .name(oneToOneAssociation.asciiId())
                         
.type(context.typeMapper.inputTypeFor(oneToOneAssociation, 
TypeMapper.InputContext.INVOKE, SchemaType.RICH))
                         .build());
     }
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichAction.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichAction.java
index 13c11b55ba..5e91700eac 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichAction.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichAction.java
@@ -91,7 +91,7 @@ public class RichAction
                     : null);
         addChildFieldFor(this.params = new RichActionParams(this, context));
 
-        buildObjectTypeAndField(ObjectFeatureUtils.asciiIdFor(objectAction), 
objectAction.getCanonicalDescription().orElse(objectAction.getCanonicalFriendlyName()));
+        buildObjectTypeAndField(objectAction.asciiId(), 
objectAction.getCanonicalDescription().orElse(objectAction.getCanonicalFriendlyName()));
     }
 
     private boolean isInvokeAllowed(ObjectAction objectAction) {
@@ -132,7 +132,7 @@ public class RichAction
         return parameters
                 .map(oap -> {
                     final ObjectSpecification elementType = 
oap.getElementType();
-                    Object argumentValue = 
argumentPojos.get(ObjectFeatureUtils.asciiIdFor(oap));
+                    Object argumentValue = argumentPojos.get(oap.asciiId());
                     Object pojoOrPojoList;
 
                     switch (elementType.getBeanSort()) {
@@ -273,14 +273,14 @@ public class RichAction
             final OneToOneActionParameter oap,
             final TypeMapper.InputContext inputContext) {
         return GraphQLArgument.newArgument()
-                .name(ObjectFeatureUtils.asciiIdFor(oap))
+                .name(oap.asciiId())
                 .type(context.typeMapper.inputTypeFor(oap, inputContext, 
getSchemaType()))
                 .build();
     }
 
     GraphQLArgument gqlArgumentFor(final OneToManyActionParameter otmp) {
         return GraphQLArgument.newArgument()
-                .name(ObjectFeatureUtils.asciiIdFor(otmp))
+                .name(otmp.asciiId())
                 .type(context.typeMapper.inputTypeFor(otmp, getSchemaType()))
                 .build();
     }
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichActionInvokeArgsArg.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichActionInvokeArgsArg.java
index 0913b8446e..09c8b865a1 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichActionInvokeArgsArg.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichActionInvokeArgsArg.java
@@ -29,7 +29,6 @@ import 
org.apache.causeway.viewer.graphql.model.context.Context;
 import org.apache.causeway.viewer.graphql.model.domain.Environment;
 import org.apache.causeway.viewer.graphql.model.domain.Element;
 import 
org.apache.causeway.viewer.graphql.model.domain.common.interactors.ActionInteractor;
-import 
org.apache.causeway.viewer.graphql.model.domain.common.query.ObjectFeatureUtils;
 
 import lombok.Getter;
 import lombok.val;
@@ -63,7 +62,7 @@ public class RichActionInvokeArgsArg
                     : gqlObjectTypeForElementType;
 
             val fieldBuilder = newFieldDefinition()
-                    .name(ObjectFeatureUtils.asciiIdFor(oap))
+                    .name(oap.asciiId())
                     .type(gqlOutputType);
             setField(fieldBuilder.build());
         } else {
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichActionParamsParam.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichActionParamsParam.java
index c93358ccd0..ae70b04dac 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichActionParamsParam.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichActionParamsParam.java
@@ -34,7 +34,6 @@ import 
org.apache.causeway.viewer.graphql.model.domain.SchemaType;
 import org.apache.causeway.viewer.graphql.model.domain.TypeNames;
 import 
org.apache.causeway.viewer.graphql.model.domain.common.interactors.ActionInteractor;
 import 
org.apache.causeway.viewer.graphql.model.domain.common.interactors.ActionParamInteractor;
-import 
org.apache.causeway.viewer.graphql.model.domain.common.query.ObjectFeatureUtils;
 import org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojo;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectActionParameterProvider;
 import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
@@ -101,7 +100,7 @@ public class RichActionParamsParam
         addChildFieldFor(this.validate = new 
RichActionParamsParamValidate(this, context));
         addChildFieldFor(this.datatype = new 
RichActionParamsParamDatatype(this, context));
 
-        buildObjectTypeAndField(ObjectFeatureUtils.asciiIdFor(oap), 
oap.getCanonicalDescription().orElse(oap.getCanonicalFriendlyName()));
+        buildObjectTypeAndField(oap.asciiId(), 
oap.getCanonicalDescription().orElse(oap.getCanonicalFriendlyName()));
     }
 
     @Override
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichActionParamsParamAutoComplete.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichActionParamsParamAutoComplete.java
index c9c1ef4d9d..06d09aaf15 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichActionParamsParamAutoComplete.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichActionParamsParamAutoComplete.java
@@ -34,11 +34,11 @@ import 
org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.causeway.core.metamodel.interactions.managed.ManagedAction;
 import 
org.apache.causeway.core.metamodel.interactions.managed.ParameterNegotiationModel;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
-import org.apache.causeway.viewer.graphql.model.context.Context;
+ import org.apache.causeway.core.metamodel.spec.feature.ObjectFeature;
+ import org.apache.causeway.viewer.graphql.model.context.Context;
 import org.apache.causeway.viewer.graphql.model.domain.Environment;
 import org.apache.causeway.viewer.graphql.model.domain.Element;
 import 
org.apache.causeway.viewer.graphql.model.domain.common.interactors.ActionParamInteractor;
- import 
org.apache.causeway.viewer.graphql.model.domain.common.query.ObjectFeatureUtils;
  import org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojo;
 import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
 
@@ -87,7 +87,8 @@ import lombok.extern.log4j.Log4j2;
          val objectAction = actionParamInteractor.getObjectMember();
          val managedObject = ManagedObject.adaptSingular(objectSpecification, 
sourcePojo);
 
-         val objectActionParameter = 
objectAction.getParameterById(ObjectFeatureUtils.asciiIdFor(actionParamInteractor.getObjectActionParameter()));
+         final ObjectFeature objectFeature = 
actionParamInteractor.getObjectActionParameter();
+         val objectActionParameter = 
objectAction.getParameterById(objectFeature.asciiId());
          val argumentManagedObjects = 
actionParamInteractor.argumentManagedObjectsFor(new 
Environment.For(dataFetchingEnvironment), objectAction, 
context.bookmarkService);
 
          val managedAction = ManagedAction.of(managedObject, objectAction, 
Where.ANYWHERE);
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichActionParamsParamChoices.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichActionParamsParamChoices.java
index 02c040ad3c..48acfa9eab 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichActionParamsParamChoices.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichActionParamsParamChoices.java
@@ -32,11 +32,11 @@ import 
org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.causeway.core.metamodel.interactions.managed.ManagedAction;
 import 
org.apache.causeway.core.metamodel.interactions.managed.ParameterNegotiationModel;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
-import org.apache.causeway.viewer.graphql.model.context.Context;
+ import org.apache.causeway.core.metamodel.spec.feature.ObjectFeature;
+ import org.apache.causeway.viewer.graphql.model.context.Context;
 import org.apache.causeway.viewer.graphql.model.domain.Environment;
 import org.apache.causeway.viewer.graphql.model.domain.Element;
 import 
org.apache.causeway.viewer.graphql.model.domain.common.interactors.ActionParamInteractor;
- import 
org.apache.causeway.viewer.graphql.model.domain.common.query.ObjectFeatureUtils;
  import org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojo;
 import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
 
@@ -79,7 +79,8 @@ import lombok.extern.log4j.Log4j2;
          val objectAction = actionParamInteractor.getObjectMember();
          val managedObject = ManagedObject.adaptSingular(objectSpecification, 
sourcePojo);
 
-         val objectActionParameter = 
objectAction.getParameterById(ObjectFeatureUtils.asciiIdFor(actionParamInteractor.getObjectActionParameter()));
+         final ObjectFeature objectFeature = 
actionParamInteractor.getObjectActionParameter();
+         val objectActionParameter = 
objectAction.getParameterById(objectFeature.asciiId());
          val argumentManagedObjects = 
actionParamInteractor.argumentManagedObjectsFor(new 
Environment.For(dataFetchingEnvironment), objectAction, 
context.bookmarkService);
 
          val managedAction = ManagedAction.of(managedObject, objectAction, 
Where.ANYWHERE);
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichActionParamsParamDefault.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichActionParamsParamDefault.java
index 0c22696b1b..7d493787f6 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichActionParamsParamDefault.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichActionParamsParamDefault.java
@@ -28,11 +28,11 @@ import org.apache.causeway.applib.annotation.Where;
 import org.apache.causeway.core.metamodel.interactions.managed.ManagedAction;
 import 
org.apache.causeway.core.metamodel.interactions.managed.ParameterNegotiationModel;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
+import org.apache.causeway.core.metamodel.spec.feature.ObjectFeature;
 import org.apache.causeway.viewer.graphql.model.context.Context;
 import org.apache.causeway.viewer.graphql.model.domain.Environment;
 import org.apache.causeway.viewer.graphql.model.domain.Element;
 import 
org.apache.causeway.viewer.graphql.model.domain.common.interactors.ActionParamInteractor;
-import 
org.apache.causeway.viewer.graphql.model.domain.common.query.ObjectFeatureUtils;
 import org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojo;
 import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
 
@@ -71,7 +71,8 @@ public class RichActionParamsParamDefault extends Element {
         }
         val objectAction = actionParamInteractor.getObjectMember();
         val managedObject = ManagedObject.adaptSingular(objectSpecification, 
sourcePojo);
-        val objectActionParameter = 
objectAction.getParameterById(ObjectFeatureUtils.asciiIdFor(actionParamInteractor.getObjectActionParameter()));
+        final ObjectFeature objectFeature = 
actionParamInteractor.getObjectActionParameter();
+        val objectActionParameter = 
objectAction.getParameterById(objectFeature.asciiId());
         val argumentManagedObjects = 
actionParamInteractor.argumentManagedObjectsFor(new 
Environment.For(dataFetchingEnvironment), objectAction, 
context.bookmarkService);
         val managedAction = ManagedAction.of(managedObject, objectAction, 
Where.ANYWHERE);
         val pendingArgs = ParameterNegotiationModel.of(managedAction, 
argumentManagedObjects);
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichActionParamsParamDisabled.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichActionParamsParamDisabled.java
index 1e71ba9b92..0248d2d2bb 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichActionParamsParamDisabled.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichActionParamsParamDisabled.java
@@ -25,11 +25,11 @@ import static 
graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
 
 import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
+import org.apache.causeway.core.metamodel.spec.feature.ObjectFeature;
 import org.apache.causeway.viewer.graphql.model.context.Context;
 import org.apache.causeway.viewer.graphql.model.domain.Environment;
 import org.apache.causeway.viewer.graphql.model.domain.Element;
 import 
org.apache.causeway.viewer.graphql.model.domain.common.interactors.ActionParamInteractor;
-import 
org.apache.causeway.viewer.graphql.model.domain.common.query.ObjectFeatureUtils;
 import org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojo;
 import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
 
@@ -68,7 +68,8 @@ public class RichActionParamsParamDisabled extends Element {
         val managedObject = ManagedObject.adaptSingular(objectSpecification, 
sourcePojo);
         val actionInteractionHead = 
objectAction.interactionHead(managedObject);
 
-        val objectActionParameter = 
objectAction.getParameterById(ObjectFeatureUtils.asciiIdFor(actionParamInteractor.getObjectActionParameter()));
+        final ObjectFeature objectFeature = 
actionParamInteractor.getObjectActionParameter();
+        val objectActionParameter = 
objectAction.getParameterById(objectFeature.asciiId());
         val argumentManagedObjects = 
actionParamInteractor.argumentManagedObjectsFor(new 
Environment.For(dataFetchingEnvironment), objectAction, 
context.bookmarkService);
 
         val usable = objectActionParameter.isUsable(actionInteractionHead, 
argumentManagedObjects, InteractionInitiatedBy.USER);
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichActionParamsParamHidden.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichActionParamsParamHidden.java
index c223f22a4c..40aeb6e09d 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichActionParamsParamHidden.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichActionParamsParamHidden.java
@@ -25,11 +25,11 @@ import static 
graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
 
 import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
-import org.apache.causeway.viewer.graphql.model.context.Context;
+ import org.apache.causeway.core.metamodel.spec.feature.ObjectFeature;
+ import org.apache.causeway.viewer.graphql.model.context.Context;
 import org.apache.causeway.viewer.graphql.model.domain.Environment;
 import org.apache.causeway.viewer.graphql.model.domain.Element;
 import 
org.apache.causeway.viewer.graphql.model.domain.common.interactors.ActionParamInteractor;
- import 
org.apache.causeway.viewer.graphql.model.domain.common.query.ObjectFeatureUtils;
  import org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojo;
 import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
 
@@ -70,7 +70,8 @@ public class RichActionParamsParamHidden extends Element {
         val managedObject = ManagedObject.adaptSingular(objectSpecification, 
sourcePojo);
         val actionInteractionHead = 
objectAction.interactionHead(managedObject);
 
-        val objectActionParameter = 
objectAction.getParameterById(ObjectFeatureUtils.asciiIdFor(actionParamInteractor.getObjectActionParameter()));
+        final ObjectFeature objectFeature = 
actionParamInteractor.getObjectActionParameter();
+        val objectActionParameter = 
objectAction.getParameterById(objectFeature.asciiId());
 
         val argumentManagedObjects = 
actionParamInteractor.argumentManagedObjectsFor(new 
Environment.For(dataFetchingEnvironment), objectAction, 
context.bookmarkService);
 
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichActionParamsParamValidate.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichActionParamsParamValidate.java
index 8d3472d1bb..c03e9b7807 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichActionParamsParamValidate.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichActionParamsParamValidate.java
@@ -25,11 +25,11 @@ import static 
graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
 
 import org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
+import org.apache.causeway.core.metamodel.spec.feature.ObjectFeature;
 import org.apache.causeway.viewer.graphql.model.context.Context;
 import org.apache.causeway.viewer.graphql.model.domain.Environment;
 import org.apache.causeway.viewer.graphql.model.domain.Element;
 import 
org.apache.causeway.viewer.graphql.model.domain.common.interactors.ActionParamInteractor;
-import 
org.apache.causeway.viewer.graphql.model.domain.common.query.ObjectFeatureUtils;
 import org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojo;
 import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
 
@@ -69,7 +69,8 @@ public class RichActionParamsParamValidate extends Element {
         val managedObject = ManagedObject.adaptSingular(objectSpecification, 
sourcePojo);
         val actionInteractionHead = 
objectAction.interactionHead(managedObject);
 
-        val objectActionParameter = 
objectAction.getParameterById(ObjectFeatureUtils.asciiIdFor(actionParamInteractor.getObjectActionParameter()));
+        final ObjectFeature objectFeature = 
actionParamInteractor.getObjectActionParameter();
+        val objectActionParameter = 
objectAction.getParameterById(objectFeature.asciiId());
 
         val argumentManagedObjects = 
actionParamInteractor.argumentManagedObjectsFor(new 
Environment.For(dataFetchingEnvironment), objectAction, 
context.bookmarkService);
 
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichActionValidity.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichActionValidity.java
index affbd0f5b3..ecccf8cd32 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichActionValidity.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichActionValidity.java
@@ -34,7 +34,6 @@ import 
org.apache.causeway.core.metamodel.spec.feature.ObjectActionParameter;
 import org.apache.causeway.viewer.graphql.model.context.Context;
 import org.apache.causeway.viewer.graphql.model.domain.Element;
 import 
org.apache.causeway.viewer.graphql.model.domain.common.interactors.ActionInteractor;
-import 
org.apache.causeway.viewer.graphql.model.domain.common.query.ObjectFeatureUtils;
 import org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojo;
 import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
 
@@ -85,7 +84,7 @@ public class RichActionValidity extends Element {
         Can<ObjectActionParameter> parameters = objectAction.getParameters();
         Can<ManagedObject> argumentManagedObjects = parameters
                 .map(oap -> {
-                    Object argumentValue = 
argumentPojos.get(ObjectFeatureUtils.asciiIdFor(oap));
+                    Object argumentValue = argumentPojos.get(oap.asciiId());
                     return ManagedObject.adaptParameter(oap, argumentValue);
                 });
 
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichCollection.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichCollection.java
index ca9d0d585f..ae5449470c 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichCollection.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichCollection.java
@@ -25,7 +25,6 @@ import 
org.apache.causeway.viewer.graphql.model.domain.SchemaType;
 import org.apache.causeway.viewer.graphql.model.domain.TypeNames;
 import 
org.apache.causeway.viewer.graphql.model.domain.common.interactors.MemberInteractor;
 import 
org.apache.causeway.viewer.graphql.model.domain.common.interactors.ObjectInteractor;
-import 
org.apache.causeway.viewer.graphql.model.domain.common.query.ObjectFeatureUtils;
 
 public class RichCollection
         extends RichAssociation<OneToManyAssociation, ObjectInteractor>
@@ -55,7 +54,7 @@ public class RichCollection
         addChildFieldFor(this.get = new RichCollectionGet(this, context));
         addChildFieldFor(this.datatype = new RichCollectionDatatype(this, 
context));
 
-        buildObjectTypeAndField(ObjectFeatureUtils.asciiIdFor(otma), 
otma.getCanonicalDescription().orElse(otma.getCanonicalFriendlyName()));
+        buildObjectTypeAndField(otma.asciiId(), 
otma.getCanonicalDescription().orElse(otma.getCanonicalFriendlyName()));
     }
 
     @Override
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichProperty.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichProperty.java
index 0cb1ee518e..581babe5d6 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichProperty.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichProperty.java
@@ -32,7 +32,6 @@ import 
org.apache.causeway.viewer.graphql.model.domain.TypeNames;
 import 
org.apache.causeway.viewer.graphql.model.domain.common.interactors.MemberInteractor;
 import 
org.apache.causeway.viewer.graphql.model.domain.common.interactors.ObjectInteractor;
 import 
org.apache.causeway.viewer.graphql.model.domain.common.interactors.PropertyInteractor;
-import 
org.apache.causeway.viewer.graphql.model.domain.common.query.ObjectFeatureUtils;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectMemberProvider;
 import 
org.apache.causeway.viewer.graphql.model.mmproviders.ObjectSpecificationProvider;
 import org.apache.causeway.viewer.graphql.model.mmproviders.SchemaTypeProvider;
@@ -100,7 +99,7 @@ public class RichProperty
         addChildFieldFor(this.set = isSetterAllowed() ? new 
RichPropertySet(this, context) : null);
         addChildFieldFor(this.datatype = new RichPropertyDatatype(this, 
context));
 
-        buildObjectTypeAndField(ObjectFeatureUtils.asciiIdFor(otoa), 
otoa.getCanonicalDescription().orElse(otoa.getCanonicalFriendlyName()));
+        buildObjectTypeAndField(otoa.asciiId(), 
otoa.getCanonicalDescription().orElse(otoa.getCanonicalFriendlyName()));
     }
 
     private boolean isSetterAllowed() {
@@ -138,7 +137,7 @@ public class RichProperty
             final OneToOneAssociation otoa,
             final TypeMapper.InputContext inputContext) {
         return GraphQLArgument.newArgument()
-                .name(ObjectFeatureUtils.asciiIdFor(otoa))
+                .name(otoa.asciiId())
                 .type(context.typeMapper.inputTypeFor(otoa, inputContext, 
SchemaType.RICH))
                 .build();
     }
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichPropertyGetBlobBytes.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichPropertyGetBlobBytes.java
index bcc9dfd222..24e2447911 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichPropertyGetBlobBytes.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichPropertyGetBlobBytes.java
@@ -20,10 +20,10 @@ package 
org.apache.causeway.viewer.graphql.model.domain.rich.query;
 
 import graphql.schema.DataFetchingEnvironment;
 
+import org.apache.causeway.core.metamodel.spec.feature.ObjectFeature;
 import org.apache.causeway.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.causeway.viewer.graphql.model.context.Context;
 import 
org.apache.causeway.viewer.graphql.model.domain.common.interactors.MemberInteractor;
-import 
org.apache.causeway.viewer.graphql.model.domain.common.query.ObjectFeatureUtils;
 import org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojo;
 
 import lombok.val;
@@ -45,8 +45,11 @@ public class RichPropertyGetBlobBytes extends 
RichPropertyGetBlobAbstract {
         val sourcePojo = BookmarkedPojo.sourceFrom(environment);
 
         val bookmarkIfAny = context.bookmarkService.bookmarkFor(sourcePojo);
-        return bookmarkIfAny.map(x -> String.format(
-                "//%s/object/%s:%s/%s/blobBytes", graphqlPath, 
x.getLogicalTypeName(), x.getIdentifier(), 
ObjectFeatureUtils.asciiIdFor(memberInteractor.getObjectMember()))).orElse(null);
+        return bookmarkIfAny.map(x -> {
+            final ObjectFeature objectFeature = 
memberInteractor.getObjectMember();
+            return String.format(
+                    "//%s/object/%s:%s/%s/blobBytes", graphqlPath, 
x.getLogicalTypeName(), x.getIdentifier(), objectFeature.asciiId());
+        }).orElse(null);
 
     }
 
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichPropertyGetClobChars.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichPropertyGetClobChars.java
index c0c713ab52..e8729ea202 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichPropertyGetClobChars.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichPropertyGetClobChars.java
@@ -20,10 +20,10 @@ package 
org.apache.causeway.viewer.graphql.model.domain.rich.query;
 
 import graphql.schema.DataFetchingEnvironment;
 
+import org.apache.causeway.core.metamodel.spec.feature.ObjectFeature;
 import org.apache.causeway.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.causeway.viewer.graphql.model.context.Context;
 import 
org.apache.causeway.viewer.graphql.model.domain.common.interactors.MemberInteractor;
-import 
org.apache.causeway.viewer.graphql.model.domain.common.query.ObjectFeatureUtils;
 import org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojo;
 
 import lombok.val;
@@ -45,8 +45,11 @@ public class RichPropertyGetClobChars extends 
RichPropertyGetClobAbstract {
         val sourcePojo = BookmarkedPojo.sourceFrom(environment);
 
         val bookmarkIfAny = context.bookmarkService.bookmarkFor(sourcePojo);
-        return bookmarkIfAny.map(x -> String.format(
-                "//%s/object/%s:%s/%s/clobChars", graphqlPath, 
x.getLogicalTypeName(), x.getIdentifier(), 
ObjectFeatureUtils.asciiIdFor(holder.getObjectMember()))).orElse(null);
+        return bookmarkIfAny.map(x -> {
+            final ObjectFeature objectFeature = holder.getObjectMember();
+            return String.format(
+                    "//%s/object/%s:%s/%s/clobChars", graphqlPath, 
x.getLogicalTypeName(), x.getIdentifier(), objectFeature.asciiId());
+        }).orElse(null);
 
     }
 
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichPropertySet.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichPropertySet.java
index 81fd99bec3..7cc570a1ec 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichPropertySet.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichPropertySet.java
@@ -31,7 +31,6 @@ import 
org.apache.causeway.viewer.graphql.model.context.Context;
 import org.apache.causeway.viewer.graphql.model.domain.Element;
 import org.apache.causeway.viewer.graphql.model.domain.SchemaType;
 import 
org.apache.causeway.viewer.graphql.model.domain.common.interactors.PropertyInteractor;
-import 
org.apache.causeway.viewer.graphql.model.domain.common.query.ObjectFeatureUtils;
 import org.apache.causeway.viewer.graphql.model.exceptions.DisabledException;
 import org.apache.causeway.viewer.graphql.model.exceptions.HiddenException;
 import org.apache.causeway.viewer.graphql.model.exceptions.InvalidException;
@@ -75,7 +74,7 @@ public class RichPropertySet extends Element {
         val managedObject = ManagedObject.adaptSingular(objectSpecification, 
sourcePojo);
 
         Map<String, Object> arguments = dataFetchingEnvironment.getArguments();
-        Object argumentValue = 
arguments.get(ObjectFeatureUtils.asciiIdFor(otoa));
+        Object argumentValue = arguments.get(otoa.asciiId());
         ManagedObject argumentManagedObject = 
ManagedObject.adaptProperty(otoa, argumentValue);
 
         val visibleConsent = otoa.isVisible(managedObject, 
InteractionInitiatedBy.USER, Where.ANYWHERE);
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichPropertyValidate.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichPropertyValidate.java
index 021c15fcac..4217eb2f2d 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichPropertyValidate.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/rich/query/RichPropertyValidate.java
@@ -28,7 +28,6 @@ import 
org.apache.causeway.core.metamodel.object.ManagedObject;
 import org.apache.causeway.viewer.graphql.model.context.Context;
 import org.apache.causeway.viewer.graphql.model.domain.Element;
 import 
org.apache.causeway.viewer.graphql.model.domain.common.interactors.PropertyInteractor;
-import 
org.apache.causeway.viewer.graphql.model.domain.common.query.ObjectFeatureUtils;
 import org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojo;
 import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
 
@@ -66,7 +65,7 @@ public class RichPropertyValidate extends Element {
         val managedObject = ManagedObject.adaptSingular(objectSpecification, 
sourcePojo);
 
         val arguments = dataFetchingEnvironment.getArguments();
-        val argumentValue = arguments.get(ObjectFeatureUtils.asciiIdFor(otoa));
+        val argumentValue = arguments.get(otoa.asciiId());
         val argumentManagedObject = ManagedObject.adaptProperty(otoa, 
argumentValue);
 
         val valid = otoa.isAssociationValid(managedObject, 
argumentManagedObject, InteractionInitiatedBy.USER);
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/simple/mutation/SimpleMutationForAction.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/simple/mutation/SimpleMutationForAction.java
index e8151680cf..6f859e47ee 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/simple/mutation/SimpleMutationForAction.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/simple/mutation/SimpleMutationForAction.java
@@ -31,6 +31,7 @@ import graphql.schema.GraphQLType;
 
 import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
 
+import org.apache.causeway.core.metamodel.spec.feature.*;
 import org.springframework.lang.Nullable;
 
 import org.apache.causeway.applib.annotation.Where;
@@ -40,10 +41,6 @@ import 
org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.causeway.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
 import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
-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.OneToManyActionParameter;
-import org.apache.causeway.core.metamodel.spec.feature.OneToOneActionParameter;
 import org.apache.causeway.viewer.graphql.model.context.Context;
 import org.apache.causeway.viewer.graphql.model.domain.Environment;
 import org.apache.causeway.viewer.graphql.model.domain.Element;
@@ -92,7 +89,7 @@ public class SimpleMutationForAction extends Element {
     private static String fieldName(
             final ObjectSpecification objectSpecification,
             final ObjectAction oa) {
-        return TypeNames.objectTypeFieldNameFor(objectSpecification) + "__" + 
ObjectFeatureUtils.asciiIdFor(oa);
+        return TypeNames.objectTypeFieldNameFor(objectSpecification) + "__" + 
oa.asciiId();
     }
 
     @Nullable
@@ -228,7 +225,7 @@ public class SimpleMutationForAction extends Element {
     // adapted from SimpleAction
     GraphQLArgument gqlArgumentFor(final OneToOneActionParameter otoap) {
         return GraphQLArgument.newArgument()
-                .name(ObjectFeatureUtils.asciiIdFor(otoap))
+                .name(otoap.asciiId())
                 .type(context.typeMapper.inputTypeFor(otoap, 
TypeMapper.InputContext.INVOKE, SchemaType.RICH))
                 .build();
     }
@@ -236,7 +233,7 @@ public class SimpleMutationForAction extends Element {
     // adapted from SimpleAction
     GraphQLArgument gqlArgumentFor(final OneToManyActionParameter otmap) {
         return GraphQLArgument.newArgument()
-                .name(ObjectFeatureUtils.asciiIdFor(otmap))
+                .name(otmap.asciiId())
                 .type(context.typeMapper.inputTypeFor(otmap, SchemaType.RICH))
                 .build();
     }
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/simple/mutation/SimpleMutationForProperty.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/simple/mutation/SimpleMutationForProperty.java
index 0074ce1bd5..f36199ec40 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/simple/mutation/SimpleMutationForProperty.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/simple/mutation/SimpleMutationForProperty.java
@@ -82,7 +82,7 @@ public class SimpleMutationForProperty extends Element {
     private static String fieldName(
             final ObjectSpecification objectSpecification,
             final OneToOneAssociation otoa) {
-        return TypeNames.objectTypeFieldNameFor(objectSpecification) + "__" + 
ObjectFeatureUtils.asciiIdFor(otoa);
+        return TypeNames.objectTypeFieldNameFor(objectSpecification) + "__" + 
otoa.asciiId();
     }
 
     @Override
@@ -123,7 +123,7 @@ public class SimpleMutationForProperty extends Element {
         val managedObject = ManagedObject.adaptSingular(objectSpec, 
sourcePojo);
 
         Map<String, Object> arguments = dataFetchingEnvironment.getArguments();
-        Object argumentValue = 
arguments.get(ObjectFeatureUtils.asciiIdFor(oneToOneAssociation));
+        Object argumentValue = arguments.get(oneToOneAssociation.asciiId());
         ManagedObject argumentManagedObject = 
ManagedObject.adaptProperty(oneToOneAssociation, argumentValue);
 
         val visibleConsent = oneToOneAssociation.isVisible(managedObject, 
InteractionInitiatedBy.USER, Where.ANYWHERE);
@@ -160,7 +160,7 @@ public class SimpleMutationForProperty extends Element {
 
         fieldBuilder.argument(
                 GraphQLArgument.newArgument()
-                        
.name(ObjectFeatureUtils.asciiIdFor(oneToOneAssociation))
+                        .name(oneToOneAssociation.asciiId())
                         
.type(context.typeMapper.inputTypeFor(oneToOneAssociation, 
TypeMapper.InputContext.INVOKE, SchemaType.RICH))
                         .build());
     }
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/simple/query/SimpleAction.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/simple/query/SimpleAction.java
index 566c8d0734..7046644a74 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/simple/query/SimpleAction.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/simple/query/SimpleAction.java
@@ -40,10 +40,7 @@ import 
org.apache.causeway.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.causeway.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
 import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
-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.OneToManyActionParameter;
-import org.apache.causeway.core.metamodel.spec.feature.OneToOneActionParameter;
+import org.apache.causeway.core.metamodel.spec.feature.*;
 import org.apache.causeway.viewer.graphql.model.context.Context;
 import org.apache.causeway.viewer.graphql.model.domain.Environment;
 import org.apache.causeway.viewer.graphql.model.domain.Element;
@@ -86,7 +83,7 @@ public class SimpleAction
     }
 
     public String getId() {
-        return ObjectFeatureUtils.asciiIdFor(objectMember);
+        return objectMember.asciiId();
     }
 
     private GraphQLOutputType typeFor(final ObjectAction objectAction){
@@ -143,7 +140,7 @@ public class SimpleAction
         return parameters
                 .map(oap -> {
                     final ObjectSpecification elementType = 
oap.getElementType();
-                    Object argumentValue = 
argumentPojos.get(ObjectFeatureUtils.asciiIdFor(oap));
+                    Object argumentValue = argumentPojos.get(oap.asciiId());
                     Object pojoOrPojoList;
 
                     switch (elementType.getBeanSort()) {
@@ -291,7 +288,7 @@ public class SimpleAction
 
     GraphQLArgument gqlArgumentFor(final OneToManyActionParameter otmap) {
         return GraphQLArgument.newArgument()
-                .name(ObjectFeatureUtils.asciiIdFor(otmap))
+                .name(otmap.asciiId())
                 .type(context.typeMapper.inputTypeFor(otmap, 
objectInteractor.getSchemaType()))
                 .build();
     }
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/simple/query/SimpleCollection.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/simple/query/SimpleCollection.java
index 941e91aaa2..87053a7f35 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/simple/query/SimpleCollection.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/simple/query/SimpleCollection.java
@@ -27,7 +27,6 @@ import 
org.apache.causeway.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.causeway.viewer.graphql.model.context.Context;
 import org.apache.causeway.viewer.graphql.model.domain.Element;
 import 
org.apache.causeway.viewer.graphql.model.domain.common.interactors.ObjectInteractor;
-import 
org.apache.causeway.viewer.graphql.model.domain.common.query.ObjectFeatureUtils;
 import org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojo;
 
 import lombok.val;
@@ -61,7 +60,7 @@ public class SimpleCollection
     }
 
     public String getId() {
-        return ObjectFeatureUtils.asciiIdFor(objectMember);
+        return objectMember.asciiId();
     }
 
     @Override
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/simple/query/SimpleProperty.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/simple/query/SimpleProperty.java
index 7661daec07..edf7694837 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/simple/query/SimpleProperty.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/simple/query/SimpleProperty.java
@@ -39,7 +39,6 @@ import 
org.apache.causeway.viewer.graphql.model.domain.SchemaType;
 import org.apache.causeway.viewer.graphql.model.domain.TypeNames;
 import 
org.apache.causeway.viewer.graphql.model.domain.common.interactors.MemberInteractor;
 import 
org.apache.causeway.viewer.graphql.model.domain.common.interactors.ObjectInteractor;
-import 
org.apache.causeway.viewer.graphql.model.domain.common.query.ObjectFeatureUtils;
 import org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojo;
 
 import lombok.Getter;
@@ -104,7 +103,7 @@ public class SimpleProperty
 
         if (gqlOutputType != null) {
             val fieldBuilder = newFieldDefinition()
-                    .name(ObjectFeatureUtils.asciiIdFor(otoa))
+                    .name(otoa.asciiId())
                     .type(gqlOutputType);
             setField(fieldBuilder.build());
         } else {
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/simple/query/SimplePropertyLobBytes.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/simple/query/SimplePropertyLobBytes.java
index a0cc7ec016..1ef9a98c57 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/simple/query/SimplePropertyLobBytes.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/simple/query/SimplePropertyLobBytes.java
@@ -20,10 +20,10 @@ package 
org.apache.causeway.viewer.graphql.model.domain.simple.query;
 
 import graphql.schema.DataFetchingEnvironment;
 
+import org.apache.causeway.core.metamodel.spec.feature.ObjectFeature;
 import org.apache.causeway.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.causeway.viewer.graphql.model.context.Context;
 import 
org.apache.causeway.viewer.graphql.model.domain.common.interactors.MemberInteractor;
-import 
org.apache.causeway.viewer.graphql.model.domain.common.query.ObjectFeatureUtils;
 import org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojo;
 
 import lombok.val;
@@ -45,8 +45,11 @@ public class SimplePropertyLobBytes extends 
SimplePropertyLobAbstract {
         val sourcePojo = BookmarkedPojo.sourceFrom(environment);
 
         val bookmarkIfAny = context.bookmarkService.bookmarkFor(sourcePojo);
-        return bookmarkIfAny.map(x -> String.format(
-                "//%s/object/%s:%s/%s/blobBytes", graphqlPath, 
x.getLogicalTypeName(), x.getIdentifier(), 
ObjectFeatureUtils.asciiIdFor(memberInteractor.getObjectMember()))).orElse(null);
+        return bookmarkIfAny.map(x -> {
+            final ObjectFeature objectFeature = 
memberInteractor.getObjectMember();
+            return String.format(
+                    "//%s/object/%s:%s/%s/blobBytes", graphqlPath, 
x.getLogicalTypeName(), x.getIdentifier(), objectFeature.asciiId());
+        }).orElse(null);
 
     }
 
diff --git 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/simple/query/SimplePropertyLobChars.java
 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/simple/query/SimplePropertyLobChars.java
index be7473b58f..1162de46be 100644
--- 
a/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/simple/query/SimplePropertyLobChars.java
+++ 
b/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/simple/query/SimplePropertyLobChars.java
@@ -20,10 +20,10 @@ package 
org.apache.causeway.viewer.graphql.model.domain.simple.query;
 
 import graphql.schema.DataFetchingEnvironment;
 
+import org.apache.causeway.core.metamodel.spec.feature.ObjectFeature;
 import org.apache.causeway.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.causeway.viewer.graphql.model.context.Context;
 import 
org.apache.causeway.viewer.graphql.model.domain.common.interactors.MemberInteractor;
-import 
org.apache.causeway.viewer.graphql.model.domain.common.query.ObjectFeatureUtils;
 import org.apache.causeway.viewer.graphql.model.fetcher.BookmarkedPojo;
 
 import lombok.val;
@@ -45,8 +45,11 @@ public class SimplePropertyLobChars extends 
SimplePropertyLobAbstract {
         val sourcePojo = BookmarkedPojo.sourceFrom(environment);
 
         val bookmarkIfAny = context.bookmarkService.bookmarkFor(sourcePojo);
-        return bookmarkIfAny.map(x -> String.format(
-                "//%s/object/%s:%s/%s/clobChars", graphqlPath, 
x.getLogicalTypeName(), x.getIdentifier(), 
ObjectFeatureUtils.asciiIdFor(memberInteractor.getObjectMember()))).orElse(null);
+        return bookmarkIfAny.map(x -> {
+            final ObjectFeature objectFeature = 
memberInteractor.getObjectMember();
+            return String.format(
+                    "//%s/object/%s:%s/%s/clobChars", graphqlPath, 
x.getLogicalTypeName(), x.getIdentifier(), objectFeature.asciiId());
+        }).orElse(null);
 
     }
 

Reply via email to