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