Fix dmaapbc properties
[dmaap/dbcapi.git] / src / main / java / org / onap / dmaap / dbcapi / server / JettyServer.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * org.onap.dmaap
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property.
6  *
7  * Modifications Copyright (C) 2019 IBM.
8  * ================================================================================
9  * Licensed under the Apache License, Version 2.0 (the "License");
10  * you may not use this file except in compliance with the License.
11  * You may obtain a copy of the License at
12  * 
13  *      http://www.apache.org/licenses/LICENSE-2.0
14  * 
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  * ============LICENSE_END=========================================================
21  */
22
23 package org.onap.dmaap.dbcapi.server;
24
25
26 import org.eclipse.jetty.server.*;
27 import org.eclipse.jetty.servlet.DefaultServlet;
28 import org.eclipse.jetty.servlet.ServletContextHandler;
29 import org.eclipse.jetty.servlet.ServletHolder;
30 import org.eclipse.jetty.util.ssl.SslContextFactory;
31 import org.onap.dmaap.dbcapi.logging.BaseLoggingClass;
32
33 import java.util.Properties;
34 /**
35  * A  Jetty server which supports:
36  *      - http and https (simultaneously for dev env)
37  *  - REST API context
38  *  - static html pages (for documentation).
39  */
40 public class JettyServer extends BaseLoggingClass {
41         private Server server;
42
43
44         public Server getServer() {
45                 return server;
46         }
47
48     public JettyServer( Properties params ) throws Exception {
49
50         server = new Server();
51         int httpPort = Integer.valueOf(params.getProperty("IntHttpPort", "80" ));
52         int sslPort = Integer.valueOf(params.getProperty("IntHttpsPort", "443" ));
53         boolean allowHttp = Boolean.valueOf(params.getProperty("HttpAllowed", "false"));
54         serverLogger.info( "port params: http=" + httpPort + " https=" + sslPort );
55         serverLogger.info( "allowHttp=" + allowHttp );
56
57                 // HTTP Server
58         HttpConfiguration http_config = new HttpConfiguration();
59         http_config.setSecureScheme("https");
60         http_config.setSecurePort(sslPort);
61         http_config.setOutputBufferSize(32768);
62
63         
64         
65         try(ServerConnector httpConnector = new ServerConnector(server, new HttpConnectionFactory(http_config))) {
66                         httpConnector.setPort(httpPort);
67                         httpConnector.setIdleTimeout(30000);
68
69
70                         // HTTPS Server
71
72                         HttpConfiguration https_config = new HttpConfiguration(http_config);
73                         https_config.addCustomizer(new SecureRequestCustomizer());
74                         SslContextFactory sslContextFactory = new SslContextFactory();
75
76                         setUpKeystore(params, sslContextFactory);
77                         setUpTrustStore(params, sslContextFactory);
78
79                         if (sslPort != 0) {
80                 try(ServerConnector sslConnector = new ServerConnector(server,
81                                                 new SslConnectionFactory(sslContextFactory, "http/1.1"),
82                                                 new HttpConnectionFactory(https_config))) {
83                     sslConnector.setPort(sslPort);
84                     if (allowHttp) {
85                         logger.info("Starting httpConnector on port " + httpPort);
86                         logger.info("Starting sslConnector on port " + sslPort + " for https");
87                         server.setConnectors(new Connector[]{httpConnector, sslConnector});
88                     } else {
89                         logger.info("NOT starting httpConnector because HttpAllowed param is " + allowHttp);
90                         logger.info("Starting sslConnector on port " + sslPort + " for https");
91                         server.setConnectors(new Connector[]{sslConnector});
92                     }
93                 }
94                         } else {
95                                 serverLogger.info("NOT starting sslConnector on port " + sslPort + " for https");
96                                 if (allowHttp) {
97                                         serverLogger.info("Starting httpConnector on port " + httpPort);
98                                         server.setConnectors(new Connector[]{httpConnector});
99                                 }
100                         }
101                 }
102
103         // Set context for servlet.  This is shared for http and https
104         ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
105         context.setContextPath("/");
106         server.setHandler( context );
107
108         ServletHolder jerseyServlet = context.addServlet( org.glassfish.jersey.servlet.ServletContainer.class, "/webapi/*");
109         jerseyServlet.setInitOrder(1);
110         jerseyServlet.setInitParameter("jersey.config.server.provider.packages", "org.onap.dmaap.dbcapi.resources" );   
111         jerseyServlet.setInitParameter("javax.ws.rs.Application", "org.onap.dmaap.dbcapi.server.ApplicationConfig" );
112         
113         // also serve up some static pages...
114         ServletHolder staticServlet = context.addServlet(DefaultServlet.class,"/*");
115         staticServlet.setInitParameter("resourceBase","www");
116         staticServlet.setInitParameter("pathInfoOnly","true");
117
118         try {
119
120             serverLogger.info("Starting jetty server");
121                 String unit_test = params.getProperty("UnitTest", "No");
122             serverLogger.info("UnitTest=" + unit_test);
123                         if ( unit_test.equals( "No" ) ) {
124                         server.start();
125                         server.dumpStdErr();
126                 server.join();
127                         }
128         } catch ( Exception e ) {
129                 errorLogger.error( "Exception " + e );
130         } finally {
131                 server.destroy();
132         }
133         
134     }
135
136         private void setUpKeystore(Properties params, SslContextFactory sslContextFactory) {
137                 String keystore = params.getProperty("KeyStoreFile", "etc/keystore");
138                 logger.info("https Server using keystore at " + keystore);
139                 sslContextFactory.setKeyStorePath(keystore);
140                 sslContextFactory.setKeyStoreType(params.getProperty("KeyStoreType", "jks"));
141                 sslContextFactory.setKeyStorePassword(params.getProperty("KeyStorePassword", "changeit"));
142                 sslContextFactory.setKeyManagerPassword(params.getProperty("KeyPassword", "changeit"));
143         }
144
145         private void setUpTrustStore(Properties params, SslContextFactory sslContextFactory) {
146                 String truststore = params.getProperty("TrustStoreFile", "etc/org.onap.dmaap-bc.trust.jks");
147                 logger.info("https Server using truststore at " + truststore);
148                 sslContextFactory.setTrustStorePath(truststore);
149                 sslContextFactory.setTrustStoreType(params.getProperty("TrustStoreType", "jks"));
150                 sslContextFactory.setTrustStorePassword(params.getProperty("TrustStorePassword", "changeit"));
151         }
152 }