EventProduction eventProduction = phaseContext.producedEvents.removeFirst();
PortletWindowEvent producedEvent = eventProduction.getProducedEvent();
//
String producerId = producedEvent.getWindowId();
PortletInfo producerPortletInfo = context.getPortletInfo(producerId);
//
if (producerPortletInfo == null)
{
log.trace("Cannot deliver event " + producedEvent +" because the producer does not have portlet info");
safeInvoker.eventDiscarded(eventCC, phaseContext, producedEvent, EventControllerContext.EVENT_PRODUCER_INFO_NOT_AVAILABLE);
continue;
}
//
if (!controller.getDistributeNonProduceableEvents())
{
if (!producerPortletInfo.getEventing().getProducedEvents().containsKey(producedEvent.getName()))
{
log.trace("Cannot deliver event " + producedEvent +" because the producer of the event does not produce the event name");
safeInvoker.eventDiscarded(eventCC, phaseContext, producedEvent, EventControllerContext.PORTLET_DOES_NOT_CONSUME_EVENT);
continue;
}
}
// Apply produced event quota if necessary
int producedEventThreshold = controller.getProducedEventThreshold();
if (producedEventThreshold >= 0)
{
if (phaseContext.producedEventSize + 1 > producedEventThreshold)
{
log.trace("Event distribution interrupted because the maximum number of produced event is reached");
eventDistributionStatus = PortletResponse.PRODUCED_EVENT_FLOODED;
safeInvoker.eventDiscarded(eventCC, phaseContext, producedEvent, EventControllerContext.PRODUCED_EVENT_FLOODED);
break;
}
}
// Give control to the event context
phaseContext.mode = EventPhaseContextImpl.READ_WRITE_MODE;
if (!safeInvoker.eventProduced(eventCC, phaseContext, eventProduction.getConsumedEvent(), producedEvent))
{
continue;
}
// Perform flow control
if (phaseContext.mode == EventPhaseContextImpl.INTERRUPTED_MODE)
{
log.trace("Event distribution interrupted by controller context");
eventDistributionStatus = PortletResponse.INTERRUPTED;
break;
}
//
while (phaseContext.toConsumeEvents.size() > 0)
{
PortletWindowEvent toConsumeEvent = phaseContext.toConsumeEvents.removeFirst();
String consumedId = toConsumeEvent.getWindowId();
//
PortletInfo consumerPortletInfo = context.getPortletInfo(consumedId);
if (consumerPortletInfo == null)
{
log.trace("Cannot deliver event " + producedEvent +" because the consumer of the event does not have a portlet info");
safeInvoker.eventDiscarded(eventCC, phaseContext, toConsumeEvent, EventControllerContext.EVENT_CONSUMER_INFO_NOT_AVAILABLE);
continue;
}
//
if (!controller.getDistributeNonConsumableEvents())
{
if (!consumerPortletInfo.getEventing().getConsumedEvents().containsKey(toConsumeEvent.getName()))
{
log.trace("Cannot deliver event " + producedEvent +" because the consumer of the event does not accept the event name");
safeInvoker.eventDiscarded(eventCC, phaseContext, toConsumeEvent, EventControllerContext.PORTLET_DOES_NOT_CONSUME_EVENT);
continue;
}