datarouter-prov code clean - remove tabs
[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 import java.util.Collection;
30
31 import javax.servlet.http.HttpServletRequest;
32 import javax.servlet.http.HttpServletResponse;
33
34 import org.json.JSONObject;
35 import org.onap.dmaap.datarouter.authz.AuthorizationResponse;
36 import org.onap.dmaap.datarouter.provisioning.BaseServlet.ContentHeader;
37 import org.onap.dmaap.datarouter.provisioning.beans.EventLogRecord;
38 import org.onap.dmaap.datarouter.provisioning.beans.Group;
39 import org.onap.dmaap.datarouter.provisioning.beans.Subscription;
40 import org.onap.dmaap.datarouter.provisioning.utils.JSONUtilities;
41
42 /**
43  * This servlet handles provisioning for the <groups> which is generated by the provisioning
44  * server to handle the creation and inspection of groups for FEEDS and SUBSCRIPTIONS.
45  *
46  * @author Vikram Singh
47  * @version $Id$
48  * @version $Id: Group.java,v 1.0 2016/07/19
49  */
50 @SuppressWarnings("serial")
51 public class GroupServlet extends ProxyServlet {
52     /**
53      * DELETE on the <GRUPS> -- not supported.
54      */
55     @Override
56     public void doDelete(HttpServletRequest req, HttpServletResponse resp) throws IOException {
57         String message = "DELETE not allowed for the GROUPS.";
58         EventLogRecord elr = new EventLogRecord(req);
59         elr.setMessage(message);
60         elr.setResult(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
61         eventlogger.info(elr);
62         resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, message);
63     }
64     /**
65      * GET on the the list of groups to a feed/sub.
66      * See the <i>Groups Collection Query</i> section in the <b>Provisioning API</b>
67      * document for details on how this method should be invoked.
68      */
69     @Override
70     public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
71         EventLogRecord elr = new EventLogRecord(req);
72         String message = isAuthorizedForProvisioning(req);
73         if (message != null) {
74             elr.setMessage(message);
75             elr.setResult(HttpServletResponse.SC_FORBIDDEN);
76             eventlogger.info(elr);
77             resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
78             return;
79         }
80         if (isProxyServer()) {
81             super.doGet(req, resp);
82             return;
83         }
84         String bhdr = req.getHeader(BEHALF_HEADER);
85         if (bhdr == null) {
86             message = "Missing "+BEHALF_HEADER+" header.";
87             elr.setMessage(message);
88             elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
89             eventlogger.info(elr);
90             resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
91             return;
92         }
93
94         // Check with the Authorizer
95         /*AuthorizationResponse aresp = authz.decide(req);
96         if (! aresp.isAuthorized()) {
97             message = "Policy Engine disallows access.";
98             elr.setMessage(message);
99             elr.setResult(HttpServletResponse.SC_FORBIDDEN);
100             eventlogger.info(elr);
101             resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
102             return;
103         }*/
104
105
106         /*ContentHeader ch = getContentHeader(req);
107         String ver = ch.getAttribute("version");
108         if (!ch.getType().equals(GROUPLIST_CONTENT_TYPE) || !(ver.equals("1.0") || ver.equals("2.0"))) {
109             intlogger.debug("Content-type is: "+req.getHeader("Content-Type"));
110             message = "Incorrect content-type";
111             elr.setMessage(message);
112             elr.setResult(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);
113             eventlogger.info(elr);
114             resp.sendError(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE, message);
115             return;
116         }*/
117
118
119         int groupid = getIdFromPath(req);
120         if (groupid < 0) {
121             message = "Missing or bad group number.";
122             elr.setMessage(message);
123             elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
124             eventlogger.info(elr);
125             resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
126             return;
127         }
128
129         Group gup = Group.getGroupById(groupid);
130         // send response
131         elr.setResult(HttpServletResponse.SC_OK);
132         eventlogger.info(elr);
133         resp.setStatus(HttpServletResponse.SC_OK);
134         resp.setContentType(GROUPFULL_CONTENT_TYPE);
135         resp.getOutputStream().print(gup.asJSONObject().toString());
136
137         // Display a list of Groups
138         /*Collection<Group> list = Group.getGroupById(groupid);
139         String t = JSONUtilities.createJSONArray(list);
140
141         // send response
142         elr.setResult(HttpServletResponse.SC_OK);
143         eventlogger.info(elr);
144         resp.setStatus(HttpServletResponse.SC_OK);
145         resp.setContentType(GROUPLIST_CONTENT_TYPE);
146         resp.getOutputStream().print(t);*/
147     }
148     /**
149      * PUT on the &lt;GROUPS&gt; -- not supported.
150      */
151     @Override
152     public void doPut(HttpServletRequest req, HttpServletResponse resp) throws IOException {
153         EventLogRecord elr = new EventLogRecord(req);
154         String message = isAuthorizedForProvisioning(req);
155         if (message != null) {
156             elr.setMessage(message);
157             elr.setResult(HttpServletResponse.SC_FORBIDDEN);
158             eventlogger.info(elr);
159             resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
160             return;
161         }
162         if (isProxyServer()) {
163             super.doPut(req, resp);
164             return;
165         }
166         String bhdr = req.getHeader(BEHALF_HEADER);
167         if (bhdr == null) {
168             message = "Missing "+BEHALF_HEADER+" header.";
169             elr.setMessage(message);
170             elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
171             eventlogger.info(elr);
172             resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
173             return;
174         }
175         int groupid = getIdFromPath(req);
176         if (groupid < 0) {
177             message = "Missing or bad groupid.";
178             elr.setMessage(message);
179             elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
180             eventlogger.info(elr);
181             resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
182             return;
183         }
184         Group oldgup = Group.getGroupById(groupid);
185         if (oldgup == null) {
186             message = "Missing or bad group number.";
187             elr.setMessage(message);
188             elr.setResult(HttpServletResponse.SC_NOT_FOUND);
189             eventlogger.info(elr);
190             resp.sendError(HttpServletResponse.SC_NOT_FOUND, message);
191             return;
192         }
193         // Check with the Authorizer
194         /*AuthorizationResponse aresp = authz.decide(req);
195         if (! aresp.isAuthorized()) {
196             message = "Policy Engine disallows access.";
197             elr.setMessage(message);
198             elr.setResult(HttpServletResponse.SC_FORBIDDEN);
199             eventlogger.info(elr);
200             resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
201             return;
202         }*/
203         // check content type is SUB_CONTENT_TYPE, version 1.0
204         ContentHeader ch = getContentHeader(req);
205         String ver = ch.getAttribute("version");
206         if (!ch.getType().equals(GROUP_BASECONTENT_TYPE) || !(ver.equals("1.0") || ver.equals("2.0"))) {
207             message = "Incorrect content-type";
208             elr.setMessage(message);
209             elr.setResult(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);
210             eventlogger.info(elr);
211             resp.sendError(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE, message);
212             return;
213         }
214         JSONObject jo = getJSONfromInput(req);
215         if (jo == null) {
216             message = "Badly formed JSON";
217             elr.setMessage(message);
218             elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
219             eventlogger.info(elr);
220             resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
221             return;
222         }
223         if (intlogger.isDebugEnabled())
224             intlogger.debug(jo.toString());
225         Group gup = null;
226         try {
227             gup = new Group(jo);
228         } catch (InvalidObjectException e) {
229             message = e.getMessage();
230             elr.setMessage(message);
231             elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
232             eventlogger.info(elr);
233             resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
234             return;
235         }
236         gup.setGroupid(oldgup.getGroupid());
237
238
239         Group gb2 = Group.getGroupMatching(gup, oldgup.getGroupid());
240         if (gb2 != null) {
241             eventlogger.warn("PROV0011 Creating a duplicate Group: "+gup.getName());
242             elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
243             resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "Duplicate Group:"+gup.getName());
244             return;
245         }
246
247         // Update Groups table entries
248         if (doUpdate(gup)) {
249             // send response
250             elr.setResult(HttpServletResponse.SC_OK);
251             eventlogger.info(elr);
252             resp.setStatus(HttpServletResponse.SC_OK);
253             resp.setContentType(GROUPFULL_CONTENT_TYPE);
254             resp.getOutputStream().print(gup.asJSONObject().toString());
255             provisioningDataChanged();
256         } else {
257             // Something went wrong with the UPDATE
258             elr.setResult(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
259             eventlogger.info(elr);
260             resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, DB_PROBLEM_MSG);
261         }
262     }
263     /**
264      * POST on the &lt;groups&gt; -- create a new GROUPS to a feed.
265      * See the <i>Creating a GROUPS</i> section in the <b>Provisioning API</b>
266      * document for details on how this method should be invoked.
267      */
268     @Override
269     public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
270         EventLogRecord elr = new EventLogRecord(req);
271         String message = isAuthorizedForProvisioning(req);
272         if (message != null) {
273             elr.setMessage(message);
274             elr.setResult(HttpServletResponse.SC_FORBIDDEN);
275             eventlogger.info(elr);
276             resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
277             return;
278         }
279         if (isProxyServer()) {
280             super.doPost(req, resp);
281             return;
282         }
283         String bhdr = req.getHeader(BEHALF_HEADER);
284         if (bhdr == null) {
285             message = "Missing "+BEHALF_HEADER+" header.";
286             elr.setMessage(message);
287             elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
288             eventlogger.info(elr);
289             resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
290             return;
291         }
292         /*int feedid = getIdFromPath(req);
293         if (feedid < 0) {
294             message = "Missing or bad feed number.";
295             elr.setMessage(message);
296             elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
297             eventlogger.info(elr);
298             resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
299             return;
300         }
301         Feed feed = Feed.getFeedById(feedid);
302         if (feed == null || feed.isDeleted()) {
303             message = "Missing or bad feed number.";
304             elr.setMessage(message);
305             elr.setResult(HttpServletResponse.SC_NOT_FOUND);
306             eventlogger.info(elr);
307             resp.sendError(HttpServletResponse.SC_NOT_FOUND, message);
308             return;
309         }*/
310         // Check with the Authorizer
311         /*AuthorizationResponse aresp = authz.decide(req);
312         if (! aresp.isAuthorized()) {
313             message = "Policy Engine disallows access.";
314             elr.setMessage(message);
315             elr.setResult(HttpServletResponse.SC_FORBIDDEN);
316             eventlogger.info(elr);
317             resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
318             return;
319         }*/
320
321         // check content type is SUB_CONTENT_TYPE, version 1.0
322         ContentHeader ch = getContentHeader(req);
323         String ver = ch.getAttribute("version");
324         if (!ch.getType().equals(GROUP_BASECONTENT_TYPE) || !(ver.equals("1.0") || ver.equals("2.0"))) {
325             intlogger.debug("Content-type is: "+req.getHeader("Content-Type"));
326             message = "Incorrect content-type";
327             elr.setMessage(message);
328             elr.setResult(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);
329             eventlogger.info(elr);
330             resp.sendError(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE, message);
331             return;
332         }
333         JSONObject jo = getJSONfromInput(req);
334         if (jo == null) {
335             message = "Badly formed JSON";
336             elr.setMessage(message);
337             elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
338             eventlogger.info(elr);
339             resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
340             return;
341         }
342         if (intlogger.isDebugEnabled())
343             intlogger.debug(jo.toString());
344
345         Group gup = null;
346         try {
347             gup = new Group(jo);
348         } catch (InvalidObjectException e) {
349             message = e.getMessage();
350             elr.setMessage(message);
351             elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
352             eventlogger.info(elr);
353             resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
354             return;
355         }
356         //gup.setFeedid(feedid);
357         //sub.setSubscriber(bhdr);    // set from X-ATT-DR-ON-BEHALF-OF header
358
359         // Check if this group already exists; not an error (yet), just warn
360         Group gb2 = Group.getGroupMatching(gup);
361         if (gb2 != null) {
362             eventlogger.warn("PROV0011 Creating a duplicate Group: "+gup.getName());
363             elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
364             resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "Duplicate Group:"+gup.getName());
365             return;
366         }
367
368
369         // Create GROUPS table entries
370         if (doInsert(gup)) {
371             // send response
372             elr.setResult(HttpServletResponse.SC_CREATED);
373             eventlogger.info(elr);
374             resp.setStatus(HttpServletResponse.SC_CREATED);
375             resp.setContentType(GROUPFULL_CONTENT_TYPE);
376             resp.getOutputStream().print(gup.asJSONObject().toString());
377             provisioningDataChanged();
378         } else {
379             // Something went wrong with the INSERT
380             elr.setResult(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
381             eventlogger.info(elr);
382             resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, DB_PROBLEM_MSG);
383         }
384     }
385 }