Context :- If we are not satisfied with the custom email action provided by ibm. We need to extend it and create our custom email action.
Step 1 :- We need to follow the previous tutorial steps and then start doing below steps
Step 2 :- Now create a war file and create below folder structure
Step 1 :- We need to follow the previous tutorial steps and then start doing below steps
Step 2 :- Now create a war file and create below folder structure
Step 3 :- Now start creating class files and packages
package com.wcm.custom.workflow;
import java.util.Locale;
import com.ibm.workplace.wcm.api.Document;
import com.ibm.workplace.wcm.api.custom.CustomWorkflowAction;
import com.ibm.workplace.wcm.api.custom.CustomWorkflowActionFactory;
public class CustomWcmEmailBodyWorkFlowActionFactory implements CustomWorkflowActionFactory {
@Override
public String[] getActionNames() {
String names[] = { "sendEmailToApprovers", "sendEmailToAuthors", "sendEmailToOwners" };
return names;
}
@Override
public String getActionTitle(Locale arg0, String arg1) {
if (arg1.equalsIgnoreCase("sendEmailToApprovers")) {
return "sendEmailToApprovers";
} else if (arg1.equalsIgnoreCase("sendEmailToAuthors")) {
return "sendEmailToAuthors";
} else if (arg1.equalsIgnoreCase("sendEmailToOwners")) {
return "sendEmailToOwners";
}
return null;
}
@Override
public String getActionDescription(Locale arg0, String arg1) {
if (arg1.equalsIgnoreCase("sendEmailToApprovers")) {
return "Send Email To Approvers with custom Body";
} else if (arg1.equalsIgnoreCase("sendEmailToAuthors")) {
return "Send Email To Authors with custom Body";
} else if (arg1.equalsIgnoreCase("sendEmailToOwners")) {
return "Send Email To Oweners with custom Body";
}
return "";
}
@Override
public CustomWorkflowAction getAction(String arg0, Document arg1) {
if (arg0.equalsIgnoreCase("sendEmailToApprovers")) {
return new SendEmailToApproversWithCustomBodyWorkFlowAction();
} else if (arg0.equalsIgnoreCase("sendEmailToAuthors")) {
return new SivaTestSendEmailToAuthorsWithCustomBodyWorkFlowAction();
} else if (arg0.equalsIgnoreCase("sendEmailToOwners")) {
return new SendEmailToOwnersWithCustomBodyWorkFlowAction();
}
return null;
}
@Override
public String getName() {
return "SivaTestCustomWcmEmailBodyWorkFlowActionFactory";
}
@Override
public String getTitle(Locale arg0) {
return "Siva Test Customized WCM Notification Email Body ";
}
}
SendEmailToApproversWithCustomBodyWorkFlowAction :-
package com.wcm.custom.workflow;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.naming.InitialContext;
import com.ibm.portal.um.Group;
import com.ibm.portal.um.Principal;
import com.ibm.portal.um.PumaController;
import com.ibm.portal.um.PumaHome;
import com.ibm.portal.um.PumaLocator;
import com.ibm.portal.um.PumaProfile;
import com.ibm.portal.um.User;
import com.ibm.workplace.wcm.api.Content;
import com.ibm.workplace.wcm.api.Document;
import com.ibm.workplace.wcm.api.WebContentCustomWorkflowService;
import com.ibm.workplace.wcm.api.Workspace;
import com.ibm.workplace.wcm.api.custom.CustomWorkflowAction;
import com.ibm.workplace.wcm.api.custom.CustomWorkflowActionResult;
import com.ibm.workplace.wcm.api.custom.Directive;
import com.ibm.workplace.wcm.api.custom.Directives;
import com.wcm.mail.util.SendEmail;
public class SendEmailToApproversWithCustomBodyWorkFlowAction implements CustomWorkflowAction {
InitialContext initContext = null;
WebContentCustomWorkflowService webContentCustomWorkflowService = null;
CustomWorkflowActionResult result = null;
// PUMA Objects
PumaHome pHome = null;
PumaController pController = null;
PumaLocator pLocator = null;
PumaProfile pProfile = null;
Principal approverPrincipal = null;
Content content = null;
String message = null;
public SendEmailToApproversWithCustomBodyWorkFlowAction() {
System.out.println("Inside the SivaTestSendEmailToApproversWithCustomBodyWorkFlowAction.... ");
}
public CustomWorkflowActionResult execute(Document arg0) {
System.out.println("Executing SivaTestSendEmailToApproversWithCustomBodyWorkFlowAction.... ");
Directive directive = Directives.CONTINUE;
if (arg0 instanceof Content) {
try {
content = (Content) arg0;
Workspace ws = content.getSourceWorkspace();
ws.useDistinguishedNames(true);
initContext = new InitialContext();
//PUMA related
pHome = (com.ibm.portal.um.PumaHome) initContext.lookup(com.ibm.portal.um.PumaHome.JNDI_NAME);
pController = pHome.getController();
pLocator = pHome.getLocator();
pProfile = pHome.getProfile();
//User Attributes
List<String> userAttributes = new ArrayList<String>();
userAttributes.add("ibm-primaryEmail");
userAttributes.add("cn");
List<Group> groupsList = new ArrayList<Group>();
Set<User> usersList = new HashSet<User>();
List<Principal> membersList = null;
List<Map<String, Object>> approversDetails = new ArrayList<Map<String, Object>>();
//Below additional logic is check for for bother users and groups as approvers,
String currentApprovers[] = content.getCurrentApprovers();
//create a separate lists for users and groups
for (int i = 0; i < currentApprovers.length; i++) {
if(currentApprovers[i].contains("uid=")){
usersList.add(pLocator.findUserByIdentifier(currentApprovers[i]));
}else{
groupsList.add(pLocator.findGroupByIdentifier(currentApprovers[i]));
}
}
//find all users from groups and add it to users list
for(Group group : groupsList){
membersList = pLocator.findMembersByGroup(group,false);
for (Principal member : membersList) {
usersList.add((User) member);
}
}
//Get required attributes from users list
for(User user : usersList){
approversDetails.add(pProfile.getAttributes(user,userAttributes));
}
for (Map<String, Object> userDetail : approversDetails) {
System.out.println("Username::" + userDetail.get("cn")+ "email::" + userDetail.get("ibm-primaryEmail"));
}
//call mail utility method to send email.
SendEmail.sendEmail(approversDetails, content);
} catch (Exception ex) {
message = "An exception has occured " + ex.getMessage();
directive = Directives.ROLLBACK_DOCUMENT;
}
try {
webContentCustomWorkflowService = (WebContentCustomWorkflowService) initContext.lookup("portal:service/wcm/WebContentCustomWorkflowService");
} catch (Exception ex) {
message = "An exception has occured in ex " + ex.getMessage();
directive = Directives.ROLLBACK_DOCUMENT;
}
}
result = webContentCustomWorkflowService.createResult(directive,message);
return result;
}
public Date getExecuteDate(Document arg0) {
return DATE_EXECUTE_NOW;
}
}
SendEmailToOwnersWithCustomBodyWorkFlowAction:-
package com.wcm.custom.workflow;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.naming.InitialContext;
import com.ibm.portal.um.Group;
import com.ibm.portal.um.Principal;
import com.ibm.portal.um.PumaController;
import com.ibm.portal.um.PumaHome;
import com.ibm.portal.um.PumaLocator;
import com.ibm.portal.um.PumaProfile;
import com.ibm.portal.um.User;
import com.ibm.workplace.wcm.api.Content;
import com.ibm.workplace.wcm.api.Document;
import com.ibm.workplace.wcm.api.WebContentCustomWorkflowService;
import com.ibm.workplace.wcm.api.Workspace;
import com.ibm.workplace.wcm.api.custom.CustomWorkflowAction;
import com.ibm.workplace.wcm.api.custom.CustomWorkflowActionResult;
import com.ibm.workplace.wcm.api.custom.Directive;
import com.ibm.workplace.wcm.api.custom.Directives;
import com.wcm.mail.util.SendEmail;
public class SendEmailToOwnersWithCustomBodyWorkFlowAction implements CustomWorkflowAction{
InitialContext initContext = null;
WebContentCustomWorkflowService webContentCustomWorkflowService = null;
CustomWorkflowActionResult result = null;
// PUMA Objects
PumaHome pHome = null;
PumaController pController = null;
PumaLocator pLocator = null;
PumaProfile pProfile = null;
Principal approverPrincipal = null;
Content content = null;
String message = null;
public SendEmailToOwnersWithCustomBodyWorkFlowAction()
{
System.out.println("SivaTestSendEmailToOwnersWithCustomBodyWorkFlowAction has been invoked.... ");
}
public CustomWorkflowActionResult execute(Document arg0) {
System.out.println("Executing SivaTestSendEmailToOwnersWithCustomBodyWorkFlowAction.... ");
Directive directive = Directives.CONTINUE;
if (arg0 instanceof Content) {
try {
content = (Content) arg0;
Workspace ws = content.getSourceWorkspace();
ws.useDistinguishedNames(true);
initContext = new InitialContext();
//PUMA related
pHome = (com.ibm.portal.um.PumaHome) initContext.lookup(com.ibm.portal.um.PumaHome.JNDI_NAME);
pController = pHome.getController();
pLocator = pHome.getLocator();
pProfile = pHome.getProfile();
//User Attributes
List<String> userAttributes = new ArrayList<String>();
userAttributes.add("ibm-primaryEmail");
userAttributes.add("cn");
List<Group> groupsList = new ArrayList<Group>();
Set<User> usersList = new HashSet<User>();
List<Principal> membersList = null;
List<Map<String, Object>> approversDetails = new ArrayList<Map<String, Object>>();
//Below additional logic is check for for bother users and groups as owners,
String currentApprovers[] = content.getOwners();
//create a separate lists for users and groups
for (int i = 0; i < currentApprovers.length; i++) {
if(currentApprovers[i].contains("uid=")){
usersList.add(pLocator.findUserByIdentifier(currentApprovers[i]));
}else{
groupsList.add(pLocator.findGroupByIdentifier(currentApprovers[i]));
}
}
//find all users from groups and add it to users list
for(Group group : groupsList){
membersList = pLocator.findMembersByGroup(group,false);
for (Principal member : membersList) {
usersList.add((User) member);
}
}
//Get required attributes from users list
for(User user : usersList){
approversDetails.add(pProfile.getAttributes(user,userAttributes));
}
for (Map<String, Object> userDetail : approversDetails) {
System.out.println("Username::" + userDetail.get("cn")+ "email::" + userDetail.get("ibm-primaryEmail"));
}
//call mail utility method to send email.
SendEmail.sendEmail(approversDetails, content);
} catch (Exception ex) {
message = "An exception has occured " + ex.getMessage();
directive = Directives.ROLLBACK_DOCUMENT;
}
try {
webContentCustomWorkflowService = (WebContentCustomWorkflowService) initContext.lookup("portal:service/wcm/WebContentCustomWorkflowService");
} catch (Exception ex) {
message = "An exception has occured in ex " + ex.getMessage();
directive = Directives.ROLLBACK_DOCUMENT;
}
}
result = webContentCustomWorkflowService.createResult(directive,message);
return result;
}
public Date getExecuteDate(Document arg0)
{
return DATE_EXECUTE_NOW;
}
}
SivaTestSendEmailToAuthorsWithCustomBodyWorkFlowAction :-
package com.wcm.custom.workflow;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.naming.InitialContext;
import com.ibm.portal.um.Group;
import com.ibm.portal.um.Principal;
import com.ibm.portal.um.PumaController;
import com.ibm.portal.um.PumaHome;
import com.ibm.portal.um.PumaLocator;
import com.ibm.portal.um.PumaProfile;
import com.ibm.portal.um.User;
import com.ibm.workplace.wcm.api.Content;
import com.ibm.workplace.wcm.api.Document;
import com.ibm.workplace.wcm.api.WebContentCustomWorkflowService;
import com.ibm.workplace.wcm.api.Workspace;
import com.ibm.workplace.wcm.api.custom.CustomWorkflowAction;
import com.ibm.workplace.wcm.api.custom.CustomWorkflowActionResult;
import com.ibm.workplace.wcm.api.custom.Directive;
import com.ibm.workplace.wcm.api.custom.Directives;
import com.wcm.mail.util.SendEmail;
public class SivaTestSendEmailToAuthorsWithCustomBodyWorkFlowAction implements CustomWorkflowAction{
InitialContext initContext = null;
WebContentCustomWorkflowService webContentCustomWorkflowService = null;
CustomWorkflowActionResult result = null;
// PUMA Objects
PumaHome pHome = null;
PumaController pController = null;
PumaLocator pLocator = null;
PumaProfile pProfile = null;
Principal approverPrincipal = null;
Content content = null;
String message = null;
public SivaTestSendEmailToAuthorsWithCustomBodyWorkFlowAction()
{
System.out.println("SivaTestSendEmailToAuthorsWithCustomBodyWorkFlowAction has been invoked ...");
}
public CustomWorkflowActionResult execute(Document arg0) {
System.out.println("Executing SivaTestSendEmailToAuthorsWithCustomBodyWorkFlowAction.... ");
Directive directive = Directives.CONTINUE;
if (arg0 instanceof Content) {
try {
content = (Content) arg0;
Workspace ws = content.getSourceWorkspace();
ws.useDistinguishedNames(true);
initContext = new InitialContext();
//PUMA related
pHome = (com.ibm.portal.um.PumaHome) initContext.lookup(com.ibm.portal.um.PumaHome.JNDI_NAME);
pController = pHome.getController();
pLocator = pHome.getLocator();
pProfile = pHome.getProfile();
//User Attributes
List<String> userAttributes = new ArrayList<String>();
userAttributes.add("ibm-primaryEmail");
userAttributes.add("cn");
List<Group> groupsList = new ArrayList<Group>();
Set<User> usersList = new HashSet<User>();
List<Principal> membersList = null;
List<Map<String, Object>> approversDetails = new ArrayList<Map<String, Object>>();
//Below additional logic is check for for bother users and groups as authors,
String currentApprovers[] = content.getAuthors();
//create a separate lists for users and groups
for (int i = 0; i < currentApprovers.length; i++) {
if(currentApprovers[i].contains("uid=")){
usersList.add(pLocator.findUserByIdentifier(currentApprovers[i]));
}else{
groupsList.add(pLocator.findGroupByIdentifier(currentApprovers[i]));
}
}
//find all users from groups and add it to users list
for(Group group : groupsList){
membersList = pLocator.findMembersByGroup(group,false);
for (Principal member : membersList) {
usersList.add((User) member);
}
}
//Get required attributes from users list
for(User user : usersList){
approversDetails.add(pProfile.getAttributes(user,userAttributes));
}
for (Map<String, Object> userDetail : approversDetails) {
System.out.println("Username::" + userDetail.get("cn")+ "email::" + userDetail.get("ibm-primaryEmail"));
}
//call mail utility method to send email.
SendEmail.sendEmail(approversDetails, content);
} catch (Exception ex) {
message = "An exception has occured " + ex.getMessage();
directive = Directives.ROLLBACK_DOCUMENT;
}
try {
webContentCustomWorkflowService = (WebContentCustomWorkflowService) initContext.lookup("portal:service/wcm/WebContentCustomWorkflowService");
} catch (Exception ex) {
message = "An exception has occured in ex " + ex.getMessage();
directive = Directives.ROLLBACK_DOCUMENT;
}
}
result = webContentCustomWorkflowService.createResult(directive,message);
return result;
}
public Date getExecuteDate(Document arg0)
{
return DATE_EXECUTE_NOW;
}
}
SendEmail {Create mail session in was server also}:-
package com.wcm.mail.util;
import java.util.List;
public class SendEmail {
public static void sendEmail(List<Map<String, Object>> usersDetails, Content content){
String from = "krao3467@gmail.com";
Session session = getMailSession();
MimeMessage message = null;
String approverEmail = "";
for(Map<String, Object> user : usersDetails){
approverEmail = (String)user.get("ibm-primaryEmail");
System.out.println("Approiver email");
if(null != approverEmail && 0 < approverEmail.trim().length()){
try{
message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));
message.addRecipient(Message.RecipientType.TO, new InternetAddress(approverEmail));
message.setSubject("Workflow Notification :: " + content.getTitle());
message.setContent(customEmailBody(user, content), "text/html" );
Transport.send(message);
}catch(Exception e){
e.printStackTrace();
}
}
}
}
public static String customEmailBody(Map<String, Object> user, Content content) throws Exception{
StringBuffer emailBody = new StringBuffer();
emailBody.append("Hi " + user.get("cn") +",");
emailBody.append("<br/><br/>");
emailBody.append("The content '"+content.getTitle()+"' has moved to Workflow Stage '"+(content.getWorkflowStageId()).getName()+"." );
emailBody.append("<br/>");
emailBody.append("Click on the following link to review the item, <a href='https://sivapc.sivavaka.com/wps/myportal/wcmAuthoring?wcmAuthoringAction=read&docid=com.aptrix.pluto.content.Content/"+(content.getId()).getId()+"'>"+content.getTitle()+"</a>");
emailBody.append("<br/><br/>");
emailBody.append("Thanks<br/>WCM Team");
return emailBody.toString();
}
private static Session getMailSession() {
Session mailSession = null;
javax.naming.Context context;
try {
context = new javax.naming.InitialContext();
mailSession = (javax.mail.Session) context.lookup("mail/personalizationMailSession/jndi");
Provider provider = mailSession.getProvider("smtp");
} catch (NamingException exp) {
exp.printStackTrace();
} catch (NoSuchProviderException exp) {
exp.printStackTrace();
}
return mailSession;
}
}
Step 4 :- Create a plugin.xml and place it under web-inf
<?xml version="1.0" encoding="UTF-8"?>
<plugin id= "com.ibm.workplace.wcm.api.custom" name= "Sample Custom Workflow Action Factory" version= "1.0.0" provider-name= "IBM" >
<extension-point id= "CustomWorkflowActionFactory" name="CustomWorkflowActionFactory" />
<extension point="com.ibm.workplace.wcm.api.CustomWorkflowActionFactory" id= "TestCustomWcmEmailBodyWorkFlowActionFactory" >
<provider class= "com.wcm.custom.workflow.CustomWcmEmailBodyWorkFlowActionFactory"/>
</extension>
</plugin>
Step 5 :- Deploy ear
Step 6 :- Now go to wcm administration and create custom action and start assigning to workflow
stages.
No comments:
Post a Comment