...
This sample can be improved to include a clickable link in the E-mail body, making it possible for users to easily navigate to the resources in which changes have been made. The following modification can be made to the code segment to achieve this:
Info | ||
---|---|---|
| ||
In this example, John Smith uses a Gmail account. Gmail automatically converts URLs into clickable links. This might not be the case if you are using a traditional E-mail client. In such situations, you might have to embed HTML syntax to convert your URL into a clickable link. |
Code Block | ||
---|---|---|
| ||
package org.wso2.carbon.registry.samples.notifications; import org.apache.axiom.om.OMElement; import org.apache.axiom.om.xpath.AXIOMXPath; import org.apache.axiom.soap.SOAPEnvelope; import org.apache.axis2.AxisFault; import org.apache.axis2.context.MessageContext; import org.apache.axis2.engine.Handler; import org.apache.axis2.handlers.AbstractHandler; import org.apache.axis2.transport.mail.MailConstants; import org.jaxen.JaxenException; import java.util.ArrayList; import java.util.Map; public class EmailTransformHandler extends AbstractHandler implements Handler { private String name; public String getName() { return name; } public InvocationResponse invoke(MessageContext msgContext) throws AxisFault { String address = msgContext.getTo().getAddress(); if (msgContext.getTo() != null && address.startsWith("mailto:")) { try { SOAPEnvelope envelope = msgContext.getEnvelope(); AXIOMXPath xPath = new AXIOMXPath("//ns:text"); xPath.addNamespace("ns", "http://ws.apache.org/commons/ns/payload"); OMElement element = (OMElement) ((ArrayList) xPath.evaluate(envelope)).get(0); fixPath(msgContext, element); element.setText(element.getText().replace("--", "This message was intercepted by " + "EmailTransformHandler\n--")); } catch (JaxenException e) { e.printStackTrace(); } } return InvocationResponse.CONTINUE; } private void fixPath(MessageContext msgContext, OMElement element) { String subject = ((Map<String, String>) msgContext.getOptions().getProperty( MessageContext.TRANSPORT_HEADERS)).get(MailConstants.MAIL_HEADER_SUBJECT); if (!subject.contains("Updated")) { return; } String path = element.getText(); path = path.substring(path.indexOf("path ") + "path ".length()); path = path.substring(0, path.indexOf(" was updated")); element.setText(element.getText().replace("path " + path, "path https://localhost:9443/" + "carbon/resources/resource.jsp?region=region3&item=resource_browser_menu&path=" + path + "&screenWidth=1600")); } public void revoke(MessageContext msgContext) { } public void setName(String name) { this.name = name; } } |
Info | ||
---|---|---|
| ||
In this example, John Smith uses a Gmail account. Gmail automatically converts URLs into clickable links. This might not be the case if you are using a traditional E-mail client. In such situations, you might have to embed HTML syntax to convert your URL into a clickable link. |
Advanced Use-case 2
This sample can be improved to restrict which users will receive an E-mail notification. For example, it might be required to get an approval from a particular group of users before moving from one state to another. However, this E-mail might not make sense to be delivered to John Smith or Joe Blogg. The following modification can be made to the code segment to restrict the recipients such that John Doe will receive this E-mail though John Smith or Joe Blogg would not.
Code Block | ||
---|---|---|
| ||
package org.wso2.carbon.registry.samples.notifications;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.xpath.AXIOMXPath;
import org.apache.axiom.soap.SOAPEnvelope;
import org.apache.axis2.AxisFault here, the link that we have used requires the user to sign-in to the management console to browse the resource. Such notifications are useful for approvals. However, there can be situations where those who approve do not need to sing-in to the management console. Such situations can be addressed by providing a clickable link that directs the user to a web service hosted on Governance Registry which does not require authentication. Learn more on how to add web services to Governance Registry by following the Endpoint Look-up Sample. Please be informed that this might introduce a security risk unless necessary precautions have been taken. As a precaution, for example, a token can be generated at the point of notifying the user, which will also appear on the URL within the E-mail. The web service logic can validate the presence of this token to prevent fraudulent access. |
Advanced Use-case 2
This sample can be improved to restrict which users will receive an E-mail notification. For example, it might be required to get an approval from a particular group of users before moving from one state to another. However, this E-mail might not make sense to be delivered to John Smith or Joe Blogg. The following modification can be made to the code segment to restrict the recipients such that John Doe will receive this E-mail though John Smith or Joe Blogg would not.
Code Block | ||
---|---|---|
| ||
package org.wso2.carbon.registry.samples.notifications; import org.apache.axiom.om.OMElement; import org.apache.axiom.axis2om.contextxpath.MessageContextAXIOMXPath; import org.apache.axis2axiom.enginesoap.HandlerSOAPEnvelope; import org.apache.axis2.handlers.AbstractHandlerAxisFault; import org.apache.axis2.context.MessageContext; import org.apache.axis2.engine.Handler; import org.apache.axis2.handlers.AbstractHandler; import org.apache.axis2.transport.mail.MailConstants; import org.jaxen.JaxenException; import java.util.ArrayList; import java.util.Arrays; import java.util.Map; public class EmailTransformHandler extends AbstractHandler implements Handler { private String[] blacklist = {"john@smith.com", "joe@bloggs.co.uk"}; private String name; public String getName() { return name; } public InvocationResponse invoke(MessageContext msgContext) throws AxisFault { String address = msgContext.getTo().getAddress(); if (msgContext.getTo() != null && address.startsWith("mailto:")) { try { SOAPEnvelope envelope = msgContext.getEnvelope(); AXIOMXPath xPath = new AXIOMXPath("//ns:text"); xPath.addNamespace("ns", "http://ws.apache.org/commons/ns/payload"); OMElement element = (OMElement) ((ArrayList) xPath.evaluate(envelope)).get(0); if (restrict(msgContext, address, element)) { return InvocationResponse.ABORT; } element.setText(element.getText().replace("--", "This message was intercepted by " + "EmailTransformHandler\n--")); } catch (JaxenException e) { e.printStackTrace(); } } return InvocationResponse.CONTINUE; } private boolean restrict(MessageContext msgContext, String address, OMElement element) { final String checkItem = "Smoke Test Passed"; final String state = "Testing"; String subject = ((Map<String, String>) msgContext.getOptions().getProperty( MessageContext.TRANSPORT_HEADERS)).get(MailConstants.MAIL_HEADER_SUBJECT); return (subject.contains("CheckListItemChecked") && element.getText().contains( "CheckList item '" + checkItem + "' of LifeCycle State '" + state + "' was") && Arrays.binarySearch(blacklist, address.substring("mailto:".length())) >= 0); } public void revoke(MessageContext msgContext) { } public void setName(String name) { this.name = name; } } |
Info | ||||
---|---|---|---|---|
| ||||
In this example we have used the default We have also assumed that the For this to work, each user on Governance Registry should fill out their User Profile. |
Info | ||
---|---|---|
| ||
In here, we have enumerated a list of E-mail addresses that would be treated as blacklisted. However, in a real-world scenario it might be cumbersome to hard-code all E-mail addresses. In such situations the User Management APIs of Governance Registry can be used. The |
An Axis2 Handler must implement the org.apache.axis2.engine.Handler
interface and can optionally extend the org.apache.axis2.handlers.AbstractHandler
class. Read more about Axis2 Handlers to get a better understanding of their uses.
...