Author: julien(a)jboss.com
Date: 2008-03-07 07:30:18 -0500 (Fri, 07 Mar 2008)
New Revision: 10236
Added:
modules/portlet/trunk/controller/src/main/java/org/jboss/portal/portlet/controller/EventControllerContextSafeInvoker.java
Modified:
modules/portlet/trunk/controller/src/main/java/org/jboss/portal/portlet/controller/PortletRequestHandler.java
modules/portlet/trunk/controller/src/main/java/org/jboss/portal/portlet/controller/event/AbstractEventControllerContext.java
modules/portlet/trunk/controller/src/main/java/org/jboss/portal/portlet/controller/event/EventControllerContext.java
modules/portlet/trunk/controller/src/main/java/org/jboss/portal/portlet/controller/impl/event/EventControllerContextImpl.java
modules/portlet/trunk/controller/src/test/java/org/jboss/portal/portlet/controller/EventControllerContextSupport.java
modules/portlet/trunk/portal/src/main/java/org/jboss/portal/portlet/portal/jsp/PageEventControllerContext.java
Log:
update controller to send event for non distributed events
Added:
modules/portlet/trunk/controller/src/main/java/org/jboss/portal/portlet/controller/EventControllerContextSafeInvoker.java
===================================================================
---
modules/portlet/trunk/controller/src/main/java/org/jboss/portal/portlet/controller/EventControllerContextSafeInvoker.java
(rev 0)
+++
modules/portlet/trunk/controller/src/main/java/org/jboss/portal/portlet/controller/EventControllerContextSafeInvoker.java 2008-03-07
12:30:18 UTC (rev 10236)
@@ -0,0 +1,115 @@
+/******************************************************************************
+ * JBoss, a division of Red Hat *
+ * Copyright 2008, Red Hat Middleware, LLC, and individual *
+ * contributors as indicated by the @authors tag. See the *
+ * copyright.txt in the distribution for a full listing of *
+ * individual contributors. *
+ * *
+ * This is free software; you can redistribute it and/or modify it *
+ * under the terms of the GNU Lesser General Public License as *
+ * published by the Free Software Foundation; either version 2.1 of *
+ * the License, or (at your option) any later version. *
+ * *
+ * This software is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this software; if not, write to the Free *
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA *
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org. *
+ ******************************************************************************/
+package org.jboss.portal.portlet.controller;
+
+import org.jboss.portal.portlet.controller.event.EventControllerContext;
+import org.jboss.portal.portlet.controller.event.EventPhaseSession;
+import org.jboss.portal.portlet.controller.event.Event;
+import org.jboss.portal.portlet.invocation.response.PortletInvocationResponse;
+import org.apache.log4j.Logger;
+
+/**
+ * An help class to catch and log exceptions thrown by an event controller context.
+ *
+ * @author <a href="mailto:julien@jboss-portal.org">Julien
Viet</a>
+ * @version $Revision: 630 $
+ */
+class EventControllerContextSafeInvoker
+{
+
+ /** . */
+ private final Logger log = Logger.getLogger(EventControllerContextSafeInvoker.class);
+
+ public boolean eventProduced(EventControllerContext context, EventPhaseSession
session, Event sourceEvent, Event producedEvent)
+ {
+ try
+ {
+ context.eventProduced(session, sourceEvent, producedEvent);
+
+ //
+ return true;
+ }
+ catch (Exception e)
+ {
+ log.error("Cannot deliver produced event " + producedEvent + "
because the event " +
+ "controller context threw a runtime exception", e);
+
+ //
+ return false;
+ }
+ }
+
+ public boolean eventConsumed(EventControllerContext context, EventPhaseSession
session, Event consumedEvent, PortletInvocationResponse consumerResponse)
+ {
+ try
+ {
+ context.eventConsumed(session, consumedEvent, consumerResponse);
+
+ //
+ return true;
+ }
+ catch (Exception e)
+ {
+ log.error("Event consumed callback threw an exception that is ignored by
the controller", e);
+
+ //
+ return false;
+ }
+ }
+
+ public boolean eventFailed(EventControllerContext context, EventPhaseSession session,
Event failedEvent, Throwable throwable)
+ {
+ try
+ {
+ context.eventFailed(session, failedEvent, throwable);
+
+ //
+ return true;
+ }
+ catch (Exception e1)
+ {
+ log.error("Event delivery failed callback threw an exception that is
ignored by the controller", e1);
+
+ //
+ return false;
+ }
+ }
+
+ public boolean eventDiscarded(EventControllerContext context, EventPhaseSession
session, Event discardedEvent, int cause)
+ {
+ try
+ {
+ context.eventDiscarded(session, discardedEvent, cause);
+
+ //
+ return true;
+ }
+ catch (Exception e1)
+ {
+ log.error("Event delivery failed callback threw an exception that is
ignored by the controller", e1);
+
+ //
+ return false;
+ }
+ }
+}
Modified:
modules/portlet/trunk/controller/src/main/java/org/jboss/portal/portlet/controller/PortletRequestHandler.java
===================================================================
---
modules/portlet/trunk/controller/src/main/java/org/jboss/portal/portlet/controller/PortletRequestHandler.java 2008-03-06
22:59:54 UTC (rev 10235)
+++
modules/portlet/trunk/controller/src/main/java/org/jboss/portal/portlet/controller/PortletRequestHandler.java 2008-03-07
12:30:18 UTC (rev 10236)
@@ -42,7 +42,6 @@
import org.jboss.portal.portlet.controller.state.WindowNavigationalState;
import org.jboss.portal.portlet.invocation.ActionInvocation;
import org.jboss.portal.portlet.invocation.EventInvocation;
-import org.jboss.portal.portlet.invocation.response.ErrorResponse;
import org.jboss.portal.portlet.invocation.response.PortletInvocationResponse;
import org.jboss.portal.portlet.invocation.response.ResponseProperties;
import org.jboss.portal.portlet.invocation.response.UpdateNavigationalStateResponse;
@@ -59,6 +58,9 @@
class PortletRequestHandler extends RequestHandler<PortletRequest>
{
+ /** . */
+ private static final EventControllerContextSafeInvoker safeInvoker = new
EventControllerContextSafeInvoker();
+
public PortletRequestHandler(PortletController controller)
{
super(PortletRequest.class, controller);
@@ -132,6 +134,7 @@
if (producerPortletInfo == null)
{
log.trace("Cannot deliver event " + producedEvent +"
because the producer does not have portlet info");
+ safeInvoker.eventDiscarded(eventCC, session, producedEvent,
EventControllerContext.EVENT_PRODUCER_INFO_NOT_AVAILABLE);
continue;
}
@@ -141,6 +144,7 @@
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, session, producedEvent,
EventControllerContext.PORTLET_DOES_NOT_CONSUME_EVENT);
continue;
}
}
@@ -153,20 +157,15 @@
{
log.trace("Event distribution interrupted because the maximum
number of produced event is reached");
eventDistributionStatus = PortletResponse.PRODUCED_EVENT_FLOODED;
+ safeInvoker.eventDiscarded(eventCC, session, producedEvent,
EventControllerContext.PRODUCED_EVENT_FLOODED);
break;
}
}
// Give control to the event context
- try
+ session.mode = EventPhaseSessionImpl.READ_WRITE_MODE;
+ if (!safeInvoker.eventProduced(eventCC, session,
eventProduction.getConsumedEvent(), producedEvent))
{
- session.mode = EventPhaseSessionImpl.READ_WRITE_MODE;
- eventCC.eventProduced(session, eventProduction.getConsumedEvent(),
producedEvent);
- }
- catch (Exception e)
- {
- log.trace("Cannot deliver produced event " + producedEvent +
" because the event controller context " +
- "threw a runtime exception", e);
continue;
}
@@ -182,18 +181,14 @@
while (session.toConsumeEvents.size() > 0)
{
Event toConsumeEvent = session.toConsumeEvents.removeFirst();
-
- //
String consumedId = toConsumeEvent.getWindowId();
//
PortletInfo consumerPortletInfo = context.getPortletInfo(consumedId);
if (consumerPortletInfo == null)
{
- if (log.isTraceEnabled())
- {
- log.trace("Cannot deliver event " + producedEvent +"
because the consumer of the event does not have a portlet info");
- }
+ log.trace("Cannot deliver event " + producedEvent +"
because the consumer of the event does not have a portlet info");
+ safeInvoker.eventDiscarded(eventCC, session, toConsumeEvent,
EventControllerContext.EVENT_CONSUMER_INFO_NOT_AVAILABLE);
continue;
}
@@ -202,10 +197,8 @@
{
if
(!consumerPortletInfo.getEventing().getConsumedEvents().containsKey(toConsumeEvent.getName()))
{
- if (log.isTraceEnabled())
- {
- log.trace("Cannot deliver event " + producedEvent
+" because the consumer of the event does not accept the event name");
- }
+ log.trace("Cannot deliver event " + producedEvent +"
because the consumer of the event does not accept the event name");
+ safeInvoker.eventDiscarded(eventCC, session, toConsumeEvent,
EventControllerContext.PORTLET_DOES_NOT_CONSUME_EVENT);
continue;
}
}
@@ -217,29 +210,29 @@
if (session.consumedEventSize + 1 > consumedEventThreshold)
{
log.trace("Event distribution interrupted because the maximum
number of consumed event is reached");
+ safeInvoker.eventDiscarded(eventCC, session, toConsumeEvent,
EventControllerContext.CONSUMED_EVENT_FLOODED);
eventDistributionStatus = PortletResponse.CONSUMED_EVENT_FLOODED;
break;
}
}
//
- PortletInvocationResponse eventResponse = deliverEvent(context,
toConsumeEvent, pageNavigationalState, requestProperties.getCookies());
-
- // Now it is consumed we add it to the history
- session.consumedEventSize++;
-
- // And we make a callback
+ PortletInvocationResponse eventResponse;
try
{
- session.mode = EventPhaseSessionImpl.READ_MODE;
- eventCC.eventConsumed(session, producedEvent, toConsumeEvent);
+ eventResponse = deliverEvent(context, toConsumeEvent,
pageNavigationalState, requestProperties.getCookies());
}
catch (Exception e)
{
- log.trace("Event consumed callback threw an exception that is
ignored by the controller", e);
+ log.trace("Event delivery of " + toConsumeEvent + "
failed", e);
+ safeInvoker.eventFailed(eventCC, session, toConsumeEvent, e);
+ continue;
}
- //
+ // Now it is consumed
+ session.consumedEventSize++;
+
+ // Update nav state if needed
if (eventResponse instanceof UpdateNavigationalStateResponse)
{
UpdateNavigationalStateResponse eventStateResponse =
(UpdateNavigationalStateResponse)eventResponse;
@@ -250,8 +243,8 @@
// Add events to source event queue
for (UpdateNavigationalStateResponse.Event portletEvent :
eventStateResponse.getEvents())
{
- Event blah = new Event(portletEvent.getName(),
portletEvent.getPayload(), toConsumeEvent.getWindowId());
- session.producedEvents.add(new EventProduction(toConsumeEvent,
blah));
+ Event toRouteEvent = new Event(portletEvent.getName(),
portletEvent.getPayload(), toConsumeEvent.getWindowId());
+ session.producedEvents.add(new EventProduction(toConsumeEvent,
toRouteEvent));
}
//
@@ -261,14 +254,10 @@
requestProperties.append(updateProperties);
}
}
- else if (eventResponse instanceof ErrorResponse)
- {
- // Do something here !!!!
- }
- else
- {
- // Do something here !!!!
- }
+
+ // And we make a callback
+ session.mode = EventPhaseSessionImpl.READ_MODE;
+ safeInvoker.eventConsumed(eventCC, session, toConsumeEvent,
eventResponse);
}
// We archive the consumed event in the history
@@ -344,9 +333,10 @@
}
}
- private PortletInvocationResponse deliverEvent(PortletControllerContext context, Event
event,
- PageNavigationalState
pageNavigationalState, List<Cookie> requestCookies)
- throws PortletInvokerException
+ private PortletInvocationResponse deliverEvent(
+ PortletControllerContext context, Event event,
+ PageNavigationalState pageNavigationalState,
+ List<Cookie> requestCookies) throws PortletInvokerException
{
WindowNavigationalState windowNS =
pageNavigationalState.getWindowNavigationalState(event.getWindowId());
Modified:
modules/portlet/trunk/controller/src/main/java/org/jboss/portal/portlet/controller/event/AbstractEventControllerContext.java
===================================================================
---
modules/portlet/trunk/controller/src/main/java/org/jboss/portal/portlet/controller/event/AbstractEventControllerContext.java 2008-03-06
22:59:54 UTC (rev 10235)
+++
modules/portlet/trunk/controller/src/main/java/org/jboss/portal/portlet/controller/event/AbstractEventControllerContext.java 2008-03-07
12:30:18 UTC (rev 10236)
@@ -22,6 +22,8 @@
******************************************************************************/
package org.jboss.portal.portlet.controller.event;
+import org.jboss.portal.portlet.invocation.response.PortletInvocationResponse;
+
/**
* An implementation of the event controller context that do no ops.
*
@@ -34,7 +36,15 @@
{
}
- public void eventConsumed(EventPhaseSession session, Event sourceEvent, Event
consumedEvent)
+ public void eventConsumed(EventPhaseSession session, Event consumedEvent,
PortletInvocationResponse consumerResponse)
{
}
+
+ public void eventFailed(EventPhaseSession session, Event consumedEvent, Throwable
throwable)
+ {
+ }
+
+ public void eventDiscarded(EventPhaseSession session, Event discardedEvent, int
cause)
+ {
+ }
}
Modified:
modules/portlet/trunk/controller/src/main/java/org/jboss/portal/portlet/controller/event/EventControllerContext.java
===================================================================
---
modules/portlet/trunk/controller/src/main/java/org/jboss/portal/portlet/controller/event/EventControllerContext.java 2008-03-06
22:59:54 UTC (rev 10235)
+++
modules/portlet/trunk/controller/src/main/java/org/jboss/portal/portlet/controller/event/EventControllerContext.java 2008-03-07
12:30:18 UTC (rev 10236)
@@ -22,6 +22,8 @@
******************************************************************************/
package org.jboss.portal.portlet.controller.event;
+import org.jboss.portal.portlet.invocation.response.PortletInvocationResponse;
+
/**
* @author <a href="mailto:julien@jboss.org">Julien Viet</a>
* @version $Revision: 630 $
@@ -29,8 +31,29 @@
public interface EventControllerContext
{
+ /** . */
+ int EVENT_PRODUCER_NOT_AVAILABLE = 0;
+
+ /** . */
+ int EVENT_PRODUCER_INFO_NOT_AVAILABLE = 1;
+
+ /** . */
+ int EVENT_CONSUMER_NOT_AVAILABLE = 2;
+
+ /** . */
+ int EVENT_CONSUMER_INFO_NOT_AVAILABLE = 3;
+
+ /** . */
+ int PORTLET_DOES_NOT_CONSUME_EVENT = 4;
+
+ /** . */
+ int CONSUMED_EVENT_FLOODED = 5;
+
+ /** . */
+ int PRODUCED_EVENT_FLOODED = 6;
+
/**
- * <p>Give control to the context when an event is produced. The session
+ * <p>Context call back when an event is produced. The session
* argument gives to the context the capability to queue events in response
* of the produced event or to interrupt the session. It has also access
* to the full history of distributed events in order to provide advanced
@@ -50,7 +73,7 @@
void eventProduced(EventPhaseSession session, Event sourceEvent, Event
producedEvent);
/**
- * <p>Signal to the context when an event is consumed by a portlet. The session
argument
+ * <p>Context call back when an event is consumed by a portlet. The session
argument
* only provides querying capabilities and it is not possible to queue event
* or interrupt the session.</p>
*
@@ -61,9 +84,54 @@
* to the portlet controller invoker.</p>
*
* @param session the session
- * @param sourceEvent the source event
* @param consumedEvent the consumed event
+ * @param consumerResponse the consumer response
*/
- void eventConsumed(EventPhaseSession session, Event sourceEvent, Event
consumedEvent);
+ void eventConsumed(EventPhaseSession session, Event consumedEvent,
PortletInvocationResponse consumerResponse);
+ /**
+ * <p>Context call back when an event failed to be delivered because the invoker
threw an exception.
+ * The session argument only provides querying capabilities and it is not possible to
queue event
+ * or interrupt the session.</p>
+ *
+ * <p>During the invocation of this method, any runtime exception thrown will
+ * be ignored by the controller.</p>
+ *
+ * <p>During the invocation of this method, any error thrown will be propagated
+ * to the portlet controller invoker.</p>
+ *
+ * @param session the session
+ * @param failedEvent the failed event
+ * @param throwable the throwable
+ */
+ void eventFailed(EventPhaseSession session, Event failedEvent, Throwable throwable);
+
+ /**
+ * <p>Context call back when an event is discarded by the controller for a
specific reason.
+ * The session argument only provides querying capabilities and it is not possible to
queue event
+ * or interrupt the session.</p>
+ *
+ * <p>The cause value is an integer among the constants
+ * <ul>
+ * <li>{@link #CONSUMED_EVENT_FLOODED}</li>
+ * <li>{@link #EVENT_CONSUMER_INFO_NOT_AVAILABLE}</li>
+ * <li>{@link #EVENT_CONSUMER_NOT_AVAILABLE}</li>
+ * <li>{@link #EVENT_PRODUCER_INFO_NOT_AVAILABLE}</li>
+ * <li>{@link #EVENT_PRODUCER_NOT_AVAILABLE}</li>
+ * <li>{@link #PORTLET_DOES_NOT_CONSUME_EVENT}</li>
+ * <li>{@link #PRODUCED_EVENT_FLOODED}</li>
+ * <p/>
+ *
+ * <p>During the invocation of this method, any runtime exception thrown will
+ * be ignored by the controller.</p>
+ *
+ * <p>During the invocation of this method, any error thrown will be propagated
+ * to the portlet controller invoker.</p>
+ *
+ * @param session the session
+ * @param discardedEvent the discarded event
+ * @param cause the cause
+ */
+ void eventDiscarded(EventPhaseSession session, Event discardedEvent, int cause);
+
}
Modified:
modules/portlet/trunk/controller/src/main/java/org/jboss/portal/portlet/controller/impl/event/EventControllerContextImpl.java
===================================================================
---
modules/portlet/trunk/controller/src/main/java/org/jboss/portal/portlet/controller/impl/event/EventControllerContextImpl.java 2008-03-06
22:59:54 UTC (rev 10235)
+++
modules/portlet/trunk/controller/src/main/java/org/jboss/portal/portlet/controller/impl/event/EventControllerContextImpl.java 2008-03-07
12:30:18 UTC (rev 10236)
@@ -25,6 +25,7 @@
import org.jboss.portal.portlet.Portlet;
import org.jboss.portal.portlet.PortletInvoker;
import org.jboss.portal.portlet.PortletInvokerException;
+import org.jboss.portal.portlet.invocation.response.PortletInvocationResponse;
import org.jboss.portal.portlet.controller.event.Event;
import org.jboss.portal.portlet.controller.event.EventControllerContext;
import org.jboss.portal.portlet.controller.event.EventPhaseSession;
@@ -66,7 +67,15 @@
}
}
- public void eventConsumed(EventPhaseSession session, Event sourceEvent, Event
consumedEvent)
+ public void eventConsumed(EventPhaseSession session, Event consumedEvent,
PortletInvocationResponse consumerResponse)
{
}
+
+ public void eventFailed(EventPhaseSession session, Event failedEvent, Throwable
throwable)
+ {
+ }
+
+ public void eventDiscarded(EventPhaseSession session, Event discardedEvent, int
cause)
+ {
+ }
}
Modified:
modules/portlet/trunk/controller/src/test/java/org/jboss/portal/portlet/controller/EventControllerContextSupport.java
===================================================================
---
modules/portlet/trunk/controller/src/test/java/org/jboss/portal/portlet/controller/EventControllerContextSupport.java 2008-03-06
22:59:54 UTC (rev 10235)
+++
modules/portlet/trunk/controller/src/test/java/org/jboss/portal/portlet/controller/EventControllerContextSupport.java 2008-03-07
12:30:18 UTC (rev 10236)
@@ -25,6 +25,7 @@
import org.jboss.portal.portlet.controller.event.EventControllerContext;
import org.jboss.portal.portlet.controller.event.Event;
import org.jboss.portal.portlet.controller.event.EventPhaseSession;
+import org.jboss.portal.portlet.invocation.response.PortletInvocationResponse;
import javax.xml.namespace.QName;
import java.util.List;
@@ -56,10 +57,18 @@
}
}
- public void eventConsumed(EventPhaseSession session, Event sourceEvent, Event
consumedEvent)
+ public void eventConsumed(EventPhaseSession session, Event consumedEvent,
PortletInvocationResponse consumerResponse)
{
}
+ public void eventFailed(EventPhaseSession session, Event failedEvent, Throwable
throwable)
+ {
+ }
+
+ public void eventDiscarded(EventPhaseSession session, Event discardedEvent, int
cause)
+ {
+ }
+
public void createWire(QName srcName, String srcWindowId, QName dstName, String
dstWindowId)
{
Point src = new Point(srcName, srcWindowId);
@@ -89,8 +98,10 @@
private static class Point
{
+ /** . */
final QName name;
+ /** . */
final String windowId;
private Point(QName name, String windowId)
Modified:
modules/portlet/trunk/portal/src/main/java/org/jboss/portal/portlet/portal/jsp/PageEventControllerContext.java
===================================================================
---
modules/portlet/trunk/portal/src/main/java/org/jboss/portal/portlet/portal/jsp/PageEventControllerContext.java 2008-03-06
22:59:54 UTC (rev 10235)
+++
modules/portlet/trunk/portal/src/main/java/org/jboss/portal/portlet/portal/jsp/PageEventControllerContext.java 2008-03-07
12:30:18 UTC (rev 10236)
@@ -27,6 +27,7 @@
import org.jboss.portal.portlet.controller.event.EventPhaseSession;
import org.jboss.portal.portlet.Portlet;
import org.jboss.portal.portlet.PortletInvokerException;
+import org.jboss.portal.portlet.invocation.response.PortletInvocationResponse;
import org.jboss.portal.portlet.info.PortletInfo;
/**
@@ -53,13 +54,13 @@
this.prepareResponse = prepareResponse;
}
- public void eventProduced(EventPhaseSession session, Event sourceEvent, Event
producedEvent)
+ public void eventProduced(EventPhaseSession context, Event sourceEvent, Event
producedEvent)
{
for (String windowId : prepareResponse.getWindowIds())
{
try
{
- Portlet portlet = context.getPortlet(windowId);
+ Portlet portlet = this.context.getPortlet(windowId);
//
if (portlet != null)
@@ -70,19 +71,27 @@
if
(portletInfo.getEventing().getConsumedEvents().containsKey(producedEvent.getName()))
{
Event distributedEvent = new Event(producedEvent.getName(),
producedEvent.getPayload(), windowId);
- session.queueEvent(distributedEvent);
+ context.queueEvent(distributedEvent);
}
}
}
catch (PortletInvokerException e)
{
e.printStackTrace();
- session.interrupt();
+ context.interrupt();
}
}
}
- public void eventConsumed(EventPhaseSession session, Event sourceEvent, Event
consumedEvent)
+ public void eventConsumed(EventPhaseSession session, Event consumedEvent,
PortletInvocationResponse consumerResponse)
{
}
+
+ public void eventFailed(EventPhaseSession session, Event failedEvent, Throwable
throwable)
+ {
+ }
+
+ public void eventDiscarded(EventPhaseSession session, Event discardedEvent, int
cause)
+ {
+ }
}