TriggerOrganizationUserProcesses.java

import com.thortech.xl.client.events.tcTriggerUserProcesses;
import com.thortech.xl.dataaccess.tcDataSetException;
import com.thortech.xl.dataobj.tcDataSet;

import java.io.IOException; import java.io.InputStream; import java.util.HashMap import java.util.Properties; import java.util.Vector;
/**  * Event handler to trigger User process task when the associated Organization is updated.  *  * Background:  * <p>  * OIM has two process triggers USR_PROCESS_TRIGGERS and ACT_PROCESS_TRIGGERS  * that invokes a process task when a user attribute or an organization  * attribute is changed.  * <p>  * For example if user's first name is updated, OIM can invoke  * process task "Change First Name" on each of the user's resource.  * <p>  * Similarly OIM can invoke process task "Change Organization Name" on each  * of the organization's resource when the name changes.  * <p>  * However there is no process trigger to invoke a    * a _user_ process task when an _organization_ attribute changes.  * Deploying this event handler will allow OIM to do this.  * <p>  *  !! IMPORTANT !!  * An Organization can have hundreds of users,  * and each users can have many resources.  So thousands of  * process tasks might get triggered, potentially slowing down OIM to a crawl.  * <p>    * To prevent that narrow down as much as possible the organization and  * the users that can trigger the process tasks.  * <p>  * In the implementation below, only organizations of type "Location" will  * trigger the process tasks for users whose login start with "LOCATION".  * <p>  * To deploy:  * <p>  * Review which organization and which users you want to trigger processes  * and update constants <code>ORGANIZATION_TYPE_FILTER</code> and <code>USER_FILTER</code> accordingly.  * <p>  * Create a lookup Lookup.ACT_USR_PROCESS_TRIGGERS and enter the organization  * attributes and the process tasks to trigger  * (modeled on Lookup.USR_PROCESS_TRIGGERS and Lookup.ACT_PROCESS_TRIGGERS)  * <p>  * Add a new event handler in Event Handler Manager.  * <p>    * In Data Object Manager, find the Organization object.  Add  * the event handler created in previous step as a Post-Update.  * <p>  * Add process tasks in the desired process definition  * (e.g. in process AD User add task "Change Organization Telephone")  * <p>  * Created 2010-04-09  *  * @author Vinh-An Trinh vinhant@zerointech.com  */ public class TriggerOrganizationUserProcesses     extends tcTriggerUserProcesses {
    // You can modify these constants
    // Only organization of this type will trigger the user process tasks     // in order to prevent firing too many process tasks     // Modify the organization type according to your specifications     final String ORGANIZATION_TYPE_FILTER = "Location";
    // Only users in this select query will trigger the users process tasks     // in order to prevent firing too many process tasks     // Modify the WHERE clause to your specifications     final String USER_FILTER = "SELECT usr_login, usr_key, act_key " +         "FROM usr " +         "WHERE usr_first_name = 'LOCATION'";
    // Do not modify code below
    // The Organization to User processes are stored in this lookup     final String PROCESS_TRIGGERS_LOOKUP_NAME =         "Lookup.ACT_USR_PROCESS_TRIGGERS";
    private String isActKey = "";     private boolean ibCheckCancelled = true;
    public TriggerOrganizationUserProcesses() {         setEventName("TriggerOrganizationUserProcesses");     }
    protected void implementation() throws Exception {         String newOrganizationType = getDataObject().getString(                 "ACT_CUST_TYPE");         if (ORGANIZATION_TYPE_FILTER.equalsIgnoreCase(                     newOrganizationType)) {             initActKey();             Vector localVector = getMilNamesNeedTrigger(                     PROCESS_TRIGGERS_LOOKUP_NAME);             for (int i = 0; i < localVector.size(); ++i) {                 String str = (String) localVector.elementAt(i);                 trigger(str, this.ibCheckCancelled,                         PROCESS_TRIGGERS_LOOKUP_NAME);             }         }     }
    private void initActKey() {         this.isActKey = getDataObject().getString("act_key");     }
    protected void initOrcTosMap(boolean paramBoolean) {         int i;         this.ioOrcTosMap = new HashMap();
        try {             String queryOrcTos =                 "SELECT usr_login, pkg_name, orc_key, tos_key " +                 "FROM orc, pkg, (${trigger_process_users}) organization_users " +                 "WHERE orc.pkg_key = pkg.pkg_key " +                 "AND orc.usr_key = organization_users.usr_key " +                 "AND orc.act_key = organization_users.act_key " +                 "AND orc.act_key = ${isActKey} " +                 "AND Nvl(pkg_system,0) <> 1 ";
            if (paramBoolean)                 queryOrcTos = queryOrcTos + " and orc_status not in ('X', 'PX')";
            queryOrcTos = queryOrcTos.replaceAll(                     "\\$\\{trigger_process_users\\}",                     USER_FILTER);             queryOrcTos = queryOrcTos.replaceAll("\\$\\{isActKey\\}", isActKey);
            tcDataSet localtcDataSet = new tcDataSet();             localtcDataSet.setQuery(getDataBase(), queryOrcTos);
            localtcDataSet.executeQuery();             for (i = 0; i < localtcDataSet.getRowCount(); ++i) {                 localtcDataSet.goToRow(i);                 String usr_login = localtcDataSet.getString("usr_login");                 String pkg_name = localtcDataSet.getString("pkg_name");                 String orc = localtcDataSet.getString("orc_key");                 String tos = localtcDataSet.getString("tos_key");                 System.out.println("Found user/process: " + usr_login + "/" +                         pkg_name);                 this.ioOrcTosMap.put(orc, tos);             }         } catch (tcDataSetException localtcDataSetException) {             localtcDataSetException.printStackTrace();         }     } }