This is an automated email from the ASF dual-hosted git repository.

danhaywood pushed a commit to branch CAUSEWAY-3676
in repository https://gitbox.apache.org/repos/asf/causeway.git


The following commit(s) were added to refs/heads/CAUSEWAY-3676 by this push:
     new d316910aa0 CAUSEWAY-3676: introduces GqlvProperty, Collection, Action
d316910aa0 is described below

commit d316910aa0306d0d01501f534ace6467a84c5736
Author: danhaywood <[email protected]>
AuthorDate: Sat Jan 20 10:13:49 2024 +0000

    CAUSEWAY-3676: introduces GqlvProperty, Collection, Action
---
 .../graphql/model/src/main/java/module-info.java   |  3 +
 .../viewer/graphql/model/parts/GqlvAction.java     | 18 +++++
 .../graphql/model/parts/GqlvAssociation.java       | 21 ++++++
 .../viewer/graphql/model/parts/GqlvCollection.java | 18 +++++
 .../viewer/graphql/model/parts/GqlvMember.java     | 26 ++++++++
 .../viewer/graphql/model/parts/GqlvProperty.java   | 18 +++++
 .../graphql/viewer/source/GqlvObjectBehaviour.java | 15 +++--
 .../graphql/viewer/source/GqlvObjectStructure.java | 78 ++++++++++------------
 8 files changed, 146 insertions(+), 51 deletions(-)

diff --git a/incubator/viewers/graphql/model/src/main/java/module-info.java 
b/incubator/viewers/graphql/model/src/main/java/module-info.java
index e3aae7aa0b..5899d6c459 100644
--- a/incubator/viewers/graphql/model/src/main/java/module-info.java
+++ b/incubator/viewers/graphql/model/src/main/java/module-info.java
@@ -1,7 +1,10 @@
 module org.apache.causeway.incubator.viewer.graphql.model {
     exports org.apache.causeway.viewer.graphql.model;
+    exports org.apache.causeway.viewer.graphql.model.parts;
 
     requires org.apache.causeway.core.config;
     requires org.apache.causeway.incubator.viewer.graphql.applib;
     requires spring.context;
+    requires org.apache.causeway.core.metamodel;
+    requires com.graphqljava;
 }
\ No newline at end of file
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/parts/GqlvAction.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/parts/GqlvAction.java
new file mode 100644
index 0000000000..8456d06cf3
--- /dev/null
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/parts/GqlvAction.java
@@ -0,0 +1,18 @@
+package org.apache.causeway.viewer.graphql.model.parts;
+
+import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
+
+import graphql.schema.GraphQLFieldDefinition;
+
+public class GqlvAction extends GqlvMember<ObjectAction> {
+
+    public GqlvAction(
+            final ObjectAction objectAction,
+            final GraphQLFieldDefinition fieldDefinition) {
+        super(objectAction, fieldDefinition);
+    }
+
+    public ObjectAction getObjectAction() {
+        return getObjectMember();
+    }
+}
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/parts/GqlvAssociation.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/parts/GqlvAssociation.java
new file mode 100644
index 0000000000..8f922f04c1
--- /dev/null
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/parts/GqlvAssociation.java
@@ -0,0 +1,21 @@
+package org.apache.causeway.viewer.graphql.model.parts;
+
+import org.apache.causeway.core.metamodel.spec.feature.ObjectAssociation;
+
+import graphql.schema.GraphQLFieldDefinition;
+
+public abstract class GqlvAssociation<T extends ObjectAssociation> extends 
GqlvMember<T> {
+
+    public GqlvAssociation(
+            final T objectAssociation,
+            final GraphQLFieldDefinition fieldDefinition) {
+        super(objectAssociation, fieldDefinition);
+    }
+
+    /**
+     * @see #getObjectMember()
+     */
+    public T getObjectAssociation() {
+        return getObjectMember();
+    }
+}
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/parts/GqlvCollection.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/parts/GqlvCollection.java
new file mode 100644
index 0000000000..dfedee12d0
--- /dev/null
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/parts/GqlvCollection.java
@@ -0,0 +1,18 @@
+package org.apache.causeway.viewer.graphql.model.parts;
+
+import graphql.schema.GraphQLFieldDefinition;
+
+import org.apache.causeway.core.metamodel.spec.feature.OneToManyAssociation;
+
+public class GqlvCollection extends GqlvAssociation<OneToManyAssociation> {
+
+    public GqlvCollection(
+            final OneToManyAssociation oneToManyAssociation,
+            final GraphQLFieldDefinition fieldDefinition) {
+        super(oneToManyAssociation, fieldDefinition);
+    }
+
+    public OneToManyAssociation getOneToManyAssociation() {
+        return getObjectAssociation();
+    }
+}
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/parts/GqlvMember.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/parts/GqlvMember.java
new file mode 100644
index 0000000000..770d0dac5d
--- /dev/null
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/parts/GqlvMember.java
@@ -0,0 +1,26 @@
+package org.apache.causeway.viewer.graphql.model.parts;
+
+import org.apache.causeway.core.metamodel.spec.feature.ObjectMember;
+import org.apache.causeway.core.metamodel.spec.feature.OneToOneAssociation;
+
+import lombok.Getter;
+
+import graphql.schema.GraphQLFieldDefinition;
+
+public abstract class GqlvMember<T extends ObjectMember> {
+
+    @Getter final T objectMember;
+    @Getter final GraphQLFieldDefinition fieldDefinition;
+
+    public GqlvMember(
+            final T objectMember,
+            final GraphQLFieldDefinition fieldDefinition) {
+        this.objectMember = objectMember;
+        this.fieldDefinition = fieldDefinition;
+    }
+
+    public String getId() {
+        return objectMember.getFeatureIdentifier().getFullIdentityString();
+    }
+
+}
diff --git 
a/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/parts/GqlvProperty.java
 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/parts/GqlvProperty.java
new file mode 100644
index 0000000000..fea94f9078
--- /dev/null
+++ 
b/incubator/viewers/graphql/model/src/main/java/org/apache/causeway/viewer/graphql/model/parts/GqlvProperty.java
@@ -0,0 +1,18 @@
+package org.apache.causeway.viewer.graphql.model.parts;
+
+import graphql.schema.GraphQLFieldDefinition;
+
+import org.apache.causeway.core.metamodel.spec.feature.OneToOneAssociation;
+
+public class GqlvProperty extends GqlvAssociation<OneToOneAssociation> {
+
+    public GqlvProperty(
+            final OneToOneAssociation oneToOneAssociation,
+            final GraphQLFieldDefinition fieldDefinition) {
+        super(oneToOneAssociation, fieldDefinition);
+    }
+
+    public OneToOneAssociation getOneToOneAssociation() {
+        return getObjectAssociation();
+    }
+}
diff --git 
a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/GqlvObjectBehaviour.java
 
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/GqlvObjectBehaviour.java
index 1ab0c21ab5..fe4a96e6e0 100644
--- 
a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/GqlvObjectBehaviour.java
+++ 
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/GqlvObjectBehaviour.java
@@ -1,7 +1,6 @@
 package org.apache.causeway.viewer.graphql.viewer.source;
 
 
-import java.util.Map;
 import java.util.Set;
 
 import org.apache.causeway.applib.services.bookmark.BookmarkService;
@@ -11,6 +10,8 @@ import 
org.apache.causeway.core.metamodel.objectmanager.ObjectManager;
 import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 import org.apache.causeway.core.metamodel.spec.feature.ObjectAssociation;
 import org.apache.causeway.core.metamodel.specloader.SpecificationLoader;
+import org.apache.causeway.viewer.graphql.model.parts.GqlvAssociation;
+import org.apache.causeway.viewer.graphql.model.parts.GqlvProperty;
 
 import lombok.RequiredArgsConstructor;
 
@@ -70,18 +71,18 @@ public class GqlvObjectBehaviour {
 
 
     public void createAndRegisterDataFetchersForField() {
-        
structure.getProperties().entrySet().forEach(this::createAndRegisterDataFetcherForAssociation);
+        
structure.getProperties().forEach(this::createAndRegisterDataFetcherForAssociation);
     }
 
     void createAndRegisterDataFetchersForCollection() {
-        
structure.getCollections().entrySet().forEach(this::createAndRegisterDataFetcherForAssociation);
+        structure.getCollections().forEach(
+                this::createAndRegisterDataFetcherForAssociation);
     }
 
-    private void createAndRegisterDataFetcherForAssociation(
-            final Map.Entry<? extends ObjectAssociation, 
GraphQLFieldDefinition> associationAndField) {
+    private void createAndRegisterDataFetcherForAssociation(final 
GqlvAssociation<?> property) {
 
-        final ObjectAssociation association = associationAndField.getKey();
-        final GraphQLFieldDefinition field = associationAndField.getValue();
+        final ObjectAssociation association = property.getObjectMember();
+        final GraphQLFieldDefinition field = property.getFieldDefinition();
 
         final GraphQLObjectType graphQLObjectType = 
structure.getGqlObjectType();
 
diff --git 
a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/GqlvObjectStructure.java
 
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/GqlvObjectStructure.java
index cb307d506e..37a08e28b6 100644
--- 
a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/GqlvObjectStructure.java
+++ 
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/GqlvObjectStructure.java
@@ -1,26 +1,8 @@
 package org.apache.causeway.viewer.graphql.viewer.source;
 
-import graphql.Scalars;
-import graphql.com.google.common.collect.BiMap;
-import graphql.schema.GraphQLArgument;
-import graphql.schema.GraphQLFieldDefinition;
-import graphql.schema.GraphQLInputObjectType;
-import graphql.schema.GraphQLList;
-import graphql.schema.GraphQLObjectType;
-
-import graphql.schema.GraphQLOutputType;
-import graphql.schema.GraphQLType;
-import graphql.schema.GraphQLTypeReference;
-
-import lombok.Getter;
-import lombok.Synchronized;
-import lombok.experimental.UtilityClass;
-import lombok.val;
-
 import java.util.ArrayList;
-import java.util.LinkedHashMap;
+import java.util.Collections;
 import java.util.List;
-import java.util.Map;
 import java.util.Optional;
 import java.util.stream.Collectors;
 
@@ -33,16 +15,32 @@ import 
org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
 import org.apache.causeway.core.metamodel.spec.feature.ObjectActionParameter;
 import org.apache.causeway.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.causeway.core.metamodel.spec.feature.OneToOneAssociation;
-import org.apache.causeway.viewer.graphql.viewer.util._BiMap;
+import org.apache.causeway.viewer.graphql.model.parts.GqlvAction;
+import org.apache.causeway.viewer.graphql.model.parts.GqlvCollection;
+import org.apache.causeway.viewer.graphql.model.parts.GqlvProperty;
+
+import static 
org.apache.causeway.viewer.graphql.viewer.source._Constants.GQL_INPUTTYPE_PREFIX;
+
+import lombok.Getter;
+import lombok.val;
+import lombok.experimental.UtilityClass;
+
+import graphql.Scalars;
+import graphql.schema.GraphQLArgument;
+import graphql.schema.GraphQLFieldDefinition;
+import graphql.schema.GraphQLInputObjectType;
+import graphql.schema.GraphQLList;
+import graphql.schema.GraphQLObjectType;
+import graphql.schema.GraphQLOutputType;
+import graphql.schema.GraphQLType;
+import graphql.schema.GraphQLTypeReference;
 
 import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
 import static graphql.schema.GraphQLInputObjectField.newInputObjectField;
 import static graphql.schema.GraphQLInputObjectType.newInputObject;
 import static graphql.schema.GraphQLNonNull.nonNull;
 import static graphql.schema.GraphQLObjectType.newObject;
-
 import static graphql.schema.GraphQLTypeReference.typeRef;
-import static 
org.apache.causeway.viewer.graphql.viewer.source._Constants.GQL_INPUTTYPE_PREFIX;
 
 /**
  * A wrapper around {@link ObjectSpecification}
@@ -94,26 +92,17 @@ public class GqlvObjectStructure {
 
     final GraphQLObjectType.Builder mutatorsTypeBuilder;
 
-    private final _BiMap<OneToOneAssociation, GraphQLFieldDefinition> 
propertyToField = new _BiMap<>();
-    private final _BiMap<OneToManyAssociation, GraphQLFieldDefinition> 
collectionToField = new _BiMap<>();
-    private final _BiMap<ObjectAction, GraphQLFieldDefinition> 
safeActionToField = new _BiMap<>();
-    private final _BiMap<ObjectAction, GraphQLFieldDefinition> 
mutatorActionToField = new _BiMap<>();
+    private final List<GqlvProperty> properties = new ArrayList<>();
+    public List<GqlvProperty> getProperties() {return 
Collections.unmodifiableList(properties);}
 
-    Map<OneToOneAssociation, GraphQLFieldDefinition> getProperties() {
-        return propertyToField.getForwardMapAsImmutable();
-    }
+    private final List<GqlvCollection> collections = new ArrayList<>();
+    public List<GqlvCollection> getCollections() {return 
Collections.unmodifiableList(collections);}
 
-    Map<OneToManyAssociation, GraphQLFieldDefinition> getCollections() {
-        return collectionToField.getForwardMapAsImmutable();
-    }
-
-    Map<ObjectAction, GraphQLFieldDefinition> getSafeActions() {
-        return safeActionToField.getForwardMapAsImmutable();
-    }
+    private final List<GqlvAction> safeActions = new ArrayList<>();
+    public List<GqlvAction> getSafeActions() {return 
Collections.unmodifiableList(safeActions);}
 
-    Map<ObjectAction, GraphQLFieldDefinition> getMutatorActions() {
-        return mutatorActionToField.getForwardMapAsImmutable();
-    }
+    private final List<GqlvAction> mutatorActions = new ArrayList<>();
+    public List<GqlvAction> getMutatorActions() {return 
Collections.unmodifiableList(mutatorActions);}
 
     /**
      * Built using {@link #buildGqlObjectType()}
@@ -123,6 +112,7 @@ public class GqlvObjectStructure {
     /**
      * Built lazily using {@link #buildMutatorsTypeIfAny()}
      */
+    @SuppressWarnings("OptionalUsedAsFieldOrParameterType")
     private Optional<GraphQLObjectType> mutatorsTypeIfAny;
 
     public GqlvObjectStructure(final ObjectSpecification objectSpec) {
@@ -197,7 +187,7 @@ public class GqlvObjectStructure {
                 break;
         }
         if (fieldDefinition != null) {
-            propertyToField.put(otoa, fieldDefinition);
+            properties.add(new GqlvProperty(otoa, fieldDefinition));
         }
     }
 
@@ -232,7 +222,7 @@ public class GqlvObjectStructure {
         }
 
         if (fieldDefinition != null) {
-            collectionToField.put(otom, fieldDefinition);
+            collections.add(new GqlvCollection(otom, fieldDefinition));
         }
     }
 
@@ -281,18 +271,18 @@ public class GqlvObjectStructure {
             final ObjectAction objectAction,
             final GraphQLFieldDefinition fieldDefinition) {
         getGqlObjectTypeBuilder().field(fieldDefinition);
-        safeActionToField.put(objectAction, fieldDefinition);
+        safeActions.add(new GqlvAction(objectAction, fieldDefinition));
     }
 
     public void addNonSafeActionAsMutatorField(
             final ObjectAction objectAction,
             final GraphQLFieldDefinition fieldDefinition) {
         mutatorsTypeBuilder.field(fieldDefinition);
-        mutatorActionToField.put(objectAction, fieldDefinition);
+        mutatorActions.add(new GqlvAction(objectAction, fieldDefinition));
     }
 
     boolean hasMutators() {
-        return !mutatorActionToField.isEmpty();
+        return !mutatorActions.isEmpty();
     }
 
 

Reply via email to