/* Copyright (c) 2011 Danish Maritime Authority * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this library. If not, see <http://www.gnu.org/licenses/>. */ package dk.dma.ais.abnormal.web; import com.google.inject.Guice; import com.google.inject.Injector; import com.google.inject.servlet.GuiceServletContextListener; import org.eclipse.jetty.rewrite.handler.RewriteHandler; import org.eclipse.jetty.rewrite.handler.RewritePatternRule; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; import org.eclipse.jetty.servlet.DefaultServlet; import org.eclipse.jetty.servlet.FilterHolder; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlets.CrossOriginFilter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.servlet.DispatcherType; import java.util.EnumSet; /** * * @author Kasper Nielsen */ public class WebServer { /** The logger */ static final Logger LOG = LoggerFactory.getLogger(WebServer.class); private final ServletContextHandler context; private final Server server; private final String repositoryName; private final String pathToEventDatabase; private final String eventRepositoryType; private final String eventDataDbHost; private final Integer eventDataDbPort; private final String eventDataDbName; private final String eventDataDbUsername; private final String eventDataDbPassword; public WebServer( int port, String repositoryName, String pathToEventDatabase, String eventRepositoryType, String eventDataDbHost, Integer eventDataDbPort, String eventDataDbName, String eventDataDbUsername, String eventDataDbPassword ) { server = new Server(port); this.context = new ServletContextHandler(ServletContextHandler.SESSIONS); this.repositoryName = repositoryName; this.pathToEventDatabase = pathToEventDatabase; this.eventRepositoryType = eventRepositoryType; this.eventDataDbHost = eventDataDbHost; this.eventDataDbPort = eventDataDbPort; this.eventDataDbName = eventDataDbName; this.eventDataDbUsername = eventDataDbUsername; this.eventDataDbPassword = eventDataDbPassword; } /** * @return the context */ public ServletContextHandler getContext() { return context; } public void join() throws InterruptedException { server.join(); } public void start() throws Exception { ((ServerConnector) server.getConnectors()[0]).setReuseAddress(true); // Root context context.setContextPath("/abnormal"); // Setup static content context.setResourceBase("src/main/webapp/"); context.addServlet(DefaultServlet.class, "/"); // Enable Jersey debug output context.setInitParameter("com.sun.jersey.config.statistic.Trace", "true"); // Enable CORS - cross origin resource sharing FilterHolder cors = new FilterHolder(); cors.setInitParameter("allowedOrigins", "https?://localhost:*, https?://*.e-navigation.net:*"); cors.setInitParameter("allowedHeaders", "*"); cors.setInitParameter("allowedMethods", "OPTIONS,GET,PUT,POST,DELETE,HEAD"); cors.setFilter(new CrossOriginFilter()); context.addFilter(cors, "*", EnumSet.of(DispatcherType.REQUEST, DispatcherType.ASYNC, DispatcherType.INCLUDE)); // Little hack to satisfy OpenLayers URLs in DMA context RewritePatternRule openlayersRewriteRule = new RewritePatternRule(); openlayersRewriteRule.setPattern("/abnormal/theme/*"); openlayersRewriteRule.setReplacement("/abnormal/js/theme/"); RewriteHandler rewrite = new RewriteHandler(); rewrite.setRewriteRequestURI(true); rewrite.setRewritePathInfo(false); rewrite.setOriginalPathAttribute("requestedPath"); rewrite.addRule(openlayersRewriteRule); rewrite.setHandler(context); server.setHandler(rewrite); // Setup Guice-Jersey integration context.addEventListener(new GuiceServletContextListener() { @Override protected Injector getInjector() { return Guice.createInjector(new RestModule( repositoryName, pathToEventDatabase, eventRepositoryType, eventDataDbHost, eventDataDbPort, eventDataDbName, eventDataDbUsername, eventDataDbPassword )); } }); context.addFilter(com.google.inject.servlet.GuiceFilter.class, "/rest/*", EnumSet.allOf(DispatcherType.class)); // Start the server server.start(); } }