A サンプルのストアド・プロシージャおよびGroovyスクリプト
この付録では、一部のプロビジョニング操作に対するサンプルのストアド・プロシージャおよびGroovyスクリプトを示します。要件に応じて、これらのストアド・プロシージャおよびGroovyスクリプトを拡張することも、新しいものを作成することもできます。この付録に示されたサンプルのストアド・プロシージャおよびgroovyスクリプトはOracle Databaseターゲット・システムでのみ作成することができます。
この付録の内容は、次のとおりです。
A.1 作成プロビジョニング操作用のサンプルのGroovyスクリプト
次に、作成プロビジョニング操作を実行するためのサンプルのgroovyスクリプトを示します。
次のように作成スクリプトを登録します。
import java.sql.PreparedStatement;
import org.identityconnectors.framework.common.objects.*;
import java.text.*;
// START HERE
System.out.println("[Create-Groovy] Attributes::"+attributes);
//Get all the attributes from script argument
String uid = attributes.get("__NAME__")!=null? attributes.get("__NAME__").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;
PreparedStatement createStmt = null;
try {
//Initialize the prepare statement to insert the data into database table
createStmt = conn.prepareStatement("INSERT INTO USERINFO(USERID,FIRSTNAME,LASTNAME,EMAIL,DESCRIPTION,SALARY,JOININGDATE,STATUS) VALUES(?,?,?,?,?,?,?,?)");
//Set the input parameters
createStmt.setString(1, uid);
createStmt.setString(2, firstName);
createStmt.setString(3, lastName);
createStmt.setString(4, email);
createStmt.setString(5, description);
createStmt.setBigDecimal(6, salary);
dateStr = null;
//Convert the joindate into oracle date format
if( joindate != null) {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.S");
java.util.Date date= df.parse(joindate);
DateFormat targetFormat = new SimpleDateFormat("dd-MMM-yy");
dateStr = targetFormat.format(date);
}
createStmt.setString(7,dateStr);
if(enableValue)
createStmt.setString(8,"Enabled");
else
createStmt.setString(8,"Disabled");
//Execute sql statement
createStmt.executeUpdate();
} finally {
//close the sql statements
if (createStmt != null)
createStmt.close();
}
System.out.println("[Create] Created User::"+uid);
//Return Uid from the script
return new Uid(uid);A.2 更新プロビジョニング操作用のサンプルのGroovyスクリプト
次に、更新プロビジョニング操作を実行するためのサンプルのgroovyスクリプトを示します。
次のように更新スクリプトを登録します。
import org.identityconnectors.framework.common.objects.*;
import java.text.*;
import org.identityconnectors.framework.common.exceptions.*;
System.out.println("[Update-Groovy] Atrributes::"+ attributes);
/** During an Update operation,OIM 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;
status = attributes.get("STATUS")!=null? attributes.get("STATUS").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 prepare statement to update the USERINFO table
stmt = conn.prepareStatement("UPDATE USERINFO SET FIRSTNAME=COALESCE(?, FIRSTNAME),LASTNAME =COALESCE(?, LASTNAME), EMAIL= COALESCE(?, EMAIL),DESCRIPTION=COALESCE(?, DESCRIPTION),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.setString(4, description);
stmt.setBigDecimal(5, salary);
dateStr = null;
//Convert the joindate into oracle date format
if( joindate != null) {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.S");
java.util.Date date= df.parse(joindate);
DateFormat targetFormat = new SimpleDateFormat("dd-MMM-yy");
dateStr = targetFormat.format(date); }
stmt.setString(6,dateStr);
if(enableValue)
stmt.setString(7,"Enabled");
else
stmt.setString(7,"Disabled");
stmt.setString(8, id);
stmt.executeUpdate();
} finally {
if (stmt != null)
stmt.close();
};
System.out.println("[Update] Updated user::"+ id);
return new Uid(id);A.3 削除プロビジョニング操作用のサンプルのGroovyスクリプト
次に、削除プロビジョニング操作を実行するためのサンプルのgroovyスクリプトを示します。
次のように削除スクリプトを登録します。
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);
System.out.println("[Delete-Groovy] Deleting user:: "+ uid);
try {
//Delete data from child tables and then, main table
//Delete user roles
st = conn.prepareStatement("DELETE FROM USER_ROLE WHERE USERID=?");
st.setString(1, uid);
st.executeUpdate();
st.close();
//Delete user groups
st = conn.prepareStatement("DELETE FROM USER_GROUP WHERE USERID=?");
st.setString(1, uid);
st.executeUpdate();
st.close();
//Delete user account
st = conn.prepareStatement("DELETE FROM USERINFO WHERE USERID=?");
st.setString(1, uid);
st.executeUpdate();
} finally {
if (st != null)
st.close(); };
System.out.println("Deleted user:: "+ uid);A.4 子データ追加プロビジョニング操作用のサンプルのGroovyスクリプト
次に、子データを追加するためのサンプルのgroovyスクリプトを示します。
次のように子データ追加スクリプトを登録します。
import org.identityconnectors.framework.common.objects.*;
import java.text.*;
System.out.println("[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.
For example, if DBAT contains USER_GROUP as a child in OIM and contains two rows of groups data then, we will get a set of embedded objects with count 2 and each embedded object represents a row in child data.
This groovy script is based on a child table named USER_GROUP and containing USERID, GROUP_ID as its columns.**/
if(attributes.get("USER_GROUP")!=null)
{
childDataEOSet=attributes.get("USER_GROUP").getValue();
childst = conn.prepareStatement("INSERT INTO USER_GROUP VALUES (?,?)");
String id = attributes.get("__UID__").getValue().get(0);
if(childDataEOSet !=null){
//Iterate through child data and insert into table
System.out.println("[addMultiValuedAttributeScript] Adding Group data.");
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);
childst.setString(1, id);
childst.setString(2, groupid);
childst.executeUpdate();
childst.clearParameters();
} };
} } } finally {
if (childst != null)
childst.close();
};
try {
//Adding Role data
childDataEOSet = null;
if(attributes.get("USER_ROLE")!=null){
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.S");
DateFormat targetFormat = new SimpleDateFormat("dd-MMM-yy");
childDataEOSet=attributes.get("USER_ROLE").getValue();
childst = conn.prepareStatement("INSERT INTO USER_ROLE VALUES (?,?,?,?)");
String id = attributes.get("__UID__").getValue().get(0);
if(childDataEOSet !=null){
System.out.println("[addMultiValuedAttributeScript] Adding Role data.");
for( iterator = childDataEOSet.iterator(); iterator.hasNext(); ) {
eo = iterator.next();
attrsSet = eo.getAttributes();
roleattr=AttributeUtil.find("ROLEID",attrsSet);
fromdateAttr=AttributeUtil.find("FROMDATE",attrsSet);
todateAttr=AttributeUtil.find("TODATE",attrsSet);
if(roleattr!=null){
roleid=roleattr.getValue().get(0);
childst.setString(1, id);
childst.setString(2, roleid);
fromdate = null;
if(fromdateAttr!= null)
{
java.util.Date date= df.parse(fromdateAttr.getValue().get(0));
fromdate = targetFormat.format(date);
}
childst.setString(3, fromdate);
todate = null;
if(todateAttr!= null)
{
java.util.Date date= df.parse(todateAttr.getValue().get(0));
todate = targetFormat.format(date);
}
childst.setString(4, todate);
childst.executeUpdate();
childst.clearParameters();
} };
} } } finally {
if (childst != null)
childst.close();
};A.5 子データ削除プロビジョニング操作用のサンプルのストアド・プロシージャおよびGroovyスクリプト
次に、子データを削除するためのサンプルのgroovyスクリプトを示します。
子データ削除プロシージャは次のように呼び出されます。
delSt= conn.prepareCall("{call DELETE_USERGROUP(?,?)}");
delSt= conn.prepareCall("{call DELETE_USERROLE(?,?)}");
DELETE_USERGROUPのプロシージャは次のとおりです。
create or replace PROCEDURE DELETE_USERGROUP ( userin IN VARCHAR2, gId IN VARCHAR2 ) AS BEGIN DELETE from USER_GROUP where USERID=userin and GROUPID=gId; END DELETE_USERGROUP;
DELETE_USERROLEのプロシージャは次のとおりです。
create or replace PROCEDURE DELETE_USERROLE ( userin IN VARCHAR2, rId IN VARCHAR2 ) AS BEGIN DELETE from USER_ROLE where USERID=userin and ROLEID=rId; END DELETE_USERROLE;
次のように子データ削除スクリプトを登録します。
import org.identityconnectors.framework.common.objects.*;
System.out.println("[removeMultiValuedAttributeScript] Removing Child data::"+ attributes);
try {
childDataEOSet = null;
delSt = null;
//Get UID
String id = attributes.get("__UID__").getValue().get(0);
if(attributes.get("USER_GROUP")!=null)
{
childDataEOSet=attributes.get("USER_GROUP").getValue();
//Delete child data using stored procedure
delSt= conn.prepareCall("{call DELETE_USERGROUP(?,?)}");
if(childDataEOSet !=null){
System.out.println("[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();
System.out.println("[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("USER_ROLE")!=null)
{
childDataEOSet=attributes.get("USER_ROLE").getValue();
delSt= conn.prepareCall("{call DELETE_USERROLE(?,?)}");
if(childDataEOSet !=null){
System.out.println("[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();
System.out.println("[removeMultiValuedAttributeScript] Deleted Role::"+ rolename);
} }; } }
} finally {
if (delSt != null)
delSt.close();
};A.6 参照フィールド同期用のサンプルのストアド・プロシージャおよびGroovyスクリプト
次に、参照フィールド同期を実行するためのサンプルのgroovyスクリプトを示します。
参照フィールド・プロシージャは次のように呼び出されます。
st = conn.prepareCall("{call GET_ROLES(?)}");
st = conn.prepareCall("{call GET_GROUPS(?)}");
GET_ROLESのプロシージャは次のとおりです。
create or replace PROCEDURE GET_ROLES ( user_cursor OUT TYPES.cursorType ) AS BEGIN OPEN user_cursor FOR SELECT ROLENAME,ROLEID from ROLES; END GET_ROLES;
GET_GROUPSのプロシージャは次のとおりです。
create or replace PROCEDURE GET_GROUPS ( user_cursor OUT TYPES.cursorType ) AS BEGIN OPEN user_cursor FOR SELECT GROUPNAME,GROUPID from GROUPS; END GET_GROUPS;
次のように参照フィールド同期スクリプトを登録します。
import org.identityconnectors.framework.common.objects.*;
rs = null;
st = null;
try {
System.out.println("[Lookup] Lookup Recon timing::"+ timing);
System.out.println("[Lookup] Attributes to Get::"+ ATTRS_TO_GET);
// This script is common for all lookups. Read the timing ( input) and return the data accordingly
// The format of timing is : executeQuery:<objectclass>
String codekey = ATTRS_TO_GET[0];
String decodekey = ATTRS_TO_GET[1];
if( timing.equals("executeQuery:Role"))
{
System.out.println("[Lookup] Getting Roles.");
st = conn.prepareCall("{call GET_ROLES(?)}");
}
else
{
System.out.println("[Lookup] Getting Groups.");
st = conn.prepareCall("{call GET_GROUPS(?)}"); }
st.registerOutParameter(1, oracle.jdbc.driver.OracleTypes.CURSOR);
st.execute();
rs = st.getObject(1);
while (rs.next()) {
cob = new ConnectorObjectBuilder();
Attribute codeattr= AttributeBuilder.build(decodekey,rs.getString(2));
Attribute decodeattr= AttributeBuilder.build(codekey,rs.getString(1));
cob.addAttribute(codeattr);
cob.addAttribute(decodeattr);
cob.setUid(rs.getString(2));
cob.setName(rs.getString(2));
handler.handle(cob.build());
} } finally {
if( null != rs)
rs.close();
if( null != st)
st.close();
}A.7 完全またはフィルタ・リコンシリエーション用のサンプルのストアド・プロシージャおよびGroovyスクリプト
次に、完全またはフィルタ・リコンシリエーションを実行するためのサンプルのgroovyスクリプトを示します。
完全リコンシリエーション・プロシージャは次のように呼び出されます。
st = conn.prepareCall("{call EXECUTE_QUERY(?)}");
フィルタ・リコンシリエーション・プロシージャは次のように呼び出されます。
st = conn.prepareCall("{call EXECUTE_QUERY_WITH_FILTER(?,?,?)}");
ユーザー・ロール取得プロシージャは次のように呼び出されます。
roleStmt = conn.prepareCall("{call GET_USERROLE(?,?)}");
ユーザー・グループ取得プロシージャは次のように呼び出されます。
groupStmt = conn.prepareCall("{call GET_USERGROUP(?,?)}");
EXECUTE_QUERYのプロシージャは次のとおりです。
create or replace PROCEDURE EXECUTE_QUERY ( user_cursor OUT TYPES.cursorType ) AS BEGIN OPEN user_cursor FOR SELECT USERINFO.USERID, USERINFO.FIRSTNAME , USERINFO.LASTNAME, USERINFO.EMAIL ,USERINFO.DESCRIPTION,USERINFO.SALARY,USERINFO.JOININGDATE ,USERINFO.STATUS FROM USERINFO; END EXECUTE_QUERY;
EXECUTE_QUERY_WITH_FILTERのプロシージャは次のとおりです。
create or replace PROCEDURE EXECUTE_QUERY_WITH_FILTER ( user_cursor OUT TYPES.cursorType, columnName IN VARCHAR2, columnValue IN VARCHAR2 ) AS BEGIN open user_cursor for 'SELECT USERINFO.USERID, USERINFO.FIRSTNAME , USERINFO.LASTNAME, USERINFO.EMAIL ,USERINFO.DESCRIPTION,USERINFO.SALARY,USERINFO.JOININGDATE ,USERINFO.STATUS FROM USERINFO USERINFO where '|| columnName ||' like '''||columnValue||''''; END EXECUTE_QUERY_WITH_FILTER;
GET_USERROLEのプロシージャは次のとおりです。
create or replace PROCEDURE GET_USERROLE ( user_cursor OUT TYPES.cursorType, userin IN VARCHAR2 ) AS BEGIN OPEN user_cursor FOR SELECT ROLEID,FROMDATE,TODATE from USER_ROLE where USERID=userin; END GET_USERROLE;
GET_USERGROUPのプロシージャは次のとおりです。
create or replace PROCEDURE GET_USERGROUP ( user_cursor OUT TYPES.cursorType, userin IN VARCHAR2 ) AS BEGIN OPEN user_cursor FOR SELECT GROUPID from USER_GROUP where USERID=userin; END GET_USERGROUP;
次のように完全またはフィルタ・リコンシリエーション・スクリプトを登録します。
import org.identityconnectors.framework.common.objects.*;
import java.lang.reflect.*;
import java.lang.String;
import org.identityconnectors.common.security.GuardedString;
import java.text.*;
rs = null;
st = null;
try {
if( filterString != "")
{
System.out.println("[Execute Query] Performing Recon with Filter. Filter is::"+ filterString+" And Filer Params are::"+filterParams);
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
{
System.out.println("[Execute Query] Performing Full Recon.");
st = conn.prepareCall("{call EXECUTE_QUERY(?)}");
}
st.registerOutParameter(1, oracle.jdbc.driver.OracleTypes.CURSOR);
st.execute();
rs = st.getObject(1);
SimpleDateFormat targetFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss z");
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
while (rs.next()) {
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(1));
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));
dbDate = rs.getDate(7);
joinDateStr = null;
if( null != dbDate)
{
java.util.Date date= df.parse(dbDate.toString());
joinDateStr = targetFormat.format(date);
}
Attribute joindate= AttributeBuilder.build(new String("JOININGDATE"),joinDateStr);
Attribute status= AttributeBuilder.build(new String("STATUS"),rs.getString(8));
cob.addAttribute(fname);
cob.addAttribute(lname);
cob.addAttribute(uid);
cob.addAttribute(name);
cob.addAttribute(email);
cob.addAttribute(salary);
cob.addAttribute(description);
cob.addAttribute(joindate);
cob.addAttribute(status);
roleStmt = conn.prepareCall("{call GET_USERROLE(?,?)}");
roleStmt.registerOutParameter(1, oracle.jdbc.driver.OracleTypes.CURSOR);
roleStmt.setString(2, rs.getString(1));
roleStmt.execute();
roleResultSet = roleStmt.getObject(1);
java.util.List<EmbeddedObject> eoList = new ArrayList<EmbeddedObject>();
while (roleResultSet.next()) {
Attribute roleId= AttributeBuilder.build(new String("ROLEID"),roleResultSet.getString(1));
dbDate = roleResultSet.getDate(2);
fromDateStr = null;
if( null != dbDate)
{
java.util.Date date= df.parse(dbDate.toString());
fromDateStr = targetFormat.format(date);
}
dbDate = roleResultSet.getDate(2);
toDateStr = null;
if( null != dbDate)
{
java.util.Date date= df.parse(dbDate.toString());
toDateStr = targetFormat.format(date);
}
Attribute fromdate= AttributeBuilder.build(new String("FROMDATE"),fromDateStr);
Attribute todate= AttributeBuilder.build(new String("TODATE"),toDateStr);
EmbeddedObjectBuilder roleEA = new EmbeddedObjectBuilder();
roleEA.addAttribute(roleId);
roleEA.addAttribute(fromdate);
roleEA.addAttribute(todate);
roleEA.setObjectClass(new ObjectClass("USER_ROLE"));
eoList.add(roleEA.build());
}
roleResultSet.close();
roleStmt.close();
EmbeddedObject[] roleEm = eoList.toArray(new EmbeddedObject[eoList.size()]);
cob.addAttribute(AttributeBuilder.build("USER_ROLE", (Object[]) roleEm));
groupStmt = conn.prepareCall("{call GET_USERGROUP(?,?)}");
groupStmt.registerOutParameter(1, oracle.jdbc.driver.OracleTypes.CURSOR);
groupStmt.setString(2, rs.getString(1));
groupStmt.execute();
groupResultSet = groupStmt.getObject(1);
java.util.List<EmbeddedObject> geoList = new ArrayList<EmbeddedObject>();
while (groupResultSet.next()) {
Attribute groupId= AttributeBuilder.build(new String("GROUPID"),groupResultSet.getString(1));
EmbeddedObjectBuilder groupEA = new EmbeddedObjectBuilder();
groupEA.addAttribute(groupId);
groupEA.setObjectClass(new ObjectClass("USER_GROUP"));
geoList.add(groupEA.build());
}
groupResultSet.close();
groupStmt.close();
EmbeddedObject[] groupEm = geoList.toArray(new EmbeddedObject[geoList.size()]);
cob.addAttribute(AttributeBuilder.build("USER_GROUP", (Object[]) groupEm));
if(!handler.handle(cob.build())) return;
} } finally {
if( null != rs)
rs.close();
if( null != st)
st.close();
}A.8 増分リコンシリエーション用のサンプルのストアド・プロシージャおよびGroovyスクリプト
次に、増分リコンシリエーションを実行するためのサンプルのgroovyスクリプトを示します。
増分リコンシリエーション・プロシージャは次のように呼び出されます。
st = conn.prepareCall("{call EXECUTE_QUERY_INCREMENTAL(?,?,?)}");
ユーザー・ロール取得プロシージャは次のように呼び出されます。
roleStmt = conn.prepareCall("{call GET_USERROLE(?,?)}");
ユーザー・グループ取得プロシージャは次のように呼び出されます。
groupStmt = conn.prepareCall("{call GET_USERGROUP(?,?)}");
EXECUTE_QUERY_INCREMENTALのプロシージャは次のとおりです。
create or replace PROCEDURE EXECUTE_QUERY_INCREMENTAL
( user_cursor OUT TYPES.cursorType, columnName IN VARCHAR2, columnValue IN VARCHAR2
) AS
BEGIN
if columnValue is NULL then
open user_cursor for 'SELECT USERID,FIRSTNAME,LASTNAME,EMAIL,DESCRIPTION,SALARY,JOININGDATE,STATUS, to_char(LASTUPDATED) FROM USERINFO';
else
open user_cursor for 'SELECT USERID,FIRSTNAME,LASTNAME,EMAIL,DESCRIPTION,SALARY,JOININGDATE,STATUS, to_char(LASTUPDATED) FROM USERINFO where '|| columnName ||' > to_timestamp ('''||columnValue||''')';
end if;
END EXECUTE_QUERY_INCREMENTAL;
GET_USERROLEのプロシージャは次のとおりです。
create or replace PROCEDURE GET_USERROLE ( user_cursor OUT TYPES.cursorType, userin IN VARCHAR2 ) AS BEGIN OPEN user_cursor FOR SELECT ROLEID,FROMDATE,TODATE from USER_ROLE where USERID=userin; END GET_USERROLE;
GET_USERGROUPのプロシージャは次のとおりです。
create or replace PROCEDURE GET_USERGROUP ( user_cursor OUT TYPES.cursorType, userin IN VARCHAR2 ) AS BEGIN OPEN user_cursor FOR SELECT GROUPID from USER_GROUP where USERID=userin; END GET_USERGROUP;
次のように増分リコンシリエーション・スクリプトを登録します。
import org.identityconnectors.framework.common.objects.*;
import java.lang.reflect.*;
import org.identityconnectors.common.security.GuardedString;
import java.text.*;
import java.lang.String;
rs = null;
st = null;
try {
System.out.println("[Sync] Performing Incremental Recon.");
System.out.println("[Sync] Sync Attribute::"+syncattribute);
System.out.println("[Sync] Sync token:: "+synctoken);
st = conn.prepareCall("{call EXECUTE_QUERY_INCREMENTAL(?,?,?)}");
st.setString(2, syncattribute);
st.setString(3, synctoken!=null? synctoken.getValue():null);
st.registerOutParameter(1, oracle.jdbc.driver.OracleTypes.CURSOR);
st.execute();
rs = st.getObject(1);
SimpleDateFormat targetFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss z");
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
while (rs.next()) {
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(1));
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));
dbDate = rs.getDate(7);
joinDateStr = null;
if( null != dbDate)
{
java.util.Date date= df.parse(dbDate.toString());
joinDateStr = targetFormat.format(date);
}
Attribute joindate= AttributeBuilder.build(new String("JOININGDATE"),joinDateStr);
Attribute status= AttributeBuilder.build(new String("STATUS"),rs.getString(8));
cob.addAttribute(fname);
cob.addAttribute(lname);
cob.addAttribute(uid);
cob.addAttribute(name);
cob.addAttribute(email);
cob.addAttribute(salary);
cob.addAttribute(description);
cob.addAttribute(joindate);
cob.addAttribute(status);
roleStmt = conn.prepareCall("{call GET_USERROLE(?,?)}");
roleStmt.registerOutParameter(1, oracle.jdbc.driver.OracleTypes.CURSOR);
roleStmt.setString(2, rs.getString(1));
roleStmt.execute();
roleResultSet = roleStmt.getObject(1);
java.util.List<EmbeddedObject> eoList = new ArrayList<EmbeddedObject>();
while (roleResultSet.next()) {
Attribute roleId= AttributeBuilder.build(new String("ROLEID"),roleResultSet.getString(1));
dbDate = roleResultSet.getDate(2);
fromDateStr = null;
if( null != dbDate)
{
java.util.Date date= df.parse(dbDate.toString());
fromDateStr = targetFormat.format(date);
}
dbDate = roleResultSet.getDate(2);
toDateStr = null;
if( null != dbDate)
{
java.util.Date date= df.parse(dbDate.toString());
toDateStr = targetFormat.format(date);
}
Attribute fromdate= AttributeBuilder.build(new String("FROMDATE"),fromDateStr);
Attribute todate= AttributeBuilder.build(new String("TODATE"),toDateStr);
EmbeddedObjectBuilder roleEA = new EmbeddedObjectBuilder();
roleEA.addAttribute(roleId);
roleEA.addAttribute(fromdate);
roleEA.addAttribute(todate);
roleEA.setObjectClass(new ObjectClass("USER_ROLE"));
eoList.add(roleEA.build());
}
roleResultSet.close();
roleStmt.close();
EmbeddedObject[] roleEm = eoList.toArray(new EmbeddedObject[eoList.size()]);
cob.addAttribute(AttributeBuilder.build("USER_ROLE", (Object[]) roleEm));
groupStmt = conn.prepareCall("{call GET_USERGROUP(?,?)}");
groupStmt.registerOutParameter(1, oracle.jdbc.driver.OracleTypes.CURSOR);
groupStmt.setString(2, rs.getString(1));
groupStmt.execute();
groupResultSet = groupStmt.getObject(1);
java.util.List<EmbeddedObject> geoList = new ArrayList<EmbeddedObject>();
while (groupResultSet.next()) {
Attribute groupId= AttributeBuilder.build(new String("GROUPID"),groupResultSet.getString(1));
EmbeddedObjectBuilder groupEA = new EmbeddedObjectBuilder();
groupEA.addAttribute(groupId);
groupEA.setObjectClass(new ObjectClass("USER_GROUP"));
geoList.add(groupEA.build());
}
groupResultSet.close();
groupStmt.close();
EmbeddedObject[] groupEm = geoList.toArray(new EmbeddedObject[geoList.size()]);
cob.addAttribute(AttributeBuilder.build("USER_GROUP", (Object[]) groupEm));
Attribute timestamp= AttributeBuilder.build(new String("LASTUPDATED"),rs.getString(9));
token = AttributeUtil.getSingleValue(timestamp);
SyncToken syncToken = new SyncToken(token);
SyncDeltaBuilder bld = new SyncDeltaBuilder();
bld.setObject(cob.build());
bld.setToken(syncToken);
bld.setDeltaType(SyncDeltaType.CREATE_OR_UPDATE);
handler.handle(bld.build());
} } finally {
if( null != rs)
rs.close();
if( null != st)
st.close();
}A.9 サンプルのGroovyおよび構成スクリプトで使用される表
次に、サンプルのgroovyスクリプトと構成スクリプトで使用される表をリストします。
-
ロールとグループの参照表:
create table ROLES( roleid varchar2(50), rolename varchar2(50)); create table GROUPS( groupid varchar2(50), groupname varchar2(50));
-
ユーザー・アカウントの表:
-
親表:
create table USERINFO( UserId varchar2(50), FirstName varchar2(50), LastName varchar2(50), email varchar2(50), Description varchar2(50), Salary NUMBER, JoiningDate date, status varchar2(50), lastupdated timestamp, PRIMARY KEY ( UserId ));
-
子表:
create table USER_ROLE( userid varchar2(50), roleid varchar2(50), fromdate date, todate date); create table USER_GROUP( userid varchar2(50), groupid varchar2(50)); ALTER TABLE USER_GROUP ADD CONSTRAINT GROUP_PK PRIMARY KEY ("USERID", "GROUPID") ENABLE; ALTER TABLE USER_ROLE ADD CONSTRAINT ROLE_PK PRIMARY KEY ("USERID", "ROLEID") ENABLE;
-