You are viewing a plain text version of this content. The canonical link for it is here.
Posted to pluto-scm@portals.apache.org by ma...@apache.org on 2017/01/25 13:50:36 UTC

portals-pluto git commit: Made cdi events to be fired from event phase too. Portlet container now prioritize cdi events fired in action/event phase before processing portlet events.

Repository: portals-pluto
Updated Branches:
  refs/heads/cross-context-cdi-events 982077a9e -> 63410b9bb


Made cdi events to be fired from event phase too. Portlet container now prioritize cdi events fired in action/event phase before processing portlet events.


Project: http://git-wip-us.apache.org/repos/asf/portals-pluto/repo
Commit: http://git-wip-us.apache.org/repos/asf/portals-pluto/commit/63410b9b
Tree: http://git-wip-us.apache.org/repos/asf/portals-pluto/tree/63410b9b
Diff: http://git-wip-us.apache.org/repos/asf/portals-pluto/diff/63410b9b

Branch: refs/heads/cross-context-cdi-events
Commit: 63410b9bbe69f872def3cb99d86038bf76833ada
Parents: 982077a
Author: ahmed <ma...@gmail.com>
Authored: Wed Jan 25 14:50:10 2017 +0100
Committer: ahmed <ma...@gmail.com>
Committed: Wed Jan 25 14:50:10 2017 +0100

----------------------------------------------------------------------
 .../pluto/container/driver/PortletServlet3.java | 55 +++++++++++++++++++-
 .../bean/processor/PortletCDIEvent.java         |  9 ++++
 .../container/impl/PortletContainerImpl.java    | 32 +++++++++++-
 .../container/EventCoordinationServiceImpl.java |  2 +-
 4 files changed, 94 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/63410b9b/pluto-container-driver-api/src/main/java/org/apache/pluto/container/driver/PortletServlet3.java
----------------------------------------------------------------------
diff --git a/pluto-container-driver-api/src/main/java/org/apache/pluto/container/driver/PortletServlet3.java b/pluto-container-driver-api/src/main/java/org/apache/pluto/container/driver/PortletServlet3.java
index 926785a..240e99a 100644
--- a/pluto-container-driver-api/src/main/java/org/apache/pluto/container/driver/PortletServlet3.java
+++ b/pluto-container-driver-api/src/main/java/org/apache/pluto/container/driver/PortletServlet3.java
@@ -575,7 +575,6 @@ public class PortletServlet3 extends HttpServlet {
             ActionRequest actionRequest = (ActionRequest) portletRequest;
             ActionResponse actionResponse = (ActionResponse) portletResponse;
             filterManager.processFilter(actionRequest, actionResponse, invoker, portletContext);
-            
             // TODO: Document this
             System.out.println("We have "+CDIEventsStore.universalEventList.size()+" events in universal event list.");
             for(PortletCDIEvent newPortletCDIEvent : CDIEventsStore.universalEventList){
@@ -593,6 +592,7 @@ public class PortletServlet3 extends HttpServlet {
                      JAXBElement<Serializable> element = new JAXBElement<Serializable>(CDI_EVENT_QNAME, clazz, (Serializable) value);
                      marshaller.marshal(element, out);
                      newPortletCDIEvent.setSerializedData(out.toString());
+                     newPortletCDIEvent.setProcessing(true);
                      actionResponse.setEvent(CDI_EVENT_QNAME, out.toString());
                      // TODO: Check if the events has already been set in another portlet of the same web app
                      /*
@@ -760,6 +760,59 @@ public class PortletServlet3 extends HttpServlet {
                   
                } else {
                   filterManager.processFilter(eventRequest, eventResponse, invoker, portletContext);
+                  for(PortletCDIEvent newPortletCDIEvent : CDIEventsStore.universalEventList){
+                     if(!newPortletCDIEvent.isProcessing()){
+                        Object value = newPortletCDIEvent.getData();
+                        if(value!=null){
+                           ClassLoader cl = Thread.currentThread().getContextClassLoader();
+                           Writer out = new StringWriter();
+               
+                           try {
+                              @SuppressWarnings("rawtypes")
+                              Class clazz = value.getClass();
+                              System.setProperty( "com.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize", "true");
+                              JAXBContext jc = JAXBContext.newInstance(clazz);
+                              Marshaller marshaller = jc.createMarshaller();
+                              JAXBElement<Serializable> element = new JAXBElement<Serializable>(CDI_EVENT_QNAME, clazz, (Serializable) value);
+                              marshaller.marshal(element, out);
+                              newPortletCDIEvent.setSerializedData(out.toString());
+                              newPortletCDIEvent.setProcessing(true);
+                              eventResponse.setEvent(CDI_EVENT_QNAME, out.toString());
+                              // TODO: Check if the events has already been set in another portlet of the same web app
+                              /*
+                              
+                              PortletApplicationDefinition pad = holder.getPad();
+                              if(CDIEventsStore.portletAppCDIEventList.containsKey(pad)){
+                                 Set<PortletCDIEvent> portletAppCDIEventList = CDIEventsStore.portletAppCDIEventList.get(pad);
+                                 for(PortletCDIEvent existingPortletCDIEvent: portletAppCDIEventList){
+                                    if(!existingPortletCDIEvent.equals(newPortletCDIEvent)){
+                                       System.out.println("Wrongly set CDI portlet event again");
+                                       portletAppCDIEventList.add(newPortletCDIEvent);
+                                       CDIEventsStore.portletAppCDIEventList.put(pad, portletAppCDIEventList);
+                                       actionResponse.setEvent(CDI_EVENT_QNAME, out.toString());
+                                    } else {
+                                       System.out.println("Skipped setting CDI portlet event because its already set by another portlet in the same web app");
+                                    }
+                                 }
+                              } else {
+                                 System.out.println("Set CDI portlet event for the first time");
+                                 Set<PortletCDIEvent> portletAppCDIEventList = new HashSet<PortletCDIEvent>();
+                                 portletAppCDIEventList.add(newPortletCDIEvent);
+                                 CDIEventsStore.portletAppCDIEventList.put(pad, portletAppCDIEventList);
+                                 actionResponse.setEvent(CDI_EVENT_QNAME, out.toString());
+                              }
+                              */
+                              
+                           } catch(Exception e) {
+                              System.out.println("Error while serializing cdi event data "+e.toString());
+                              e.printStackTrace();
+                           } finally {
+                              Thread.currentThread().setContextClassLoader(cl);
+                              System.getProperties().remove("com.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize");
+                           }
+                        }
+                     }
+                  }
                }
             } else {
                System.out.println("Portlet Event is null.");

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/63410b9b/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/PortletCDIEvent.java
----------------------------------------------------------------------
diff --git a/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/PortletCDIEvent.java b/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/PortletCDIEvent.java
index f056fca..63d39fb 100644
--- a/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/PortletCDIEvent.java
+++ b/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/PortletCDIEvent.java
@@ -11,6 +11,7 @@ public class PortletCDIEvent {
    private Object data;
    private String dataType;
    private Class observerBeanClass;
+   private boolean processing;
 
    public PortletCDIEvent(Set<Annotation> qualifiers, Object data, Class observerBeanClass) {
       this.qualifiers = new Annotation[qualifiers.size()];
@@ -23,6 +24,7 @@ public class PortletCDIEvent {
       this.data = data;
       this.dataType = data.getClass().getCanonicalName();
       this.observerBeanClass=observerBeanClass;
+      this.processing=false;
    }
 
    public Annotation[] getQualifiers() {
@@ -48,7 +50,14 @@ public class PortletCDIEvent {
    public Class getObserverBeanClass() {
       return observerBeanClass;
    }
+   
+   public boolean isProcessing() {
+      return processing;
+   }
 
+   public void setProcessing(boolean processing) {
+      this.processing = processing;
+   }
    
    // TODO: Maybe throw exceptions when equals return false
    // TODO: Check if we can set same CDI event 2 times  

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/63410b9b/pluto-container/src/main/java/org/apache/pluto/container/impl/PortletContainerImpl.java
----------------------------------------------------------------------
diff --git a/pluto-container/src/main/java/org/apache/pluto/container/impl/PortletContainerImpl.java b/pluto-container/src/main/java/org/apache/pluto/container/impl/PortletContainerImpl.java
index 5a9aba1..cd5cdfe 100644
--- a/pluto-container/src/main/java/org/apache/pluto/container/impl/PortletContainerImpl.java
+++ b/pluto-container/src/main/java/org/apache/pluto/container/impl/PortletContainerImpl.java
@@ -19,6 +19,7 @@ package org.apache.pluto.container.impl;
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.io.StringWriter;
+import java.util.ArrayList;
 import java.util.List;
 
 import javax.portlet.ActionRequest;
@@ -36,6 +37,7 @@ import javax.portlet.ResourceRequest;
 import javax.portlet.ResourceResponse;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import javax.xml.namespace.QName;
 
 import org.apache.pluto.container.ContainerServices;
 import org.apache.pluto.container.FilterManager;
@@ -347,9 +349,22 @@ public class PortletContainerImpl implements PortletContainer
             if (!responseContext.isRedirect())
             {
                 List<Event> events = responseContext.getEvents();
+                QName cdiEventQname = new QName("javax.portlet.cdi.event", "javax.portlet.cdi.event");
                 if (!events.isEmpty())
                 {
-                    getContainerServices().getEventCoordinationService().processEvents(this, portletWindow, request, response, events);
+                   List<Event> cdiEvents = new ArrayList<Event>();
+                   List<Event> portletEvents = new ArrayList<Event>();
+                   for(Event event : events){
+                      if(event.getQName().equals(cdiEventQname)){
+                         cdiEvents.add(event);
+                      } else {
+                         portletEvents.add(event);
+                      }
+                   }
+                   events.clear();
+                   events.addAll(cdiEvents);
+                   events.addAll(portletEvents);
+                   getContainerServices().getEventCoordinationService().processEvents(this, portletWindow, request, response, events);
                 }
             }
         } catch (Throwable t) {
@@ -563,7 +578,20 @@ public class PortletContainerImpl implements PortletContainer
 
         if (events != null && !events.isEmpty())
         {
-            getContainerServices().getEventCoordinationService().processEvents(this, portletWindow, request, response, events);
+           QName cdiEventQname = new QName("javax.portlet.cdi.event", "javax.portlet.cdi.event");
+           List<Event> cdiEvents = new ArrayList<Event>();
+           List<Event> portletEvents = new ArrayList<Event>();
+           for(Event eventEvent : events){
+              if(eventEvent.getQName().equals(cdiEventQname)){
+                 cdiEvents.add(eventEvent);
+              } else {
+                 portletEvents.add(eventEvent);
+              }
+           }
+           events.clear();
+           events.addAll(cdiEvents);
+           events.addAll(portletEvents);
+           getContainerServices().getEventCoordinationService().processEvents(this, portletWindow, request, response, events);
         }
 
         debugWithName("Portlet event: "+ event.getName() +" fired for: " + portletWindow.getPortletDefinition().getPortletName());

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/63410b9b/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/EventCoordinationServiceImpl.java
----------------------------------------------------------------------
diff --git a/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/EventCoordinationServiceImpl.java b/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/EventCoordinationServiceImpl.java
index f23a1d1..5eb2523 100644
--- a/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/EventCoordinationServiceImpl.java
+++ b/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/EventCoordinationServiceImpl.java
@@ -163,7 +163,7 @@ public class EventCoordinationServiceImpl implements EventCoordinationService {
             }
          }
          for(PortletCDIEvent portletCDIEvent : CDIEventsStore.universalEventList){
-            if(event.getQName().equals(CDI_EVENT_QNAME) && event.getValue().equals(portletCDIEvent.getData())){
+            if(event.getQName().equals(CDI_EVENT_QNAME) && event.getValue().equals(portletCDIEvent.getData()) && portletCDIEvent.isProcessing()){
                //System.out.println("Processed event "+ event.getValue().toString());
                //System.out.println("processed both portlet event so removing event from universal event list.");
                CDIEventsStore.universalEventList.remove(portletCDIEvent);