In this blog you can find, how to add or remove child record in OIM
accounts using API. In this example I used AD connectors, but it is applicable to any connectors.
Adding child record:
private String APP_INSTANCE_NAME = "ActiveDirectory";
private String CHILD_TABLE_FIELD_NAME = "UD_ADUSRC_GROUPNAME";
private String CHILD_TABLE_NAME = "UD_ADUSRC";
/**
* userLogin: USR_LOGIN value
* accountName: account login name e.g. UD_ADUSER_UID for AD account
* childRecords: String contains List of child data with comma separated.
*/
public void addChildRecord(String userLogin,String accountName, String childRecords) {
try {
ProvisioningService provAPI = oimClient.getService(ProvisioningService.class);
Account acc = null;
List accList = provAPI.getAccountsProvisionedToUser(getUserKeybyUserLogin(userLogin));
for (Account account : accList){
if (account.getAccountDescriptiveField().equalsIgnoreCase(accountName) &&
account.getAppInstance().getApplicationInstanceName().equalsIgnoreCase(APP_INSTANCE_NAME) &&
(account.getAccountStatus().equalsIgnoreCase("Provisioned") ||
account.getAccountStatus().equalsIgnoreCase("Enabled") ||
account.getAccountStatus().equalsIgnoreCase("Disabled"))){
acc = provAPI.getAccountDetails(Long.parseLong(account.getAccountID()));
}
}
System.out.println("App :: " + acc.getAppInstance().getApplicationInstanceName());
AccountData accData = acc.getAccountData();
ArrayList childArray = new ArrayList();
String[] childRecordList = childRecords.split(",");
for (int k = 0; k < childRecordList.length; k++) {
ChildTableRecord newChild = new ChildTableRecord();
Map val1 = new HashMap();
val1.put(CHILD_TABLE_FIELD_NAME,childRecordList[k].toString());
newChild.setChildData(val1);
newChild.setAction(ChildTableRecord.ACTION.Add);
childArray.add(newChild);
}
System.out.println("childArray size :: " + childArray.size());
Map> childData = new HashMap>();
childData.put(CHILD_TABLE_NAME, childArray);
accData.setChildData(childData);
acc.setAccountData(accData);
provAPI.modify(acc);
System.out.println(" ===== Account Name :: " + acc.getAccountDescriptiveField() + " updated");
} catch (Exception e) {
e.printStackTrace();
}
}
Removing child records
private String APP_INSTANCE_NAME = "ActiveDirectory";
private String CHILD_TABLE_FIELD_NAME = "UD_ADUSRC_GROUPNAME";
private String CHILD_TABLE_NAME = "UD_ADUSRC";
/**
* userLogin: USR_LOGIN value
* accountName: account login name e.g. UD_ADUSER_UID for AD account
* childRecords: String contains List of child data with comma separated.
*/
public void deleteChildRecord(String userLogin,String accountName, String childRecords) {
try {
ProvisioningService provAPI = oimClient.getService(ProvisioningService.class);
Account acc = null;
List accList = provAPI.getAccountsProvisionedToUser(getUserKeybyUserLogin(userLogin));
for (Account account : accList){
if (account.getAccountDescriptiveField().equalsIgnoreCase(accountName) &&
account.getAppInstance().getApplicationInstanceName().equalsIgnoreCase(APP_INSTANCE_NAME) &&
(account.getAccountStatus().equalsIgnoreCase("Provisioned") ||
account.getAccountStatus().equalsIgnoreCase("Enabled") ||
account.getAccountStatus().equalsIgnoreCase("Disabled"))){
acc = provAPI.getAccountDetails(Long.parseLong(account.getAccountID()));
}
}
System.out.println("App instance :: " + acc.getAppInstance().getApplicationInstanceName());
AccountData accData = acc.getAccountData();
ArrayList childRecArray = null;
Map> childDataMap = accData.getChildData();
for (Map.Entry> entry : childDataMap.entrySet()){
if (entry.getKey().equalsIgnoreCase(CHILD_TABLE_NAME)){
childRecArray = entry.getValue();
}
}
String[] childRecordList = childRecords.split(",");
ArrayList childArray = new ArrayList();
for (String childRecordToDelete : childRecordList) {
String row_key = null;
for (ChildTableRecord childRecord : childRecArray) {
Map childValMap = childRecord.getChildData();
if (childValMap.get(CHILD_TABLE_FIELD_NAME).toString().equalsIgnoreCase(childRecordToDelete)) {
row_key = childValMap.get(CHILD_TABLE_NAME+"_KEY").toString();
System.out.println("row_key to be deleted :: " + row_key);
}
}
if (row_key != null) {
ChildTableRecord newChild = new ChildTableRecord();
Map val1 = new HashMap();
val1.put(CHILD_TABLE_FIELD_NAME, childRecordToDelete);
newChild.setChildData(val1);
newChild.setAction(ChildTableRecord.ACTION.Delete);
newChild.setRowKey(row_key);
childArray.add(newChild);
}
}
if (childArray.size() > 0){
System.out.println("childArray size :: " + childArray.size());
Map> childData = new HashMap>();
childData.put(CHILD_TABLE_NAME, childArray);
accData.setChildData(childData);
acc.setAccountData(accData);
provAPI.modify(acc);
System.out.println(" ===== Account Name :: " +acc.getAccountDescriptiveField() + ": updated");
}else{
System.out.println(" ===== Account Name :: " +acc.getAccountDescriptiveField() + ": No data to delete");
}
} catch (Exception e) {
e.printStackTrace();
}
}
private String getUserKeybyUserLogin(String userLogin) throws Exception {
UserManager userAPI =
(UserManager)oimClient.getService(UserManager.class);
Set retAttrs = new HashSet();
User userDetails = userAPI.getDetails(userLogin, retAttrs, true);
return userDetails.getEntityId();
}