/* * Copyright 2016-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.example.calculator.helpers; import com.google.inject.Injector; import com.google.inject.Module; import com.google.inject.servlet.GuiceFilter; import com.google.inject.servlet.ServletModule; import com.squarespace.jersey2.guice.BootstrapUtils; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.servlet.FilterHolder; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; import org.glassfish.hk2.api.ServiceLocator; import org.glassfish.jersey.server.ResourceConfig; import org.glassfish.jersey.servlet.ServletContainer; import javax.servlet.DispatcherType; import java.io.Closeable; import java.io.IOException; import java.util.EnumSet; import java.util.List; public class HttpServer implements Closeable { private static Injector injector; private final Server server; public static HttpServer of(Class<?> resource, List<Module> modules) { return of(new ResourceConfig() {{ register(resource); }}, modules); } public static HttpServer of(ResourceConfig resource, List<Module> modules) { modules.add(new ServletModule()); ServiceLocator locator = BootstrapUtils.newServiceLocator(); injector = BootstrapUtils.newInjector(locator, modules); BootstrapUtils.install(locator); Server server = new Server(8080); ResourceConfig config = ResourceConfig.forApplication(resource); ServletContainer servletContainer = new ServletContainer(config); ServletHolder sh = new ServletHolder(servletContainer); ServletContextHandler context = new ServletContextHandler( ServletContextHandler.SESSIONS); context.setContextPath("/openmdm"); FilterHolder filterHolder = new FilterHolder(GuiceFilter.class); context.addFilter(filterHolder, "/*", EnumSet.allOf(DispatcherType.class)); context.addServlet(sh, "/*"); server.setHandler(context); return new HttpServer(server); } public static Injector getInjector() { return injector; } private HttpServer(Server server) { this.server = server; } @Override public void close() throws IOException { try { server.stop(); } catch (Exception err) { throw new IOException(err); } finally { BootstrapUtils.reset(); } } public void start() throws IOException { try { server.start(); } catch (Exception err) { throw new IOException(err); } } }