Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package org.springframework.graphql.boot;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.graphql.execution.GraphQlSource;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;


/**
* Default implementation of {@link SchemaResourceResolver} that uses a {@link ResourcePatternResolver} to find schema.
*
* @author Brian Clozel
* @author Josh Long
* @since 1.0.0
*/
public class DefaultSchemaResourceResolver implements SchemaResourceResolver {

private static final Log logger = LogFactory.getLog(DefaultSchemaResourceResolver.class);

private final ResourcePatternResolver resourcePatternResolver;
private final String[] schemaLocations;
private final String[] fileExtensions;

DefaultSchemaResourceResolver(ResourcePatternResolver resourcePatternResolver, String[] schemaLocations, String[] fileExtensions) {
this.resourcePatternResolver = resourcePatternResolver;
this.schemaLocations = schemaLocations;
this.fileExtensions = fileExtensions;
}

@Override
public List<Resource> resolveSchemaResources() {
List<Resource> schemaResources = new ArrayList<>();
for (String location : this.schemaLocations) {
for (String extension : this.fileExtensions) {
String resourcePattern = location + "*" + extension;
try {
schemaResources.addAll(Arrays.asList(this.resourcePatternResolver.getResources(resourcePattern)));
} catch (IOException ex) {
logger.debug("Could not resolve schema location: '" + resourcePattern + "'", ex);
}
}
}
return schemaResources;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;

Expand Down Expand Up @@ -46,53 +47,43 @@
* {@link GraphQlSource}.
*
* @author Brian Clozel
* @author Josh Long
* @since 1.0.0
*/
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass({GraphQL.class, GraphQlSource.class})
@EnableConfigurationProperties(GraphQlProperties.class)
public class GraphQlAutoConfiguration {

private static final Log logger = LogFactory.getLog(GraphQlAutoConfiguration.class);
@Bean
@ConditionalOnMissingBean
SchemaResourceResolver schemaResourceResolver(ResourcePatternResolver resourcePatternResolver, GraphQlProperties properties) {
return new DefaultSchemaResourceResolver(resourcePatternResolver, properties.getSchema().getLocations(), properties.getSchema().getFileExtensions());
}

@Bean
@ConditionalOnMissingBean
public GraphQlSource graphQlSource(ResourcePatternResolver resourcePatternResolver, GraphQlProperties properties,
ObjectProvider<DataFetcherExceptionResolver> exceptionResolversProvider,
ObjectProvider<Instrumentation> instrumentationsProvider,
ObjectProvider<GraphQlSourceBuilderCustomizer> sourceCustomizers,
ObjectProvider<RuntimeWiringConfigurer> wiringConfigurers) {
@Bean
@ConditionalOnMissingBean
public GraphQlSource graphQlSource(SchemaResourceResolver resolver,
ResourcePatternResolver resourcePatternResolver, GraphQlProperties properties,
ObjectProvider<DataFetcherExceptionResolver> exceptionResolversProvider,
ObjectProvider<Instrumentation> instrumentationsProvider,
ObjectProvider<GraphQlSourceBuilderCustomizer> sourceCustomizers,
ObjectProvider<RuntimeWiringConfigurer> wiringConfigurers) {

List<Resource> schemaResources = resolveSchemaResources(resourcePatternResolver, properties.getSchema().getLocations(),
properties.getSchema().getFileExtensions());
GraphQlSource.Builder builder = GraphQlSource.builder()
.schemaResources(schemaResources.toArray(new Resource[0]))
.exceptionResolvers(exceptionResolversProvider.orderedStream().collect(Collectors.toList()))
.instrumentation(instrumentationsProvider.orderedStream().collect(Collectors.toList()));
wiringConfigurers.orderedStream().forEach(builder::configureRuntimeWiring);
sourceCustomizers.orderedStream().forEach((customizer) -> customizer.customize(builder));
try {
return builder.build();
}
catch (MissingSchemaException exc) {
throw new InvalidSchemaLocationsException(properties.getSchema().getLocations(), resourcePatternResolver, exc);
}
}
List<Resource> schemaResources = resolver.resolveSchemaResources();
GraphQlSource.Builder builder = GraphQlSource.builder()
.schemaResources(schemaResources.toArray(new Resource[0]))
.exceptionResolvers(exceptionResolversProvider.orderedStream().collect(Collectors.toList()))
.instrumentation(instrumentationsProvider.orderedStream().collect(Collectors.toList()));
wiringConfigurers.orderedStream().forEach(builder::configureRuntimeWiring);
sourceCustomizers.orderedStream().forEach((customizer) -> customizer.customize(builder));
try {
return builder.build();
} catch (MissingSchemaException exc) {
throw new InvalidSchemaLocationsException(properties.getSchema().getLocations(), resourcePatternResolver, exc);
}
}

private List<Resource> resolveSchemaResources(ResourcePatternResolver resolver, String[] schemaLocations, String[] fileExtensions) {
List<Resource> schemaResources = new ArrayList<>();
for (String location : schemaLocations) {
for (String extension : fileExtensions) {
String resourcePattern = location + "*" + extension;
try {
schemaResources.addAll(Arrays.asList(resolver.getResources(resourcePattern)));
}
catch (IOException ex) {
logger.debug("Could not resolve schema location: '" + resourcePattern + "'", ex);
}
}
}
return schemaResources;
}

}

Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package org.springframework.graphql.boot;

import org.springframework.core.io.Resource;

import java.util.List;

/**
* Strategy interface that supports pluggable resolution of GraphQL schema files as Spring Framework {@link Resource}s.
* @author Josh Long
*/
public interface SchemaResourceResolver {

List<Resource> resolveSchemaResources();
}