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 7dc74def3..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 @@ -16,6 +16,31 @@ 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.LinkedHashMap; +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 +66,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 +75,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; @@ -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()); @@ -165,6 +169,12 @@ public GraphQLSchema build() { return schema.build(); } + public GraphQLJpaSchemaBuilder scalar(Class javaType, GraphQLScalarType scalarType) { + scalars.put(javaType, scalarType); + + return this; + } + private GraphQLObjectType getQueryType() { GraphQLObjectType.Builder queryType = GraphQLObjectType.newObject() 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