Développer des scripts personnalisés pour les tables d'application de base de données (Oracle) à l'aide de Groovy

Présentation du script personnalisé pour les tables d'application de base de données (Oracle)

Lorsque vous provisionnez des comptes à partir d'Oracle Access Governance à l'aide de l'intégration des tables d'application de base de données, des opérations telles que la création, la mise à jour et la suppression sont implémentées à l'aide du code fourni par défaut. Dans les cas où vous souhaitez modifier les opérations fournies par défaut, vous pouvez éventuellement fournir vos propres scripts personnalisés qui implémentent vos propres exigences d'opération de provisionnement. Cette étape est complètement facultative, vous n'avez pas besoin de créer de scripts personnalisés si les opérations par défaut vous fournissent ce dont vous avez besoin. Vous pouvez ajouter des scripts personnalisés à toutes les opérations prises en charge. Si vous choisissez des scripts personnalisés, vous n'avez qu'à les ajouter là où vous souhaitez que l'opération par défaut soit modifiée, vous pouvez avoir une combinaison de scripts personnalisés et par défaut pour les opérations prises en charge, bien que vous ne puissiez avoir qu'une seule ou l'autre option pour chaque opération spécifique. Par exemple, l'opération create peut être implémentée avec un script personnalisé qui ajoute certaines fonctionnalités propres à votre organisation, tandis que l'opération delete n'est pas modifiée et utilise la fonctionnalité par défaut.

Une fois que vous avez implémenté et configuré les tables d'application de base de données pour qu'elles utilisent un script personnalisé, ce script sera utilisé lors de la prochaine opération de provisionnement ou de chargement des données.
Remarque

Tout script personnalisé doit être implémenté au format Groovy. Les autres formats de script ne sont pas pris en charge.
Lorsque vous créez un système orchestré Tables d'application de base de données, vous pouvez identifier les scripts à exécuter pour un certain nombre d'opérations de provisionnement sur l'application de base de données contenant les données de compte. Ces opérations sont les suivantes :
  • Créer
  • Mettre à jour
  • Supprimer
  • Chargement de données
  • Ajouter des données de relation
  • Supprimer les données de relation
Ces scripts doivent se trouver sur l'hôte de l'agent, dans le répertoire d'installation de l'agent, par exemple, /app/<custom script> . Vous configurez l'agent avec l'emplacement des scripts dans les paramètres d'intégration de votre système orchestré. Vous devez vous assurer que l'utilisateur du système d'exploitation exécutant l'agent dispose de droits d'accès en lecture/écriture pour tous les scripts personnalisés.
Lorsque vous effectuez une tâche de provisionnement, le script est exécuté en remplacement du traitement standard associé à la tâche. Le script doit gérer la tâche de provisionnement par défaut, telle que la création ou la mise à jour, et peut également comporter des tâches personnalisées au-delà du processus de provisionnement par défaut, telles que :
  • Effectuer des mises à jour de table personnalisées
  • Audit personnalisé
  • Envoyer des notifications personnalisées
Cela signifie que vous disposez de deux options pour le provisionnement du traitement à l'aide de l'intégration des tables d'application de base de données :
  1. Utiliser la logique par défaut fournie avec le connecteur Database Application Tables
  2. Utiliser la logique personnalisée implémentée dans les scripts
Les scripts personnalisés sont uniquement utilisés lorsqu'ils sont configurés dans votre système orchestré. Par conséquent, si vous avez spécifié un script de création lors de la création de votre système orchestré, mais aucun script de mise à jour, le script personnalisé sera utilisé pour la tâche de création de provisionnement, tandis que la tâche de mise à jour sera implémentée à l'aide du traitement de connecteur par défaut.

Vous devez également noter que tous les types de script personnalisés sont pris en charge pour un système orchestré configuré pour le mode système géré. Le seul type de script pris en charge pour le mode source faisant autorité est le type de chargement de données, qui est pris en charge pour les deux modes.

Remarque

Exemple de schéma de base de données

Les exemples fournis dans les sections suivantes sont basés sur les tables de base de données décrites dans cette section.

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));
Remarque

Une contrainte de clé primaire doit être définie pour les tables enfant telles que mydbat_roles, mydbat_groups et mydbat_country. Si aucune clé primaire n'est définie pour les tables enfant, votre opération de validation échouera et vous verrez une erreur Clé pour la table <tablename> non définie.

Déclencheur et séquence pour l'incrémentation automatique

Le code suivant crée une séquence et un déclencheur qui affectent automatiquement un USERID lors de la création d'un utilisateur dans la table 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;

Arguments de script Groovy

Les arguments suivants peuvent être utilisés dans les scripts Groovy :

Arguments du script
Argument Description
connecteur Objet connecteur Tables d'application de base de données.
timing

Lorsque le script Groovy est appelé. L'attribut de synchronisation explique également le type d'opération effectuée. Par exemple, s'il s'agit d'une opération de recherche, la classe d'objet recherchée est également renvoyée.

Voici le format de l'argument de synchronisation pour la synchronisation des champs de recherche :
executeQuery:OBJECT_CLASS
Dans ce format, OBJECT_CLASS est remplacé par le type d'objet en cours de rapprochement.
Par exemple, pour un travail planifié de synchronisation de champ de recherche qui contient le type d'objet Rôle, la valeur de l'argument de synchronisation sera la suivante :
executeQuery:Role
attributs Tous les attributs.
trace Logger en tant que pont de trace de script vers l'application
Chaîne où condition pour execute query, ou NULL.
gestionnaire resultSetHandler ou SyncResultsHandler pour les objets de connecteur produits par la requête d'exécution, l'opération de synchronisation ou le retour NULL.
soumission des propositions Type de référence de nom de table à utiliser dans SQL. La valeur par défaut est une chaîne vide. La valeur de cet argument provient des paramètres d'intégration.
nativeTimestamps Indique si le script extrait les données d'horodatage des colonnes de type java.sql.Timestamp de la table de base de données. Ces informations sont obtenues à partir des paramètres d'intégration.
allNative Indique si le script doit extraire le type de données des colonnes dans un format natif de la table de base de données. La valeur de cet argument provient des paramètres d'intégration. La valeur de cet argument indique si le script doit générer des exceptions lorsqu'un code d'erreur égal à zéro (0x00) est rencontré.
enableEmptyString Indique si la prise en charge de l'écriture d'une chaîne vide au lieu d'une valeur NULL doit être activée. La valeur de cet argument provient des paramètres d'intégration.
filterString Condition de filtre de chaîne pour l'exécution de la requête ou NULL.
filterParams Liste des paramètres de filtre. Chaque paramètre est présent au format COLUMN_NAME:VALUE. Par exemple, FIRSTNAME:test.
syncattribute Nom de la colonne de base de données configurée pour le rapprochement incrémentiel. Cet argument est disponible dans le script de synchronisation, qui est appelé lors d'une exécution de rapprochement incrémentiel.
synctoken Valeur de l'attribut de synchronisation. Cet argument est disponible dans le script de synchronisation.

Exemple de script de chargement de données

Le script de chargement de données lit les données de toutes les tables pour toutes les entités définies. Dans ce scénario, le terme chargement de données fait référence au chargement complet des données et au chargement des données de recherche.

Cet exemple de script lit les données utilisateur de la table MYDBAT_PERSON et les données de relation des utilisateurs des tables MYDABAT_PERSON_ROLE et MYDBAT_PERSON_GROUP. Les données d'habilitation sont lues à partir de la table MYDBAT_GROUPS et les données de recherche sont lues à partir de la table MYDBAT_COUNTRY. Il prend également en charge une recherche de filtre de base sur la table MYDBAT_PERSON. Toutes ces lectures de données sont effectuées à l'aide de procédures stockées.

Script de chargement de données

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();
        }

Procédure stockée : Charger des utilisateurs

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;

Procédure stockée : Recherche d'utilisateur filtré

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;
Il s'agit d'un exemple très simple de recherche de filtre avec une seule condition de filtre, par exemple, MYDBAT_PERSON.USERID :21. Il est utilisé spécifiquement pour le traitement writeBack après l'opération de création.

Procédure stockée : Obtenir les rôles

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;

Procédure stockée : Obtenir les rôles utilisateur

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;

Procédure stockée : Obtenir les groupes

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;

Procédure stockée : Obtenir les groupes d'utilisateurs

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;

Procédure stockée : Obtenir les codes express (pays)

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;

Exemple de script de création

Ce script est appelé lors du provisionnement d'un nouveau compte à partir d'Oracle Access Governance. Ici, nous insérons des données dans la table MYDBAT_PERSON.

Créer un 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);

Exemple de script Ajouter un enfant

Ce script est appelé lors du provisionnement des habilitations/autorisations aux utilisateurs à partir d'Oracle Access Governance. Nous allons insérer des données dans les tables MYDBAT_PERSON_GROUP et MYDBAT_PERSON_ROLE.

Ajouter un script enfant

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();
         
};

Exemple de script de suppression d'enfant

Ce script est appelé lors du déprovisionnement des habilitations/autorisations des utilisateurs à partir d'Oracle Access Governance. Ici, nous supprimons les données des tables MYDBAT_PERSON_GROUP et MYDBAT_PERSON_ROLE à l'aide de procédures stockées.

Supprimer le script enfant

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();
};

Procédure stockée : Supprimer l'enfant

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;

Exemple de script de suppression

Ce script est appelé lors de la révocation d'un compte d'Oracle Access Governance. Ici, nous supprimons les tables de relations utilisateur, MYDBAT_PERSON_ROLE et MYDBAT_PERSON_GROUP, ainsi que les données de la table MYDBAT_PERSON.

Supprimer un 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);

Exemple de script de mise à jour

Ce script est appelé lors des opérations de provisionnement lorsque le compte est mis à jour à partir d'Oracle Access Governance. Nous mettons à jour les données de la table MYDBAT_PERSON.

Script de mise à jour

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);