+ private static final String SUBCNTRL_CONTENT_TYPE = "application/vnd.dmaap-dr.subscription-control";\r
+ //Adding EELF Logger Rally:US664892\r
+ private static EELFLogger eelfLogger = EELFManager.getInstance()\r
+ .getLogger(SubscriptionServlet.class);\r
+\r
+\r
+\r
+\r
+\r
+ /**\r
+ * DELETE on the <subscriptionUrl> -- delete a subscription. See the <i>Deleting a Subscription</i> section in\r
+ * the <b>Provisioning API</b> document for details on how this method should be invoked.\r
+ */\r
+ @Override\r
+ public void doDelete(HttpServletRequest req, HttpServletResponse resp) {\r
+ setIpFqdnRequestIDandInvocationIDForEelf("doDelete", req);\r
+ eelfLogger.info(EelfMsgs.ENTRY);\r
+ try {\r
+ eelfLogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_SUBID,\r
+ req.getHeader(BEHALF_HEADER), getIdFromPath(req) + "");\r
+ EventLogRecord elr = new EventLogRecord(req);\r
+ String message = isAuthorizedForProvisioning(req);\r
+ if (message != null) {\r
+ elr.setMessage(message);\r
+ elr.setResult(HttpServletResponse.SC_FORBIDDEN);\r
+ eventlogger.error(elr.toString());\r
+ sendResponseError(resp, HttpServletResponse.SC_FORBIDDEN, message, eventlogger);\r
+ return;\r
+ }\r
+ if (isProxyServer()) {\r
+ super.doDelete(req, resp);\r
+ return;\r
+ }\r
+ String bhdr = req.getHeader(BEHALF_HEADER);\r
+ if (bhdr == null) {\r
+ message = MISSING_ON_BEHALF;\r
+ elr.setMessage(message);\r
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);\r
+ eventlogger.error(elr.toString());\r
+ sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);\r
+ return;\r
+ }\r
+ int subid = getIdFromPath(req);\r
+ if (subid < 0) {\r
+ message = BAD_SUB;\r
+ elr.setMessage(message);\r
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);\r
+ eventlogger.error(elr.toString());\r
+ sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);\r
+ return;\r
+ }\r
+ Subscription sub = Subscription.getSubscriptionById(subid);\r
+ if (sub == null) {\r
+ message = BAD_SUB;\r
+ elr.setMessage(message);\r
+ elr.setResult(HttpServletResponse.SC_NOT_FOUND);\r
+ eventlogger.error(elr.toString());\r
+ sendResponseError(resp, HttpServletResponse.SC_NOT_FOUND, message, eventlogger);\r
+ return;\r
+ }\r
+ /*\r
+ * START - AAF changes\r
+ * TDP EPIC US# 307413\r
+ * CADI code - check on permissions based on Legacy/AAF users to allow to delete/remove subscription\r
+ */\r
+ String aafInstance = sub.getAafInstance();\r
+ if (aafInstance == null || "".equals(aafInstance) || "legacy".equalsIgnoreCase(aafInstance)) {\r
+ AuthorizationResponse aresp = authz.decide(req);\r
+ if (!aresp.isAuthorized()) {\r
+ message = POLICY_ENGINE;\r
+ elr.setMessage(message);\r
+ elr.setResult(HttpServletResponse.SC_FORBIDDEN);\r
+ eventlogger.error(elr.toString());\r
+ sendResponseError(resp, HttpServletResponse.SC_FORBIDDEN, message, eventlogger);\r
+ return;\r
+ }\r
+ } else {\r
+ String permission = getSubscriberPermission(aafInstance, BaseServlet.DELETE_PERMISSION);\r
+ eventlogger.info("SubscriptionServlet.doDelete().. Permission String - " + permission);\r
+ if (!req.isUserInRole(permission)) {\r
+ message = "AAF disallows access to permission - " + permission;\r
+ elr.setMessage(message);\r
+ elr.setResult(HttpServletResponse.SC_FORBIDDEN);\r
+ eventlogger.error(elr.toString());\r
+ sendResponseError(resp, HttpServletResponse.SC_FORBIDDEN, message, eventlogger);\r
+ return;\r
+ }\r
+ }\r
+ /*\r
+ * END - AAF changes\r
+ */\r
+ // Delete Subscription\r
+ if (doDelete(sub)) {\r
+ activeSubs--;\r
+ // send response\r
+ elr.setResult(HttpServletResponse.SC_NO_CONTENT);\r
+ eventlogger.info(elr.toString());\r
+ resp.setStatus(HttpServletResponse.SC_NO_CONTENT);\r
+ provisioningDataChanged();\r
+ } else {\r
+ // Something went wrong with the DELETE\r
+ elr.setResult(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);\r
+ eventlogger.error(elr.toString());\r
+ sendResponseError(resp, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, DB_PROBLEM_MSG, intlogger);\r
+ }\r
+ } finally {\r
+ eelfLogger.info(EelfMsgs.EXIT);\r
+ }\r
+ }\r
+\r
+ /**\r
+ * GET on the <subscriptionUrl> -- get information about a subscription. See the <i>Retreiving Information\r
+ * about a Subscription</i> section in the <b>Provisioning API</b> document for details on how this method should be\r
+ * invoked.\r
+ */\r
+ @Override\r
+ public void doGet(HttpServletRequest req, HttpServletResponse resp) {\r
+ setIpFqdnRequestIDandInvocationIDForEelf("doGet", req);\r
+ eelfLogger.info(EelfMsgs.ENTRY);\r
+ try {\r
+ eelfLogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_SUBID,\r
+ req.getHeader(BEHALF_HEADER), getIdFromPath(req) + "");\r
+ EventLogRecord elr = new EventLogRecord(req);\r
+ String message = isAuthorizedForProvisioning(req);\r
+ if (message != null) {\r
+ elr.setMessage(message);\r
+ elr.setResult(HttpServletResponse.SC_FORBIDDEN);\r
+ eventlogger.error(elr.toString());\r
+ sendResponseError(resp, HttpServletResponse.SC_FORBIDDEN, message, eventlogger);\r
+ return;\r
+ }\r
+ if (isProxyServer()) {\r
+ super.doGet(req, resp);\r
+ return;\r
+ }\r
+ String bhdr = req.getHeader(BEHALF_HEADER);\r
+ if (bhdr == null) {\r
+ message = MISSING_ON_BEHALF;\r
+ elr.setMessage(message);\r
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);\r
+ eventlogger.error(elr.toString());\r
+ sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);\r
+ return;\r
+ }\r
+ int subid = getIdFromPath(req);\r
+ if (subid < 0) {\r
+ message = BAD_SUB;\r
+ elr.setMessage(message);\r
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);\r
+ eventlogger.error(elr.toString());\r
+ sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);\r
+ return;\r
+ }\r
+ Subscription sub = Subscription.getSubscriptionById(subid);\r
+ if (sub == null) {\r
+ message = BAD_SUB;\r
+ elr.setMessage(message);\r
+ elr.setResult(HttpServletResponse.SC_NOT_FOUND);\r
+ eventlogger.error(elr.toString());\r
+ sendResponseError(resp, HttpServletResponse.SC_NOT_FOUND, message, eventlogger);\r
+ return;\r
+ }\r
+ // Check with the Authorizer\r
+ AuthorizationResponse aresp = authz.decide(req);\r
+ if (!aresp.isAuthorized()) {\r
+ message = POLICY_ENGINE;\r
+ elr.setMessage(message);\r
+ elr.setResult(HttpServletResponse.SC_FORBIDDEN);\r
+ eventlogger.error(elr.toString());\r
+ sendResponseError(resp, HttpServletResponse.SC_FORBIDDEN, message, eventlogger);\r
+ return;\r
+ }\r
+\r
+ // send response\r
+ elr.setResult(HttpServletResponse.SC_OK);\r
+ eventlogger.info(elr.toString());\r
+ resp.setStatus(HttpServletResponse.SC_OK);\r
+ resp.setContentType(SUBFULL_CONTENT_TYPE);\r
+ try {\r
+ resp.getOutputStream().print(sub.asJSONObject(true).toString());\r
+ } catch (IOException ioe) {\r
+ eventlogger.error("PROV0191 SubscriptionServlet.doGet: " + ioe.getMessage(), ioe);\r
+ }\r
+ } finally {\r
+ eelfLogger.info(EelfMsgs.EXIT);\r
+ }\r
+ }\r
+\r
+ /**\r
+ * PUT on the <subscriptionUrl> -- modify a subscription. See the <i>Modifying a Subscription</i> section in\r
+ * the <b>Provisioning API</b> document for details on how this method should be invoked.\r
+ */\r
+ @Override\r
+ public void doPut(HttpServletRequest req, HttpServletResponse resp) {\r
+ setIpFqdnRequestIDandInvocationIDForEelf("doPut", req);\r
+ eelfLogger.info(EelfMsgs.ENTRY);\r
+ try {\r
+ eelfLogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_SUBID,\r
+ req.getHeader(BEHALF_HEADER), getIdFromPath(req) + "");\r
+ EventLogRecord elr = new EventLogRecord(req);\r
+ String message = isAuthorizedForProvisioning(req);\r
+ if (message != null) {\r
+ elr.setMessage(message);\r
+ elr.setResult(HttpServletResponse.SC_FORBIDDEN);\r
+ eventlogger.error(elr.toString());\r
+ sendResponseError(resp, HttpServletResponse.SC_FORBIDDEN, message, eventlogger);\r
+ return;\r
+ }\r
+ if (isProxyServer()) {\r
+ super.doPut(req, resp);\r
+ return;\r
+ }\r
+ String bhdr = req.getHeader(BEHALF_HEADER);\r
+ if (bhdr == null) {\r
+ message = MISSING_ON_BEHALF;\r
+ elr.setMessage(message);\r
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);\r
+ eventlogger.error(elr.toString());\r
+ sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);\r
+ return;\r
+ }\r
+ int subid = getIdFromPath(req);\r
+ if (subid < 0) {\r
+ message = BAD_SUB;\r
+ elr.setMessage(message);\r
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);\r
+ eventlogger.error(elr.toString());\r
+ sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);\r
+ return;\r
+ }\r
+ Subscription oldsub = Subscription.getSubscriptionById(subid);\r
+ if (oldsub == null) {\r
+ message = BAD_SUB;\r
+ elr.setMessage(message);\r
+ elr.setResult(HttpServletResponse.SC_NOT_FOUND);\r
+ eventlogger.error(elr.toString());\r
+ sendResponseError(resp, HttpServletResponse.SC_NOT_FOUND, message, eventlogger);\r
+ return;\r
+ }\r
+ // check content type is SUB_CONTENT_TYPE, version 1.0\r
+ ContentHeader ch = getContentHeader(req);\r
+ String ver = ch.getAttribute("version");\r
+ if (!ch.getType().equals(SUB_BASECONTENT_TYPE) || !("1.0".equals(ver) || "2.0".equals(ver))) {\r
+ message = "Incorrect content-type";\r
+ elr.setMessage(message);\r
+ elr.setResult(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);\r
+ eventlogger.error(elr.toString());\r
+ sendResponseError(resp, HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE, message, eventlogger);\r
+ return;\r
+ }\r
+ JSONObject jo = getJSONfromInput(req);\r
+ if (jo == null) {\r
+ message = BAD_JSON;\r
+ elr.setMessage(message);\r
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);\r
+ eventlogger.error(elr.toString());\r
+ sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);\r
+ return;\r
+ }\r
+ if (intlogger.isDebugEnabled()) {\r
+ intlogger.debug(jo.toString());\r
+ }\r
+ Subscription sub = null;\r
+ try {\r
+ sub = new Subscription(jo);\r
+ } catch (InvalidObjectException e) {\r
+ message = e.getMessage();\r
+ elr.setMessage(message);\r
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);\r
+ eventlogger.error(elr.toString(), e);\r
+ sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);\r
+ return;\r
+ }\r
+\r
+ /*\r
+ * START - AAF changes\r
+ * TDP EPIC US# 307413\r
+ * CADI code - check on permissions based on Legacy/AAF users to allow to delete/remove subscription\r
+ */\r
+ String aafInstance = sub.getAafInstance();\r
+ if (aafInstance == null || "".equals(aafInstance) || "legacy".equalsIgnoreCase(aafInstance)) {\r
+ AuthorizationResponse aresp = authz.decide(req);\r
+ if (!aresp.isAuthorized()) {\r
+ message = POLICY_ENGINE;\r
+ elr.setMessage(message);\r
+ elr.setResult(HttpServletResponse.SC_FORBIDDEN);\r
+ eventlogger.error(elr.toString());\r
+ sendResponseError(resp, HttpServletResponse.SC_FORBIDDEN, message, eventlogger);\r
+ return;\r
+ }\r
+ } else {\r
+ String permission = getSubscriberPermission(aafInstance, BaseServlet.EDIT_PERMISSION);\r
+ eventlogger.info("SubscriptionServlet.doDelete().. Permission String - " + permission);\r
+ if (!req.isUserInRole(permission)) {\r
+ message = "AAF disallows access to permission - " + permission;\r
+ elr.setMessage(message);\r
+ elr.setResult(HttpServletResponse.SC_FORBIDDEN);\r
+ eventlogger.error(elr.toString());\r
+ sendResponseError(resp, HttpServletResponse.SC_FORBIDDEN, message, eventlogger);\r
+ return;\r
+ }\r
+ }\r
+ /*\r
+ * END - AAF changes\r
+ */\r
+ sub.setSubid(oldsub.getSubid());\r
+ sub.setFeedid(oldsub.getFeedid());\r
+ sub.setSubscriber(bhdr); // set from X-DMAAP-DR-ON-BEHALF-OF header\r
+ //Adding for group feature:Rally US708115\r
+ String subjectgroup = (req.getHeader("X-DMAAP-DR-ON-BEHALF-OF-GROUP"));\r
+ if (!oldsub.getSubscriber().equals(sub.getSubscriber()) && subjectgroup == null) {\r
+ message = "This subscriber must be modified by the same subscriber that created it.";\r
+ elr.setMessage(message);\r
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);\r
+ eventlogger.error(elr.toString());\r
+ sendResponseError(resp, HttpServletResponse.SC_BAD_REQUEST, message, eventlogger);\r
+ return;\r
+ }\r
+\r
+ // Update SUBSCRIPTIONS table entries\r
+ if (doUpdate(sub)) {\r
+ // send response\r
+ elr.setResult(HttpServletResponse.SC_OK);\r
+ eventlogger.info(elr.toString());\r
+ resp.setStatus(HttpServletResponse.SC_OK);\r
+ resp.setContentType(SUBFULL_CONTENT_TYPE);\r
+ try {\r
+ resp.getOutputStream().print(sub.asLimitedJSONObject().toString());\r
+ } catch (IOException ioe) {\r
+ eventlogger.error("PROV0192 SubscriptionServlet.doPut: " + ioe.getMessage(), ioe);\r
+ }\r
+\r
+ /**Change Owner ship of Subscriber. Adding for group feature:Rally US708115*/\r
+ if (jo.has("changeowner") && subjectgroup != null) {\r
+ try {\r
+ Boolean changeowner = (Boolean) jo.get("changeowner");\r
+ if (changeowner != null && changeowner.equals(true)) {\r
+ sub.setSubscriber(req.getHeader(BEHALF_HEADER));\r
+ sub.changeOwnerShip();\r
+ }\r
+ } catch (JSONException je) {\r
+ eventlogger.error("PROV0193 SubscriptionServlet.doPut: " + je.getMessage(), je);\r
+ }\r
+ }\r
+ /***End of change ownership.*/\r