OIM 
11g has introduced an improved and template based 
Notifications framework. New release has removed the limitation of sending text 
based emails (out-of-the-box emails) and enhanced to support html features. New 
release provides in-built out-of-the-box templates for events like 'Reset 
Password', 'Create User Self Service' , ‘User Deleted' etc. Also provides new 
APIs to support custom templates to send notifications out of OIM. 
     
       
         
           
            OIM 
notification framework supports notification mechanism based on events, 
notification templates and template resolver. They are defined as 
follows: 
            Ø Events 
are defined as XML file and imported as part of MDS database in order to make 
notification event available for use. 
            Ø Notification 
templates are created using OIM advance administration console. The template 
contains the text and the substitution 'variables' which will be replaced with 
the data provided by the template resolver. Templates support 
internationalization and can be defined as HTML or in form of simple text. 
 
            Ø Template 
resolver is a Java class that is responsible to provide attributes and data to 
be used at runtime and design time. It must be deployed following the OIM 
plug-in framework. Resolver data provided at design time is to be used by end 
user to design notification template with available entity variables and it also 
provides data at runtime to replace the designed variable with value to be 
displayed to recipients. 
           
         
       
     
    Steps 
to define custom notifications in OIM 11g are: 
     
       
         
           
            Steps# 
           
           
            Steps 
           
         
         
           
            1. 
           
           
            Define 
the Notification Event 
           
         
         
           
            2. 
           
           
            Create 
the Custom Template Resolver class 
           
         
         
           
            3. 
           
           
            Create 
Template with notification contents to be sent to 
recipients 
           
         
         
           
            4. 
           
           
            Create 
Event triggering spots in OIM 
           
         
       
     
    1. Notification 
Event metadata 
    The 
Notification Event is defined as XML file which need to be imported into MDS 
database. An event file must be compliant with the schema defined by the 
notification engine, which is NotificationEvent.xsd. The event file contains 
basic information about the event.XSD location in MDS database: 
“/metadata/iam-features-notification/NotificationEvent.xsd”Schema 
file can be viewed by exporting file from MDS using 
weblogicExportMetadata.sh script.Sample Notification event metadata 
definition: 
     
       
         
           
            1: <?xml version="1.0" 
encoding="UTF-8"?> 
            2: 
<Events xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance 
xsi:noNamespaceSchemaLocation="../../../metadata/NotificationEvent.xsd"> 
            3: <EventType 
name="Sample Notification"> 
            4: 
 <StaticData> 
            5: 
 <Attribute 
DataType="X2-Entity" EntityName="User" Name="Granted 
User"/> 
            6: </StaticData> 
            7: <Resolver class="com.iam.oim.demo.notification.DemoNotificationResolver"> 
            8: <Param DataType="91-Entity" EntityName="Resource" Name="ResourceInfo"/> 
            9: </Resolver> 
            10: </EventType> 
            11: 
</Events> 
           
         
       
     
      
     
       
         
           
            Line# 
           
           
            Description 
           
         
         
           
            1. 
           
           
            XML 
file notation tag 
           
         
         
           
            2. 
           
           
            Events 
is root tag 
           
         
         
           
            3. 
           
           
            EventType tag is to declare a unique event name which 
will be available for template designing 
           
         
         
           
            4. 
           
           
            The 
StaticData 
element lists a set of parameters which allow user to add parameters that are 
not data dependent. In other words, this element defines the static data to be 
displayed when notification is to be configured. An example of static data is 
the User 
entity, which is not dependent on any other data and has the same set of 
attributes for all event instances and notification templates. Available 
attributes are used to be defined as substitution tokens in the template. 
           
         
         
           
            5. 
           
           
            Attribute 
tag is child tag for StaticData to declare the entity 
and its data type with unique reference name. User entity is most commonly used 
Entity as StaticData. 
           
         
         
           
            6. 
           
           
            StaticData 
closing tag 
           
         
         
           
            7. 
           
           
            Resolver 
tag defines the resolver class. The Resolver class must be defined for each 
notification. It defines what parameters are available in the notification 
creation screen and how those parameters are replaced when the notification is 
to be sent. Resolver class resolves the data dynamically at run time and 
displays the attributes in the UI. 
           
         
         
           
            8. 
           
           
            The 
Param DataType element 
lists a set of parameters which allow user to add parameters that are data 
dependent. An example of the data dependent or a dynamic entity is a resource 
object which user can select at run time. A notification template is to be 
configured for the resource object. Corresponding to the resource object field, 
a lookup is displayed on the UI. When a user selects the event the call goes to 
the Resolver class provided to fetch the fields that are displayed in the 
Available Data list, from which user can select the attribute to be used on the 
template. 
            Param 
tag is child tag to declare the entity and its data type with unique reference 
name.  
           
         
         
           
            9. 
           
           
            Resolver 
closing tag 
           
         
         
           
            10 
           
           
            EventType 
closing tag 
           
         
         
           
            11. 
           
           
            Events 
closing tag 
           
         
       
     
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
     
       
         
           
             
              Note: - DataType needs to be declared as “X2-Entity” for User entity 
and “91-Entity” for Resource or Organization entities. The dynamic entities 
supported for lookup are user, resource, and 
organization. 
             
           
         
       
      
      
     Once 
notification event metadata is defined, need to be imported into MDS database. 
Fully qualified resolver class name need to be define for XML but do not need to 
load the class in OIM yet (it can be loaded later). 
    2. Coding 
the notification resolver 
    All 
event owners have to provide a resolver class which would resolve the data 
dynamically at run time. Custom resolver class must implement the interface 
oracle.iam.notification.impl.NotificationEventResolver 
and override the implemented methods with actual implementation. It has 2 
methods: 
      
     
       
         
           
            S# 
           
           
            Methods 
Descriptions 
           
         
         
           
            1. 
           
           
            public 
List<NotificationAttribute> getAvailableData(String eventType, 
Map<String, Object> params); 
              
            This 
API will return the list of available data variables. These variables will be 
available on the UI while creating/modifying the Templates and would let user 
select the variables so that they can be embedded as a token as part of the 
Messages on the template. These 
tokens are replaced by the value passed by the resolver class at run time. 
Available data is displayed in a list. 
              
            The 
parameter "eventType" specifies the event Name for 
which template is to be read.The parameter "params" is the map which has the entity name and the 
corresponding value for which available data is to be 
fetched. 
              
            Sample 
code snippet: 
              
            List<NotificationAttribute> list = new ArrayList<NotificationAttribute>(); 
            long 
objKey = (Long) params.get("resource"); 
            //Form 
Field details based on Resource object key 
            HashMap<String, 
Object> formFieldDetail = getObjectFormName(objKey); 
            for 
(Iterator<?> itrd = 
formFieldDetail.entrySet().iterator(); itrd.hasNext(); ) 
{ 
            NotificationAttribute availableData = new NotificationAttribute(); 
            Map.Entry formDetailEntrySet = (Entry<?, ?>)itrd.next(); 
            String 
fieldLabel = (String)formDetailEntrySet.getValue(); 
            availableData.setName(fieldLabel); 
            list.add(availableData); 
            } 
            return 
list; 
              
           
         
         
           
            2. 
           
           
            Public 
HashMap<String, Object> getReplacedData(String eventType, 
Map<String, Object> params); 
              
            This 
API would return the resolved value of the variables present on the template at 
the runtime when notification is being sent. 
            The 
parameter "eventType" specifies the event Name for 
which template is to be read.The parameter "params" is the map which has the base values such as usr_key, obj_key etc required by 
the resolver implementation to resolve the rest of the variables in the 
template. 
              
            Sample 
code snippet: 
            HashMap<String, Object> resolvedData = new HashMap<String, Object>();String firstName = getUserFirstname(params.get("usr_key"));resolvedData.put("fname", firstName); 
            String 
lastName = getUserLastName(params.get("usr_key"));resolvedData.put("lname", lastname);resolvedData.put("count", "1 million");return resolvedData; 
              
           
         
       
     
      
    This 
code must be deployed as per OIM 11g plug-in framework. The XML file defining 
the plug-in is as below: 
     
       
         
           
            <?xml 
version="1.0" encoding="UTF-8"?> 
            <oimplugins xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
             <plugins 
pluginpoint="oracle.iam.notification.impl.NotificationEventResolver"> 
            <plugin pluginclass= " com.iam.oim.demo.notification.DemoNotificationResolver" 
version="1.0" name="Sample Notification Resolver"/>  
             </plugins> 
            </oimplugins> 
           
         
       
     
    3. Defining 
the template 
    To 
create a notification template: 
     
       
         
           
            Log 
in to the Oracle Identity Administration 
           
         
         
           
            Click 
the System Management tab and then click the Notification tab 
           
         
         
           
            From 
the Actions list on the left pane, select Create 
             
           
         
         
           
            On 
the Create page, enter values for the following fields under the Template 
Information section: 
              Template Name: Demo template 
              Description Text: Demo template 
           
         
         
           
            Under 
the Event Details section, perform the following: 
            From 
the Available Event list, select the event for which the notification template 
is to be created from a list of available events. Depending on your selection, 
other fields are displayed in the Event Details section. Note that the template 
Sample Notification Event created in the previous step being used as the 
notification event. The contents of the Available Data drop down are based on 
the event XML StaticData tag, the drop down basically 
lists all the attributes of the entities defined in that tag. Once you select an 
element in the drop down, it will show up in the Selected Data text field and 
then you can just copy it and paste it into either the message subject or the 
message body fields prefixing $ symbol. Example if list has attribute like First_Name then message body will contains this as $First_Name which resolver will parse and replace it with 
actual value at runtime. 
            In 
the Resource field, select a resource from the lookup. This is the dynamic data 
defined by the Param DataType element in the XML definition. Based on selected 
resource getAvailableData method of resolver will be 
called to fetch the resource object attribute detail, if method is overridden 
with required implementation. For current scenario, Map<String, Object> 
params will get populated with object key as value and 
key as “resource” in the map. This is the only input will be provided to 
resolver at design time. You need to implement the further logic to fetch the 
object attributes detail to populate the available Data list. List string should 
not have space in between, if object attributes has space for attribute name 
then implement logic to replace the space with ‘_’ before populating the list. 
Example if attribute name is “First Name” then make it “First_Name” and populate the list. Space is not supported 
while you try to parse and replace the token at run time with real 
value. 
            Make 
a note that the Available Data and Selected Data are used in the substitution 
tokens definition only, they do not define the final 
data that will be sent in the notification. OIM will invoke the resolver class 
to get the data and make the substitutions. 
             
           
         
         
           
            Under 
the Locale Information section, enter values in the following 
fields: 
            To 
specify a form of encoding, select either UTF-8 or 
ASCII. 
            In 
the Message Subject field, enter a subject for the 
notification. 
            From 
the Type options, select the data type in which you want to send the message. 
You can choose between HTML and Text/Plain. 
            In 
the Short Message field, enter a gist of the message in very few 
words. 
            In 
the Long Message field, enter the message that will be sent as the notification 
with Available data token which need to be replaced by resolver at 
runtime. 
           
         
         
           
            After 
you have entered the required values in all the fields, click 
Save. 
           
         
         
           
            A 
message is displayed confirming the creation of the notification template. Click 
OK 
           
         
       
     
      
    4. Triggering 
the event 
    A 
notification event can be triggered from different places in OIM. The logic 
behind the triggering must be coded and plugged into OIM.  
    Examples 
of triggering points for notifications: 
    Event 
handlers: post process notifications for specific data updates in OIM 
users 
    Process 
tasks: to notify the users that a provisioning task was executed by 
OIM 
    Scheduled 
tasks: to notify something related to the task 
    The 
scheduled job has two parameters: 
    Template 
Name: defines the notification template to be sent 
    User 
Login: defines the user record that will provide the data to be sent in the 
notification 
    Sample 
Code Snippet: 
     
       
         
           
            public 
void execute(String templateName , String userId) { 
            try 
{ 
            NotificationService notService = Platform.getService(NotificationService.class); 
            NotificationEvent eventToSend=this.createNotificationEvent(templateName,userId); 
            notService.notify(eventToSend); 
            } 
catch (Exception e) { 
             e.printStackTrace(); 
            } 
            } 
           
         
         
           
            private 
NotificationEvent createNotificationEvent(String poTemplateName, String poUserId) 
{ 
             NotificationEvent event = new NotificationEvent(); 
             String[] receiverUserIds= { poUserId 
};  
             event.setUserIds(receiverUserIds); 
             event.setTemplateName(poTemplateName); 
             event.setSender(null); 
             HashMap<String, Object> templateParams = new HashMap<String, Object>(); 
             templateParams.put("USER_LOGIN",poUserId); 
             event.setParams(templateParams); 
             return event; 
             } 
             public HashMap getAttributes() { 
             return null; 
             } 
             public void setAttributes() {} 
            }