From 0ed43529cdb723ec3f5f7abc827324f47dea4a8a Mon Sep 17 00:00:00 2001 From: Igor Dianov Date: Wed, 9 Nov 2022 14:38:56 -0800 Subject: [PATCH 1/2] fix: add scalar registration method to GraphQLJpaSchemaBuilder --- .../schema/impl/GraphQLJpaSchemaBuilder.java | 56 ++++++++++--------- 1 file changed, 31 insertions(+), 25 deletions(-) diff --git a/graphql-jpa-query-schema/src/main/java/com/introproventures/graphql/jpa/query/schema/impl/GraphQLJpaSchemaBuilder.java b/graphql-jpa-query-schema/src/main/java/com/introproventures/graphql/jpa/query/schema/impl/GraphQLJpaSchemaBuilder.java index 7dc74def3..37a84a10a 100644 --- a/graphql-jpa-query-schema/src/main/java/com/introproventures/graphql/jpa/query/schema/impl/GraphQLJpaSchemaBuilder.java +++ b/graphql-jpa-query-schema/src/main/java/com/introproventures/graphql/jpa/query/schema/impl/GraphQLJpaSchemaBuilder.java @@ -16,6 +16,30 @@ package com.introproventures.graphql.jpa.query.schema.impl; +import java.beans.Introspector; +import java.lang.reflect.AnnotatedElement; +import java.lang.reflect.Field; +import java.lang.reflect.Member; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Supplier; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import javax.persistence.Convert; +import javax.persistence.EntityManager; +import javax.persistence.metamodel.Attribute; +import javax.persistence.metamodel.EmbeddableType; +import javax.persistence.metamodel.EntityType; +import javax.persistence.metamodel.ManagedType; +import javax.persistence.metamodel.PluralAttribute; +import javax.persistence.metamodel.SingularAttribute; +import javax.persistence.metamodel.Type; import com.introproventures.graphql.jpa.query.annotation.GraphQLIgnore; import com.introproventures.graphql.jpa.query.annotation.GraphQLIgnoreFilter; import com.introproventures.graphql.jpa.query.annotation.GraphQLIgnoreOrder; @@ -41,6 +65,7 @@ import graphql.schema.GraphQLList; import graphql.schema.GraphQLObjectType; import graphql.schema.GraphQLOutputType; +import graphql.schema.GraphQLScalarType; import graphql.schema.GraphQLSchema; import graphql.schema.GraphQLType; import graphql.schema.GraphQLTypeReference; @@ -49,31 +74,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.persistence.Convert; -import javax.persistence.EntityManager; -import javax.persistence.metamodel.Attribute; -import javax.persistence.metamodel.EmbeddableType; -import javax.persistence.metamodel.EntityType; -import javax.persistence.metamodel.ManagedType; -import javax.persistence.metamodel.PluralAttribute; -import javax.persistence.metamodel.SingularAttribute; -import javax.persistence.metamodel.Type; -import java.beans.Introspector; -import java.lang.reflect.AnnotatedElement; -import java.lang.reflect.Field; -import java.lang.reflect.Member; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.function.Supplier; -import java.util.stream.Collectors; -import java.util.stream.Stream; - import static graphql.Scalars.GraphQLBoolean; import static graphql.schema.GraphQLArgument.newArgument; import static graphql.schema.GraphQLInputObjectField.newInputObjectField; @@ -165,6 +165,12 @@ public GraphQLSchema build() { return schema.build(); } + public GraphQLJpaSchemaBuilder scalar(Class javaType, GraphQLScalarType scalarType) { + JavaScalars.register(javaType, scalarType); + + return this; + } + private GraphQLObjectType getQueryType() { GraphQLObjectType.Builder queryType = GraphQLObjectType.newObject() From 3919543f4b5394b60af3ca10c8475267964ba2c3 Mon Sep 17 00:00:00 2001 From: Igor Dianov Date: Sat, 17 Dec 2022 10:18:25 -0800 Subject: [PATCH 2/2] fix: add schema builder scalar test --- .../query/schema/GraphQLSchemaBuilder.java | 13 ++++++- .../schema/impl/GraphQLJpaSchemaBuilder.java | 6 ++- .../query/schema/StarwarsSchemaBuildTest.java | 39 ++++++++++++++----- 3 files changed, 46 insertions(+), 12 deletions(-) diff --git a/graphql-jpa-query-schema/src/main/java/com/introproventures/graphql/jpa/query/schema/GraphQLSchemaBuilder.java b/graphql-jpa-query-schema/src/main/java/com/introproventures/graphql/jpa/query/schema/GraphQLSchemaBuilder.java index ab46d758b..5ef5f943d 100644 --- a/graphql-jpa-query-schema/src/main/java/com/introproventures/graphql/jpa/query/schema/GraphQLSchemaBuilder.java +++ b/graphql-jpa-query-schema/src/main/java/com/introproventures/graphql/jpa/query/schema/GraphQLSchemaBuilder.java @@ -15,6 +15,7 @@ */ package com.introproventures.graphql.jpa.query.schema; +import graphql.schema.GraphQLScalarType; import graphql.schema.GraphQLSchema; /** @@ -57,7 +58,17 @@ public interface GraphQLSchemaBuilder { * @return this builder instance */ GraphQLSchemaBuilder namingStrategy(NamingStrategy instance); - + + + /** + * Register Java type scalar + * + * @param javaType class + * @param scalarType GraphQL scalar instance + * @return this builder instance + */ + GraphQLSchemaBuilder scalar(Class javaType, GraphQLScalarType scalarType); + /** * Builds {code #GraphQLSchema} instance * diff --git a/graphql-jpa-query-schema/src/main/java/com/introproventures/graphql/jpa/query/schema/impl/GraphQLJpaSchemaBuilder.java b/graphql-jpa-query-schema/src/main/java/com/introproventures/graphql/jpa/query/schema/impl/GraphQLJpaSchemaBuilder.java index 37a84a10a..cebfdb3db 100644 --- a/graphql-jpa-query-schema/src/main/java/com/introproventures/graphql/jpa/query/schema/impl/GraphQLJpaSchemaBuilder.java +++ b/graphql-jpa-query-schema/src/main/java/com/introproventures/graphql/jpa/query/schema/impl/GraphQLJpaSchemaBuilder.java @@ -24,6 +24,7 @@ import java.util.Collection; import java.util.Collections; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Optional; @@ -133,6 +134,7 @@ public class GraphQLJpaSchemaBuilder implements GraphQLSchemaBuilder { private boolean enableResultStream = false; private RestrictedKeysProvider restrictedKeysProvider = (entityDescriptor) -> Optional.of(Collections.emptyList()); + private Map, GraphQLScalarType> scalars = new LinkedHashMap<>(); private final Relay relay = new Relay(); @@ -151,6 +153,8 @@ public GraphQLJpaSchemaBuilder(EntityManager entityManager) { */ @Override public GraphQLSchema build() { + scalars.forEach((javaType, scalarType) -> JavaScalars.register(javaType, scalarType)); + GraphQLSchema.Builder schema = GraphQLSchema.newSchema() .query(getQueryType()); @@ -166,7 +170,7 @@ public GraphQLSchema build() { } public GraphQLJpaSchemaBuilder scalar(Class javaType, GraphQLScalarType scalarType) { - JavaScalars.register(javaType, scalarType); + scalars.put(javaType, scalarType); return this; } diff --git a/graphql-jpa-query-schema/src/test/java/com/introproventures/graphql/jpa/query/schema/StarwarsSchemaBuildTest.java b/graphql-jpa-query-schema/src/test/java/com/introproventures/graphql/jpa/query/schema/StarwarsSchemaBuildTest.java index ce8f56ea9..f016abff2 100644 --- a/graphql-jpa-query-schema/src/test/java/com/introproventures/graphql/jpa/query/schema/StarwarsSchemaBuildTest.java +++ b/graphql-jpa-query-schema/src/test/java/com/introproventures/graphql/jpa/query/schema/StarwarsSchemaBuildTest.java @@ -16,10 +16,15 @@ package com.introproventures.graphql.jpa.query.schema; -import static org.assertj.core.api.Assertions.assertThat; - +import java.util.Optional; import javax.persistence.EntityManager; - +import com.introproventures.graphql.jpa.query.AbstractSpringBootTestSupport; +import com.introproventures.graphql.jpa.query.schema.impl.GraphQLJpaSchemaBuilder; +import graphql.Scalars; +import graphql.schema.GraphQLInputObjectType; +import graphql.schema.GraphQLObjectType; +import graphql.schema.GraphQLScalarType; +import graphql.schema.GraphQLSchema; import org.junit.Before; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -28,13 +33,7 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Bean; -import com.introproventures.graphql.jpa.query.AbstractSpringBootTestSupport; -import com.introproventures.graphql.jpa.query.schema.impl.GraphQLJpaSchemaBuilder; - -import graphql.Scalars; -import graphql.schema.GraphQLInputObjectType; -import graphql.schema.GraphQLObjectType; -import graphql.schema.GraphQLSchema; +import static org.assertj.core.api.Assertions.assertThat; @SpringBootTest public class StarwarsSchemaBuildTest extends AbstractSpringBootTestSupport { @@ -188,5 +187,25 @@ public void testBuildSchema(){ //then assertThat(schema).isNotNull(); } + + @Test + public void scalar() { + // given + GraphQLScalarType scalarType = GraphQLScalarType.newScalar() + .name("TestObject") + .coercing(new JavaScalars.GraphQLObjectCoercing()) + .build(); + + // when + builder.scalar(Object.class, scalarType) + .build(); + + // then + Optional result = JavaScalars.of(scalarType.getName()); + + assertThat(result).isNotEmpty() + .get() + .isEqualTo(scalarType); + } } \ No newline at end of file