Sun Java System Portal Server 7.1 Developer's Guide

Inter Portlet Communication API

Portlets can communicate with each other even if they are in different web applications. It is assumed that all the sample portlets are on the same instance of a Portal Server. The Inter Portlet Communication API uses event generation and notification to convey the information or data among portlets. The event notification occurs for the portlets, which are registered themselves for listening to that particular event.

The IPC API is located in the com.sun.portal.portlet package. Portlets that are interested in receiving an event implements a single interface, PortletEventListener.

public interface PortletEventListener
{
	public void handleEvent(EventRequest ereq, EventResponse eres)
 throws PortletException;
}

You can use EventRequest to obtain the event name and event payload data. You can obtain Event payload data either by getting the event stream and reading from it or by calling getEventData() method which returns an Object and then casting it appropriately. If getEventData() is called after getting the event stream an IllegalStateException is thrown. Similarly, if getEventStream() is called after getEventData() an IllegalStateException is thrown.

public interface EventRequest() 
	{
		public String getEventName();
		public InputStream getEventStream();
		public Object getEventData();
	}

You can use EventResponse to set the render parameters, so that the information can be passed on to the render method after processing the event received in the handleEvent() method.

public interface EventResponse() 
	{
		public void setRenderParameters(Map parmMap);
		public void setRenderParameter(String key, String value);
		public void setRenderParameter(String key, String[] values);
	}

The portlets can generate events only from within the handleEvent() or processAction() methods. Event can be generated by instantiating PortletEventBroker and calling createEvent() method on it. The PortletEventBroker constructor throws an IllegalStateException if you call from methods other than the handleEvent() or processAction().

public class PortletEventBroker
{
	//Make sure that the call is coming from handleEvent()
	or from processAction()
	public PortletEventBroker(PortletRequest pr);

	//to create an event ...
	public PortletEvent createEvent(String eventName)
	throws EventNotRegisteredException;
}

You can then use the PortletEventBroker instance to create an event by calling the createEvent() method.

public interface PortletEvent 
	{
		public String getEventName();
		public OutputStream getEventStream();
		public void setEventData(Serializable s);
		public void fire();
	}

You can set the event data can on the event stream which can be obtained by calling getEventStream() method. Alternatively, event data can be set by calling setEventData() method. If after obtaining the event stream, attempt to call setEventData() throws the IllegalStateException exception. Similarly, after calling setEventData() an attempt to call the getEventStream() throws the IllegalStateException exception. The event is then fired by calling the fire() method.