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 fe71add7b09c54ee38c3e164250945072b337e37
Author: danhaywood <[email protected]>
AuthorDate: Wed Jan 24 13:07:39 2024 +0000

    CAUSEWAY-3676: factors out GqlvAssociationGet
---
 .../graphql/model/domain/GqlvAssociation.java      | 36 ----------
 ...qlvPropertyGet.java => GqlvAssociationGet.java} | 39 ++++++-----
 ...etHolder.java => GqlvAssociationGetHolder.java} |  6 +-
 .../graphql/model/domain/GqlvCollection.java       |  3 +-
 .../graphql/model/domain/GqlvCollectionGet.java    | 79 +++------------------
 .../model/domain/GqlvCollectionGetHolder.java      |  3 +-
 .../graphql/model/domain/GqlvCollectionSimple.java | 60 ----------------
 .../graphql/model/domain/GqlvDomainObject.java     |  9 ---
 .../viewer/graphql/model/domain/GqlvProperty.java  |  2 +-
 .../graphql/model/domain/GqlvPropertyGet.java      | 80 +++-------------------
 .../model/domain/GqlvPropertyGetHolder.java        |  3 +-
 11 files changed, 49 insertions(+), 271 deletions(-)

diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAssociation.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAssociation.java
index d372fae02d..4b8f31bf96 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAssociation.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAssociation.java
@@ -57,40 +57,4 @@ public abstract class GqlvAssociation<T extends 
ObjectAssociation, H extends Gql
         return getObjectMember();
     }
 
-    public void addDataFetcher() {
-
-        final ObjectAssociation association = getObjectAssociation();
-        final ObjectSpecification fieldObjectSpecification = 
association.getElementType();
-        final BeanSort beanSort = fieldObjectSpecification.getBeanSort();
-
-        switch (beanSort) {
-
-            case VALUE:
-            case VIEW_MODEL:
-            case ENTITY:
-
-                codeRegistryBuilder.dataFetcher(
-                        getHolder().coordinatesFor(getField()),
-                        (DataFetcher<Object>) environment -> {
-
-                            Object domainObjectInstance = 
environment.getSource();
-
-                            Class<?> domainObjectInstanceClass = 
domainObjectInstance.getClass();
-                            ObjectSpecification specification = 
specificationLoader.loadSpecification(domainObjectInstanceClass);
-                            if (specification == null) {
-                                return null;
-                            }
-
-                            // TODO: probably incorrect to adapt as a singular 
here.
-                            ManagedObject owner = 
ManagedObject.adaptSingular(specification, domainObjectInstance);
-                            ManagedObject managedObject = 
association.get(owner);
-
-                            return managedObject!=null ? 
managedObject.getPojo() : null;
-                        });
-
-                break;
-
-        }
-    }
-
 }
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyGet.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAssociationGet.java
similarity index 71%
copy from 
incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyGet.java
copy to 
incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAssociationGet.java
index 37ec2cf782..fb8a32d616 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyGet.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAssociationGet.java
@@ -19,6 +19,9 @@
 package org.apache.causeway.viewer.graphql.model.domain;
 
 import org.apache.causeway.core.metamodel.object.ManagedObject;
+import org.apache.causeway.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.causeway.core.metamodel.spec.feature.OneToManyAssociation;
+import org.apache.causeway.core.metamodel.specloader.SpecificationLoader;
 import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
 
 import lombok.val;
@@ -30,27 +33,27 @@ import graphql.schema.GraphQLOutputType;
 
 import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
 
-public class GqlvPropertyGet {
+public abstract class GqlvAssociationGet<T extends ObjectAssociation> {
 
-    private final GqlvPropertyGetHolder holder;
-    private final GraphQLCodeRegistry.Builder codeRegistryBuilder;
-    private final GraphQLFieldDefinition field;
+    final GqlvAssociationGetHolder<T> holder;
+    final GraphQLCodeRegistry.Builder codeRegistryBuilder;
+    final SpecificationLoader specificationLoader;
+    final GraphQLFieldDefinition field;
 
-
-    public GqlvPropertyGet(
-            final GqlvPropertyGetHolder holder,
-            final GraphQLCodeRegistry.Builder codeRegistryBuilder) {
+    public GqlvAssociationGet(
+            final GqlvAssociationGetHolder<T> holder,
+            final GraphQLCodeRegistry.Builder codeRegistryBuilder,
+            final SpecificationLoader specificationLoader) {
         this.holder = holder;
         this.codeRegistryBuilder = codeRegistryBuilder;
         this.field = fieldDefinition(holder);
+        this.specificationLoader = specificationLoader;
     }
 
-    private static GraphQLFieldDefinition fieldDefinition(final 
GqlvPropertyGetHolder holder) {
-
-        val oneToOneAssociation = holder.getOneToOneAssociation();
+    GraphQLFieldDefinition fieldDefinition(final GqlvAssociationGetHolder<T> 
holder) {
 
         GraphQLFieldDefinition fieldDefinition = null;
-        GraphQLOutputType type = TypeMapper.outputTypeFor(oneToOneAssociation);
+        GraphQLOutputType type = outputTypeFor(holder);
         if (type != null) {
             val fieldBuilder = newFieldDefinition()
                     .name("get")
@@ -62,13 +65,14 @@ public class GqlvPropertyGet {
         return fieldDefinition;
     }
 
-    public void addDataFetcher() {
+    abstract GraphQLOutputType outputTypeFor(GqlvAssociationGetHolder<T> 
holder);
+
+    void addDataFetcher() {
 
-        val association = holder.getOneToOneAssociation();
+        val association = holder.getObjectAssociation();
         val fieldObjectSpecification = association.getElementType();
         val beanSort = fieldObjectSpecification.getBeanSort();
 
-        val specificationLoader = association.getSpecificationLoader();
         switch (beanSort) {
 
             case VALUE:
@@ -84,14 +88,13 @@ public class GqlvPropertyGet {
         }
     }
 
-    private Object get(final DataFetchingEnvironment dataFetchingEnvironment) {
+    Object get(final DataFetchingEnvironment dataFetchingEnvironment) {
 
-        val association = holder.getOneToOneAssociation();
+        val association = holder.getObjectAssociation();
 
         val sourcePojo = BookmarkedPojo.sourceFrom(dataFetchingEnvironment);
 
         val sourcePojoClass = sourcePojo.getClass();
-        val specificationLoader = association.getSpecificationLoader();
         val objectSpecification = 
specificationLoader.loadSpecification(sourcePojoClass);
         if (objectSpecification == null) {
             // not expected
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyGetHolder.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAssociationGetHolder.java
similarity index 81%
copy from 
incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyGetHolder.java
copy to 
incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAssociationGetHolder.java
index 6929661150..60374717b1 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyGetHolder.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvAssociationGetHolder.java
@@ -18,9 +18,9 @@
  */
 package org.apache.causeway.viewer.graphql.model.domain;
 
-import org.apache.causeway.core.metamodel.spec.feature.OneToOneAssociation;
+import org.apache.causeway.core.metamodel.spec.feature.ObjectAssociation;
 
-public interface GqlvPropertyGetHolder extends GqlvHolder {
+public interface GqlvAssociationGetHolder<T extends ObjectAssociation> extends 
GqlvHolder {
 
-    OneToOneAssociation getOneToOneAssociation();
+    T getObjectAssociation();
 }
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollection.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollection.java
index 488223bd98..f8abc10017 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollection.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollection.java
@@ -20,7 +20,6 @@ package org.apache.causeway.viewer.graphql.model.domain;
 
 import org.apache.causeway.applib.services.bookmark.BookmarkService;
 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.util.TypeNames;
 
 import lombok.val;
@@ -57,7 +56,7 @@ public class GqlvCollection extends 
GqlvAssociation<OneToManyAssociation, GqlvCo
 
         this.hidden = new GqlvMemberHidden(this, codeRegistryBuilder);
         this.disabled = new GqlvMemberDisabled(this, codeRegistryBuilder);
-        this.get = new GqlvCollectionGet(this, codeRegistryBuilder);
+        this.get = new GqlvCollectionGet(this, codeRegistryBuilder, 
specificationLoader);
 
         this.gqlObjectType = gqlObjectTypeBuilder.build();
 
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollectionGet.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollectionGet.java
index faec3d340a..d71e317bcd 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollectionGet.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollectionGet.java
@@ -19,6 +19,8 @@
 package org.apache.causeway.viewer.graphql.model.domain;
 
 import org.apache.causeway.core.metamodel.object.ManagedObject;
+import org.apache.causeway.core.metamodel.spec.feature.OneToManyAssociation;
+import org.apache.causeway.core.metamodel.specloader.SpecificationLoader;
 import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
 
 import lombok.val;
@@ -30,80 +32,19 @@ import graphql.schema.GraphQLOutputType;
 
 import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
 
-public class GqlvCollectionGet {
-
-    private final GqlvCollectionGetHolder holder;
-    private final GraphQLCodeRegistry.Builder codeRegistryBuilder;
-    private final GraphQLFieldDefinition field;
-
+public class GqlvCollectionGet extends 
GqlvAssociationGet<OneToManyAssociation> {
 
     public GqlvCollectionGet(
             final GqlvCollectionGetHolder holder,
-            final GraphQLCodeRegistry.Builder codeRegistryBuilder) {
-        this.holder = holder;
-        this.codeRegistryBuilder = codeRegistryBuilder;
-        this.field = fieldDefinition(holder);
-    }
-
-    private static GraphQLFieldDefinition fieldDefinition(final 
GqlvCollectionGetHolder holder) {
-
-        val oneToManyAssociation = holder.getOneToManyAssociation();
-
-        GraphQLFieldDefinition fieldDefinition = null;
-        GraphQLOutputType type = 
TypeMapper.listTypeForElementTypeOf(oneToManyAssociation);
-        if (type != null) {
-            val fieldBuilder = newFieldDefinition()
-                    .name("get")
-                    .type(type);
-            fieldDefinition = fieldBuilder.build();
-
-            holder.addField(fieldDefinition);
-        }
-        return fieldDefinition;
-    }
-
-    public void addDataFetcher() {
-
-        val association = holder.getOneToManyAssociation();
-        val fieldObjectSpecification = association.getElementType();
-        val beanSort = fieldObjectSpecification.getBeanSort();
-
-        switch (beanSort) {
-
-            case VALUE:
-            case VIEW_MODEL:
-            case ENTITY:
-
-                codeRegistryBuilder.dataFetcher(
-                        holder.coordinatesFor(field),
-                        this::get);
-
-                break;
-
-        }
+            final GraphQLCodeRegistry.Builder codeRegistryBuilder,
+            final SpecificationLoader specificationLoader) {
+        super(holder, codeRegistryBuilder, specificationLoader);
     }
 
-    private Object get(final DataFetchingEnvironment dataFetchingEnvironment) {
-
-        val association = holder.getOneToManyAssociation();
-
-        val sourcePojo = BookmarkedPojo.sourceFrom(dataFetchingEnvironment);
-
-        val sourcePojoClass = sourcePojo.getClass();
-        val specificationLoader = association.getSpecificationLoader();
-        val objectSpecification = 
specificationLoader.loadSpecification(sourcePojoClass);
-        if (objectSpecification == null) {
-            // not expected
-            return null;
-        }
-
-        // TODO: probably incorrect to adapt as a singular here?
-        val managedObject = ManagedObject.adaptSingular(objectSpecification, 
sourcePojo);
-        val resultManagedObject = association.get(managedObject);
-
-        return resultManagedObject != null
-                ? resultManagedObject.getPojo()
-                : null;
+    @Override
+    GraphQLOutputType 
outputTypeFor(GqlvAssociationGetHolder<OneToManyAssociation> holder) {
+        val oneToManyAssociation = holder.getObjectAssociation();
+        return TypeMapper.listTypeForElementTypeOf(oneToManyAssociation);
     }
 
 }
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollectionGetHolder.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollectionGetHolder.java
index be3dc7a899..326a27654c 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollectionGetHolder.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollectionGetHolder.java
@@ -20,7 +20,6 @@ package org.apache.causeway.viewer.graphql.model.domain;
 
 import org.apache.causeway.core.metamodel.spec.feature.OneToManyAssociation;
 
-public interface GqlvCollectionGetHolder extends GqlvHolder {
+public interface GqlvCollectionGetHolder extends 
GqlvAssociationGetHolder<OneToManyAssociation> {
 
-    OneToManyAssociation getOneToManyAssociation();
 }
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollectionSimple.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollectionSimple.java
deleted file mode 100644
index eb4a867652..0000000000
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvCollectionSimple.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.causeway.viewer.graphql.model.domain;
-
-import org.springframework.lang.Nullable;
-
-import org.apache.causeway.core.metamodel.spec.feature.OneToManyAssociation;
-import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
-
-import graphql.schema.GraphQLCodeRegistry;
-import graphql.schema.GraphQLFieldDefinition;
-import graphql.schema.GraphQLList;
-
-import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
-
-public class GqlvCollectionSimple extends 
GqlvAssociation<OneToManyAssociation, GqlvCollectionHolder> {
-
-    public GqlvCollectionSimple(
-            final GqlvCollectionHolder domainObject,
-            final OneToManyAssociation oneToManyAssociation,
-            final GraphQLCodeRegistry.Builder codeRegistryBuilder
-    ) {
-        super(domainObject, oneToManyAssociation, 
fieldDefinition(domainObject, oneToManyAssociation), codeRegistryBuilder);
-    }
-
-    @Nullable private static GraphQLFieldDefinition fieldDefinition(
-            final GqlvCollectionHolder holder,
-            final OneToManyAssociation otom) {
-        GraphQLList type = TypeMapper.listTypeForElementTypeOf(otom);
-        GraphQLFieldDefinition fieldDefinition = null;
-        if (type != null) {
-                fieldDefinition = newFieldDefinition()
-                        .name(otom.getId())
-                        .type(type).build();
-                holder.addField(fieldDefinition);
-        }
-        return fieldDefinition;
-    }
-
-    public OneToManyAssociation getOneToManyAssociation() {
-        return getObjectAssociation();
-    }
-
-}
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObject.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObject.java
index 13b328cfd9..fc831fad44 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObject.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvDomainObject.java
@@ -65,7 +65,6 @@ public class GqlvDomainObject implements GqlvActionHolder, 
GqlvPropertyHolder, G
 
     private final SortedMap<String, GqlvProperty> properties = new TreeMap<>();
     private final SortedMap<String, GqlvCollection> collections = new 
TreeMap<>();
-    private final SortedMap<String, GqlvCollectionSimple> collectionSimples = 
new TreeMap<>();
     private final Map<String, GqlvAction> safeActions = new TreeMap<>();
 
     private GraphQLObjectType gqlObjectType;
@@ -132,13 +131,6 @@ public class GqlvDomainObject implements GqlvActionHolder, 
GqlvPropertyHolder, G
                 collections.put(collectionId, collection);
             }
         }
-//        GqlvCollectionSimple collection = new GqlvCollectionSimple(this, 
otom, codeRegistryBuilder);
-//        if (collection.hasFieldDefinition()) {
-//            String collectionId = collection.getId();
-//            if (!collectionSimples.containsKey(collectionId)) {
-//                collectionSimples.put(collectionId, collection);
-//            }
-//        }
     }
 
     private void addAction(final ObjectAction objectAction) {
@@ -177,7 +169,6 @@ public class GqlvDomainObject implements GqlvActionHolder, 
GqlvPropertyHolder, G
         meta.addDataFetchers();
         properties.forEach((id, property) -> property.addDataFetcher());
         collections.forEach((id, collection) -> collection.addDataFetcher());
-//        collectionSimples.forEach((id, collection) -> 
collection.addDataFetcher());
         safeActions.forEach((id, action) -> action.addDataFetcher());
         mutations.addDataFetchers();
     }
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvProperty.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvProperty.java
index 2c6677b117..14c4ee2606 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvProperty.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvProperty.java
@@ -57,7 +57,7 @@ public class GqlvProperty extends 
GqlvAssociation<OneToOneAssociation, GqlvPrope
 
         this.hidden = new GqlvMemberHidden(this, codeRegistryBuilder);
         this.disabled = new GqlvMemberDisabled(this, codeRegistryBuilder);
-        this.get = new GqlvPropertyGet(this, codeRegistryBuilder);
+        this.get = new GqlvPropertyGet(this, codeRegistryBuilder, 
specificationLoader);
 
         this.gqlObjectType = gqlObjectTypeBuilder.build();
 
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyGet.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyGet.java
index 37ec2cf782..d67944f14f 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyGet.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyGet.java
@@ -19,6 +19,9 @@
 package org.apache.causeway.viewer.graphql.model.domain;
 
 import org.apache.causeway.core.metamodel.object.ManagedObject;
+import org.apache.causeway.core.metamodel.spec.feature.OneToManyAssociation;
+import org.apache.causeway.core.metamodel.spec.feature.OneToOneAssociation;
+import org.apache.causeway.core.metamodel.specloader.SpecificationLoader;
 import org.apache.causeway.viewer.graphql.model.types.TypeMapper;
 
 import lombok.val;
@@ -30,80 +33,19 @@ import graphql.schema.GraphQLOutputType;
 
 import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
 
-public class GqlvPropertyGet {
-
-    private final GqlvPropertyGetHolder holder;
-    private final GraphQLCodeRegistry.Builder codeRegistryBuilder;
-    private final GraphQLFieldDefinition field;
-
+public class GqlvPropertyGet  extends GqlvAssociationGet<OneToOneAssociation> {
 
     public GqlvPropertyGet(
             final GqlvPropertyGetHolder holder,
-            final GraphQLCodeRegistry.Builder codeRegistryBuilder) {
-        this.holder = holder;
-        this.codeRegistryBuilder = codeRegistryBuilder;
-        this.field = fieldDefinition(holder);
-    }
-
-    private static GraphQLFieldDefinition fieldDefinition(final 
GqlvPropertyGetHolder holder) {
-
-        val oneToOneAssociation = holder.getOneToOneAssociation();
-
-        GraphQLFieldDefinition fieldDefinition = null;
-        GraphQLOutputType type = TypeMapper.outputTypeFor(oneToOneAssociation);
-        if (type != null) {
-            val fieldBuilder = newFieldDefinition()
-                    .name("get")
-                    .type(type);
-            fieldDefinition = fieldBuilder.build();
-
-            holder.addField(fieldDefinition);
-        }
-        return fieldDefinition;
-    }
-
-    public void addDataFetcher() {
-
-        val association = holder.getOneToOneAssociation();
-        val fieldObjectSpecification = association.getElementType();
-        val beanSort = fieldObjectSpecification.getBeanSort();
-
-        val specificationLoader = association.getSpecificationLoader();
-        switch (beanSort) {
-
-            case VALUE:
-            case VIEW_MODEL:
-            case ENTITY:
-
-                codeRegistryBuilder.dataFetcher(
-                        holder.coordinatesFor(field),
-                        this::get);
-
-                break;
-
-        }
+            final GraphQLCodeRegistry.Builder codeRegistryBuilder,
+            final SpecificationLoader specificationLoader) {
+        super(holder, codeRegistryBuilder, specificationLoader);
     }
 
-    private Object get(final DataFetchingEnvironment dataFetchingEnvironment) {
-
-        val association = holder.getOneToOneAssociation();
-
-        val sourcePojo = BookmarkedPojo.sourceFrom(dataFetchingEnvironment);
-
-        val sourcePojoClass = sourcePojo.getClass();
-        val specificationLoader = association.getSpecificationLoader();
-        val objectSpecification = 
specificationLoader.loadSpecification(sourcePojoClass);
-        if (objectSpecification == null) {
-            // not expected
-            return null;
-        }
-
-        val managedObject = ManagedObject.adaptSingular(objectSpecification, 
sourcePojo);
-        val resultManagedObject = association.get(managedObject);
-
-        return resultManagedObject != null
-                ? resultManagedObject.getPojo()
-                : null;
+    @Override
+    GraphQLOutputType 
outputTypeFor(GqlvAssociationGetHolder<OneToOneAssociation> holder) {
+        val oneToOneAssociation = holder.getObjectAssociation();
+        return TypeMapper.outputTypeFor(oneToOneAssociation);
     }
 
 }
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyGetHolder.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyGetHolder.java
index 6929661150..0f68abb1a6 100644
--- 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyGetHolder.java
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/domain/GqlvPropertyGetHolder.java
@@ -20,7 +20,6 @@ package org.apache.causeway.viewer.graphql.model.domain;
 
 import org.apache.causeway.core.metamodel.spec.feature.OneToOneAssociation;
 
-public interface GqlvPropertyGetHolder extends GqlvHolder {
+public interface GqlvPropertyGetHolder extends 
GqlvAssociationGetHolder<OneToOneAssociation> {
 
-    OneToOneAssociation getOneToOneAssociation();
 }

Reply via email to