Event Mappers
In more complex scenarios, adapting only the event names or QNames might not be enough. Sometimes you might need to transform the payload.
For example, in a travel site, a passenger information portlet portlet1 emits a passenger ID under the key passengerID.
The payload is of type Integer. A second portlet, a car renters
information portlet portlet2 expects a passenger ID under the key
userID, and sent as payload of type String.
portlet1 to communicate with the car renters information portlet portlet2, you have the following two options: - You can make the passenger information portlet
portlet1store its payload under the keyuserIDand as of typeString,even though it emits an event with theQName employeeIDand as of typeInteger. - You can make the car renters information portlet
portlet2read the keyemployeeIDand as of typeInteger, even though it expects an event with theQName userIDand as of typeString.
Mappers have full access to the DCX segment of the currently processed dialog instance and also to the payload that is being processed. Therefore, mappers are powerful tools, as they can run various transformations.
Implement MapperFactory to make the mappers available. You can
register the MapperFactory with an Eclipse Extension
Point. The advantage of this approach is that you can register new mappers without
having to restart the server. This method is also called hot deployment. To use a
MapperFactory, you need to implement the interface
MapperFactory and return an object instance of type
ContextToPayloadMapper or PayloadToContextMapper. This implementation depends on the concrete event
mapper that is requested.
The following code sample shows an example of how a MapperFactory
can look.
public class MapperFactory implements com.ibm.portal.pcm.events.MapperFactory {
public ContextToPayloadMapper getContextToPayloadMapper(String name) {
ContextToPayloadMapper result = null;
if (name.equals("myPackage.myMapper")) {
result = new MyMapper();
}
return result;
}
public PayloadToContextMapper getPayloadToContextMapper(String name) {
// ...
}
}
The following code sample shows how you can register a MapperFactory with a plugin.xml file.
<plugin
id="com.ibm.wps.portlet.pcm.demo"
name="Portlet Control Manager Demo"
version="1.0.0"
provider-name="IBM">
<!-- Mapper Factory -->
<extension point="com.ibm.portal.pcm.MapperFactory" id="PcmMapperFactory">
<factory class="com.ibm.wps.pcm.demo.mapper.MapperFactory"/>
</extension>
</plugin>