544a48004923eee86bf7d49abb46b7ebccd193a1
[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.error(elr.toString());
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.error(elr.toString());
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.error(elr.toString());
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;
95             elr.setMessage(message);
96             elr.setResult(HttpServletResponse.SC_FORBIDDEN);
97             eventlogger.error(elr.toString());
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.error(elr.toString());
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.error(elr.toString());
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.toString());
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("PROV0121 GroupServlet.doGet: " + ioe.getMessage(), ioe);
136         }
137
138     }
139     /**
140      * PUT on the &lt;GROUPS&gt; -- not supported.
141      */
142     @Override
143     public void doPut(HttpServletRequest req, HttpServletResponse resp) {
144         EventLogRecord elr = new EventLogRecord(req);
145         String message = isAuthorizedForProvisioning(req);
146         if (message != null) {
147             elr.setMessage(message);
148             elr.setResult(HttpServletResponse.SC_FORBIDDEN);
149             eventlogger.error(elr.toString());
150             sendResponseError(resp, HttpServletResponse.SC_FORBIDDEN, message, eventlogger);
151             return;
152         }
153         if (isProxyServer()) {
154             super.doPut(req, resp);
155             return;
156         }
157         String bhdr = req.getHeader(BEHALF_HEADER);
158         if (bhdr == null) {
159             message = "Missing "+BEHALF_HEADER+" header.";
160             elr.setMessage(message);
161             elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
162             eventlogger.error(elr.toString());
163             sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);
164             return;
165         }
166         int groupid = getIdFromPath(req);
167         if (groupid < 0) {
168             message = "Missing or bad groupid.";
169             elr.setMessage(message);
170             elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
171             eventlogger.error(elr.toString());
172             sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);
173             return;
174         }
175         Group oldgup = Group.getGroupById(groupid);
176         if (oldgup == null) {
177             message = "Missing or bad group number.";
178             elr.setMessage(message);
179             elr.setResult(HttpServletResponse.SC_NOT_FOUND);
180             eventlogger.error(elr.toString());
181             sendResponseError(resp, HttpServletResponse.SC_NOT_FOUND, message, eventlogger);
182             return;
183         }
184
185         // check content type is SUB_CONTENT_TYPE, version 1.0
186         ContentHeader ch = getContentHeader(req);
187         String ver = ch.getAttribute("version");
188         if (!ch.getType().equals(GROUP_BASECONTENT_TYPE) || !("1.0".equals(ver) || "2.0".equals(ver))) {
189             message = "Incorrect content-type";
190             elr.setMessage(message);
191             elr.setResult(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);
192             eventlogger.error(elr.toString());
193             sendResponseError(resp, HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE, message, eventlogger);
194             return;
195         }
196         JSONObject jo = getJSONfromInput(req);
197         if (jo == null) {
198             message = BAD_JSON;
199             elr.setMessage(message);
200             elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
201             eventlogger.error(elr.toString());
202             sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);
203             return;
204         }
205         if (intlogger.isDebugEnabled())
206             intlogger.debug(jo.toString());
207         Group gup;
208         try {
209             gup = new Group(jo);
210         } catch (InvalidObjectException e) {
211             message = e.getMessage();
212             elr.setMessage(message);
213             elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
214             eventlogger.error(elr.toString(), e);
215             sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);
216             return;
217         }
218         gup.setGroupid(oldgup.getGroupid());
219         Group gb2 = Group.getGroupMatching(gup, oldgup.getGroupid());
220         if (gb2 != null) {
221             eventlogger.warn("PROV0011 Creating a duplicate Group: "+gup.getName());
222             elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
223             sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, "Duplicate Group:"+gup.getName(), eventlogger);
224             return;
225         }
226
227         // Update Groups table entries
228         if (doUpdate(gup)) {
229             // send response
230             elr.setResult(HttpServletResponse.SC_OK);
231             eventlogger.info(elr.toString());
232             resp.setStatus(HttpServletResponse.SC_OK);
233             resp.setContentType(GROUPFULL_CONTENT_TYPE);
234             try {
235                 resp.getOutputStream().print(gup.asJSONObject().toString());
236             } catch (IOException ioe) {
237                 eventlogger.error("PROV0122 GroupServlet.doPut: " + ioe.getMessage(), ioe);
238             }
239             provisioningDataChanged();
240         } else {
241             // Something went wrong with the UPDATE
242             elr.setResult(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
243             eventlogger.error(elr.toString());
244             sendResponseError(resp, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, DB_PROBLEM_MSG, eventlogger);
245         }
246     }
247     /**
248      * POST on the &lt;groups&gt; -- create a new GROUPS to a feed.
249      * See the <i>Creating a GROUPS</i> section in the <b>Provisioning API</b>
250      * document for details on how this method should be invoked.
251      */
252     @Override
253     public void doPost(HttpServletRequest req, HttpServletResponse resp) {
254         EventLogRecord elr = new EventLogRecord(req);
255         String message = isAuthorizedForProvisioning(req);
256         if (message != null) {
257             elr.setMessage(message);
258             elr.setResult(HttpServletResponse.SC_FORBIDDEN);
259             eventlogger.error(elr.toString());
260             sendResponseError(resp, HttpServletResponse.SC_FORBIDDEN, message, eventlogger);
261             return;
262         }
263         if (isProxyServer()) {
264             super.doPost(req, resp);
265             return;
266         }
267         String bhdr = req.getHeader(BEHALF_HEADER);
268         if (bhdr == null) {
269             message = "Missing "+BEHALF_HEADER+" header.";
270             elr.setMessage(message);
271             elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
272             eventlogger.error(elr.toString());
273             sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);
274             return;
275         }
276
277         // check content type is SUB_CONTENT_TYPE, version 1.0
278         ContentHeader ch = getContentHeader(req);
279         String ver = ch.getAttribute("version");
280         if (!ch.getType().equals(GROUP_BASECONTENT_TYPE) || !(ver.equals("1.0") || ver.equals("2.0"))) {
281             intlogger.debug("Content-type is: "+req.getHeader("Content-Type"));
282             message = "Incorrect content-type";
283             elr.setMessage(message);
284             elr.setResult(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);
285             eventlogger.error(elr.toString());
286             sendResponseError(resp, HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE, message, eventlogger);
287             return;
288         }
289         JSONObject jo = getJSONfromInput(req);
290         if (jo == null) {
291             message = BAD_JSON;
292             elr.setMessage(message);
293             elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
294             eventlogger.error(elr.toString());
295             sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);
296             return;
297         }
298         if (intlogger.isDebugEnabled())
299             intlogger.debug(jo.toString());
300
301         Group gup;
302         try {
303             gup = new Group(jo);
304         } catch (InvalidObjectException e) {
305             message = e.getMessage();
306             elr.setMessage(message);
307             elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
308             eventlogger.error(elr.toString(), e);
309             sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);
310             return;
311         }
312         //gup.setFeedid(feedid);
313         //sub.setSubscriber(bhdr);    // set from X-DMAAP-DR-ON-BEHALF-OF header
314
315         // Check if this group already exists; not an error (yet), just warn
316         Group gb2 = Group.getGroupMatching(gup);
317         if (gb2 != null) {
318             eventlogger.warn("PROV0011 Creating a duplicate Group: "+gup.getName());
319             elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
320             sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, "Duplicate Group:"+gup.getName(), eventlogger);
321             return;
322         }
323
324
325         // Create GROUPS table entries
326         if (doInsert(gup)) {
327             // send response
328             elr.setResult(HttpServletResponse.SC_CREATED);
329             eventlogger.info(elr.toString());
330             resp.setStatus(HttpServletResponse.SC_CREATED);
331             resp.setContentType(GROUPFULL_CONTENT_TYPE);
332             try {
333                 resp.getOutputStream().print(gup.asJSONObject().toString());
334             } catch (IOException ioe) {
335                 eventlogger.error("PROV0122 GroupServlet.doPost: " + ioe.getMessage(), ioe);
336             }
337             provisioningDataChanged();
338         } else {
339             // Something went wrong with the INSERT
340             elr.setResult(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
341             eventlogger.error(elr.toString());
342             sendResponseError(resp, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, DB_PROBLEM_MSG, eventlogger);
343         }
344     }
345 }