Last active
August 26, 2019 04:01
-
-
Save aaronanderson/5a530150c25dbefad145d19a833146aa to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package quarkus.graphql.test; | |
import java.util.Set; | |
import javax.servlet.ServletContextEvent; | |
import javax.servlet.ServletContextListener; | |
import javax.servlet.annotation.WebListener; | |
import javax.websocket.Endpoint; | |
import javax.websocket.HandshakeResponse; | |
import javax.websocket.server.HandshakeRequest; | |
import javax.websocket.server.ServerApplicationConfig; | |
import javax.websocket.server.ServerContainer; | |
import javax.websocket.server.ServerEndpointConfig; | |
import graphql.execution.AsyncExecutionStrategy; | |
import graphql.execution.SubscriptionExecutionStrategy; | |
import graphql.schema.GraphQLSchema; | |
import graphql.schema.StaticDataFetcher; | |
import graphql.schema.idl.RuntimeWiring; | |
import graphql.schema.idl.SchemaGenerator; | |
import graphql.schema.idl.SchemaParser; | |
import graphql.schema.idl.TypeDefinitionRegistry; | |
import graphql.servlet.GraphQLWebsocketServlet; | |
import graphql.servlet.config.DefaultExecutionStrategyProvider; | |
import graphql.servlet.config.DefaultGraphQLSchemaProvider; | |
import graphql.servlet.config.ExecutionStrategyProvider; | |
import graphql.servlet.core.GraphQLObjectMapper; | |
import graphql.servlet.core.GraphQLQueryInvoker; | |
import graphql.servlet.input.GraphQLInvocationInputFactory; | |
//Inspired from https://github.com/graphql-java-kickstart/graphql-spring-boot/blob/master/graphql-spring-boot-autoconfigure/src/main/java/com/oembedler/moon/graphql/boot/GraphQLWebAutoConfiguration.java | |
//Background https://github.com/quarkusio/quarkus/issues/3691 | |
@WebListener | |
public class HelloWSContextListener implements ServletContextListener, ServerApplicationConfig { | |
private static GraphQLWebsocketServlet servlet; | |
/* @Override | |
public void contextInitialized(ServletContextEvent servletContextEvent) { | |
final ServerContainer serverContainer = (ServerContainer) servletContextEvent.getServletContext().getAttribute("javax.websocket.server.ServerContainer"); | |
try { | |
servlet = configureServlet(); | |
ServerEndpointConfig endpointConfiguration = ServerEndpointConfig.Builder.create(GraphQLWebsocketServlet.class, "/graphql-ws2").configurator(new HelloEndpointConfigurator(servlet)).build(); | |
serverContainer.addEndpoint(endpointConfiguration); | |
} catch (DeploymentException e) { | |
e.printStackTrace(); | |
} | |
}*/ | |
@Override | |
public Set<ServerEndpointConfig> getEndpointConfigs(Set<Class<? extends Endpoint>> endpointClasses) { | |
servlet = configureServlet(); | |
ServerEndpointConfig endpointConfiguration = ServerEndpointConfig.Builder.create(GraphQLWebsocketServlet.class, "/graphql-ws").configurator(new HelloEndpointConfigurator(servlet)).build(); | |
return Set.of(endpointConfiguration); | |
} | |
private GraphQLWebsocketServlet configureServlet() { | |
String schema = "type Query{hello: String}"; | |
SchemaParser schemaParser = new SchemaParser(); | |
TypeDefinitionRegistry typeDefinitionRegistry = schemaParser.parse(schema); | |
RuntimeWiring runtimeWiring = RuntimeWiring.newRuntimeWiring().type("Query", builder -> builder.dataFetcher("hello", new StaticDataFetcher("world!!"))).build(); | |
SchemaGenerator schemaGenerator = new SchemaGenerator(); | |
GraphQLSchema graphQLSchema = schemaGenerator.makeExecutableSchema(typeDefinitionRegistry, runtimeWiring); | |
GraphQLInvocationInputFactory invocationInputFactory = GraphQLInvocationInputFactory.newBuilder(new DefaultGraphQLSchemaProvider(graphQLSchema)).build(); | |
ExecutionStrategyProvider executionStrategyProvider = new DefaultExecutionStrategyProvider(new AsyncExecutionStrategy(), new AsyncExecutionStrategy(), new SubscriptionExecutionStrategy()); | |
GraphQLQueryInvoker queryInvoker = GraphQLQueryInvoker.newBuilder().withExecutionStrategyProvider(executionStrategyProvider).build(); | |
GraphQLObjectMapper graphQLObjectMapper = GraphQLObjectMapper.newBuilder().build(); | |
return new GraphQLWebsocketServlet(queryInvoker, invocationInputFactory, graphQLObjectMapper); | |
} | |
@Override | |
public Set<Class<?>> getAnnotatedEndpointClasses(Set<Class<?>> scanned) { | |
return Set.of(); | |
} | |
public void contextDestroyed(ServletContextEvent servletContextEvent) { | |
if (servlet != null && !servlet.isShutDown()) { | |
servlet.beginShutDown(); | |
servlet = null; | |
} | |
} | |
public class HelloEndpointConfigurator extends ServerEndpointConfig.Configurator { | |
private GraphQLWebsocketServlet servlet; | |
public HelloEndpointConfigurator(GraphQLWebsocketServlet servlet) { | |
this.servlet = servlet; | |
} | |
@SuppressWarnings("unchecked") | |
@Override | |
public <T> T getEndpointInstance(Class<T> clazz) throws InstantiationException { | |
return (T) servlet; | |
} | |
@Override | |
public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response) { | |
servlet.modifyHandshake(sec, request, response); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment