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