Form appearing like below while raising request for Access Profile or entitlment.
As per above screen shot I want to read filed values like internal - Other etc. Developed a cloud rule (beforeProvisioningRule) and deployed on tenant and also developed WebServiceBeforeOperationRule to read the form for create account.
This is the Rule BeforeProvisioning Cloud Rule for Webservice Source deployed on tenant
Throuh this Rule trying to fetch form data and adding it to AccountRequest
log.debug(“WebserviceAppBeforeProvisioningRule:: Starting rule”);
try {
if (plan == null) {
log.error(“WebserviceAppBeforeProvisioningRule:: ProvisioningPlan is null”);
return;
}
List acctReqs = plan.getAccountRequests();
if (acctReqs == null || acctReqs.isEmpty()) {
log.debug("WebserviceAppBeforeProvisioningRule:: No AccountRequests found in plan");
return;
}
log.debug("WebserviceAppBeforeProvisioningRule:: Found " + acctReqs.size() + " AccountRequests in plan");
Map formDataToInject = null;
// Step 1: Extract form data from the plan
for (Object arObj : acctReqs) {
if (!(arObj instanceof AccountRequest)) {
continue;
}
AccountRequest acctReq = (AccountRequest) arObj;
String appName = acctReq.getApplicationName();
log.debug("WebserviceAppBeforeProvisioningRule:: Processing AccountRequest for application: " + appName);
// Check AttributeRequests first
List attrReqs = acctReq.getAttributeRequests();
if (attrReqs != null && !attrReqs.isEmpty()) {
for (Object atObj : attrReqs) {
if (!(atObj instanceof AttributeRequest)) {
continue;
}
AttributeRequest attrReq = (AttributeRequest) atObj;
Object argsObj = attrReq.getArguments();
// Cast to Map, not Attributes
if (argsObj instanceof Map) {
Map attrArgs = (Map) argsObj;
if (attrArgs.containsKey("IdnAccessRequestAttributes")) {
Object idnObj = attrArgs.get("IdnAccessRequestAttributes");
if (idnObj instanceof Map) {
Map idnArgs = (Map) idnObj;
Object formObj = idnArgs.get("form");
if (formObj instanceof Map) {
formDataToInject = (Map) formObj;
log.debug("WebserviceAppBeforeProvisioningRule:: Extracted form data from AttributeRequest in application: " + appName);
break;
}
}
}
}
}
}
if (formDataToInject != null) {
break;
}
// Fallback: Check AccountRequest arguments
Object acctArgsObj = acctReq.getArguments();
if (acctArgsObj instanceof Map) {
Map acctArgs = (Map) acctArgsObj;
if (acctArgs.containsKey("IdnAccessRequestAttributes")) {
Object idnObj = acctArgs.get("IdnAccessRequestAttributes");
if (idnObj instanceof Map) {
Map idnArgs = (Map) idnObj;
Object formObj = idnArgs.get("form");
if (formObj instanceof Map) {
formDataToInject = (Map) formObj;
log.debug("WebserviceAppBeforeProvisioningRule:: Extracted form data from AccountRequest in application: " + appName);
break;
}
}
}
}
}
// Step 2: Inject form data into target AccountRequests
if (formDataToInject != null) {
log.debug("WebserviceAppBeforeProvisioningRule:: Form data extracted successfully. Injecting into target AccountRequests");
for (Object arObj : acctReqs) {
if (!(arObj instanceof AccountRequest)) {
continue;
}
AccountRequest acctReq = (AccountRequest) arObj;
String appName = acctReq.getApplicationName();
if (appName != null &&
!"IdentityNow".equalsIgnoreCase(appName) &&
!"IIQ".equalsIgnoreCase(appName)) {
log.debug("WebserviceAppBeforeProvisioningRule:: Injecting AccessRequestFormData into AccountRequest for application: " + appName);
acctReq.addArgument("AccessRequestFormData", formDataToInject);
} else {
log.debug("WebserviceAppBeforeProvisioningRule:: Skipping internal application: " + appName);
}
}
} else {
log.debug("WebserviceAppBeforeProvisioningRule:: No form data extracted from the plan. Nothing to inject");
}
} catch (Exception e) {
log.error(“WebserviceAppBeforeProvisioningRule:: Unexpected error in BeforeProvisioning rule”, e);
}
log.debug(“WebserviceAppBeforeProvisioningRule:: Finished rule”);
]]>
This is Rule is WebServiceBeforeOperationRule
Here, need to fetch the form value that is selected while raising entitlement/Access Profile request.
import sailpoint.connector.webservices.EndPoint;
import sailpoint.object.ProvisioningPlan;
import sailpoint.object.ProvisioningPlan.AccountRequest;
import sailpoint.object.ProvisioningPlan.AttributeRequest;
import sailpoint.object.Attributes;
import java.net.HttpURLConnection;
import java.net.URL;
import java.io.OutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.util.Base64;
import java.util.List;
import java.util.Map;
import java.util.HashMap;
import java.util.*;
log.debug(“WebserviceApp_Before_Create Account: Rule started.”);
// ---------------------------------------------------------------
// Read and log all AttributeRequests from the Create AccountRequest
// ---------------------------------------------------------------
String firstName = null;
String lastName = null;
String username = null;
String emailAddress = null;
String personType =“3”;
Map innerForm = null;
Map formData = null;
List groupIds = new ArrayList();
if (provisioningPlan != void && provisioningPlan != null) {
if (provisioningPlan.getIdentity() != null) {
log.error("=> Provisioning Plan Identity: " + provisioningPlan.getIdentity().getName());
}
log.error("=> Provisioning Plan Target Integration: " + provisioningPlan.getTargetIntegration());
log.debug("=> Provisioning Plan Arguments: " + provisioningPlan.getArguments());
log.error("=> Provisioning Plan Integration Data: " + provisioningPlan.getIntegrationData());
Map planArgs = provisioningPlan.getArguments();
List accountRequests = provisioningPlan.getAccountRequests();
if (accountRequests != null && !accountRequests.isEmpty()) {
for (int i = 0; i < accountRequests.size(); i++) {
sailpoint.object.ProvisioningPlan.AccountRequest acctReq = accountRequests.get(i);
log.error(" -> Account Request [" + i + "]: Application=" + acctReq.getApplication() + ", NativeIdentity=" + acctReq.getNativeIdentity() + ", Operation=" + acctReq.getOperation());
if (acctReq.getArguments() != null) {
log.error(" Account Request Arguments Keys: " + acctReq.getArguments().keySet());
if (acctReq.getArguments().containsKey("AccessRequestFormData")) {
Map formData = (Map) acctReq.getArguments().get("AccessRequestFormData");
log.error(" => INJECTED FORM DATA FOUND!");
if (formData != null && formData.containsKey("formData")) {
Map innerForm = (Map) formData.get("formData");
log.error(" => Form Fields Available: " + innerForm.keySet());
for (Object key : innerForm.keySet()) {
log.error(" -> " + key + " : " + innerForm.get(key));
}
}
}
} else {
log.error(" Account Request Arguments: null");
}
List attrReqs = acctReq.getAttributeRequests();
if (attrReqs != null && !attrReqs.isEmpty()) {
for (int j = 0; j < attrReqs.size(); j++) {
sailpoint.object.ProvisioningPlan.AttributeRequest attrReq = attrReqs.get(j);
log.error(" => Attr Request [" + j + "]: Name=" + attrReq.getName() + ", Operation=" + attrReq.getOperation() + ", Value=" + attrReq.getValue());
log.error(" Attr Request Arguments: " + attrReq.getArguments());
}
} else {
log.error(" => No Attribute Requests.");
}
}
} else {
log.error(" -> No Account Requests.");
}
List objectRequests = provisioningPlan.getObjectRequests();
if (objectRequests != null && !objectRequests.isEmpty()) {
for (int k = 0; k < objectRequests.size(); k++) {
sailpoint.object.ProvisioningPlan.ObjectRequest objReq = objectRequests.get(k);
log.error(" -> Object Request [" + k + "]: Target=" + objReq.getTarget() + ", Operation=" + objReq.getOperation());
log.error(" Object Request Arguments: " + objReq.getArguments());
}
}
} else {
log.error(“=> Provisioning Plan: null or undefined in this rule.”);’
But we observed that acctReq.getArguments() is getting null or empty that block itself is not executing. Please do provde any assistance what went wrong.
}
// further we need to pass the values for create user
return requestEndPoint;

