4914a4cbd0215f81a175a7a7bbef1ba77bbfca99
[policy/drools-pdp.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  * policy-endpoints
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20 package org.openecomp.policy.drools.http.server.internal;
21
22 import java.util.ArrayList;
23 import java.util.HashMap;
24
25 import org.eclipse.jetty.servlet.ServletHolder;
26
27 import org.openecomp.policy.common.logging.flexlogger.FlexLogger;
28 import org.openecomp.policy.common.logging.flexlogger.Logger;
29
30 /**
31  * REST Jetty Server using Jersey
32  */
33 public class JettyJerseyServer extends JettyServletServer {
34         
35         protected static final String JERSEY_PACKAGES_PARAM = "jersey.config.server.provider.packages";
36         protected static final String JERSEY_CLASSNAMES_PARAM = "jersey.config.server.provider.classnames";
37         
38         protected static Logger logger = FlexLogger.getLogger(JettyJerseyServer.class);
39         
40         protected ArrayList<String> packages = new ArrayList<String>();
41         protected HashMap<String, ServletHolder> servlets = 
42                                                         new HashMap<String, ServletHolder>();
43         
44         public JettyJerseyServer(String name, String host, int port, String contextPath) 
45                throws IllegalArgumentException {                
46                 super(name, host, port, contextPath);
47         }
48         
49         protected synchronized ServletHolder getServlet(String servletPath) 
50                           throws IllegalArgumentException {
51                 
52                 if (servletPath == null || servletPath.isEmpty())
53                         servletPath = "/*";
54                 
55                 ServletHolder jerseyServlet = servlets.get(servletPath);
56                 if (jerseyServlet == null) {
57                         jerseyServlet = context.addServlet
58                         (org.glassfish.jersey.servlet.ServletContainer.class, servletPath);  
59                         jerseyServlet.setInitOrder(0);
60                         String initPackages = 
61                                         jerseyServlet.getInitParameter(JERSEY_PACKAGES_PARAM);
62                         if (initPackages == null) {
63                         jerseyServlet.setInitParameter(
64                                         JERSEY_PACKAGES_PARAM,
65                                         "com.jersey.jaxb,com.fasterxml.jackson.jaxrs.json");
66                         }
67                         this.servlets.put(servletPath, jerseyServlet);
68                 }
69                 
70                 return jerseyServlet;
71         }
72         
73         @Override
74         public synchronized void addServletPackage(String servletPath, String restPackage) 
75                throws IllegalArgumentException, IllegalStateException {
76                 
77         if (restPackage == null || restPackage.isEmpty())
78                         throw new IllegalArgumentException("No discoverable REST package provided");
79                 
80                 ServletHolder jerseyServlet = this.getServlet(servletPath);
81                 if (jerseyServlet == null)
82                         throw new IllegalStateException("Unexpected, no Jersey Servlet class");
83                 
84                 String initPackages = 
85                                 jerseyServlet.getInitParameter(JERSEY_PACKAGES_PARAM);
86                 if (initPackages == null)
87                         throw new IllegalStateException("Unexpected, no Init Parameters loaded");
88                 
89         jerseyServlet.setInitParameter(
90                         JERSEY_PACKAGES_PARAM,
91                         initPackages + "," + restPackage);
92         
93         if (logger.isDebugEnabled())
94                 logger.debug(this + "Added REST Package: " + jerseyServlet.dump());
95         }
96         
97         @Override
98         public synchronized void addServletClass(String servletPath, String restClass) 
99                        throws IllegalArgumentException, IllegalStateException {
100                         
101         if (restClass == null || restClass.isEmpty())
102                         throw new IllegalArgumentException("No discoverable REST class provided");
103                 
104                 ServletHolder jerseyServlet = this.getServlet(servletPath);
105                 if (jerseyServlet == null)
106                         throw new IllegalStateException("Unexpected, no Jersey Servlet class");
107                 
108                 String initClasses = 
109                                 jerseyServlet.getInitParameter(JERSEY_CLASSNAMES_PARAM);
110                 if (initClasses == null)
111                         initClasses = restClass;
112                 else
113                         initClasses = initClasses + "," + restClass;
114                 
115         jerseyServlet.setInitParameter(
116                         JERSEY_CLASSNAMES_PARAM,
117                         initClasses);
118         
119         if (logger.isDebugEnabled())
120                 logger.debug(this + "Added REST Class: " + jerseyServlet.dump());
121         }
122
123         @Override
124         public String toString() {
125                 StringBuilder builder = new StringBuilder();
126                 builder.append("JerseyJettyServer [packages=").append(packages).append(", servlets=").append(servlets)
127                            .append(", toString()=").append(super.toString()).append("]");
128                 return builder.toString();
129         }
130 }