Skip to content

Instantly share code, notes, and snippets.

@aaronanderson
Last active August 26, 2019 04:01
Show Gist options
  • Save aaronanderson/5a530150c25dbefad145d19a833146aa to your computer and use it in GitHub Desktop.
Save aaronanderson/5a530150c25dbefad145d19a833146aa to your computer and use it in GitHub Desktop.
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