aboutsummaryrefslogtreecommitdiffstats
path: root/POLICY-SDK-APP/src/main
diff options
context:
space:
mode:
authoruj426b <uj426b@att.com>2019-03-21 22:02:04 -0400
committeruj426b <uj426b@att.com>2019-04-04 17:14:26 -0400
commite1fe7fcff0568f6376c3392ddf761b3aa0601587 (patch)
tree86d8840b2ee7c8c52806dff7a5e62831117dd469 /POLICY-SDK-APP/src/main
parentd5f95d08ffd3f2e16b67aadae7007c7a51dfae19 (diff)
Auditing User Operations Push or Delete Policies.
Change-Id: I39d5fc01e68e9d711c5dd09790dc34beb68783c3 Issue-ID: POLICY-1421 Signed-off-by: uj426b <uj426b@att.com>
Diffstat (limited to 'POLICY-SDK-APP/src/main')
-rw-r--r--POLICY-SDK-APP/src/main/java/org/onap/policy/admin/RESTfulPAPEngine.java157
-rw-r--r--POLICY-SDK-APP/src/main/java/org/onap/policy/controller/AutoPushController.java46
-rw-r--r--POLICY-SDK-APP/src/main/java/org/onap/policy/model/PDPGroupContainer.java714
3 files changed, 474 insertions, 443 deletions
diff --git a/POLICY-SDK-APP/src/main/java/org/onap/policy/admin/RESTfulPAPEngine.java b/POLICY-SDK-APP/src/main/java/org/onap/policy/admin/RESTfulPAPEngine.java
index 91bdc772b..a500c1dbe 100644
--- a/POLICY-SDK-APP/src/main/java/org/onap/policy/admin/RESTfulPAPEngine.java
+++ b/POLICY-SDK-APP/src/main/java/org/onap/policy/admin/RESTfulPAPEngine.java
@@ -9,9 +9,9 @@
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -22,6 +22,13 @@
package org.onap.policy.admin;
+import com.att.research.xacml.api.pap.PAPException;
+import com.att.research.xacml.api.pap.PDPPolicy;
+import com.att.research.xacml.api.pap.PDPStatus;
+import com.att.research.xacml.util.XACMLProperties;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.type.CollectionType;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
@@ -38,8 +45,9 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
-
import org.apache.commons.io.IOUtils;
+import org.onap.policy.common.logging.flexlogger.FlexLogger;
+import org.onap.policy.common.logging.flexlogger.Logger;
import org.onap.policy.rest.XACMLRestProperties;
import org.onap.policy.rest.adapter.PolicyRestAdapter;
import org.onap.policy.utils.PeCryptoUtils;
@@ -54,25 +62,14 @@ import org.onap.policy.xacml.std.pap.StdPDPItemSetChangeNotifier;
import org.onap.policy.xacml.std.pap.StdPDPPolicy;
import org.onap.policy.xacml.std.pap.StdPDPStatus;
-import com.att.research.xacml.api.pap.PAPException;
-import com.att.research.xacml.api.pap.PDPPolicy;
-import com.att.research.xacml.api.pap.PDPStatus;
-import com.att.research.xacml.util.XACMLProperties;
-import com.fasterxml.jackson.databind.DeserializationFeature;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.type.CollectionType;
-
-import org.onap.policy.common.logging.flexlogger.FlexLogger;
-import org.onap.policy.common.logging.flexlogger.Logger;
-
/**
- * Implementation of the PAPEngine interface that communicates with a PAP engine in a remote servlet
- * through a RESTful interface
- *
+ * Implementation of the PAPEngine interface that communicates with a PAP engine in a remote servlet through a RESTful
+ * interface
+ *
*
*/
public class RESTfulPAPEngine extends StdPDPItemSetChangeNotifier implements PAPPolicyEngine {
- private static final Logger LOGGER = FlexLogger.getLogger(RESTfulPAPEngine.class);
+ private static final Logger LOGGER = FlexLogger.getLogger(RESTfulPAPEngine.class);
private static final String GROUP_ID = "groupId=";
@@ -83,15 +80,17 @@ public class RESTfulPAPEngine extends StdPDPItemSetChangeNotifier implements PAP
/**
* Set up link with PAP Servlet and get our initial set of Groups
+ *
* @throws PAPException When failing to register with PAP
*/
- public RESTfulPAPEngine (String myURLString) throws PAPException {
+ public RESTfulPAPEngine(String myURLString) throws PAPException {
//
// Get our URL to the PAP servlet
//
this.papServletURLString = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_URL);
if (this.papServletURLString == null || this.papServletURLString.length() == 0) {
- String message = "The property 'POLICYENGINE_ADMIN_ACTIVE' was not set during installation. Admin Console cannot call PAP.";
+ String message =
+ "The property 'POLICYENGINE_ADMIN_ACTIVE' was not set during installation. Admin Console cannot call PAP.";
LOGGER.error(message);
throw new PAPException(message);
}
@@ -103,7 +102,7 @@ public class RESTfulPAPEngine extends StdPDPItemSetChangeNotifier implements PAP
if (newURL != null) {
// assume this was a re-direct and try again
LOGGER.warn("Redirecting to '" + newURL + "'");
- this.papServletURLString = (String)newURL;
+ this.papServletURLString = (String) newURL;
newURL = sendToPAP("PUT", null, null, null, "adminConsoleURL=" + myURLString);
if (newURL != null) {
LOGGER.error("Failed to redirect to " + this.papServletURLString);
@@ -118,7 +117,7 @@ public class RESTfulPAPEngine extends StdPDPItemSetChangeNotifier implements PAP
@Override
public OnapPDPGroup getDefaultGroup() throws PAPException {
- return (OnapPDPGroup)sendToPAP("GET", null, null, StdPDPGroup.class, GROUP_ID, "default=");
+ return (OnapPDPGroup) sendToPAP("GET", null, null, StdPDPGroup.class, GROUP_ID, "default=");
}
@Override
@@ -136,22 +135,22 @@ public class RESTfulPAPEngine extends StdPDPItemSetChangeNotifier implements PAP
@Override
public OnapPDPGroup getGroup(String id) throws PAPException {
- return (OnapPDPGroup)sendToPAP("GET", null, null, StdPDPGroup.class, GROUP_ID + id);
+ return (OnapPDPGroup) sendToPAP("GET", null, null, StdPDPGroup.class, GROUP_ID + id);
}
@Override
- public void newGroup(String name, String description)
- throws PAPException {
+ public void newGroup(String name, String description) throws PAPException {
String escapedName;
String escapedDescription;
try {
escapedName = URLEncoder.encode(name, "UTF-8");
escapedDescription = URLEncoder.encode(description, "UTF-8");
} catch (UnsupportedEncodingException e) {
- throw new PAPException("Unable to send name or description to PAP: " + e.getMessage() +e);
+ throw new PAPException("Unable to send name or description to PAP: " + e.getMessage() + e);
}
- this.sendToPAP("POST", null, null, null, GROUP_ID, "groupName="+escapedName, "groupDescription=" + escapedDescription);
+ this.sendToPAP("POST", null, null, null, GROUP_ID, "groupName=" + escapedName,
+ "groupDescription=" + escapedDescription);
}
/**
@@ -165,13 +164,16 @@ public class RESTfulPAPEngine extends StdPDPItemSetChangeNotifier implements PAP
public void updateGroup(OnapPDPGroup group) throws PAPException {
try {
//
- // ASSUME that all of the policies mentioned in this group are already located in the correct directory on the PAP!
+ // ASSUME that all of the policies mentioned in this group are already located in the correct directory on
+ // the PAP!
//
- // Whenever a Policy is added to the group, that file must be automatically copied to the PAP from the Workspace.
+ // Whenever a Policy is added to the group, that file must be automatically copied to the PAP from the
+ // Workspace.
//
// Copy all policies from the local machine's workspace to the PAP's PDPGroup directory.
// This is not efficient since most of the policies will already exist there.
- // However, the policy files are (probably!) not too huge, and this is a good way to ensure that any corrupted files on the PAP get refreshed.
+ // However, the policy files are (probably!) not too huge, and this is a good way to ensure that any
+ // corrupted files on the PAP get refreshed.
// now update the group object on the PAP
sendToPAP("PUT", group, null, null, GROUP_ID + group.getId());
} catch (Exception e) {
@@ -181,6 +183,23 @@ public class RESTfulPAPEngine extends StdPDPItemSetChangeNotifier implements PAP
}
}
+ /*
+ * Passing UserName to PAP Rest for Audit Logging.
+ *
+ * @see org.onap.policy.xacml.api.pap.PAPPolicyEngine#updateGroup(org.onap.policy.xacml.api.pap.OnapPDPGroup,
+ * java.lang.String)
+ */
+ @Override
+ public void updateGroup(OnapPDPGroup group, String userName) throws PAPException {
+ try {
+ sendToPAP("PUT", group, null, null, GROUP_ID + group.getId(), "userId=" + userName);
+ } catch (Exception e) {
+ String message = "Unable to PUT policy '" + group.getId() + "', e:" + e;
+ LOGGER.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + message, e);
+ throw new PAPException(message);
+ }
+ }
+
@Override
public void removeGroup(OnapPDPGroup group, OnapPDPGroup newGroup) throws PAPException {
String moveToGroupString = null;
@@ -196,16 +215,18 @@ public class RESTfulPAPEngine extends StdPDPItemSetChangeNotifier implements PAP
}
public OnapPDPGroup getPDPGroup(String pdpId) throws PAPException {
- return (OnapPDPGroup)sendToPAP("GET", null, null, StdPDPGroup.class, GROUP_ID, "pdpId=" + pdpId, "getPDPGroup=");
+ return (OnapPDPGroup) sendToPAP("GET", null, null, StdPDPGroup.class, GROUP_ID, "pdpId=" + pdpId,
+ "getPDPGroup=");
}
@Override
public OnapPDP getPDP(String pdpId) throws PAPException {
- return (OnapPDP)sendToPAP("GET", null, null, StdPDP.class, GROUP_ID, "pdpId=" + pdpId);
+ return (OnapPDP) sendToPAP("GET", null, null, StdPDP.class, GROUP_ID, "pdpId=" + pdpId);
}
@Override
- public void newPDP(String id, OnapPDPGroup group, String name, String description, int jmxport) throws PAPException {
+ public void newPDP(String id, OnapPDPGroup group, String name, String description, int jmxport)
+ throws PAPException {
StdPDP newPDP = new StdPDP(id, name, description, jmxport);
sendToPAP("PUT", newPDP, null, null, GROUP_ID + group.getId(), "pdpId=" + id);
}
@@ -227,19 +248,21 @@ public class RESTfulPAPEngine extends StdPDPItemSetChangeNotifier implements PAP
sendToPAP("DELETE", null, null, null, GROUP_ID + group.getId(), "pdpId=" + pdp.getId());
}
- //Validate the Policy Data
+ // Validate the Policy Data
public boolean validatePolicyRequest(PolicyRestAdapter policyAdapter, String policyType) throws PAPException {
- StdPAPPolicy newPAPPolicy = new StdPAPPolicy(policyAdapter.getPolicyName(), policyAdapter.getConfigBodyData(), policyAdapter.getConfigType(), "Base");
+ StdPAPPolicy newPAPPolicy = new StdPAPPolicy(policyAdapter.getPolicyName(), policyAdapter.getConfigBodyData(),
+ policyAdapter.getConfigType(), "Base");
- //send JSON object to PAP
- return (Boolean) sendToPAP("PUT", newPAPPolicy, null, null, "operation=validate", "apiflag=admin", "policyType=" + policyType);
+ // send JSON object to PAP
+ return (Boolean) sendToPAP("PUT", newPAPPolicy, null, null, "operation=validate", "apiflag=admin",
+ "policyType=" + policyType);
}
@Override
- public void publishPolicy(String id, String name, boolean isRoot,
- InputStream policy, OnapPDPGroup group) throws PAPException {
+ public void publishPolicy(String id, String name, boolean isRoot, InputStream policy, OnapPDPGroup group)
+ throws PAPException {
// copy the (one) file into the target directory on the PAP servlet
copyFile(id, group, policy);
@@ -252,8 +275,8 @@ public class RESTfulPAPEngine extends StdPDPItemSetChangeNotifier implements PAP
}
/**
- * Copy a single Policy file from the input stream to the PAP Servlet.
- * Either this works (silently) or it throws an exception.
+ * Copy a single Policy file from the input stream to the PAP Servlet. Either this works (silently) or it throws an
+ * exception.
*
* @param policyId
* @param group
@@ -264,7 +287,7 @@ public class RESTfulPAPEngine extends StdPDPItemSetChangeNotifier implements PAP
public void copyFile(String policyId, OnapPDPGroup group, InputStream policy) throws PAPException {
// send the policy file to the PAP Servlet
try {
- sendToPAP("POST", policy, null, null, GROUP_ID + group.getId(), "policyId="+policyId);
+ sendToPAP("POST", policy, null, null, GROUP_ID + group.getId(), "policyId=" + policyId);
} catch (Exception e) {
String message = "Unable to PUT policy '" + policyId + "', e:" + e;
LOGGER.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + message, e);
@@ -275,10 +298,10 @@ public class RESTfulPAPEngine extends StdPDPItemSetChangeNotifier implements PAP
@Override
public void copyPolicy(PDPPolicy policy, OnapPDPGroup group) throws PAPException {
if (policy == null || group == null) {
- throw new PAPException("Null input policy="+policy+" group="+group);
+ throw new PAPException("Null input policy=" + policy + " group=" + group);
}
- try (InputStream is = new FileInputStream(new File(policy.getLocation())) ) {
- copyFile(policy.getId(), group, is );
+ try (InputStream is = new FileInputStream(new File(policy.getLocation()))) {
+ copyFile(policy.getId(), group, is);
} catch (Exception e) {
String message = "Unable to PUT policy '" + policy.getId() + "', e:" + e;
LOGGER.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + message, e);
@@ -292,8 +315,8 @@ public class RESTfulPAPEngine extends StdPDPItemSetChangeNotifier implements PAP
}
/**
- * Special operation - Similar to the normal PAP operations but this one contacts the PDP directly
- * to get detailed status info.
+ * Special operation - Similar to the normal PAP operations but this one contacts the PDP directly to get detailed
+ * status info.
*
* @param pdp
* @return
@@ -301,7 +324,7 @@ public class RESTfulPAPEngine extends StdPDPItemSetChangeNotifier implements PAP
*/
@Override
public PDPStatus getStatus(OnapPDP pdp) throws PAPException {
- return (StdPDPStatus)sendToPAP("GET", pdp, null, StdPDPStatus.class);
+ return (StdPDPStatus) sendToPAP("GET", pdp, null, StdPDPStatus.class);
}
//
@@ -311,21 +334,22 @@ public class RESTfulPAPEngine extends StdPDPItemSetChangeNotifier implements PAP
/**
* Send a request to the PAP Servlet and get the response.
*
- * The content is either an InputStream to be copied to the Request OutputStream
- * OR it is an object that is to be encoded into JSON and pushed into the Request OutputStream.
+ * The content is either an InputStream to be copied to the Request OutputStream OR it is an object that is to be
+ * encoded into JSON and pushed into the Request OutputStream.
*
* The Request parameters may be encoded in multiple "name=value" sets, or parameters may be combined by the caller.
*
* @param method
- * @param content - EITHER an InputStream OR an Object to be encoded in JSON
+ * @param content - EITHER an InputStream OR an Object to be encoded in JSON
* @param collectionTypeClass
* @param responseContentClass
* @param parameters
* @return
* @throws PAPException
*/
- @SuppressWarnings({ "rawtypes", "unchecked" })
- private Object sendToPAP(String method, Object content, Class collectionTypeClass, Class responseContentClass, String... parameters ) throws PAPException {
+ @SuppressWarnings({"rawtypes", "unchecked"})
+ private Object sendToPAP(String method, Object content, Class collectionTypeClass, Class responseContentClass,
+ String... parameters) throws PAPException {
HttpURLConnection connection = null;
String papID = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_USERID);
LOGGER.info("User Id is " + papID);
@@ -423,8 +447,8 @@ public class RESTfulPAPEngine extends StdPDPItemSetChangeNotifier implements PAP
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
if (collectionTypeClass != null) {
// collection of objects expected
- final CollectionType javaType =
- mapper.getTypeFactory().constructCollectionType(collectionTypeClass, responseContentClass);
+ final CollectionType javaType = mapper.getTypeFactory()
+ .constructCollectionType(collectionTypeClass, responseContentClass);
return mapper.readValue(json, javaType);
} else {
// single value object expected
@@ -435,10 +459,10 @@ public class RESTfulPAPEngine extends StdPDPItemSetChangeNotifier implements PAP
// redirection
String newURL = connection.getHeaderField("Location");
if (newURL == null) {
- LOGGER
- .error("No Location header to redirect to when response code=" + connection.getResponseCode());
+ LOGGER.error(
+ "No Location header to redirect to when response code=" + connection.getResponseCode());
throw new IOException(
- "No redirect Location header when response code=" + connection.getResponseCode());
+ "No redirect Location header when response code=" + connection.getResponseCode());
}
int qIndex = newURL.indexOf('?');
if (qIndex > 0) {
@@ -447,10 +471,10 @@ public class RESTfulPAPEngine extends StdPDPItemSetChangeNotifier implements PAP
LOGGER.info("Redirect seen. Redirecting " + fullURL + " to " + newURL);
return newURL;
} else {
- LOGGER.warn("Unexpected response code: " + connection.getResponseCode() + " message: " + connection
- .getResponseMessage());
+ LOGGER.warn("Unexpected response code: " + connection.getResponseCode() + " message: "
+ + connection.getResponseMessage());
throw new IOException(
- "Server Response: " + connection.getResponseCode() + ": " + connection.getResponseMessage());
+ "Server Response: " + connection.getResponseCode() + ": " + connection.getResponseMessage());
}
} catch (Exception e) {
LOGGER.error(XACMLErrorConstants.ERROR_SYSTEM_ERROR + "HTTP Request/Response to PAP: " + e, e);
@@ -479,9 +503,9 @@ public class RESTfulPAPEngine extends StdPDPItemSetChangeNotifier implements PAP
// Send our current policy configuration
//
try (OutputStream os = connection.getOutputStream()) {
- int count = IOUtils.copy(contentObj, os);
+ int count = IOUtils.copy(contentObj, os);
if (LOGGER.isDebugEnabled()) {
- LOGGER.debug("copied to output, bytes="+count);
+ LOGGER.debug("copied to output, bytes=" + count);
}
}
} catch (Exception e) {
@@ -492,11 +516,12 @@ public class RESTfulPAPEngine extends StdPDPItemSetChangeNotifier implements PAP
private String getJsonString(final HttpURLConnection connection) throws IOException {
String json;
// read the inputStream into a buffer (trick found online scans entire input looking for end-of-file)
- try(java.util.Scanner scanner = new java.util.Scanner(connection.getInputStream())) {
+ try (java.util.Scanner scanner = new java.util.Scanner(connection.getInputStream())) {
scanner.useDelimiter("\\A");
json = scanner.hasNext() ? scanner.next() : "";
- } catch (Exception e){
- LOGGER.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Failed to read inputStream from connection: " + e, e);
+ } catch (Exception e) {
+ LOGGER.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Failed to read inputStream from connection: " + e,
+ e);
throw e;
}
LOGGER.info("JSON response from PAP: " + json);
diff --git a/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/AutoPushController.java b/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/AutoPushController.java
index 3af430f45..44a133068 100644
--- a/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/AutoPushController.java
+++ b/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/AutoPushController.java
@@ -8,9 +8,9 @@
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -21,6 +21,11 @@
package org.onap.policy.controller;
+import com.att.research.xacml.api.pap.PAPException;
+import com.att.research.xacml.api.pap.PDPPolicy;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
@@ -37,14 +42,12 @@ import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
-
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;
import javax.script.SimpleBindings;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-
import org.json.JSONObject;
import org.onap.policy.common.logging.flexlogger.FlexLogger;
import org.onap.policy.common.logging.flexlogger.Logger;
@@ -70,14 +73,8 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
-import com.att.research.xacml.api.pap.PAPException;
-import com.att.research.xacml.api.pap.PDPPolicy;
-import com.fasterxml.jackson.databind.DeserializationFeature;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
@Controller
-@RequestMapping({ "/" })
+@RequestMapping({"/"})
public class AutoPushController extends RestrictedBaseController {
private static final Logger logger = FlexLogger.getLogger(AutoPushController.class);
@@ -117,8 +114,8 @@ public class AutoPushController extends RestrictedBaseController {
return policyController != null ? getPolicyController() : new PolicyController();
}
- @RequestMapping(value = {"/get_AutoPushPoliciesContainerData"}, method = {
- RequestMethod.GET}, produces = MediaType.APPLICATION_JSON_VALUE)
+ @RequestMapping(value = {"/get_AutoPushPoliciesContainerData"}, method = {RequestMethod.GET},
+ produces = MediaType.APPLICATION_JSON_VALUE)
public void getPolicyGroupContainerData(HttpServletRequest request, HttpServletResponse response) {
try {
Set<String> scopes = new HashSet<>();
@@ -133,10 +130,7 @@ public class AutoPushController extends RestrictedBaseController {
for (Object role : userRoles) {
Roles userRole = (Roles) role;
roles.add(userRole.getRole());
- scopes.addAll(Stream.of(userRole.getScope().split(","))
- .map(String::new)
- .collect(Collectors.toSet())
- );
+ scopes.addAll(Stream.of(userRole.getScope().split(",")).collect(Collectors.toSet()));
}
if (roles.contains("super-admin") || roles.contains("super-editor") || roles.contains("super-guest")) {
data = commonClassDao.getData(PolicyVersion.class);
@@ -155,7 +149,7 @@ public class AutoPushController extends RestrictedBaseController {
} else {
PolicyVersion emptyPolicyName = new PolicyVersion();
emptyPolicyName
- .setPolicyName("Please Contact Policy Super Admin, There are no scopes assigned to you");
+ .setPolicyName("Please Contact Policy Super Admin, There are no scopes assigned to you");
data.add(emptyPolicyName);
}
}
@@ -169,7 +163,7 @@ public class AutoPushController extends RestrictedBaseController {
}
}
- @RequestMapping(value = { "/auto_Push/PushPolicyToPDP.htm" }, method = { RequestMethod.POST })
+ @RequestMapping(value = {"/auto_Push/PushPolicyToPDP.htm"}, method = {RequestMethod.POST})
public ModelAndView pushPolicyToPDPGroup(HttpServletRequest request, HttpServletResponse response)
throws IOException {
try {
@@ -201,8 +195,8 @@ public class AutoPushController extends RestrictedBaseController {
for (Object policyId : adapter.getPolicyDatas()) {
LinkedHashMap<?, ?> selected = (LinkedHashMap<?, ?>) policyId;
- String policyName = selected.get("policyName").toString() + "."
- + selected.get("activeVersion").toString() + ".xml";
+ String policyName =
+ selected.get("policyName").toString() + "." + selected.get("activeVersion").toString() + ".xml";
selectedPoliciesInUI.add(policyName);
}
@@ -312,7 +306,7 @@ public class AutoPushController extends RestrictedBaseController {
currentPoliciesInGroup.addAll(selectedPolicies);
updatedGroupObject.setPolicies(currentPoliciesInGroup);
- this.container.updateGroup(updatedGroupObject);
+ this.container.updateGroup(updatedGroupObject, userId);
response.setCharacterEncoding(UTF8);
response.setContentType("application / json");
@@ -340,7 +334,7 @@ public class AutoPushController extends RestrictedBaseController {
}
@SuppressWarnings("unchecked")
- @RequestMapping(value = { "/auto_Push/remove_GroupPolicies.htm" }, method = { RequestMethod.POST })
+ @RequestMapping(value = {"/auto_Push/remove_GroupPolicies.htm"}, method = {RequestMethod.POST})
public ModelAndView removePDPGroup(HttpServletRequest request, HttpServletResponse response) throws IOException {
try {
PolicyController controller = getPolicyControllerInstance();
@@ -362,9 +356,9 @@ public class AutoPushController extends RestrictedBaseController {
policyContainer = new PDPPolicyContainer(group);
if (removePolicyData.size() > 0) {
IntStream.range(0, removePolicyData.size()).mapToObj(i -> removePolicyData.get(i).toString())
- .forEach(polData -> this.policyContainer.removeItem(polData));
- Set<PDPPolicy> changedPolicies = new HashSet<>(
- (Collection<PDPPolicy>) this.policyContainer.getItemIds());
+ .forEach(polData -> this.policyContainer.removeItem(polData));
+ Set<PDPPolicy> changedPolicies =
+ new HashSet<>((Collection<PDPPolicy>) this.policyContainer.getItemIds());
StdPDPGroup updatedGroupObject = new StdPDPGroup(group.getId(), group.isDefaultGroup(), group.getName(),
group.getDescription(), null);
updatedGroupObject.setPolicies(changedPolicies);
diff --git a/POLICY-SDK-APP/src/main/java/org/onap/policy/model/PDPGroupContainer.java b/POLICY-SDK-APP/src/main/java/org/onap/policy/model/PDPGroupContainer.java
index c751c472b..e6c375808 100644
--- a/POLICY-SDK-APP/src/main/java/org/onap/policy/model/PDPGroupContainer.java
+++ b/POLICY-SDK-APP/src/main/java/org/onap/policy/model/PDPGroupContainer.java
@@ -2,14 +2,14 @@
* ============LICENSE_START=======================================================
* ONAP Policy Engine
* ================================================================================
- * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2017-2019 AT&T Intellectual Property. All rights reserved.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -21,6 +21,7 @@
package org.onap.policy.model;
+import com.att.research.xacml.api.pap.PAPException;
import java.awt.Checkbox;
import java.util.ArrayList;
import java.util.Collection;
@@ -28,7 +29,6 @@ import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
-
import org.onap.policy.common.logging.flexlogger.FlexLogger;
import org.onap.policy.common.logging.flexlogger.Logger;
import org.onap.policy.rest.util.PolicyContainer;
@@ -38,175 +38,185 @@ import org.onap.policy.xacml.api.pap.OnapPDP;
import org.onap.policy.xacml.api.pap.OnapPDPGroup;
import org.onap.policy.xacml.api.pap.PAPPolicyEngine;
-import com.att.research.xacml.api.pap.PAPException;
-import com.att.research.xacml.api.pap.PDP;
-import com.att.research.xacml.api.pap.PDPPIPConfig;
-import com.att.research.xacml.api.pap.PDPPolicy;
-
-public class PDPGroupContainer extends PolicyItemSetChangeNotifier implements PolicyContainer.Indexed, PolicyContainer.ItemSetChangeNotifier {
- private static final long serialVersionUID = 1L;
- private static final Logger LOGGER = FlexLogger.getLogger(PDPGroupContainer.class);
-
+public class PDPGroupContainer extends PolicyItemSetChangeNotifier
+ implements PolicyContainer.Indexed, PolicyContainer.ItemSetChangeNotifier {
+ private static final long serialVersionUID = 1L;
+ private static final Logger LOGGER = FlexLogger.getLogger(PDPGroupContainer.class);
+
/**
* String identifier of a file's "Id" property.
*/
- private static final String PROPERTY_ID = "Id";
+ private static final String PROPERTY_ID = "Id";
- /**
+ /**
* String identifier of a file's "name" property.
*/
- private static final String PROPERTY_NAME = "Name";
+ private static final String PROPERTY_NAME = "Name";
/**
* String identifier of a file's "Description" property.
*/
- private static final String PROPERTY_DESCRIPTION = "Description";
+ private static final String PROPERTY_DESCRIPTION = "Description";
/**
* String identifier of a file's "Default" property.
*/
- private static final String PROPERTY_DEFAULT = "Default";
+ private static final String PROPERTY_DEFAULT = "Default";
/**
* String identifier of a file's "Status" property.
*/
- private static final String PROPERTY_STATUS = "Status";
+ private static final String PROPERTY_STATUS = "Status";
/**
* String identifier of a file's "PDPs" property.
*/
- private static final String PROPERTY_PDPS = "PDPs";
+ private static final String PROPERTY_PDPS = "PDPs";
/**
* String identifier of a file's "Policies" property.
*/
- private static final String PROPERTY_POLICIES = "Policies";
+ private static final String PROPERTY_POLICIES = "Policies";
/**
* String identifier of a file's "PIP Configurations" property.
*/
- private static final String PROPERTY_PIPCONFIG = "PIP Configurations";
-
+ private static final String PROPERTY_PIPCONFIG = "PIP Configurations";
+
/**
* String identifier of a file's "Selected" property.
*/
- private static final String PROPERTY_SELECTED = "Selected";
+ private static final String PROPERTY_SELECTED = "Selected";
/**
* List of the string identifiers for the available properties.
*/
- private static Collection<String> pDPProperties;
+ private static Collection<String> pDPProperties;
+
+ private transient PAPPolicyEngine papEngine = null;
+ protected transient List<OnapPDPGroup> groups = Collections.synchronizedList(new ArrayList<OnapPDPGroup>());
- private transient PAPPolicyEngine papEngine = null;
- protected transient List<OnapPDPGroup> groups = Collections.synchronizedList(new ArrayList<OnapPDPGroup>());
-
public PDPGroupContainer(PAPPolicyEngine papPolicyEngine) {
- super();
- this.setContainer(this);
- //
- //
- //
- this.papEngine = papPolicyEngine;
- //
- //
- //
- this.refreshGroups();
- }
-
+ super();
+ this.setContainer(this);
+ //
+ //
+ //
+ this.papEngine = papPolicyEngine;
+ //
+ //
+ //
+ this.refreshGroups();
+ }
+
public boolean isSupported(Object itemId) {
- return itemId instanceof OnapPDPGroup;
- }
-
- public synchronized void refreshGroups() {
- synchronized(this.groups) {
- this.groups.clear();
- try {
- this.groups.addAll(this.papEngine.getOnapPDPGroups());
- } catch (PAPException e) {
- String message = "Unable to retrieve Groups from server: " + e;
- LOGGER.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + message, e);
- }
- LOGGER.info("refreshGroups");
- }
- //
- // Notify that we have changed
- //
- this.fireItemSetChange();
- }
-
- public List<OnapPDPGroup> getGroups() {
- return Collections.unmodifiableList(this.groups);
- }
-
- public void makeDefault(OnapPDPGroup group) {
- try {
- this.papEngine.setDefaultGroup(group);
- } catch (PAPException e) {
- String message = "Unable to set Default Group on server: " + e;
- LOGGER.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + message, e);
- }
- return;
- }
-
- public void removeGroup(OnapPDPGroup group, OnapPDPGroup newGroup) throws PAPException {
- if (LOGGER.isTraceEnabled()) {
- LOGGER.trace("removeGroup: " + group + " new group for PDPs: " + newGroup);
- }
- if (group.isDefaultGroup()) {
- throw new UnsupportedOperationException("You can't remove the Default Group.");
- }
- try {
- this.papEngine.removeGroup(group, newGroup);
- } catch (NullPointerException | PAPException e) {
- LOGGER.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Failed to removeGroup " + group.getId(), e);
- throw new PAPException("Failed to remove group '" + group.getId()+ "'", e);
- }
- }
-
- public void removePDP(OnapPDP pdp, OnapPDPGroup group) throws PAPException {
- if (LOGGER.isTraceEnabled()) {
- LOGGER.trace("removePDP: " + pdp + " from group: " + group);
- }
- try {
- this.papEngine.removePDP(pdp);
- } catch (PAPException e) {
- LOGGER.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Failed to removePDP " + pdp.getId(), e);
- throw new PAPException("Failed to remove pdp '" + pdp.getId()+ "'", e);
- }
- }
-
- public void updatePDP(OnapPDP pdp) {
- try {
- papEngine.updatePDP(pdp);
- } catch (PAPException e) {
- LOGGER.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + e);
- }
- }
-
- public void updateGroup(OnapPDPGroup group) {
- try {
- papEngine.updateGroup(group);
- } catch (PAPException e) {
- LOGGER.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + e);
- }
- }
-
- @Override
- public Collection<?> getContainerPropertyIds() {
- return pDPProperties;
- }
-
- @Override
- public Collection<?> getItemIds() {
- final Collection<Object> items = new ArrayList<>();
- items.addAll(this.groups);
- if (LOGGER.isTraceEnabled()) {
- LOGGER.trace("getItemIds: " + items);
- }
- return Collections.unmodifiableCollection(items);
- }
-
- @Override
- public Class<?> getType(Object propertyId) {
+ return itemId instanceof OnapPDPGroup;
+ }
+
+ public synchronized void refreshGroups() {
+ synchronized (this.groups) {
+ this.groups.clear();
+ try {
+ this.groups.addAll(this.papEngine.getOnapPDPGroups());
+ } catch (PAPException e) {
+ String message = "Unable to retrieve Groups from server: " + e;
+ LOGGER.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + message, e);
+ }
+ LOGGER.info("refreshGroups");
+ }
+ //
+ // Notify that we have changed
+ //
+ this.fireItemSetChange();
+ }
+
+ public List<OnapPDPGroup> getGroups() {
+ return Collections.unmodifiableList(this.groups);
+ }
+
+ public void makeDefault(OnapPDPGroup group) {
+ try {
+ this.papEngine.setDefaultGroup(group);
+ } catch (PAPException e) {
+ String message = "Unable to set Default Group on server: " + e;
+ LOGGER.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + message, e);
+ }
+ return;
+ }
+
+ public void removeGroup(OnapPDPGroup group, OnapPDPGroup newGroup) throws PAPException {
+ if (LOGGER.isTraceEnabled()) {
+ LOGGER.trace("removeGroup: " + group + " new group for PDPs: " + newGroup);
+ }
+ if (group.isDefaultGroup()) {
+ throw new UnsupportedOperationException("You can't remove the Default Group.");
+ }
+ try {
+ this.papEngine.removeGroup(group, newGroup);
+ } catch (NullPointerException | PAPException e) {
+ LOGGER.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Failed to removeGroup " + group.getId(), e);
+ throw new PAPException("Failed to remove group '" + group.getId() + "'", e);
+ }
+ }
+
+ public void removePDP(OnapPDP pdp, OnapPDPGroup group) throws PAPException {
+ if (LOGGER.isTraceEnabled()) {
+ LOGGER.trace("removePDP: " + pdp + " from group: " + group);
+ }
+ try {
+ this.papEngine.removePDP(pdp);
+ } catch (PAPException e) {
+ LOGGER.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Failed to removePDP " + pdp.getId(), e);
+ throw new PAPException("Failed to remove pdp '" + pdp.getId() + "'", e);
+ }
+ }
+
+ public void updatePDP(OnapPDP pdp) {
+ try {
+ papEngine.updatePDP(pdp);
+ } catch (PAPException e) {
+ LOGGER.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + e);
+ }
+ }
+
+ public void updateGroup(OnapPDPGroup group) {
+ try {
+ papEngine.updateGroup(group);
+ } catch (PAPException e) {
+ LOGGER.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + e);
+ }
+ }
+
+ /**
+ * Update group.
+ *
+ * @param group the group
+ * @param userName the user name
+ */
+ public void updateGroup(OnapPDPGroup group, String userName) {
+ try {
+ papEngine.updateGroup(group, userName);
+ } catch (PAPException e) {
+ LOGGER.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + e);
+ }
+ }
+
+ @Override
+ public Collection<?> getContainerPropertyIds() {
+ return pDPProperties;
+ }
+
+ @Override
+ public Collection<?> getItemIds() {
+ final Collection<Object> items = new ArrayList<>();
+ items.addAll(this.groups);
+ if (LOGGER.isTraceEnabled()) {
+ LOGGER.trace("getItemIds: " + items);
+ }
+ return Collections.unmodifiableCollection(items);
+ }
+
+ @Override
+ public Class<?> getType(Object propertyId) {
if (propertyId.equals(PROPERTY_ID)) {
return String.class;
}
@@ -235,224 +245,226 @@ public class PDPGroupContainer extends PolicyItemSetChangeNotifier implements Po
return Checkbox.class;
}
return null;
- }
-
- @Override
- public int size() {
- return this.groups.size();
- }
-
- @Override
- public boolean containsId(Object itemId) {
- if (LOGGER.isTraceEnabled()) {
- LOGGER.trace("containsId: " + itemId);
- }
- if (! this.isSupported(itemId)) {
- return false;
- }
- return this.groups.contains(itemId);
- }
-
- @Override
- public Object addItem() {
- throw new UnsupportedOperationException("PDP Container cannot add a given item.");
- }
-
- public void addNewGroup(String name, String description) throws PAPException {
- if (LOGGER.isTraceEnabled()) {
- LOGGER.trace("addNewGroup " + name + " " + description);
- }
- this.papEngine.newGroup(name, description);
- }
-
- public void addNewPDP(String id, OnapPDPGroup group, String name, String description, int jmxport) throws PAPException {
- if (LOGGER.isTraceEnabled()) {
- LOGGER.trace("addNewPDP " + id + " " + name + " " + description + " " + jmxport);
- }
- this.papEngine.newPDP(id, group, name, description, jmxport);
- }
-
- public void movePDP(OnapPDP pdp, OnapPDPGroup group) {
- try {
- this.papEngine.movePDP(pdp, group);
- } catch (PAPException e) {
- String message = "Unable to move PDP to new group on server: " + e;
- LOGGER.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + message, e);
- }
- return;
- }
-
- @Override
- public boolean addContainerProperty(Object propertyId, Class<?> type, Object defaultValue) {
- throw new UnsupportedOperationException("Cannot add a container property.");
- }
-
- @Override
- public boolean removeContainerProperty(Object propertyId) {
- throw new UnsupportedOperationException("Cannot remove a container property.");
- }
-
- @Override
- public boolean removeAllItems() {
- throw new UnsupportedOperationException("PDP Container cannot remove all items. You must have at least the Default group.");
- }
-
- @Override
- public void addItemSetChangeListener(ItemSetChangeListener listener) {
+ }
+
+ @Override
+ public int size() {
+ return this.groups.size();
+ }
+
+ @Override
+ public boolean containsId(Object itemId) {
+ if (LOGGER.isTraceEnabled()) {
+ LOGGER.trace("containsId: " + itemId);
+ }
+ if (!this.isSupported(itemId)) {
+ return false;
+ }
+ return this.groups.contains(itemId);
+ }
+
+ @Override
+ public Object addItem() {
+ throw new UnsupportedOperationException("PDP Container cannot add a given item.");
+ }
+
+ public void addNewGroup(String name, String description) throws PAPException {
+ if (LOGGER.isTraceEnabled()) {
+ LOGGER.trace("addNewGroup " + name + " " + description);
+ }
+ this.papEngine.newGroup(name, description);
+ }
+
+ public void addNewPDP(String id, OnapPDPGroup group, String name, String description, int jmxport)
+ throws PAPException {
+ if (LOGGER.isTraceEnabled()) {
+ LOGGER.trace("addNewPDP " + id + " " + name + " " + description + " " + jmxport);
+ }
+ this.papEngine.newPDP(id, group, name, description, jmxport);
+ }
+
+ public void movePDP(OnapPDP pdp, OnapPDPGroup group) {
+ try {
+ this.papEngine.movePDP(pdp, group);
+ } catch (PAPException e) {
+ String message = "Unable to move PDP to new group on server: " + e;
+ LOGGER.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + message, e);
+ }
+ return;
+ }
+
+ @Override
+ public boolean addContainerProperty(Object propertyId, Class<?> type, Object defaultValue) {
+ throw new UnsupportedOperationException("Cannot add a container property.");
+ }
+
+ @Override
+ public boolean removeContainerProperty(Object propertyId) {
+ throw new UnsupportedOperationException("Cannot remove a container property.");
+ }
+
+ @Override
+ public boolean removeAllItems() {
+ throw new UnsupportedOperationException(
+ "PDP Container cannot remove all items. You must have at least the Default group.");
+ }
+
+ @Override
+ public void addItemSetChangeListener(ItemSetChangeListener listener) {
if (getItemSetChangeListeners() == null) {
setItemSetChangeListeners(new LinkedList<PolicyContainer.ItemSetChangeListener>());
}
- getItemSetChangeListeners().add(listener);
- }
-
- @Override
- public Object nextItemId(Object itemId) {
- if (! this.isSupported(itemId)) {
- return null;
- }
- int index = this.groups.indexOf(itemId);
- if (index == -1) {
- //
- // We don't know this group
- //
- return null;
- }
- //
- // Is it the last one?
- //
- if (index == this.groups.size() - 1) {
- //
- // Yes
- //
- return null;
- }
- //
- // Return the next one
- //
- return this.groups.get(index + 1);
- }
-
- @Override
- public Object prevItemId(Object itemId) {
- if (! this.isSupported(itemId)) {
- return null;
- }
- int index = this.groups.indexOf(itemId);
- if (index == -1) {
- //
- // We don't know this group
- //
- return null;
- }
- //
- // Is it the first one?
- //
- if (index == 0) {
- //
- // Yes
- //
- return null;
- }
- //
- // Return the previous one
- //
- return this.groups.get(index - 1);
- }
-
- @Override
- public Object firstItemId() {
- synchronized (this.groups) {
- if (!this.groups.isEmpty()) {
- return this.groups.get(0);
- }
- }
- return null;
- }
-
- @Override
- public Object lastItemId() {
- synchronized (this.groups) {
- if (!this.groups.isEmpty()) {
- return this.groups.get(this.groups.size() - 1);
- }
- }
- return null;
- }
-
- @Override
- public boolean isFirstId(Object itemId) {
- synchronized (this.groups) {
- if (!this.groups.isEmpty()) {
- return this.groups.get(0).equals(itemId);
- }
- }
- return false;
- }
-
- @Override
- public boolean isLastId(Object itemId) {
- synchronized (this.groups) {
- if (!this.groups.isEmpty()) {
- return this.groups.get(this.groups.size() - 1).equals(itemId);
- }
- }
- return false;
- }
-
- @Override
- public Object addItemAfter(Object previousItemId) {
- throw new UnsupportedOperationException("Cannot addItemAfter, there really is no real ordering.");
- }
-
- @Override
- public int indexOfId(Object itemId) {
- return this.groups.indexOf(itemId);
- }
-
- @Override
- public Object getIdByIndex(int index) {
- return this.groups.get(index);
- }
-
- @Override
- public List<?> getItemIds(int startIndex, int numberOfItems) {
- synchronized (this.groups) {
- int endIndex = startIndex + numberOfItems;
- if (endIndex > this.groups.size()) {
- endIndex = this.groups.size() - 1;
- }
- return this.groups.subList(startIndex, endIndex);
- }
- }
-
- @Override
- public Object addItemAt(int index) {
- throw new UnsupportedOperationException("Cannot addItemAt");
- }
-
- @Override
- public boolean removeItem(Object itemId) {
- if (LOGGER.isTraceEnabled()) {
- LOGGER.trace("removeItem: " + itemId);
- }
- if (! this.isSupported(itemId)) {
- return false;
- }
- //
- // You cannot remove the default group
- //
- if (PROPERTY_DEFAULT.equals(((OnapPDPGroup) itemId).getId())) {
- throw new UnsupportedOperationException("You can't remove the Default Group.");
- }
- //
- // Remove PDPGroup and move any PDP's in it into the default group
- //
- try {
- this.papEngine.removeGroup((OnapPDPGroup) itemId, this.papEngine.getDefaultGroup());
- return true;
- } catch (NullPointerException | PAPException e) {
- LOGGER.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Failed to remove group", e);
- }
- return false;
- }
+ getItemSetChangeListeners().add(listener);
+ }
+
+ @Override
+ public Object nextItemId(Object itemId) {
+ if (!this.isSupported(itemId)) {
+ return null;
+ }
+ int index = this.groups.indexOf(itemId);
+ if (index == -1) {
+ //
+ // We don't know this group
+ //
+ return null;
+ }
+ //
+ // Is it the last one?
+ //
+ if (index == this.groups.size() - 1) {
+ //
+ // Yes
+ //
+ return null;
+ }
+ //
+ // Return the next one
+ //
+ return this.groups.get(index + 1);
+ }
+
+ @Override
+ public Object prevItemId(Object itemId) {
+ if (!this.isSupported(itemId)) {
+ return null;
+ }
+ int index = this.groups.indexOf(itemId);
+ if (index == -1) {
+ //
+ // We don't know this group
+ //
+ return null;
+ }
+ //
+ // Is it the first one?
+ //
+ if (index == 0) {
+ //
+ // Yes
+ //
+ return null;
+ }
+ //
+ // Return the previous one
+ //
+ return this.groups.get(index - 1);
+ }
+
+ @Override
+ public Object firstItemId() {
+ synchronized (this.groups) {
+ if (!this.groups.isEmpty()) {
+ return this.groups.get(0);
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public Object lastItemId() {
+ synchronized (this.groups) {
+ if (!this.groups.isEmpty()) {
+ return this.groups.get(this.groups.size() - 1);
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public boolean isFirstId(Object itemId) {
+ synchronized (this.groups) {
+ if (!this.groups.isEmpty()) {
+ return this.groups.get(0).equals(itemId);
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean isLastId(Object itemId) {
+ synchronized (this.groups) {
+ if (!this.groups.isEmpty()) {
+ return this.groups.get(this.groups.size() - 1).equals(itemId);
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public Object addItemAfter(Object previousItemId) {
+ throw new UnsupportedOperationException("Cannot addItemAfter, there really is no real ordering.");
+ }
+
+ @Override
+ public int indexOfId(Object itemId) {
+ return this.groups.indexOf(itemId);
+ }
+
+ @Override
+ public Object getIdByIndex(int index) {
+ return this.groups.get(index);
+ }
+
+ @Override
+ public List<?> getItemIds(int startIndex, int numberOfItems) {
+ synchronized (this.groups) {
+ int endIndex = startIndex + numberOfItems;
+ if (endIndex > this.groups.size()) {
+ endIndex = this.groups.size() - 1;
+ }
+ return this.groups.subList(startIndex, endIndex);
+ }
+ }
+
+ @Override
+ public Object addItemAt(int index) {
+ throw new UnsupportedOperationException("Cannot addItemAt");
+ }
+
+ @Override
+ public boolean removeItem(Object itemId) {
+ if (LOGGER.isTraceEnabled()) {
+ LOGGER.trace("removeItem: " + itemId);
+ }
+ if (!this.isSupported(itemId)) {
+ return false;
+ }
+ //
+ // You cannot remove the default group
+ //
+ if (PROPERTY_DEFAULT.equals(((OnapPDPGroup) itemId).getId())) {
+ throw new UnsupportedOperationException("You can't remove the Default Group.");
+ }
+ //
+ // Remove PDPGroup and move any PDP's in it into the default group
+ //
+ try {
+ this.papEngine.removeGroup((OnapPDPGroup) itemId, this.papEngine.getDefaultGroup());
+ return true;
+ } catch (NullPointerException | PAPException e) {
+ LOGGER.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Failed to remove group", e);
+ }
+ return false;
+ }
}