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