Error while evaluating webservices before operation rule (400 bad request)

Hi,

I’m trying to implement a Before Operation rule in my Add Entitlement section. My code works fine for single entitlement requests or multiple individual requests. However, when it comes to an access profile that contains multiple entitlements, it returns a 400 Bad Request and mentions that the entitlements are already assigned.

The connector pushes the entitlements to the target system, but the changes don’t reflect back to the tenant. Here’s an example of the payload, and I’ve attached my code for your reference.

sample payload

[
    {
         "roleId":3.
         "productId":"T"
     },....
]
import sailpoint.object.ProvisioningPlan.AccountRequest;
import sailpoint.object.ProvisioningPlan.AttributeRequest;
import sailpoint.tools.GeneralException;
import sailpoint.tools.xml.PersistentArrayList;
import org.apache.commons.lang3.StringUtils;

import java.util.List;
import java.util.Map;
import java.util.HashMap;

try {
    Map payload = new HashMap();

    if (provisioningPlan != null) {
        log.info("Rule - Modify Body: plan is not null");

        for (AccountRequest accReq : provisioningPlan.getAccountRequests()) {
            log.info("Rule - Modify Body: iterating over account request");

            for (AttributeRequest attReq : accReq.getAttributeRequests()) {
                if ("roles-products".equalsIgnoreCase(attReq.getName())) {
                    Object value = attReq.getValue();

                    if (value instanceof PersistentArrayList) {
                        PersistentArrayList rolesProductList = (PersistentArrayList) value;

                        if (rolesProductList != null && !rolesProductList.isEmpty()) {
                            StringBuilder jsonStringBuilder = new StringBuilder();
                            jsonStringBuilder.append("[\r\n");

                            for (int i = 0; i < rolesProductList.size(); i++) {
                                String roleProduct = (String) rolesProductList.get(i);
                                String[] parts = roleProduct.split(":");

                                if (parts.length == 2) {
                                    String roleId = parts[0].trim();
                                    String productId = parts[1].trim();

                                    jsonStringBuilder.append("{\r\n");
                                    jsonStringBuilder.append("\"roleId\": ").append(roleId).append(",\r\n");
                                    jsonStringBuilder.append("\"productId\": ").append(productId).append("\r\n");
                                    jsonStringBuilder.append("}");

                                    if (i < rolesProductList.size() - 1) {
                                        jsonStringBuilder.append(",\r\n");
                                    } else {
                                        jsonStringBuilder.append("\r\n");
                                    }
                                } else {
                                    log.error("Invalid format in roles-products value: " + roleProduct + ", expected 'role:product'");
                                    throw new GeneralException("Invalid roles-products format, expected 'role:product' but found: " + roleProduct);
                                }
                            }

                            jsonStringBuilder.append("]");
                            String jsonBody = jsonStringBuilder.toString();
                            payload.put("jsonBody", jsonBody);
                            log.info("Payload set for account request: " + jsonBody);

                            _requestEndPoint.setBody(payload);
                        } else {
                            log.error("roles-products list is empty or null for account request.");
                            throw new GeneralException("roles-products list is empty or null for account request.");
                        }
                    } else if (value instanceof String) {
                        String roleProduct = (String) value;
                        String[] parts = roleProduct.split(":");

                        if (parts.length == 2) {
                            String roleId = parts[0].trim();
                            String productId = parts[1].trim();

                            StringBuilder jsonStringBuilder = new StringBuilder();
                            jsonStringBuilder.append("[\r\n");
                            jsonStringBuilder.append("{\r\n");
                            jsonStringBuilder.append("\"roleId\": ").append(roleId).append(",\r\n");
                            jsonStringBuilder.append("\"productId\": ").append(productId).append("\r\n");
                            jsonStringBuilder.append("}\r\n");
                            jsonStringBuilder.append("]");

                            String jsonBody = jsonStringBuilder.toString();
                            payload.put("jsonBody", jsonBody);
                            log.info("Payload set for account request: " + jsonBody);

                            requestEndPoint.setBody(payload);
                        } else {
                            log.error("Invalid format in roles-products value: " + roleProduct + ", expected 'role:product'");
                            throw new GeneralException("Invalid roles-products format, expected 'role:product' but found: " + roleProduct);
                        }
                    } else {
                        log.error("Unexpected type for roles-products attribute value: " + value.getClass().getName());
                        throw new GeneralException("Unexpected type for roles-products attribute value: " + value.getClass().getName());
                    }
                }
            }
        }
    } else {
        log.error("No account requests found in the provisioning plan.");
        throw new GeneralException("No account requests found in the provisioning plan.");
    }

    log.info("Final payload for request: " + payload);
} catch (GeneralException e) {
    log.error("Error processing provisioning plan", e);
    throw new GeneralException("Error processing provisioning plan", e);
}

return requestEndPoint;

Let me know if you need further edits or clarifications!

Don’t you need "" around the values being passed for roleID and productID?

Something like:

jsonStringBuilder.append("\"roleId\": \"").append(roleId).append(\"",\r\`
1 Like

This topic was automatically closed 60 days after the last reply. New replies are no longer allowed.