/* * Copyright (C) 2015 Google Inc. All Rights Reserved. * * 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 apps.provisioning.server.rest; import java.util.logging.Level; import java.util.logging.Logger; import org.eclipse.jetty.server.Connector; import org.eclipse.jetty.server.HttpConfiguration; import org.eclipse.jetty.server.HttpConnectionFactory; import org.eclipse.jetty.server.SecureRequestCustomizer; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; import org.eclipse.jetty.server.SslConnectionFactory; import org.eclipse.jetty.servlet.FilterHolder; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; import org.eclipse.jetty.servlets.CrossOriginFilter; import org.eclipse.jetty.util.ssl.SslContextFactory; import apps.provisioning.Application; import apps.provisioning.Commands; import apps.provisioning.ProvisioningApp; import apps.provisioning.config.ConfigData; /** * Class that encapsulates the logic of the username suggest RESTful API. */ public class RESTApp extends Application { private final Logger logger = Logger.getLogger(RESTApp.class.getName()); private static final int PORT_DEFAULT_VALUE = 8080; private final String HTTP_VERSION = "http/1.1"; private Server jettyServer; private ServletContextHandler servletContext; private ServletHolder jerseyServlet; private Integer customPort; public RESTApp(Commands commands) { this.commands = commands; parseCommands(); } @Override public void initApp() throws Exception { initJerseyServlet(); initJettyServer(); } /** * Reads command line values. */ private void parseCommands() { customPort = commands.getCommandIntValue(Commands.PORT_COMMAND_OPTION); } /** * Initializes the Jetty server. */ private void initJettyServer() { logger.log(Level.INFO, "Initialzing Jetty server..."); int port; if (customPort == null) { logger.log(Level.INFO, "Initialzing server in default port: " + PORT_DEFAULT_VALUE); port = PORT_DEFAULT_VALUE; } else { logger.log(Level.INFO, "Initialzing server in custom port: " + customPort.toString()); port = customPort; } jettyServer = new Server(port); ConfigData config = ProvisioningApp.getInstance().getContext().getConfig(); if (config.getUseSSL()) { HttpConfiguration https = new HttpConfiguration(); https.addCustomizer(new SecureRequestCustomizer()); SslContextFactory sslContextFactory = new SslContextFactory(); sslContextFactory.setKeyStorePath(config.getKeyStorePath()); sslContextFactory.setKeyStorePassword(config.getKeyStorePassword()); sslContextFactory.setKeyManagerPassword(config.getKeyManagerPassword()); ServerConnector sslConnector = new ServerConnector(jettyServer, new SslConnectionFactory(sslContextFactory, HTTP_VERSION), new HttpConnectionFactory( https)); sslConnector.setPort(port); jettyServer.setConnectors(new Connector[] {sslConnector}); } jettyServer.setHandler(servletContext); try { jettyServer.start(); jettyServer.join(); } catch (Throwable e) { logger.log(Level.SEVERE, "Exception during server initialization", e); jettyServer.destroy(); } } /** * Initializes the Jersey Servlet. */ private void initJerseyServlet() { servletContext = new ServletContextHandler(ServletContextHandler.SESSIONS); servletContext.setContextPath("/"); // This is used for allowing access to different domains/ports. FilterHolder filterHolder = new FilterHolder(CrossOriginFilter.class); filterHolder.setInitParameter("allowedOrigins", "*"); filterHolder.setInitParameter("allowedMethods", "GET, POST"); servletContext.addFilter(filterHolder, "/*", null); jerseyServlet = servletContext.addServlet(org.glassfish.jersey.servlet.ServletContainer.class, "/*"); jerseyServlet.setInitOrder(0); // Tell the Jersey Servlet which REST class to load. jerseyServlet.setInitParameter("jersey.config.server.provider.classnames", ProvisioningAction.class.getCanonicalName()); } }