Lets assume we have a disconnected/connected application in OIM which is integrated using a custom connector. To perform the reconciliation for such a custom application a custom code is required to fetch the data from target and create reconciliation event.
This post is to illustrate the recon for a disconnected application using a flat file as a source of data.
- For disconnected application we‘ll need to find a mechanism to get the recon data from the application, simplest of this can be getting a text/csv file from the application team daily/weekly depending upon the recon schedule. For "connected application" we can connect directly to the application and fetch the data.
- Generate the recon profile for the application this includes adding the fields for reconciliation in the Object reconciliation tab of resource object.
For eg. We have 2 fields for recon - Account ID, Account Name. Adding ITResource field is very important for custom recon to work
- Create a recon rule and map the recon attribute with the user
profile attribute. Make sure the Active checkbox is checked.
- In Reconcilliation tab goto Reconcilliation Action Rules and do
the mapping as below.
- Update the reconciliation field mapping in the process
definition.
- Create a custom scheduled job. You can refer my post for creating a scheduled job in OIM.
- We are having below three arguments for the job. For eg:
- File Name (Complete path)
- ITResource Name (Mandatory)
- Resource Object Name (Mandatory)
- Write code to generate the custom recon events.
import Thor.API.Exceptions.tcAPIException; import Thor.API.Operations.tcProvisioningOperationsIntf; import Thor.API.Operations.tcUserOperationsIntf; import com.bea.security.providers.xacml.entitlement.parser.Roles; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.Vector; import oracle.iam.platform.Platform; import oracle.iam.reconciliation.api.BatchAttributes; import oracle.iam.reconciliation.api.EventAttributes; import oracle.iam.reconciliation.api.InputData; import oracle.iam.reconciliation.api.ReconOperationsService; import oracle.iam.reconciliation.api.ReconciliationResult; import oracle.iam.scheduler.vo.TaskSupport; public class dummyRecon extends TaskSupport { private tcUserOperationsIntf userOperation = null; private tcProvisioningOperationsIntf provisionOperation = null; private ReconOperationsService reconOperation; private Vector data = new Vector(); private String fileName; private String ItResource; private String resourceObjName; public dummyRecon() { } public void execute(HashMap hashMap) { this.fileName = hashMap.get("File Name").toString(); this.ItResource = hashMap.get("ITResource Name").toString();
this.resourceObjName= hashMap.get("Resource Object Name").toString();
initialize(); getReconData(); triggerRecon(); } private void initialize() { this.userOperation = ((tcUserOperationsIntf)Platform.getService(tcUserOperationsIntf.class)); this.provisionOperation = ((tcProvisioningOperationsIntf)Platform.getService(tcProvisioningOperationsIntf.class)); this.reconOperation = ((ReconOperationsService)Platform.getService(ReconOperationsService.class)); } public HashMap getAttributes() { return null; } public void setAttributes() { } private void getReconData() { String file = this.fileName; BufferedReader reader = null; try { reader = new BufferedReader(new FileReader(file)); int headerFieldCount = 0; String line = ""; while ((line = reader.readLine()) != null) { this.data.add(line.split("\\,")); } } catch (Exception e) { e.printStackTrace(); try { reader.close(); } catch (IOException ioe) { ioe.printStackTrace(); } catch (Exception e1) { e1.printStackTrace(); } } finally { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } } private void triggerRecon() { EventAttributes ea = new EventAttributes(); for (int i = 0; i < data.size(); i++) { String[] temp = (String[])data.get(i); MapreconMap = new HashMap (); reconMap.put("Account ID", temp[0]); reconMap.put("Account Name", temp[1]); reconMap.put("ITResource", this.ItResource); //Must Have this ea.setEventFinished(true); long eventKey = reconOperation.createReconciliationEvent(this. resourceObjName, reconMap, ea); try { reconOperation.processReconciliationEvent(eventKey); } catch (tcAPIException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } } }
If you have any questions or need more details, please update the comments. I will try my best to answer them.
-gaurav
-gaurav