Sviluppo di script personalizzati per le tabelle applicazioni di database (Oracle) mediante Groovy

Panoramica di Scripting personalizzato per tabelle applicazione database (Oracle)

Quando si esegue il provisioning degli account da Oracle Access Governance utilizzando l'integrazione delle tabelle dell'applicazione di database, operazioni quali creazione, aggiornamento ed eliminazione vengono implementate utilizzando il codice fornito predefinito. Nelle occasioni in cui si desidera modificare le operazioni predefinite fornite, è possibile facoltativamente fornire script personalizzati che implementano requisiti specifici delle operazioni di provisioning. Questa operazione è completamente opzionale e non è necessario creare script personalizzati se le operazioni predefinite forniscono ciò di cui si ha bisogno. È possibile aggiungere script personalizzati a qualsiasi operazione supportata. Se si scelgono script personalizzati, è necessario aggiungerli solo quando è necessario modificare l'operazione predefinita, è possibile disporre di una combinazione di script personalizzati e predefiniti per le operazioni supportate, anche se è possibile avere solo un'opzione o l'altra per ogni operazione specifica. Ad esempio, l'operazione create potrebbe essere implementata con uno script personalizzato che aggiunge alcune funzionalità specifiche dell'organizzazione, mentre l'operazione delete rimane invariata e utilizza la funzionalità predefinita.

Dopo aver implementato e configurato le tabelle dell'applicazione di database per l'uso di uno script personalizzato, tale script verrà utilizzato quando si esegue un'operazione di provisioning o caricamento dei dati.
Nota

Qualsiasi script personalizzato deve essere implementato utilizzando il formato Groovy. Altri formati di script non sono supportati.
Quando si crea un sistema orchestrato Tabelle applicazioni di database, è possibile identificare gli script da eseguire per una serie di operazioni di provisioning nell'applicazione di database contenente i dati dell'account. tra cui:
  • Crea
  • Aggiorna
  • Elimina
  • DataLoad
  • Aggiungi dati di relazione
  • Rimuovi dati di relazione
Questi script devono trovarsi sull'host dell'agente, nella directory di installazione dell'agente, ad esempio /app/<custom script> . È possibile configurare l'agente con la posizione degli script nelle impostazioni di integrazione per il sistema orchestrato. È necessario assicurarsi che l'utente del sistema operativo che esegue l'agente disponga delle autorizzazioni di lettura/scrittura per qualsiasi script personalizzato.
Quando si esegue un task di provisioning, lo script verrà eseguito in sostituzione dell'elaborazione standard associata al task. Lo script deve gestire il task di provisioning predefinito, ad esempio creazione o aggiornamento, e può anche avere task personalizzati al di sopra e oltre il processo di provisioning predefinito, ad esempio:
  • Esegui aggiornamenti personalizzati tabella
  • Audit personalizzato
  • Invia notifiche personalizzate
Ciò significa che sono disponibili due opzioni per l'elaborazione del provisioning mediante l'integrazione delle tabelle dell'applicazione di database:
  1. Utilizzare la logica predefinita fornita con il connettore Tabelle applicazioni database
  2. Utilizzare la logica personalizzata implementata negli script
Gli script personalizzati vengono utilizzati solo se configurati nel sistema orchestrato. Pertanto, se è stato specificato uno script di creazione durante la creazione del sistema orchestrato, ma non uno script per l'aggiornamento, lo script personalizzato verrà utilizzato per il task di creazione provisioning, mentre il task di aggiornamento verrà implementato utilizzando l'elaborazione del connettore predefinita.

Si noti inoltre che tutti i tipi di script personalizzati sono supportati per un sistema orchestrato configurato per la modalità di sistema gestito. L'unico tipo di script supportato per la modalità di origine affidabile è il tipo Dataload, che è supportato per entrambe le modalità.

Nota

Schema di database di esempio

I campioni forniti nelle sezioni seguenti si basano sulle tabelle di database descritte in questa sezione.

MYDBAT_PERSON

CREATE TABLE MYDBAT_PERSON
  (USERID VARCHAR2(50BYTE) NOT NULL ENABLE,
   USERNAME VARCHAR2(50BYTE) NOT NULL ENABLE,
   FIRSTNAME VARCHAR2(50BYTE),
   LASTNAME VARCHAR2(50BYTE),
   EMAIL VARCHAR2(50BYTE) NOT NULL ENABLE,
   COUNTRYCODE VARCHAR2(20BYTE),
   DESCRIPTION VARCHAR2(50BYTE),
   SALARY NUMBER,
   JOININGDATE DATE,
   STATUS VARCHAR2(50BYTE),
   LASTUPDATED TIMESTAMP (6),
   PASSWORD VARCHAR2(50BYTE),
   CONSTRAINT MYDBATPERSON_PK PRIMARY KEY (USERID));

MYDBAT_GROUPS

CREATE TABLE MYDBAT_GROUPS
  (GROUPID VARCHAR2(20BYTE) NOT NULL ENABLE,
   GROUPNAME VARCHAR2(20BYTE) NOT NULL ENABLE,
   CONSTRAINT MYDBATGROUPS_PK PRIMARY KEY (GROUPID));

MYDBAT_ROLES

CREATE TABLE MYDBAT_ROLES
  (ROLEID VARCHAR2(50BYTE) NOT NULL ENABLE,
   ROLENAME VARCHAR2(50BYTE) NOT NULL ENABLE,
   CONSTRAINT MYDBATROLES_PK PRIMARY KEY (ROLEID));

MYDBAT_PERSON_GROUP

CREATE TABLE MYDBAT_PERSON_GROUP
  (USERID VARCHAR2(20BYTE) NOT NULL ENABLE,
   GROUPID VARCHAR2(20BYTE) NOT NULL ENABLE,
   CONSTRAINT "MYDBATPERSONGROUP_PK"PRIMARY KEY (USERID, GROUPID));

MYDBAT_PERSON_ROLE

CREATE TABLE MYDBAT_PERSON_ROLE
  (USERID VARCHAR2(20BYTE) NOT NULL ENABLE,
   ROLEID VARCHAR2(20BYTE) NOT NULL ENABLE,
   FROMDATE DATE,
   TODATE DATE,
   CONSTRAINT "MYDBATPERSONROLE_PK"PRIMARY KEY (USERID, ROLEID));

MYDBAT_COUNTRY

CREATE TABLE MYDBAT_COUNTRY
  (COUNTRYCODE VARCHAR2(20BYTE) NOT NULL ENABLE,
   COUNTRYNAME VARCHAR2(200BYTE) NOT NULL ENABLE,
   CONSTRAINT MYDBAT_COUNTRY_PK PRIMARY KEY (COUNTRYCODE));
Nota

Per le tabelle figlio quali mydbat_roles, mydbat_groups e mydbat_country deve essere definito un vincolo di chiave primaria. Se non è definita alcuna chiave primaria per le tabelle figlio, l'operazione di convalida non riuscirà e verrà visualizzato un errore La chiave per la tabella <tablename> non è definita.

Trigger e sequenza per incremento automatico

Il codice seguente creerà una sequenza e un trigger che assegnerà automaticamente un USERID durante la creazione di un utente nella tabella MYDBAT_PERSON.
CREATE SEQUENCE MYDBAT_PERSON_SEQ MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT
      BY 1 START WITH 1 CACHE 20 NOORDER NOCYCLE;
create or replace TRIGGER DBAT_PERSON_TRG
BEFORE INSERT ON MYDBAT_PERSON
FOR EACH ROW
BEGIN
  <<COLUMN_SEQUENCES>>
  BEGIN IF INSERTING AND :NEW.USERID IS NULL THEN
    SELECT MYDBAT_PERSON_SEQ.NEXTVAL INTO :NEW.USERID FROM SYS.DUAL;
  END IF;
  END COLUMN_SEQUENCES;END;

Argomenti script Groovy

Negli script Groovy è possibile utilizzare i seguenti argomenti:

Argomenti dello script
Argomento Descrizione
connettore Oggetto connettore Tabelle applicazioni database.
tempificazione

Quando viene chiamato lo script Groovy. L'attributo timing spiega anche il tipo di operazione eseguita. Ad esempio, se si tratta di un'operazione di ricerca, viene restituita anche la classe oggetto in fase di ricerca.

Di seguito è riportato il formato dell'argomento timing per la sincronizzazione dei campi di ricerca.
executeQuery:OBJECT_CLASS
In questo formato OBJECT_CLASS viene sostituito con il tipo di oggetto da riconciliare.
Ad esempio, per un job pianificato di sincronizzazione del campo di ricerca contenente il tipo di oggetto Ruolo, il valore dell'argomento di tempistica sarà il seguente:
executeQuery:Role
attributi Tutti gli attributi
trace Logger come bridge di trace script per l'applicazione
dove Stringa in cui la condizione per l'esecuzione della query è nulla.
handler resultSetHandler o SyncResultsHandler per gli oggetti connettore prodotti dalla query di esecuzione, dall'operazione di sincronizzazione o da una restituzione nulla.
definizione preventivi Il tipo di citazione dei nomi di tabella da utilizzare in SQL. Il valore predefinito è la stringa vuota. Il valore di questo argomento viene ottenuto dalle impostazioni di integrazione.
nativeTimestamps Specifica se lo script recupera i dati dell'indicatore orario delle colonne come tipo java.sql.Timestamp dalla tabella del database. Queste informazioni sono ottenute dalle impostazioni di integrazione.
allNative Specifica se lo script deve recuperare il tipo di dati delle colonne in formato nativo dalla tabella di database. Il valore di questo argomento viene ottenuto dalle impostazioni di integrazione. Il valore di questo argomento specifica se lo script deve generare eccezioni quando viene rilevato un codice di errore pari a zero (0x00).
enableEmptyString Specifica se è necessario abilitare il supporto per la scrittura di una stringa vuota anziché di un valore NULL. Il valore di questo argomento viene ottenuto dalle impostazioni di integrazione.
filterString Condizione di filtro stringa per l'esecuzione della query o null.
filterParams Lista dei parametri di filtro. Ogni parametro è presente nel formato COLUMN_NAME:VALUE. Ad esempio, FIRSTNAME:test.
attributo di sincronizzazione Nome della colonna di database configurata per la riconciliazione incrementale. Questo argomento è disponibile nello script di sincronizzazione, richiamato durante un'esecuzione di riconciliazione incrementale.
sincronizzazione Valore dell'attributo sincronizzazione. Questo argomento è disponibile nello script di sincronizzazione.

Script di caricamento dati di esempio

Lo script di caricamento dati legge i dati di tutte le tabelle per tutte le entità definite. In questo scenario, il termine caricamento dati si riferisce al caricamento completo dei dati e al caricamento dei dati di ricerca.

Questo script di esempio legge i dati utente dalla tabella MYDBAT_PERSON e i dati di relazione degli utenti dalle tabelle MYDABAT_PERSON_ROLE e MYDBAT_PERSON_GROUP. I dati di abilitazione vengono letti dalla tabella MYDBAT_GROUPS e i dati di ricerca vengono letti dalla tabella MYDBAT_COUNTRY. Ha anche il supporto per una ricerca di filtro di base sulla tabella MYDBAT_PERSON. Tutte queste letture dei dati vengono eseguite utilizzando le stored procedure.

Script di caricamento dati

import java.sql.CallableStatement;
import java.sql.Connection;
import java.math.*;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.identityconnectors.framework.common.objects.*;
import java.lang.reflect.*;
import java.lang.String;
import org.identityconnectors.common.security.GuardedString;
import java.text.*;
 
ResultSet rs = null;
        CallableStatement st = null;
        String ocName ;
        try {
            if( timing != "")
            {
                trace.info("[Execute Query] timing attribute value : "+ timing);
                ocName = timing.split(":")[1]
            }
 
            trace.info("[Execute Query] for objectClass : "+ ocName);
             
            if(ocName.equals("ACCOUNT") || ocName.equals("TARGETACCOUNT")){
            if( filterString != "")
            {
                trace.info("[Execute Query] Performing Recon with Filter. Filter is::"+ filterString+" And Filer Params are::"+filterParams);
                //[Execute Query] Performing Recon with Filter. Filter is::MYDBAT_PERSON.USERID = ? And Filer Params are::[MYDBAT_PERSON.USERID:21]
                String[] filter = filterParams.get(0).split(":");
                st = conn.prepareCall("{call EXECUTE_QUERY_WITH_FILTER(?,?,?)}");
                st.setString(2, filter[0]);
                st.setString(3, filter[1]);
            }
            else
            {
                trace.info("[Execute Query] Performing Full Recon.");
                st = conn.prepareCall("{call EXECUTE_QUERY_PERSON(?)}");
            }
            st.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);
            st.execute();
            rs = (ResultSet) st.getObject(1);
            SimpleDateFormat targetFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss z");
            DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
 
            while (rs.next()) {
                ConnectorObjectBuilder cob = new ConnectorObjectBuilder();
                cob.setObjectClass(ObjectClass.ACCOUNT);
                Attribute fname= AttributeBuilder.build(new String("FIRSTNAME"),rs.getString(2));
                Attribute lname= AttributeBuilder.build(new String("LASTNAME"),rs.getString(3));
                Attribute uid= AttributeBuilder.build(new String("__UID__"),rs.getString(1));
                Attribute name= AttributeBuilder.build(new String("__NAME__"),rs.getString(10));
                Attribute email= AttributeBuilder.build(new String("EMAIL"),rs.getString(4));
                //Attribute salary= AttributeBuilder.build(new String("SALARY"),rs.getBigDecimal(6));
                Attribute description= AttributeBuilder.build(new String("DESCRIPTION"),rs.getString(5));
                Date dbDate = rs.getDate(7);
                String joinDateStr = null;
                Long joinDate = null;
                if( null != dbDate)
                {
                    java.util.Date date= df.parse(dbDate.toString());
                    joinDateStr = targetFormat.format(date);
                    joinDate = date.getTime()
                    trace.info("date : " +date +" ---- joinDate : "+ joinDate);
                }
 
                //Attribute joindate= AttributeBuilder.build(new String("JOININGDATE"),joinDateStr);
                if(null != joinDate) {
                    trace.info("Setting joinDate : "+ joinDate);
                    Attribute joindate= AttributeBuilder.build(new String("JOININGDATE"),joinDate);
                    cob.addAttribute(joindate);
                }
                Attribute status= AttributeBuilder.build(new String("STATUS"),rs.getString(8));
                Attribute countryCode= AttributeBuilder.build(new String("COUNTRYCODE"),rs.getString(9));
                cob.addAttribute(fname);
                cob.addAttribute(lname);
                cob.addAttribute(uid);
                cob.addAttribute(name);
                cob.addAttribute(email);
                //cob.addAttribute(salary);
                cob.addAttribute(description);
                cob.addAttribute(status);
                cob.addAttribute(countryCode);
 
                if(ocName.equals("TARGETACCOUNT")){
                CallableStatement roleStmt = conn.prepareCall("{call GET_USERROLE(?,?)}");
                roleStmt.registerOutParameter(1, oracle.jdbc.driver.OracleTypes.CURSOR);
                roleStmt.setString(2, rs.getString(1));
                roleStmt.execute();
                ResultSet roleResultSet = (ResultSet) roleStmt.getObject(1);
                java.util.List<EmbeddedObject> eoList = new ArrayList<EmbeddedObject>();
                while (roleResultSet.next()) {
                    Attribute roleId= AttributeBuilder.build(new String("ROLEID"),roleResultSet.getString(2));
                    dbDate = roleResultSet.getDate(3);
                    String fromDateStr = null;
                    Long fromDate = null;
                    if( null != dbDate)
                    {
                        java.util.Date date= df.parse(dbDate.toString());
                        fromDateStr = targetFormat.format(date);
                        fromDate = date.getTime()
                    }
 
                    dbDate = roleResultSet.getDate(4);
                    String toDateStr = null;
                    Long toDate = null;
                    if( null != dbDate)
                    {
                        java.util.Date date= df.parse(dbDate.toString());
                        toDateStr = targetFormat.format(date);
                        toDate = date.getTime()
                    }
                     
                    EmbeddedObjectBuilder roleEA = new EmbeddedObjectBuilder();
                    roleEA.addAttribute(roleId);
                    if(null != fromDate) {
                        trace.info("Setting roles fromDate : "+ fromDate);
                        Attribute fromdate= AttributeBuilder.build(new String("FROMDATE"),fromDate);
                        roleEA.addAttribute(fromdate);
                    }
 
                    if(null != toDate) {
                        trace.info("Setting roles toDate : "+ toDate);
                        Attribute todate= AttributeBuilder.build(new String("TODATE"),toDate);
                        roleEA.addAttribute(todate);
                    }
 
                    roleEA.setObjectClass(new ObjectClass("MYDBAT_ROLES"));
                    eoList.add(roleEA.build());
                }
                roleResultSet.close();
                roleStmt.close();
                EmbeddedObject[] roleEm = eoList.toArray(new EmbeddedObject[eoList.size()]);
                cob.addAttribute(AttributeBuilder.build("MYDBAT_PERSON_ROLE", (Object[]) roleEm));
 
                CallableStatement groupStmt = conn.prepareCall("{call GET_USERGROUP(?,?)}");
                groupStmt.registerOutParameter(1, oracle.jdbc.driver.OracleTypes.CURSOR);
                groupStmt.setString(2, rs.getString(1));
                groupStmt.execute();
                ResultSet groupResultSet = (ResultSet) groupStmt.getObject(1);
                java.util.List<EmbeddedObject> geoList = new ArrayList<EmbeddedObject>();
                while (groupResultSet.next()) {
                    Attribute groupId= AttributeBuilder.build(new String("GROUPID"),groupResultSet.getString(2));
                    EmbeddedObjectBuilder groupEA = new EmbeddedObjectBuilder();
                    groupEA.addAttribute(groupId);
                    groupEA.setObjectClass(new ObjectClass("MYDBAT_GROUPS"));
                    geoList.add(groupEA.build());
                }
                groupResultSet.close();
                groupStmt.close();
                EmbeddedObject[] groupEm = geoList.toArray(new EmbeddedObject[geoList.size()]);
                cob.addAttribute(AttributeBuilder.build("MYDBAT_PERSON_GROUP", (Object[]) groupEm));
                }
 
                if(!handler.handle(cob.build())) return;
            }
    }else if(ocName.equals("MYDBAT_COUNTRY")){
        trace.info("[Execute Query] for Lookup : "+ ocName);
        CallableStatement groupStmt = conn.prepareCall("{call GET_COUNTRIES(?)}");
        groupStmt.registerOutParameter(1, oracle.jdbc.driver.OracleTypes.CURSOR);
        groupStmt.execute();
        ResultSet groupResultSet = (ResultSet) groupStmt.getObject(1);
        while (groupResultSet.next()) {
            ConnectorObjectBuilder cob = new ConnectorObjectBuilder();
            cob.setObjectClass(new ObjectClass("MYDBAT_COUNTRY"));
            Attribute groupId= AttributeBuilder.build(new String("__UID__"),groupResultSet.getString(1));
            Attribute groupName= AttributeBuilder.build(new String("__NAME__"),groupResultSet.getString(2));
            cob.addAttribute(groupId);
            cob.addAttribute(groupName);
            if(!handler.handle(cob.build())) return;
        }
         
        groupResultSet.close();
        groupStmt.close();
    }else if(ocName.equals("MYDBAT_GROUPS")){
        trace.info("[Execute Query] for Entitlement : "+ ocName);
        CallableStatement groupStmt = conn.prepareCall("{call GET_GROUPS(?)}");
        groupStmt.registerOutParameter(1, oracle.jdbc.driver.OracleTypes.CURSOR);
        groupStmt.execute();
        ResultSet groupResultSet = (ResultSet) groupStmt.getObject(1);
        while (groupResultSet.next()) {
            ConnectorObjectBuilder cob = new ConnectorObjectBuilder();
            cob.setObjectClass(new ObjectClass("MYDBAT_GROUPS"));
            Attribute groupId= AttributeBuilder.build(new String("__UID__"),groupResultSet.getString(1));
            Attribute groupName= AttributeBuilder.build(new String("__NAME__"),groupResultSet.getString(2));
            cob.addAttribute(groupId);
            cob.addAttribute(groupName);
            if(!handler.handle(cob.build())) return;
        }
         
        groupResultSet.close();
        groupStmt.close();
    }
    } finally {
            if( null != rs)
                rs.close();
            if( null != st)
                st.close();
        }

Stored Procedure: Carica utenti

create or replace PROCEDURE EXECUTE_QUERY_PERSON
(user_cursor OUT SYS_REFCURSOR) AS
BEGIN
  OPEN user_cursor FOR
  SELECT USERID,
         FIRSTNAME,
         LASTNAME,
         EMAIL,
         DESCRIPTION,
         SALARY,
         JOININGDATE,
         STATUS,
         COUNTRYCODE,
         USERNAME
  FROM MYDBAT_PERSON;
END EXECUTE_QUERY_PERSON;

Stored Procedure: ricerca utente filtrata

create or replace PROCEDURE EXECUTE_QUERY_WITH_FILTER
(user_cursor OUT SYS_REFCURSOR,
 filter IN VARCHAR2,
 filterValue IN VARCHAR2) AS
BEGIN
  OPEN user_cursor FOR
    SELECT USERID,
           FIRSTNAME,
           LASTNAME,
           EMAIL,
           DESCRIPTION,
           SALARY,
           JOININGDATE,
           STATUS,
           COUNTRYCODE,
           USERNAME 
    FROM MYDBAT_PERSON
    WHERE filter=filterValue;
END EXECUTE_QUERY_WITH_FILTER;
Si tratta di un esempio molto semplice di ricerca filtro con una sola condizione di filtro, ad esempio MYDBAT_PERSON.USERID:21. Utilizzato in modo specifico per l'elaborazione writeBack dopo l'operazione di creazione

Stored Procedure: Recupera ruoli

create or replace PROCEDURE GET_ROLES
(user_cursor OUT SYS_REFCURSOR) AS
BEGIN
  OPEN user_cursor FOR
    SELECT ROLEID,
           ROLENAME
    FROM MYDBAT_ROLES;
END GET_ROLES;

Stored Procedure: Recupera ruoli utente

create or replace PROCEDURE GET_USERROLE
(user_cursor OUT SYS_REFCURSOR,
 userin IN VARCHAR2) AS
BEGIN
  OPEN user_cursor FOR
    SELECT USERID,
           ROLEID,
           FROMDATE,
           TODATE
    FROM MYDBAT_PERSON_ROLE
    WHERE USERID=userin;
END GET_USERROLE;

Stored Procedure: Recupera gruppi

create or replace PROCEDURE GET_GROUPS
(user_cursor OUT SYS_REFCURSOR) AS
BEGIN
  OPEN user_cursor FOR
    SELECT GROUPID,
           GROUPNAME
    FROM MYDBAT_GROUPS;
END GET_GROUPS;

Stored Procedure: Recupera gruppi di utenti

create or replace PROCEDURE GET_USERGROUP
(user_cursor OUT SYS_REFCURSOR,
 userin IN VARCHAR2) AS
BEGIN
  OPEN user_cursor FOR
    SELECT USERID,
           GROUPID 
    FROM MYDBAT_PERSON_GROUP 
    WHERE USERID=userin;
END GET_USERGROUP;

Stored Procedure: Recupera ricerche (Paese)

create or replace PROCEDURE GET_COUNTRIES
(user_cursor OUT SYS_REFCURSOR) AS
BEGIN
  OPEN user_cursor FOR
    SELECT COUNTRYCODE,
           COUNTRYNAME
    FROM MYDBAT_COUNTRY;
END GET_COUNTRIES;

Script di creazione di esempio

Questo script viene richiamato durante il provisioning di un nuovo account da Oracle Access Governance. Qui stiamo inserendo i dati nella tabella MYDBAT_PERSON.

Crea script

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.text.*;
import java.util.Date.*;
import org.identityconnectors.common.security.GuardedString;
import org.identityconnectors.framework.common.objects.*;
 
import java.text.*;
 
// START HERE
trace.info("[Create-Groovy] Attributes::"+attributes);
//USERID,PASSWORD,USERNAME,STATUS,EMAIL,FIRSTNAME,LASTNAME,ORGANIZATION,CITY,EMPLOYEE_NUMBER,joiningdate,ENDDATE,LONGVALUE,FLOATVALUE,CHARVALUE
//Get all the attributes from script argument
 
// This shows how to read arrtibures
 
 
String uid = attributes.get("__NAME__")!=null? attributes.get("__NAME__").getValue().get(0):null;
GuardedString pass = attributes.get("__PASSWORD__")!=null? attributes.get("__PASSWORD__").getValue().get(0):null;
String uname = attributes.get("__NAME__")!=null? attributes.get("__NAME__").getValue().get(0):null;
enableValue = attributes.get("__ENABLE__")!=null? attributes.get("__ENABLE__").getValue().get(0):true;
String email=attributes.get("EMAIL")!=null? attributes.get("EMAIL").getValue().get(0):null;
String first=attributes.get("FIRSTNAME")!=null? attributes.get("FIRSTNAME").getValue().get(0):null;
String last=attributes.get("LASTNAME")!=null? attributes.get("LASTNAME").getValue().get(0):null;
String org=attributes.get("ORGANIZATION")!=null? attributes.get("ORGANIZATION").getValue().get(0):null;
String countryCode=attributes.get("COUNTRYCODE")!=null? attributes.get("COUNTRYCODE").getValue().get(0):null;
joiningdate = attributes.get("JOININGDATE")!=null? attributes.get("JOININGDATE").getValue().get(0):null;
 
 
PreparedStatement createStmt = null;
String ret =null;
try {
         
        //Call Target API to create a user
        createStmt =   conn.prepareStatement("INSERT INTO MYDBAT_PERSON(USERID,PASSWORD,USERNAME,STATUS,EMAIL,FIRSTNAME,LASTNAME,COUNTRYCODE,JOININGDATE) VALUES(?,?,?,?,?,?,?,?,?)");
        createStmt.setString(1, uid);
        if(pass!=null)
        {
        pass.access(new GuardedString.Accessor(){
       public void access(char[] clearChars) {  createStmt.setString(2, new String(clearChars));}
        });
        }
        else
        createStmt.setString(2,null);
         
        createStmt.setString(3, uname);
 
        if(enableValue)
                createStmt.setString(4,"Enabled");
        else
                createStmt.setString(4,"Disabled");
        createStmt.setString(5, email);
        createStmt.setString(6, first);
        createStmt.setString(7, last);
        createStmt.setString(8, countryCode);   
 
        DateFormat formatter = new SimpleDateFormat("dd-MMM-yy");
 
        if (joiningdate!=null)
        {
            if (joiningdate == 0){
                createStmt.setString(9,null);
            }
            else
        {
        Date da=new Date(joiningdate);
        st=formatter.format(da);
        createStmt.setString(9,st);
 
        }
        }
 
       createStmt.executeUpdate();
         
} finally{
        //close the sql statements
        if (createStmt != null)
                createStmt.close();
}
trace.info("[Create] Created User::"+uid);
//Return Uid from the script
return new Uid(uid);

Esempio di script Aggiungi figlio

Questo script viene richiamato durante il provisioning delle abilitazioni/autorizzazioni agli utenti da Oracle Access Governance. Qui stiamo inserendo i dati nelle tabelle MYDBAT_PERSON_GROUP e MYDBAT_PERSON_ROLE.

Aggiungi script figlio

import org.identityconnectors.framework.common.objects.*;
import java.text.*;
 
trace.info("[addMultiValuedAttributeScript-Groovy] Adding Child data::"+ attributes);
childst =null;
try {
        //Adding Group data
         
        childDataEOSet = null;
         
        //The child attributes are returned as a set of embedded objects. Each  Embedded object
        // will provide a row of data in the child table.
         
        // Logic for handling simple multi valued attributes
         
        if(attributes.get("MYDBAT_PERSON_GROUP")!=null)
        {
                 
                childDataEOSet=attributes.get("MYDBAT_PERSON_GROUP").getValue();
                childst=conn.prepareStatement("INSERT INTO MYDBAT_PERSON_GROUP VALUES (?,?)");
                String id = attributes.get("__UID__").getValue().get(0);
 
                if(childDataEOSet !=null){
                        //Iterate through child data and insert into table
                        trace.info("[addMultiValuedAttributeScript] Adding Group data.");
                        for( iterator = childDataEOSet.iterator(); iterator.hasNext(); )
                        {
                                eo = iterator.next();
                                attrsSet=eo.getAttributes();
                                grpattr=AttributeUtil.find("GROUPID",attrsSet);
                                 if(grpattr!=null){
                                        // You are iterating simple multi valued attributes here, Call target APIs here
                                        //conn object is available here
                                        groupid=grpattr.getValue().get(0);
                                         
                                        childst.setString(1, id);
                                        childst.setString(2, groupid);
                                        childst.executeUpdate();
                                        childst.clearParameters();
                                }
                        };
                }
        }
} finally {
        if (childst != null)
        childst.close();
         
};
 
try {
        childDataEOSet = null;
        // Logic for handling Complex multi valued attributes
        if(attributes.get("MYDBAT_PERSON_ROLE")!=null)
        {
                 
                childDataEOSet=attributes.get("MYDBAT_PERSON_ROLE").getValue();
                childst=conn.prepareStatement("INSERT INTO MYDBAT_PERSON_ROLE VALUES (?,?,?,?)");
 
                String id = attributes.get("__UID__").getValue().get(0);
 
                if(childDataEOSet !=null)
                {
                        trace.info("[addMultiValuedAttributeScript] Adding Role data.");
                        for( iterator = childDataEOSet.iterator(); iterator.hasNext(); )
                        {
                                eo = iterator.next();
                                attrsSet = eo.getAttributes(); // Get all the attributes of child object
                                roleattr=AttributeUtil.find("ROLEID",attrsSet);
                                 
                                 
                                // You are iterating complex multi valued attributes here, Call target APIs here
                            //conn object is available here
                                if(roleattr!=null){
                                        // You are iterating simple multi valued attributes here, Call target APIs here
                                        //conn object is available here
                                        roleid=roleattr.getValue().get(0);
                                        fromDate=AttributeUtil.find("FROMDATE",attrsSet).getValue().get(0);
                                        toDate=AttributeUtil.find("TODATE",attrsSet).getValue().get(0);
                                 
                                        childst.setString(1, id);
                                        childst.setString(2, roleid);
                                        Date from_date=new Date(fromDate);
                                        SimpleDateFormat formatter = new SimpleDateFormat("dd-MMM-yy");
                                        String from_date_st=formatter.format(from_date);
                                        childst.setString(3, from_date_st);
 
                                        Date to_date=new Date(toDate);
                                        String to_date_st=formatter.format(to_date);
                                        childst.setString(4, to_date_st);
                                         
 
                                        childst.executeUpdate();
                                        childst.clearParameters();
                                }
 
                        };
                }
        }
} finally {
if (childst != null)
                childst.close();
         
};

Esempio di rimozione dello script secondario

Questo script viene richiamato durante l'annullamento del provisioning delle abilitazioni/autorizzazioni da parte degli utenti di Oracle Access Governance. Di seguito vengono rimossi i dati dalle tabelle MYDBAT_PERSON_GROUP e MYDBAT_PERSON_ROLE utilizzando le stored procedure.

Rimuovi script figlio

import org.identityconnectors.framework.common.objects.*;
 
trace.info("[removeMultiValuedAttributeScript] Removing Child data::"+ attributes);
 
try {
        childDataEOSet = null;
        delSt = null;
        //Get UID
        String id      = attributes.get("__UID__").getValue().get(0);
        if(attributes.get("MYDBAT_PERSON_GROUP")!=null)
        {
                childDataEOSet=attributes.get("MYDBAT_PERSON_GROUP").getValue();
                //Delete child data using stored procedure
                delSt= conn.prepareCall("{call DELETE_USERGROUP(?,?)}");
            if(childDataEOSet !=null){
                        trace.info("[removeMultiValuedAttributeScript] Removing Group data.");
                        //Iterate through child data and delete
                        for( iterator = childDataEOSet.iterator(); iterator.hasNext(); )
                        {
                                eo = iterator.next();
                                attrsSet = eo.getAttributes();
                                grpattr=AttributeUtil.find("GROUPID",attrsSet);
                                if(grpattr!=null){
                                        groupid=grpattr.getValue().get(0);
                                        delSt.setString(1, id);
                                        delSt.setString(2, groupid);
                                        delSt.executeUpdate();
                                        trace.info("[removeMultiValuedAttributeScript] Deleted Group::"+ grpattr);
                                }
                        };
                }
 
        }
} finally {
        if (delSt != null)
        delSt.close();
};
 
try {
        childDataEOSet = null;
        delSt = null;
        String id      = attributes.get("__UID__").getValue().get(0);
        if(attributes.get("MYDBAT_PERSON_ROLE")!=null)
        {
                childDataEOSet=attributes.get("MYDBAT_PERSON_ROLE").getValue();
                delSt= conn.prepareCall("{call DELETE_USERROLE(?,?)}");
            if(childDataEOSet !=null){
                        trace.info("[removeMultiValuedAttributeScript] Removing Role data.");
                        for( iterator = childDataEOSet.iterator(); iterator.hasNext(); )
                        {
                         
                                eo = iterator.next();
                                attrsSet = eo.getAttributes();
                                roleattr=AttributeUtil.find("ROLEID",attrsSet);
                                if(roleattr!=null){
                                        rolename=roleattr.getValue().get(0);
                                        delSt.setString(1, id);
                                        delSt.setString(2, rolename);
                                        delSt.executeUpdate();
                                        trace.info("[removeMultiValuedAttributeScript] Deleted Role::"+ rolename);
                                }
                        };
                }
        }
} finally {
        if (delSt != null)
                delSt.close();
};

Stored Procedure: Rimuovi figlio

create or replace PROCEDURE DELETE_USERGROUP
(user_id MYDBAT_PERSON_group.USERID%TYPE,
 group_id MYDBAT_PERSON_group.GROUPID%TYPE ) AS
BEGIN
  DELETE FROM MYDBAT_PERSON_group
  WHERE groupid=group_id 
  AND userid=user_id;
END DELETE_USERGROUP; 

create or replace PROCEDURE DELETE_USERROLE
(user_id MYDBAT_PERSON_ROLE.USERID%TYPE,
 role_id MYDBAT_PERSON_ROLE.ROLEID%TYPE) AS
BEGIN
  DELETE FROM MYDBAT_PERSON_ROLE
  WHERE userid=user_id and roleid=role_id;
END DELETE_USERROLE;

Script di eliminazione di esempio

Questo script viene richiamato durante la revoca di un account da Oracle Access Governance. Di seguito vengono eliminate le tabelle delle relazioni utente dei dati, MYDBAT_PERSON_ROLE e MYDBAT_PERSON_GROUP, nonché i dati dalla tabella MYDBAT_PERSON

Elimina script

import java.sql.PreparedStatement;
import org.identityconnectors.framework.common.objects.*;
  
//Get the UID from the input map 'attributes'
String uid = attributes.get("__UID__").getValue().get(0);
trace.info("[Delete-Groovy] Deleting user:: "+ uid);
  
try {
    //Delete data from child tables and then, main table
    //Delete user roles
    st = conn.prepareStatement("DELETE FROM MYDBAT_PERSON_ROLE WHERE USERID=?");
    st.setString(1, uid);
    st.executeUpdate();
    st.close();
     
    //Delete user groups
    st = conn.prepareStatement("DELETE FROM MYDBAT_PERSON_GROUP WHERE USERID=?");
    st.setString(1, uid);
    st.executeUpdate();
    st.close();
     
    //Delete user account
    st = conn.prepareStatement("DELETE FROM MYDBAT_PERSON WHERE USERID=?");
    st.setString(1, uid);
    st.executeUpdate();
} finally {
    if (st != null)
        st.close(); };
trace.info("Deleted user:: "+ uid);

Script di aggiornamento di esempio

Questo script viene richiamato durante le operazioni di provisioning quando l'account viene aggiornato da Oracle Access Governance. Qui stiamo aggiornando i dati nella tabella MYDBAT_PERSON

Aggiorna script

import org.identityconnectors.framework.common.objects.*;
import java.text.*;
import org.identityconnectors.framework.common.exceptions.*;
  
trace.info("[Update-Groovy] Atrributes::"+ attributes);
  
/** During an Update operation,AGCS  sends the UID attribute along with updated attributes.
Get all the values of attributes **/
  
String id = attributes.get("__UID__")!=null? attributes.get("__UID__").getValue().get(0):null;
String firstName=attributes.get("FIRSTNAME")!=null? attributes.get("FIRSTNAME").getValue().get(0):null;
String lastName=attributes.get("LASTNAME")!=null? attributes.get("LASTNAME").getValue().get(0):null;
String email=attributes.get("EMAIL")!=null? attributes.get("EMAIL").getValue().get(0):null;
String description=attributes.get("DESCRIPTION")!=null? attributes.get("DESCRIPTION").getValue().get(0):null;
salary=attributes.get("SALARY")!=null? attributes.get("SALARY").getValue().get(0):null;
joindate = attributes.get("JOININGDATE")!=null? attributes.get("JOININGDATE").getValue().get(0):null;
enableValue = attributes.get("__ENABLE__")!=null? attributes.get("__ENABLE__").getValue().get(0):true;
  
//Throw exception if uid is null
if(id==null) throw new ConnectorException("UID Cannot be Null");
    stmt = null;
try {
//Create prepared statement to update the MYDBAT_PERSON table
        stmt = conn.prepareStatement("UPDATE MYDBAT_PERSON SET FIRSTNAME=COALESCE(?, FIRSTNAME),LASTNAME =COALESCE(?, LASTNAME), EMAIL= COALESCE(?, EMAIL),SALARY=COALESCE(?, SALARY),JOININGDATE=COALESCE(to_date(?,'dd-Mon-yy'), JOININGDATE),STATUS=COALESCE(?, STATUS) WHERE USERID =?");
        //Set sql input parameters
        stmt.setString(1, firstName);
        stmt.setString(2, lastName);
        stmt.setString(3, email);
        stmt.setBigDecimal(4, new BigDecimal(salary));
        dateStr = null;
        //Convert the joindate into oracle date format
        if( joindate != null) {
            Date date=new Date(joindate);
            DateFormat targetFormat = new SimpleDateFormat("dd-MMM-yy");
            dateStr = targetFormat.format(date);
        }
        stmt.setString(5,dateStr);
        if(enableValue)
            stmt.setString(6,"Enabled");
        else
            stmt.setString(6,"Disabled");
        stmt.setString(7, id);
        stmt.executeUpdate();
} finally {
    if (stmt != null)
        stmt.close();
};
trace.info("[Update] Updated user::"+ id);
return new Uid(id);