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 52dca972b8 CAUSEWAY-3676: wip on addActions, to move into
GqlvObjectSpec (4)
52dca972b8 is described below
commit 52dca972b843c63b162986490dec3ab7a8f6b02f
Author: danhaywood <[email protected]>
AuthorDate: Fri Jan 19 13:09:29 2024 +0000
CAUSEWAY-3676: wip on addActions, to move into GqlvObjectSpec (4)
---
.../graphql/viewer/source/GqlvObjectSpec.java | 117 +++++++++++++++------
.../graphql/viewer/source/ObjectTypeFactory.java | 40 +------
2 files changed, 85 insertions(+), 72 deletions(-)
diff --git
a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/GqlvObjectSpec.java
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/GqlvObjectSpec.java
index d4824b5585..94a8ffd11b 100644
---
a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/GqlvObjectSpec.java
+++
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/GqlvObjectSpec.java
@@ -1,11 +1,13 @@
package org.apache.causeway.viewer.graphql.viewer.source;
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.GraphQLTypeReference;
import lombok.Getter;
@@ -13,10 +15,14 @@ import lombok.val;
import java.util.ArrayList;
import java.util.List;
+import java.util.stream.Collectors;
import org.apache.causeway.applib.services.metamodel.BeanSort;
+import org.apache.causeway.commons.collections.Can;
import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
import org.apache.causeway.core.metamodel.spec.feature.MixedIn;
+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;
@@ -51,8 +57,10 @@ public class GqlvObjectSpec {
return (GraphQLObjectType) metaField.getType();
}
+ String getMutatorsTypeName() {
+ return getLogicalTypeNameSanitized() + "__DomainObject_mutators";
+ }
- final String mutatorsTypeName;
final GraphQLObjectType.Builder mutatorsTypeBuilder;
final List<GraphQLFieldDefinition> mutatorsTypeFields = new ArrayList<>();
@@ -79,11 +87,10 @@ public class GqlvObjectSpec {
.build());
gqlInputObjectType = inputTypeBuilder.build();
- mutatorsTypeName = getLogicalTypeNameSanitized() +
"__DomainObject_mutators";
- mutatorsTypeBuilder = newObject().name(mutatorsTypeName);
-
+ mutatorsTypeBuilder = newObject().name(getMutatorsTypeName());
}
+
private GraphQLObjectType metaType() {
val metaTypeBuilder = newObject().name(getLogicalTypeNameSanitized() +
"__DomainObject_meta");
metaTypeBuilder.field(ObjectTypeFactory.Fields.id);
@@ -95,37 +102,26 @@ public class GqlvObjectSpec {
}
-
void addPropertiesAsFields() {
objectSpec.streamProperties(MixedIn.INCLUDED)
- .forEach(this::addSafeActionAsField);
- }
-
- public void addSafeActionAsField(GraphQLFieldDefinition fieldDefinition) {
- getGqlObjectTypeBuilder().field(fieldDefinition);
- }
-
- public void addNonSafeActionAsMutatorField(GraphQLFieldDefinition
fieldDefinition) {
- mutatorsTypeBuilder.field(fieldDefinition);
- mutatorsTypeFields.add(fieldDefinition);
+ .forEach(this::addPropertyAsField);
}
- private void addSafeActionAsField(OneToOneAssociation otoa) {
+ private void addPropertyAsField(final OneToOneAssociation otoa) {
ObjectSpecification otoaObjectSpec = otoa.getElementType();
switch (otoaObjectSpec.getBeanSort()) {
case VIEW_MODEL:
case ENTITY:
-
String logicalTypeNameOfField =
otoaObjectSpec.getLogicalTypeName();
GraphQLFieldDefinition.Builder fieldBuilder =
newFieldDefinition()
- .name(otoa.getId())
- .type(otoa.isOptional()
- ? GraphQLTypeReference.typeRef(
-
_LogicalTypeName.sanitized(logicalTypeNameOfField))
- : nonNull(GraphQLTypeReference.typeRef(
-
_LogicalTypeName.sanitized(logicalTypeNameOfField))));
+ .name(otoa.getId())
+ .type(otoa.isOptional()
+ ? GraphQLTypeReference.typeRef(
+
_LogicalTypeName.sanitized(logicalTypeNameOfField))
+ : nonNull(GraphQLTypeReference.typeRef(
+
_LogicalTypeName.sanitized(logicalTypeNameOfField))));
getGqlObjectTypeBuilder().field(fieldBuilder);
break;
@@ -135,18 +131,18 @@ public class GqlvObjectSpec {
// todo: map ...
GraphQLFieldDefinition.Builder valueBuilder =
newFieldDefinition()
- .name(otoa.getId())
- .type(otoa.isOptional()
- ? Scalars.GraphQLString
- : nonNull(Scalars.GraphQLString));
+ .name(otoa.getId())
+ .type(otoa.isOptional()
+ ? Scalars.GraphQLString
+ : nonNull(Scalars.GraphQLString));
getGqlObjectTypeBuilder().field(valueBuilder);
break;
-
}
}
- void addCollections() {
+
+ void addCollectionsAsLists() {
objectSpec.streamCollections(MixedIn.INCLUDED).forEach(this::addCollection);
}
@@ -160,21 +156,73 @@ public class GqlvObjectSpec {
case ENTITY:
String logicalTypeNameOfField =
elementType.getLogicalTypeName();
GraphQLFieldDefinition.Builder fieldBuilder =
newFieldDefinition()
- .name(otom.getId())
- .type(GraphQLList.list(GraphQLTypeReference.typeRef(
-
_LogicalTypeName.sanitized(logicalTypeNameOfField))));
+ .name(otom.getId())
+ .type(GraphQLList.list(GraphQLTypeReference.typeRef(
+
_LogicalTypeName.sanitized(logicalTypeNameOfField))));
gqlObjectTypeBuilder.field(fieldBuilder);
break;
case VALUE:
GraphQLFieldDefinition.Builder valueBuilder =
newFieldDefinition()
- .name(otom.getId())
-
.type(GraphQLList.list(TypeMapper.typeFor(elementType.getCorrespondingClass())));
+ .name(otom.getId())
+
.type(GraphQLList.list(TypeMapper.typeFor(elementType.getCorrespondingClass())));
gqlObjectTypeBuilder.field(valueBuilder);
break;
}
}
+
+
+ void addAction(final ObjectAction objectAction) {
+
+ val fieldName = objectAction.getId();
+ GraphQLFieldDefinition.Builder fieldBuilder = newFieldDefinition()
+ .name(fieldName)
+ .type((GraphQLOutputType)
TypeMapper.typeForObjectAction(objectAction));
+ addGqlArguments(objectAction, fieldBuilder);
+ GraphQLFieldDefinition fieldDefinition = fieldBuilder.build();
+
+ if (objectAction.getSemantics().isSafeInNature()) {
+ addSafeActionAsField(fieldDefinition);
+ } else {
+ addNonSafeActionAsMutatorField(fieldDefinition);
+ }
+ }
+
+ private static void addGqlArguments(
+ final ObjectAction objectAction,
+ final GraphQLFieldDefinition.Builder builder) {
+
+ Can<ObjectActionParameter> parameters = objectAction.getParameters();
+
+ if (parameters.isNotEmpty()) {
+ builder.arguments(parameters.stream()
+ .map(GqlvObjectSpec::gqlArgumentFor)
+ .collect(Collectors.toList()));
+ }
+ }
+
+ private static GraphQLArgument gqlArgumentFor(final ObjectActionParameter
objectActionParameter) {
+ return GraphQLArgument.newArgument()
+ .name(objectActionParameter.getId())
+ .type(objectActionParameter.isOptional()
+ ? TypeMapper.inputTypeFor(objectActionParameter)
+ :
nonNull(TypeMapper.inputTypeFor(objectActionParameter)))
+ .build();
+ }
+
+
+ public void addSafeActionAsField(GraphQLFieldDefinition fieldDefinition) {
+ getGqlObjectTypeBuilder().field(fieldDefinition);
+ }
+
+ public void addNonSafeActionAsMutatorField(GraphQLFieldDefinition
fieldDefinition) {
+ mutatorsTypeBuilder.field(fieldDefinition);
+ mutatorsTypeFields.add(fieldDefinition);
+ }
+
+
+
/**
* Should be called only after fields etc have been added.
*
@@ -199,4 +247,5 @@ public class GqlvObjectSpec {
return gqlObjectType;
}
+
}
diff --git
a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/ObjectTypeFactory.java
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/ObjectTypeFactory.java
index b3404e13dc..d6412edcca 100644
---
a/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/ObjectTypeFactory.java
+++
b/incubator/viewers/graphql/viewer/src/main/java/org/apache/causeway/viewer/graphql/viewer/source/ObjectTypeFactory.java
@@ -25,14 +25,11 @@ import static graphql.schema.GraphQLObjectType.newObject;
import java.util.List;
import java.util.Set;
-import java.util.stream.Collectors;
import javax.inject.Inject;
import org.apache.causeway.core.metamodel.objectmanager.ObjectManager;
-import org.apache.causeway.core.metamodel.spec.feature.ObjectAction;
-
import org.springframework.stereotype.Component;
import org.apache.causeway.applib.services.bookmark.BookmarkService;
@@ -47,12 +44,10 @@ import
org.apache.causeway.core.metamodel.specloader.SpecificationLoader;
import graphql.Scalars;
import graphql.schema.DataFetcher;
import graphql.schema.FieldCoordinates;
-import graphql.schema.GraphQLArgument;
import graphql.schema.GraphQLCodeRegistry;
import graphql.schema.GraphQLFieldDefinition;
import graphql.schema.GraphQLInputType;
import graphql.schema.GraphQLObjectType;
-import graphql.schema.GraphQLOutputType;
import graphql.schema.GraphQLType;
import lombok.AllArgsConstructor;
@@ -110,7 +105,7 @@ public class ObjectTypeFactory {
gqlvObjectSpec.addPropertiesAsFields();
// add collections
- gqlvObjectSpec.addCollections();
+ gqlvObjectSpec.addCollectionsAsLists();
// add actions
MutatorsDataForEntity mutatorsDataForEntity =
addActions(gqlvObjectSpec);
@@ -165,7 +160,7 @@ public class ObjectTypeFactory {
gqlvObjectSpec.getObjectSpec().streamActions(ActionScope.PRODUCTION,
MixedIn.INCLUDED)
.forEach(objectAction ->
- addAction(gqlvObjectSpec, objectAction)
+ gqlvObjectSpec.addAction(objectAction)
);
if (!gqlvObjectSpec.mutatorsTypeFields.isEmpty()){
@@ -208,37 +203,6 @@ public class ObjectTypeFactory {
}
- private static void addAction(
- final GqlvObjectSpec gqlvObjectSpec, final ObjectAction
objectAction) {
-
- val fieldName = objectAction.getId();
- GraphQLFieldDefinition.Builder builder = newFieldDefinition()
- .name(fieldName)
- .type((GraphQLOutputType)
TypeMapper.typeForObjectAction(objectAction));
- addArguments(objectAction, builder);
- GraphQLFieldDefinition fieldDefinition = builder.build();
-
- if (objectAction.getSemantics().isSafeInNature()) {
-
- gqlvObjectSpec.addSafeActionAsField(fieldDefinition);
-
- } else {
- gqlvObjectSpec.addNonSafeActionAsMutatorField(fieldDefinition);
- }
- }
-
- private static void addArguments(ObjectAction objectAction,
GraphQLFieldDefinition.Builder builder) {
- if (objectAction.getParameters().isNotEmpty()) {
- builder.arguments(objectAction.getParameters().stream()
- .map(objectActionParameter -> GraphQLArgument.newArgument()
- .name(objectActionParameter.getId())
- .type(objectActionParameter.isOptional()
- ?
TypeMapper.inputTypeFor(objectActionParameter)
- :
nonNull(TypeMapper.inputTypeFor(objectActionParameter)))
- .build())
- .collect(Collectors.toList()));
- }
- }
@Data
@AllArgsConstructor