1 /*******************************************************************************
2 * ============LICENSE_START==================================================
4 * * ===========================================================================
5 * * Copyright © 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
11 * * http://www.apache.org/licenses/LICENSE-2.0
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====================================================
20 * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
22 ******************************************************************************/
25 package org.onap.dmaap.datarouter.provisioning;
27 import java.io.IOException;
28 import java.io.InvalidObjectException;
30 import javax.servlet.http.HttpServletRequest;
31 import javax.servlet.http.HttpServletResponse;
33 import org.json.JSONObject;
34 import org.onap.dmaap.datarouter.provisioning.beans.EventLogRecord;
35 import org.onap.dmaap.datarouter.provisioning.beans.Group;
37 import static org.onap.dmaap.datarouter.provisioning.utils.HttpServletUtils.sendResponseError;
40 * This servlet handles provisioning for the <groups> which is generated by the provisioning
41 * server to handle the creation and inspection of groups for FEEDS and SUBSCRIPTIONS.
43 * @author Vikram Singh
45 * @version $Id: Group.java,v 1.0 2016/07/19
47 @SuppressWarnings("serial")
48 public class GroupServlet extends ProxyServlet {
50 * DELETE on the <GRUPS> -- not supported.
53 public void doDelete(HttpServletRequest req, HttpServletResponse resp) {
54 String message = "DELETE not allowed for the GROUPS.";
55 EventLogRecord elr = new EventLogRecord(req);
56 elr.setMessage(message);
57 elr.setResult(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
58 eventlogger.error(elr.toString());
59 sendResponseError(resp, HttpServletResponse.SC_METHOD_NOT_ALLOWED, message, eventlogger);
62 * GET on the the list of groups to a feed/sub.
63 * See the <i>Groups Collection Query</i> section in the <b>Provisioning API</b>
64 * document for details on how this method should be invoked.
67 public void doGet(HttpServletRequest req, HttpServletResponse resp) {
68 EventLogRecord elr = new EventLogRecord(req);
69 String message = isAuthorizedForProvisioning(req);
70 if (message != null) {
71 elr.setMessage(message);
72 elr.setResult(HttpServletResponse.SC_FORBIDDEN);
73 eventlogger.error(elr.toString());
74 sendResponseError(resp, HttpServletResponse.SC_FORBIDDEN, message, eventlogger);
77 if (isProxyServer()) {
78 super.doGet(req, resp);
81 String bhdr = req.getHeader(BEHALF_HEADER);
83 message = "Missing "+BEHALF_HEADER+" header.";
84 elr.setMessage(message);
85 elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
86 eventlogger.error(elr.toString());
87 sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);
91 // Check with the Authorizer
92 /*AuthorizationResponse aresp = authz.decide(req);
93 if (! aresp.isAuthorized()) {
94 message = "Policy Engine disallows access.";
95 elr.setMessage(message);
96 elr.setResult(HttpServletResponse.SC_FORBIDDEN);
97 eventlogger.error(elr.toString());
98 resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
103 /*ContentHeader ch = getContentHeader(req);
104 String ver = ch.getAttribute("version");
105 if (!ch.getType().equals(GROUPLIST_CONTENT_TYPE) || !(ver.equals("1.0") || ver.equals("2.0"))) {
106 intlogger.debug("Content-type is: "+req.getHeader("Content-Type"));
107 message = "Incorrect content-type";
108 elr.setMessage(message);
109 elr.setResult(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);
110 eventlogger.error(elr.toString());
111 resp.sendError(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE, message);
116 int groupid = getIdFromPath(req);
118 message = "Missing or bad group number.";
119 elr.setMessage(message);
120 elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
121 eventlogger.error(elr.toString());
122 sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);
126 Group gup = Group.getGroupById(groupid);
128 elr.setResult(HttpServletResponse.SC_OK);
129 eventlogger.info(elr.toString());
130 resp.setStatus(HttpServletResponse.SC_OK);
131 resp.setContentType(GROUPFULL_CONTENT_TYPE);
133 resp.getOutputStream().print(gup.asJSONObject().toString());
134 } catch (IOException ioe) {
135 eventlogger.error("IOException" + ioe.getMessage());
138 // Display a list of Groups
139 /*Collection<Group> list = Group.getGroupById(groupid);
140 String t = JSONUtilities.createJSONArray(list);
143 elr.setResult(HttpServletResponse.SC_OK);
144 eventlogger.info(elr.toString());
145 resp.setStatus(HttpServletResponse.SC_OK);
146 resp.setContentType(GROUPLIST_CONTENT_TYPE);
147 resp.getOutputStream().print(t);*/
150 * PUT on the <GROUPS> -- not supported.
153 public void doPut(HttpServletRequest req, HttpServletResponse resp) {
154 EventLogRecord elr = new EventLogRecord(req);
155 String message = isAuthorizedForProvisioning(req);
156 if (message != null) {
157 elr.setMessage(message);
158 elr.setResult(HttpServletResponse.SC_FORBIDDEN);
159 eventlogger.error(elr.toString());
160 sendResponseError(resp, HttpServletResponse.SC_FORBIDDEN, message, eventlogger);
163 if (isProxyServer()) {
164 super.doPut(req, resp);
167 String bhdr = req.getHeader(BEHALF_HEADER);
169 message = "Missing "+BEHALF_HEADER+" header.";
170 elr.setMessage(message);
171 elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
172 eventlogger.error(elr.toString());
173 sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);
176 int groupid = getIdFromPath(req);
178 message = "Missing or bad groupid.";
179 elr.setMessage(message);
180 elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
181 eventlogger.error(elr.toString());
182 sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);
185 Group oldgup = Group.getGroupById(groupid);
186 if (oldgup == null) {
187 message = "Missing or bad group number.";
188 elr.setMessage(message);
189 elr.setResult(HttpServletResponse.SC_NOT_FOUND);
190 eventlogger.error(elr.toString());
191 sendResponseError(resp, HttpServletResponse.SC_NOT_FOUND, message, eventlogger);
194 // Check with the Authorizer
195 /*AuthorizationResponse aresp = authz.decide(req);
196 if (! aresp.isAuthorized()) {
197 message = "Policy Engine disallows access.";
198 elr.setMessage(message);
199 elr.setResult(HttpServletResponse.SC_FORBIDDEN);
200 eventlogger.error(elr.toString());
201 resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
204 // check content type is SUB_CONTENT_TYPE, version 1.0
205 ContentHeader ch = getContentHeader(req);
206 String ver = ch.getAttribute("version");
207 if (!ch.getType().equals(GROUP_BASECONTENT_TYPE) || !(ver.equals("1.0") || ver.equals("2.0"))) {
208 message = "Incorrect content-type";
209 elr.setMessage(message);
210 elr.setResult(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);
211 eventlogger.error(elr.toString());
212 sendResponseError(resp, HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE, message, eventlogger);
215 JSONObject jo = getJSONfromInput(req);
217 message = "Badly formed JSON";
218 elr.setMessage(message);
219 elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
220 eventlogger.error(elr.toString());
221 sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);
224 if (intlogger.isDebugEnabled())
225 intlogger.debug(jo.toString());
229 } catch (InvalidObjectException e) {
230 message = e.getMessage();
231 elr.setMessage(message);
232 elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
233 eventlogger.error(elr.toString());
234 sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);
237 gup.setGroupid(oldgup.getGroupid());
238 Group gb2 = Group.getGroupMatching(gup, oldgup.getGroupid());
240 eventlogger.warn("PROV0011 Creating a duplicate Group: "+gup.getName());
241 elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
242 sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, "Duplicate Group:"+gup.getName(), eventlogger);
246 // Update Groups table entries
249 elr.setResult(HttpServletResponse.SC_OK);
250 eventlogger.info(elr.toString());
251 resp.setStatus(HttpServletResponse.SC_OK);
252 resp.setContentType(GROUPFULL_CONTENT_TYPE);
254 resp.getOutputStream().print(gup.asJSONObject().toString());
255 } catch (IOException ioe) {
256 eventlogger.error("IOException" + ioe.getMessage());
258 provisioningDataChanged();
260 // Something went wrong with the UPDATE
261 elr.setResult(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
262 eventlogger.error(elr.toString());
263 sendResponseError(resp, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, DB_PROBLEM_MSG, eventlogger);
267 * POST on the <groups> -- create a new GROUPS to a feed.
268 * See the <i>Creating a GROUPS</i> section in the <b>Provisioning API</b>
269 * document for details on how this method should be invoked.
272 public void doPost(HttpServletRequest req, HttpServletResponse resp) {
273 EventLogRecord elr = new EventLogRecord(req);
274 String message = isAuthorizedForProvisioning(req);
275 if (message != null) {
276 elr.setMessage(message);
277 elr.setResult(HttpServletResponse.SC_FORBIDDEN);
278 eventlogger.error(elr.toString());
279 sendResponseError(resp, HttpServletResponse.SC_FORBIDDEN, message, eventlogger);
282 if (isProxyServer()) {
283 super.doPost(req, resp);
286 String bhdr = req.getHeader(BEHALF_HEADER);
288 message = "Missing "+BEHALF_HEADER+" header.";
289 elr.setMessage(message);
290 elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
291 eventlogger.error(elr.toString());
292 sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);
295 /*int feedid = getIdFromPath(req);
297 message = "Missing or bad feed number.";
298 elr.setMessage(message);
299 elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
300 eventlogger.info(elr.toString());
301 resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
304 Feed feed = Feed.getFeedById(feedid);
305 if (feed == null || feed.isDeleted()) {
306 message = "Missing or bad feed number.";
307 elr.setMessage(message);
308 elr.setResult(HttpServletResponse.SC_NOT_FOUND);
309 eventlogger.info(elr.toString());
310 resp.sendError(HttpServletResponse.SC_NOT_FOUND, message);
313 // Check with the Authorizer
314 /*AuthorizationResponse aresp = authz.decide(req);
315 if (! aresp.isAuthorized()) {
316 message = "Policy Engine disallows access.";
317 elr.setMessage(message);
318 elr.setResult(HttpServletResponse.SC_FORBIDDEN);
319 eventlogger.info(elr.toString());
320 resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
324 // check content type is SUB_CONTENT_TYPE, version 1.0
325 ContentHeader ch = getContentHeader(req);
326 String ver = ch.getAttribute("version");
327 if (!ch.getType().equals(GROUP_BASECONTENT_TYPE) || !(ver.equals("1.0") || ver.equals("2.0"))) {
328 intlogger.debug("Content-type is: "+req.getHeader("Content-Type"));
329 message = "Incorrect content-type";
330 elr.setMessage(message);
331 elr.setResult(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);
332 eventlogger.error(elr.toString());
333 sendResponseError(resp, HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE, message, eventlogger);
336 JSONObject jo = getJSONfromInput(req);
338 message = "Badly formed JSON";
339 elr.setMessage(message);
340 elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
341 eventlogger.error(elr.toString());
342 sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);
345 if (intlogger.isDebugEnabled())
346 intlogger.debug(jo.toString());
351 } catch (InvalidObjectException e) {
352 message = e.getMessage();
353 elr.setMessage(message);
354 elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
355 eventlogger.error(elr.toString());
356 sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);
359 //gup.setFeedid(feedid);
360 //sub.setSubscriber(bhdr); // set from X-DMAAP-DR-ON-BEHALF-OF header
362 // Check if this group already exists; not an error (yet), just warn
363 Group gb2 = Group.getGroupMatching(gup);
365 eventlogger.warn("PROV0011 Creating a duplicate Group: "+gup.getName());
366 elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
367 sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, "Duplicate Group:"+gup.getName(), eventlogger);
372 // Create GROUPS table entries
375 elr.setResult(HttpServletResponse.SC_CREATED);
376 eventlogger.info(elr.toString());
377 resp.setStatus(HttpServletResponse.SC_CREATED);
378 resp.setContentType(GROUPFULL_CONTENT_TYPE);
380 resp.getOutputStream().print(gup.asJSONObject().toString());
381 } catch (IOException ioe) {
382 eventlogger.error("IOException" + ioe.getMessage());
384 provisioningDataChanged();
386 // Something went wrong with the INSERT
387 elr.setResult(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
388 eventlogger.error(elr.toString());
389 sendResponseError(resp, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, DB_PROBLEM_MSG, eventlogger);