Saturday 10 September 2016

Event Handler for Generating Random Password and Updating in OIM and Send Custom Notification in OIM11gR2

Requirement- Our requirement is once user is Enabled in OIM then it will treated as Rehire User so for this user I am generating Random Password according to OIM Password Policy and updating password in OIM and sending the Custom Notification to Manager and User for Rehire User in OIM11gR2. For this I have developed Post Process Event Handler on Enable User Event.

=================================OIM Client Code==================================
We need to put Jar file in lib folder.
package com.oim.EventHandler;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
import com.thortech.util.logging.Logger;
import Thor.API.tcResultSet;
import Thor.API.Exceptions.tcAPIException;
import Thor.API.Exceptions.tcColumnNotFoundException;
import Thor.API.Exceptions.tcInvalidLookupException;
import Thor.API.Operations.tcLookupOperationsIntf;
import Thor.API.Operations.tcUserOperationsIntf;
import oracle.core.ojdl.logging.ODLLogger;
import oracle.iam.identity.exception.NoSuchUserException;
import oracle.iam.identity.exception.SearchKeyNotUniqueException;
import oracle.iam.identity.exception.UserLookupException;
import oracle.iam.identity.exception.UserManagerException;
import oracle.iam.identity.usermgmt.api.UserManager;
import oracle.iam.identity.usermgmt.vo.User;
import oracle.iam.passwordmgmt.domain.generator.RandomPasswordGeneratorImpl;
import oracle.iam.platform.Platform;
import oracle.iam.platform.authz.exception.AccessDeniedException;
import oracle.iam.platform.context.ContextAware;
import oracle.iam.platform.kernel.spi.PostProcessHandler;
import oracle.iam.platform.kernel.vo.AbstractGenericOrchestration;
import oracle.iam.platform.kernel.vo.BulkEventResult;
import oracle.iam.platform.kernel.vo.BulkOrchestration;
import oracle.iam.platform.kernel.vo.EventResult;
import oracle.iam.platform.kernel.vo.Orchestration;
import java.util.Locale;
import java.util.Properties;
public class RandomPasswordGenerator implements PostProcessHandler {
String _className = "comoim.EventHandler.RandomPasswordGenerator.java-";
private static final ODLLogger logger = ODLLogger.getODLLogger("EVE_RANDOMPASSWORDGENERATE_REHIREUSER.LOGGER");
UserManager usrmgr = null;
RandomPasswordGeneratorImpl randomPasswordGenerator = null;
tcUserOperationsIntf userintf = null;
User user = null;
String maillookup="Lookup.SAPAssociate.EmailConfiguration";
String _propertiesFileName = "/opt/oracle/RandomPasswordForRehireUser.properties";
String _OIM_NEW_MGR_KEY=null;
String _OIM_NEW_USR_LOGIN = "";
String _OIM_NEW_STATUS = "";
String _OIM_OLD_STATUS = "";
String _OIM_NEW_EMAIL = "";
String usrMgrEmail=null;

@Override
public void initialize(HashMap<String, String> arg0) {
// TODO Auto-generated method stub
}
@Override
public void compensate(long arg0, long arg1, AbstractGenericOrchestration arg2) {
// TODO Auto-generated method stub
}
@Override
public boolean cancel(long arg0, long arg1, AbstractGenericOrchestration arg2) {
// TODO Auto-generated method stub
return false;
}
@Override
public EventResult execute(long processID, long eventID, Orchestration orchestration) {
// TODO Auto-generated method stub
String _methodName = "execute() method-";
logger.log(java.util.logging.Level.FINE,"In Execute Method");
usrmgr = Platform.getService(UserManager.class);
randomPasswordGenerator = new RandomPasswordGeneratorImpl();
userintf = Platform.getService(tcUserOperationsIntf.class);
logger.log(java.util.logging.Level.FINE, "Start - Getting old and new user profile"); 
java.util.HashMap<String, java.io.Serializable> hm = orchestration.getInterEventData();
        oracle.iam.identity.usermgmt.vo.User oldUsr = (oracle.iam.identity.usermgmt.vo.User) hm.get("CURRENT_USER");
    oracle.iam.identity.usermgmt.vo.User newUsr = (oracle.iam.identity.usermgmt.vo.User) hm.get("NEW_USER_STATE");
         
    //Getting attributes from the new user profile object.
    _OIM_OLD_STATUS = oldUsr.getStatus();
    _OIM_NEW_STATUS = newUsr.getStatus();
    _OIM_NEW_USR_LOGIN=newUsr.getLogin();
    _OIM_NEW_EMAIL=newUsr.getEmail();
    _OIM_NEW_MGR_KEY=newUsr.getManagerKey();
    logger.log(java.util.logging.Level.FINE, "New User Status : --" + _OIM_NEW_STATUS + "--");
    logger.log(java.util.logging.Level.FINE, "Old User Status : --" + _OIM_OLD_STATUS + "--");
    logger.log(java.util.logging.Level.FINE, "New User Login  : --" + _OIM_NEW_USR_LOGIN + "--");
    logger.log(java.util.logging.Level.FINE, "New User Email : --" + _OIM_NEW_EMAIL + "--");
    logger.log(java.util.logging.Level.FINE, "New User Manager Key : --" + _OIM_NEW_MGR_KEY + "--");
    logger.log(java.util.logging.Level.FINE, "End - Getting old and new user profile");
        HashMap userMap = new HashMap();
   userMap.put("Users.Key", _OIM_NEW_MGR_KEY);
   tcResultSet userResultSet = null;
   try {
userResultSet = userintf.findUsers(userMap);
String[] CNameforUser=userResultSet.getColumnNames();
   usrMgrEmail=userResultSet.getStringValue("usr_email");
   logger.log(java.util.logging.Level.FINE,"User Manager Email --->"+usrMgrEmail);
   logger.log(java.util.logging.Level.FINE, ">>>>>>>End - Manager Email Search >>>>>>>");
   
   } catch (tcAPIException e) {
    String _errorMessage = "Exception-Exception-Message : " + e.getMessage();
       logger.log(java.util.logging.Level.INFO, _className + _methodName + _errorMessage);       
       java.io.StringWriter sw = new java.io.StringWriter(); 
       java.io.PrintWriter pw = new java.io.PrintWriter(sw);
       e.printStackTrace(pw);                                                                                          
       logger.log(java.util.logging.Level.SEVERE, _className + _methodName + _errorMessage + "- Complete Error Stack : " + sw.toString());
}
catch (tcColumnNotFoundException e) {
String _errorMessage = "Exception-Exception-Message : " + e.getMessage();
       logger.log(java.util.logging.Level.INFO, _className + _methodName + _errorMessage);       
       java.io.StringWriter sw = new java.io.StringWriter(); 
       java.io.PrintWriter pw = new java.io.PrintWriter(sw);
       e.printStackTrace(pw);                                                                                          
       logger.log(java.util.logging.Level.SEVERE, _className + _methodName + _errorMessage + "- Complete Error Stack : " + sw.toString());
}
   
try {
user = usrmgr.getDetails("User Login", _OIM_NEW_USR_LOGIN, null);
} catch (NoSuchUserException e) {
String _errorMessage = "Exception-Exception-Message : " + e.getMessage();
       logger.log(java.util.logging.Level.INFO, _className + _methodName + _errorMessage);       
       java.io.StringWriter sw = new java.io.StringWriter(); 
       java.io.PrintWriter pw = new java.io.PrintWriter(sw);
       e.printStackTrace(pw);                                                                                          
       logger.log(java.util.logging.Level.SEVERE, _className + _methodName + _errorMessage + "- Complete Error Stack : " + sw.toString());
} catch (UserLookupException e) {
String _errorMessage = "Exception-Exception-Message : " + e.getMessage();
       logger.log(java.util.logging.Level.INFO, _className + _methodName + _errorMessage);       
       java.io.StringWriter sw = new java.io.StringWriter(); 
       java.io.PrintWriter pw = new java.io.PrintWriter(sw);
       e.printStackTrace(pw);                                                                                          
       logger.log(java.util.logging.Level.SEVERE, _className + _methodName + _errorMessage + "- Complete Error Stack : " + sw.toString());
} catch (SearchKeyNotUniqueException e) {
String _errorMessage = "Exception-Exception-Message : " + e.getMessage();
       logger.log(java.util.logging.Level.INFO, _className + _methodName + _errorMessage);       
       java.io.StringWriter sw = new java.io.StringWriter(); 
       java.io.PrintWriter pw = new java.io.PrintWriter(sw);
       e.printStackTrace(pw);                                                                                          
       logger.log(java.util.logging.Level.SEVERE, _className + _methodName + _errorMessage + "- Complete Error Stack : " + sw.toString());
} catch (AccessDeniedException e) {
String _errorMessage = "Exception-Exception-Message : " + e.getMessage();
       logger.log(java.util.logging.Level.INFO, _className + _methodName + _errorMessage);       
       java.io.StringWriter sw = new java.io.StringWriter(); 
       java.io.PrintWriter pw = new java.io.PrintWriter(sw);
       e.printStackTrace(pw);                                                                                          
       logger.log(java.util.logging.Level.SEVERE, _className + _methodName + _errorMessage + "- Complete Error Stack : " + sw.toString());
}
User userNew = new User(user.getEntityId());
logger.log(java.util.logging.Level.FINE, ">>>>>>> Before generating Random Password >>>>>>>");
/*<----------Generating Random Password--------------->*/
char new_pwd[] = randomPasswordGenerator.generatePassword(user);
logger.log(java.util.logging.Level.FINE, "Got Scheduler Attributes : [Generated Random Password:"+new_pwd.toString()+"] ");
/*<----------Converting Random Password in String--------------->*/
String pass = new String(new_pwd);
try {
logger.log(java.util.logging.Level.FINE, ">>>>>>> Before updating the Password in OIM >>>>>>>");
/*<----------Updating Random Password in OIM--------------->*/
usrmgr.changePassword(_OIM_NEW_USR_LOGIN, new_pwd, true, null, true, false);
logger.log(java.util.logging.Level.FINE, ">>>>>>> Password has been updated in OIM for User >>>>>>>");
} catch (NoSuchUserException e) {
String _errorMessage = "Exception-Exception-Message : " + e.getMessage();
       logger.log(java.util.logging.Level.INFO, _className + _methodName + _errorMessage);       
       java.io.StringWriter sw = new java.io.StringWriter(); 
       java.io.PrintWriter pw = new java.io.PrintWriter(sw);
       e.printStackTrace(pw);                                                                                          
       logger.log(java.util.logging.Level.SEVERE, _className + _methodName + _errorMessage + "- Complete Error Stack : " + sw.toString());
} catch (UserManagerException e) {
String _errorMessage = "Exception-Exception-Message : " + e.getMessage();
       logger.log(java.util.logging.Level.INFO, _className + _methodName + _errorMessage);       
       java.io.StringWriter sw = new java.io.StringWriter(); 
       java.io.PrintWriter pw = new java.io.PrintWriter(sw);
       e.printStackTrace(pw);                                                                                          
       logger.log(java.util.logging.Level.SEVERE, _className + _methodName + _errorMessage + "- Complete Error Stack : " + sw.toString());
} catch (AccessDeniedException e) {
String _errorMessage = "Exception-Exception-Message : " + e.getMessage();
       logger.log(java.util.logging.Level.INFO, _className + _methodName + _errorMessage);       
       java.io.StringWriter sw = new java.io.StringWriter(); 
       java.io.PrintWriter pw = new java.io.PrintWriter(sw);
       e.printStackTrace(pw);                                                                                          
       logger.log(java.util.logging.Level.SEVERE, _className + _methodName + _errorMessage + "- Complete Error Stack : " + sw.toString());
}
try {
/*<----------Sending Credential Notification to Manager--------------->*/
if(usrMgrEmail!=null){
sendEMailToManager(_OIM_NEW_USR_LOGIN, pass, usrMgrEmail);
}
} catch (tcInvalidLookupException e) {
String _errorMessage = "Exception-Exception-Message : " + e.getMessage();
       logger.log(java.util.logging.Level.INFO, _className + _methodName + _errorMessage);       
       java.io.StringWriter sw = new java.io.StringWriter(); 
       java.io.PrintWriter pw = new java.io.PrintWriter(sw);
       e.printStackTrace(pw);                                                                                          
       logger.log(java.util.logging.Level.SEVERE, _className + _methodName + _errorMessage + "- Complete Error Stack : " + sw.toString());
}
try {
/*<----------Sending Credential Notification to User--------------->*/
if(_OIM_NEW_EMAIL!=null){
sendEMailToUser(_OIM_NEW_USR_LOGIN, pass, _OIM_NEW_EMAIL);
}
} catch (tcInvalidLookupException e) {
String _errorMessage = "Exception-Exception-Message : " + e.getMessage();
       logger.log(java.util.logging.Level.INFO, _className + _methodName + _errorMessage);       
       java.io.StringWriter sw = new java.io.StringWriter(); 
       java.io.PrintWriter pw = new java.io.PrintWriter(sw);
       e.printStackTrace(pw);                                                                                          
       logger.log(java.util.logging.Level.SEVERE, _className + _methodName + _errorMessage + "- Complete Error Stack : " + sw.toString());
}
   
return new EventResult();

}
public String sendEMailToManager(String userid, String pass, String usrMgrEmail) throws tcInvalidLookupException
{
String _methodName = "sendEMailToManager()-";
logger.log(java.util.logging.Level.FINE, "****************In Send Email To Manager Method !!!********************");
logger.log(java.util.logging.Level.FINE,"Mail Lookup: "+maillookup);
    String body="";
String sub="";
String response = "Failure";
String mailer = "msgsend";
Properties prop = new Properties();
InputStream input = null;
try {
input = new FileInputStream(_propertiesFileName);
// load a properties file
prop.load(input);
// get the property value and print it out
sub=prop.getProperty("RANDOMPASSWORD_EMAIL_SUB");
logger.log(java.util.logging.Level.FINE, "Email Subject is: "+sub);
body=prop.getProperty("RANDOMPASSWORD_EMAIL_BODY");
body=body.replace("__UserLogin__", userid);
body=body.replace("__Password__", pass);
tcLookupOperationsIntf lookupOps=Platform.getService(Thor.API.Operations.tcLookupOperationsIntf.class);

try 
{
String _SMTP_EMAILFROM = lookupOps.getDecodedValueForEncodedValue(maillookup, "SMTP_EMAILFROM");
String _SMTP_MAILHOST = lookupOps.getDecodedValueForEncodedValue(maillookup, "SMTP_MAILHOST");
   logger.log(java.util.logging.Level.FINE, "Email From: "+_SMTP_EMAILFROM);
logger.log(java.util.logging.Level.FINE, "------Host name is: "+_SMTP_MAILHOST);
java.util.Properties props = System.getProperties();
if (_SMTP_MAILHOST != null)
{
props.put("mail.smtp.host", _SMTP_MAILHOST);
}
javax.mail.Session session = javax.mail.Session.getInstance(props, null);
session.setDebug(false);
javax.mail.Message msg = new javax.mail.internet.MimeMessage(session);
if (_SMTP_EMAILFROM != null) msg.setFrom(new javax.mail.internet.InternetAddress(_SMTP_EMAILFROM));
else msg.setFrom();
msg.setRecipients(javax.mail.Message.RecipientType.TO, javax.mail.internet.InternetAddress.parse(usrMgrEmail, false));
msg.setSubject(sub);
msg.setContent(body, "text/html; charset=utf-8");
//msg.setText(body,"UTF-8");
msg.setHeader("X-Mailer", mailer);
msg.setHeader("Content-Type", "text/html; charet=utf-8");
logger.log(java.util.logging.Level.FINE, "------Message is-------->["+msg+"]--------");
javax.mail.Transport.send(msg);
logger.log(java.util.logging.Level.FINE, "****************Email has been send to Manager Successfully !!!********************");

}catch (tcAPIException e) {
  String _errorMessage = "Exception-Exception-Message : " + e.getMessage();
          logger.log(java.util.logging.Level.INFO, _className + _methodName + _errorMessage);       
          java.io.StringWriter sw = new java.io.StringWriter(); 
          java.io.PrintWriter pw = new java.io.PrintWriter(sw);
          e.printStackTrace(pw);                                                                                          
          logger.log(java.util.logging.Level.SEVERE, _className + _methodName + _errorMessage + "- Complete Error Stack : " + sw.toString());                              
}catch (Exception e) { 
  String _errorMessage = "Exception-Exception-Message : " + e.getMessage();
          logger.log(java.util.logging.Level.INFO, _className + _methodName + _errorMessage);       
          java.io.StringWriter sw = new java.io.StringWriter(); 
          java.io.PrintWriter pw = new java.io.PrintWriter(sw);
          e.printStackTrace(pw);                                                                                          
          logger.log(java.util.logging.Level.SEVERE, _className + _methodName + _errorMessage + "- Complete Error Stack : " + sw.toString());                              
   }    
} catch (FileNotFoundException e) {
String _errorMessage = "Exception-Exception-Message : " + e.getMessage();
        logger.log(java.util.logging.Level.INFO, _className + _methodName + _errorMessage);       
        java.io.StringWriter sw = new java.io.StringWriter(); 
        java.io.PrintWriter pw = new java.io.PrintWriter(sw);
        e.printStackTrace(pw);                                                                                          
        logger.log(java.util.logging.Level.SEVERE, _className + _methodName + _errorMessage + "- Complete Error Stack : " + sw.toString());                              
    } catch (IOException e) {
    String _errorMessage = "Exception-Exception-Message : " + e.getMessage();
        logger.log(java.util.logging.Level.INFO, _className + _methodName + _errorMessage);       
        java.io.StringWriter sw = new java.io.StringWriter(); 
        java.io.PrintWriter pw = new java.io.PrintWriter(sw);
        e.printStackTrace(pw);                                                                                          
        logger.log(java.util.logging.Level.SEVERE, _className + _methodName + _errorMessage + "- Complete Error Stack : " + sw.toString());                              
        }
    catch (Exception e) { 
    String _errorMessage = "Exception-Exception-Message : " + e.getMessage();
        logger.log(java.util.logging.Level.INFO, _className + _methodName + _errorMessage);       
        java.io.StringWriter sw = new java.io.StringWriter(); 
        java.io.PrintWriter pw = new java.io.PrintWriter(sw);
        e.printStackTrace(pw);                                                                                          
        logger.log(java.util.logging.Level.SEVERE, _className + _methodName + _errorMessage + "- Complete Error Stack : " + sw.toString());                              
        }    
return response;
}
public String sendEMailToUser(String userid, String pass, String usrEmail) throws tcInvalidLookupException
{
String _methodName = "sendEMailToUser()-";
logger.log(java.util.logging.Level.FINE, "****************In Send Email To User Method !!!********************");
logger.log(java.util.logging.Level.FINE,"Mail Lookup: "+maillookup);
    String body="";
String sub="";
String response = "Failure";
String mailer = "msgsend";
Properties prop = new Properties();
InputStream input = null;
try {
input = new FileInputStream(_propertiesFileName);
// load a properties file
prop.load(input);
// get the property value and print it out
sub=prop.getProperty("RANDOMPASSWORD_EMAIL_SUB");
logger.log(java.util.logging.Level.FINE, "Email Subject is: "+sub);
body=prop.getProperty("RANDOMPASSWORD_EMAIL_BODY");
body=body.replace("__UserLogin__", userid);
body=body.replace("__Password__", pass);
tcLookupOperationsIntf lookupOps=Platform.getService(Thor.API.Operations.tcLookupOperationsIntf.class);

try 
{
String _SMTP_EMAILFROM = lookupOps.getDecodedValueForEncodedValue(maillookup, "SMTP_EMAILFROM");
String _SMTP_MAILHOST = lookupOps.getDecodedValueForEncodedValue(maillookup, "SMTP_MAILHOST");
   logger.log(java.util.logging.Level.FINE, "Email From: "+_SMTP_EMAILFROM);
logger.log(java.util.logging.Level.FINE, "------Host name is: "+_SMTP_MAILHOST);
java.util.Properties props = System.getProperties();
if (_SMTP_MAILHOST != null)
{
props.put("mail.smtp.host", _SMTP_MAILHOST);
}
javax.mail.Session session = javax.mail.Session.getInstance(props, null);
session.setDebug(false);
javax.mail.Message msg = new javax.mail.internet.MimeMessage(session);
if (_SMTP_EMAILFROM != null) msg.setFrom(new javax.mail.internet.InternetAddress(_SMTP_EMAILFROM));
else msg.setFrom();
msg.setRecipients(javax.mail.Message.RecipientType.TO, javax.mail.internet.InternetAddress.parse(usrEmail, false));
msg.setSubject(sub);
msg.setContent(body, "text/html; charset=utf-8");
//msg.setText(body,"UTF-8");
msg.setHeader("X-Mailer", mailer);
msg.setHeader("Content-Type", "text/html; charet=utf-8");
logger.log(java.util.logging.Level.FINE, "------Message is-------->["+msg+"]--------");
javax.mail.Transport.send(msg);
logger.log(java.util.logging.Level.FINE, "****************Email has been send to User Successfully !!!********************");

}catch (tcAPIException e) {
  String _errorMessage = "Exception-Exception-Message : " + e.getMessage();
          logger.log(java.util.logging.Level.INFO, _className + _methodName + _errorMessage);       
          java.io.StringWriter sw = new java.io.StringWriter(); 
          java.io.PrintWriter pw = new java.io.PrintWriter(sw);
          e.printStackTrace(pw);                                                                                          
          logger.log(java.util.logging.Level.SEVERE, _className + _methodName + _errorMessage + "- Complete Error Stack : " + sw.toString());                              
}catch (Exception e) { 
  String _errorMessage = "Exception-Exception-Message : " + e.getMessage();
          logger.log(java.util.logging.Level.INFO, _className + _methodName + _errorMessage);       
          java.io.StringWriter sw = new java.io.StringWriter(); 
          java.io.PrintWriter pw = new java.io.PrintWriter(sw);
          e.printStackTrace(pw);                                                                                          
          logger.log(java.util.logging.Level.SEVERE, _className + _methodName + _errorMessage + "- Complete Error Stack : " + sw.toString());                              
   }    
} catch (FileNotFoundException e) {
String _errorMessage = "Exception-Exception-Message : " + e.getMessage();
        logger.log(java.util.logging.Level.INFO, _className + _methodName + _errorMessage);       
        java.io.StringWriter sw = new java.io.StringWriter(); 
        java.io.PrintWriter pw = new java.io.PrintWriter(sw);
        e.printStackTrace(pw);                                                                                          
        logger.log(java.util.logging.Level.SEVERE, _className + _methodName + _errorMessage + "- Complete Error Stack : " + sw.toString());                              
    } catch (IOException e) {
    String _errorMessage = "Exception-Exception-Message : " + e.getMessage();
        logger.log(java.util.logging.Level.INFO, _className + _methodName + _errorMessage);       
        java.io.StringWriter sw = new java.io.StringWriter(); 
        java.io.PrintWriter pw = new java.io.PrintWriter(sw);
        e.printStackTrace(pw);                                                                                          
        logger.log(java.util.logging.Level.SEVERE, _className + _methodName + _errorMessage + "- Complete Error Stack : " + sw.toString());                              
        }
    catch (Exception e) { 
    String _errorMessage = "Exception-Exception-Message : " + e.getMessage();
        logger.log(java.util.logging.Level.INFO, _className + _methodName + _errorMessage);       
        java.io.StringWriter sw = new java.io.StringWriter(); 
        java.io.PrintWriter pw = new java.io.PrintWriter(sw);
        e.printStackTrace(pw);                                                                                          
        logger.log(java.util.logging.Level.SEVERE, _className + _methodName + _errorMessage + "- Complete Error Stack : " + sw.toString());                              
        }    
return response;
}
@Override
public BulkEventResult execute(long processID, long eventID, BulkOrchestration bulkOrchestration) {
// TODO Auto-generated method stub
return null;
}
private String getParamaterValue(HashMap<String, Serializable> parameters,
           String key) {
String _methodName = "getParamaterValue() method-";
           String value = (parameters.get(key) instanceof ContextAware)
           ? (String) ((ContextAware) parameters.get(key)).getObjectValue()
           : (String) parameters.get(key);
           return value;
            }

}

=================================plugin.xml==================================

<?xml version="1.0" encoding="UTF-8"?>

<oimplugins>

  <plugins pluginpoint="oracle.iam.platform.kernel.spi.EventHandler">
    <plugin pluginclass="com.oim.EventHandler.RandomPasswordGenerator" version="1.0" name="RandomPasswordGenerator" />
  </plugins>
</oimplugins>

============================metaDataRandomPasswordGeneration.xml===================
We need to put metaDataRandomPasswordGeneration.xml in META-INF folder.

<?xml version='1.0' encoding='UTF-8'?>
<eventhandlers xmlns="http://www.oracle.com/schema/oim/platform/kernel" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.oracle.com/schema/oim/platform/kernel orchestration-handlers.xsd">
   <!-- Custom postprocess event handlers for middlename -->
<action-handler class="com.oim.EventHandler.RandomPasswordGenerator" entity-type="User" operation="ENABLE" name="RandomPasswordGenerator" order="1004" stage="postprocess" sync="TRUE"/>
</eventhandlers>


=================================Generating Plugins=================================
pluginRandomPasswordGenerationforRehire.zip is combination of zip of below files. Folder Structure is below-

lib-->RandomPasswordGenerator.jar
plugin.xml
META-INF-->metaDataRandomPasswordGeneration.xml