Replace ATT headers
[dmaap/datarouter.git] / datarouter-prov / src / main / java / org / onap / dmaap / datarouter / provisioning / GroupServlet.java
1 /*******************************************************************************
2  * ============LICENSE_START==================================================
3  * * org.onap.dmaap
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
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  * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
21  * *
22  ******************************************************************************/
23
24
25 package org.onap.dmaap.datarouter.provisioning;
26
27 import java.io.IOException;
28 import java.io.InvalidObjectException;
29
30 import javax.servlet.http.HttpServletRequest;
31 import javax.servlet.http.HttpServletResponse;
32
33 import org.json.JSONObject;
34 import org.onap.dmaap.datarouter.provisioning.beans.EventLogRecord;
35 import org.onap.dmaap.datarouter.provisioning.beans.Group;
36
37 import static org.onap.dmaap.datarouter.provisioning.utils.HttpServletUtils.sendResponseError;
38
39 /**
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.
42  *
43  * @author Vikram Singh
44  * @version $Id$
45  * @version $Id: Group.java,v 1.0 2016/07/19
46  */
47 @SuppressWarnings("serial")
48 public class GroupServlet extends ProxyServlet {
49     /**
50      * DELETE on the <GRUPS> -- not supported.
51      */
52     @Override
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.info(elr);
59         sendResponseError(resp, HttpServletResponse.SC_METHOD_NOT_ALLOWED, message, eventlogger);
60     }
61     /**
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.
65      */
66     @Override
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.info(elr);
74             sendResponseError(resp, HttpServletResponse.SC_FORBIDDEN, message, eventlogger);
75             return;
76         }
77         if (isProxyServer()) {
78             super.doGet(req, resp);
79             return;
80         }
81         String bhdr = req.getHeader(BEHALF_HEADER);
82         if (bhdr == null) {
83             message = "Missing "+BEHALF_HEADER+" header.";
84             elr.setMessage(message);
85             elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
86             eventlogger.info(elr);
87             sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);
88             return;
89         }
90
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.info(elr);
98             resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
99             return;
100         }*/
101
102
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.info(elr);
111             resp.sendError(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE, message);
112             return;
113         }*/
114
115
116         int groupid = getIdFromPath(req);
117         if (groupid < 0) {
118             message = "Missing or bad group number.";
119             elr.setMessage(message);
120             elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
121             eventlogger.info(elr);
122             sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);
123             return;
124         }
125
126         Group gup = Group.getGroupById(groupid);
127         // send response
128         elr.setResult(HttpServletResponse.SC_OK);
129         eventlogger.info(elr);
130         resp.setStatus(HttpServletResponse.SC_OK);
131         resp.setContentType(GROUPFULL_CONTENT_TYPE);
132         try {
133             resp.getOutputStream().print(gup.asJSONObject().toString());
134         } catch (IOException ioe) {
135             eventlogger.error("IOException" + ioe.getMessage());
136         }
137
138         // Display a list of Groups
139         /*Collection<Group> list = Group.getGroupById(groupid);
140         String t = JSONUtilities.createJSONArray(list);
141
142         // send response
143         elr.setResult(HttpServletResponse.SC_OK);
144         eventlogger.info(elr);
145         resp.setStatus(HttpServletResponse.SC_OK);
146         resp.setContentType(GROUPLIST_CONTENT_TYPE);
147         resp.getOutputStream().print(t);*/
148     }
149     /**
150      * PUT on the &lt;GROUPS&gt; -- not supported.
151      */
152     @Override
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.info(elr);
160             sendResponseError(resp, HttpServletResponse.SC_FORBIDDEN, message, eventlogger);
161             return;
162         }
163         if (isProxyServer()) {
164             super.doPut(req, resp);
165             return;
166         }
167         String bhdr = req.getHeader(BEHALF_HEADER);
168         if (bhdr == null) {
169             message = "Missing "+BEHALF_HEADER+" header.";
170             elr.setMessage(message);
171             elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
172             eventlogger.info(elr);
173             sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);
174             return;
175         }
176         int groupid = getIdFromPath(req);
177         if (groupid < 0) {
178             message = "Missing or bad groupid.";
179             elr.setMessage(message);
180             elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
181             eventlogger.info(elr);
182             sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);
183             return;
184         }
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.info(elr);
191             sendResponseError(resp, HttpServletResponse.SC_NOT_FOUND, message, eventlogger);
192             return;
193         }
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.info(elr);
201             resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
202             return;
203         }*/
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.info(elr);
212             sendResponseError(resp, HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE, message, eventlogger);
213             return;
214         }
215         JSONObject jo = getJSONfromInput(req);
216         if (jo == null) {
217             message = "Badly formed JSON";
218             elr.setMessage(message);
219             elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
220             eventlogger.info(elr);
221             sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);
222             return;
223         }
224         if (intlogger.isDebugEnabled())
225             intlogger.debug(jo.toString());
226         Group gup;
227         try {
228             gup = new Group(jo);
229         } catch (InvalidObjectException e) {
230             message = e.getMessage();
231             elr.setMessage(message);
232             elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
233             eventlogger.info(elr);
234             sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);
235             return;
236         }
237         gup.setGroupid(oldgup.getGroupid());
238         Group gb2 = Group.getGroupMatching(gup, oldgup.getGroupid());
239         if (gb2 != null) {
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);
243             return;
244         }
245
246         // Update Groups table entries
247         if (doUpdate(gup)) {
248             // send response
249             elr.setResult(HttpServletResponse.SC_OK);
250             eventlogger.info(elr);
251             resp.setStatus(HttpServletResponse.SC_OK);
252             resp.setContentType(GROUPFULL_CONTENT_TYPE);
253             try {
254                 resp.getOutputStream().print(gup.asJSONObject().toString());
255             } catch (IOException ioe) {
256                 eventlogger.error("IOException" + ioe.getMessage());
257             }
258             provisioningDataChanged();
259         } else {
260             // Something went wrong with the UPDATE
261             elr.setResult(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
262             eventlogger.info(elr);
263             sendResponseError(resp, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, DB_PROBLEM_MSG, eventlogger);
264         }
265     }
266     /**
267      * POST on the &lt;groups&gt; -- 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.
270      */
271     @Override
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.info(elr);
279             sendResponseError(resp, HttpServletResponse.SC_FORBIDDEN, message, eventlogger);
280             return;
281         }
282         if (isProxyServer()) {
283             super.doPost(req, resp);
284             return;
285         }
286         String bhdr = req.getHeader(BEHALF_HEADER);
287         if (bhdr == null) {
288             message = "Missing "+BEHALF_HEADER+" header.";
289             elr.setMessage(message);
290             elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
291             eventlogger.info(elr);
292             sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);
293             return;
294         }
295         /*int feedid = getIdFromPath(req);
296         if (feedid < 0) {
297             message = "Missing or bad feed number.";
298             elr.setMessage(message);
299             elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
300             eventlogger.info(elr);
301             resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
302             return;
303         }
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);
310             resp.sendError(HttpServletResponse.SC_NOT_FOUND, message);
311             return;
312         }*/
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);
320             resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
321             return;
322         }*/
323
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.info(elr);
333             sendResponseError(resp, HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE, message, eventlogger);
334             return;
335         }
336         JSONObject jo = getJSONfromInput(req);
337         if (jo == null) {
338             message = "Badly formed JSON";
339             elr.setMessage(message);
340             elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
341             eventlogger.info(elr);
342             sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);
343             return;
344         }
345         if (intlogger.isDebugEnabled())
346             intlogger.debug(jo.toString());
347
348         Group gup;
349         try {
350             gup = new Group(jo);
351         } catch (InvalidObjectException e) {
352             message = e.getMessage();
353             elr.setMessage(message);
354             elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
355             eventlogger.info(elr);
356             sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);
357             return;
358         }
359         //gup.setFeedid(feedid);
360         //sub.setSubscriber(bhdr);    // set from X-DMAAP-DR-ON-BEHALF-OF header
361
362         // Check if this group already exists; not an error (yet), just warn
363         Group gb2 = Group.getGroupMatching(gup);
364         if (gb2 != null) {
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);
368             return;
369         }
370
371
372         // Create GROUPS table entries
373         if (doInsert(gup)) {
374             // send response
375             elr.setResult(HttpServletResponse.SC_CREATED);
376             eventlogger.info(elr);
377             resp.setStatus(HttpServletResponse.SC_CREATED);
378             resp.setContentType(GROUPFULL_CONTENT_TYPE);
379             try {
380                 resp.getOutputStream().print(gup.asJSONObject().toString());
381             } catch (IOException ioe) {
382                 eventlogger.error("IOException" + ioe.getMessage());
383             }
384             provisioningDataChanged();
385         } else {
386             // Something went wrong with the INSERT
387             elr.setResult(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
388             eventlogger.info(elr);
389             sendResponseError(resp, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, DB_PROBLEM_MSG, eventlogger);
390         }
391     }
392 }