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/26 09:28:49 UTC

portals-pluto git commit: Shifted the mechanism to prioritize CDI events over portlet events in EventCoordinationServiceImpl instead of PortletContainerImpl. Cleaned up CDI Event Store and came up with better type checking while analyzing fields in Portl

Repository: portals-pluto
Updated Branches:
  refs/heads/cross-context-cdi-events 931cacb78 -> dac954402


Shifted the mechanism to prioritize CDI events over portlet events in EventCoordinationServiceImpl instead of PortletContainerImpl. Cleaned up CDI Event Store and came up with better type checking while analyzing fields in PortletCDIEventExtension.


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

Branch: refs/heads/cross-context-cdi-events
Commit: dac954402c8b93d8810b0171d3432a11e121de4a
Parents: 931cacb
Author: ahmed <ma...@gmail.com>
Authored: Thu Jan 26 10:28:34 2017 +0100
Committer: ahmed <ma...@gmail.com>
Committed: Thu Jan 26 10:28:34 2017 +0100

----------------------------------------------------------------------
 .../pluto/container/driver/PortletServlet3.java | 12 ++---
 .../bean/processor/CDIEventsStore.java          | 48 ++++++--------------
 .../processor/PortletCDIEventExtension.java     | 41 +++++++----------
 .../container/impl/PortletContainerImpl.java    | 26 -----------
 .../container/EventCoordinationServiceImpl.java | 17 ++++++-
 5 files changed, 51 insertions(+), 93 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/dac95440/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 240e99a..927f004 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
@@ -296,8 +296,6 @@ public class PortletServlet3 extends HttpServlet {
             portletContext = contextService.getPortletContext(applicationName);
             portletConfig = contextService.getPortletConfig(applicationName, portletName);
             
-            // Get the portlet application definition
-            //PortletApplicationDefinition apd = portletContext.getPortletApplicationDefinition();
             PortletApplicationDefinition pad = holder.getPad();
             
             PortletDefinition portletDefinition =pad.getPortlet(portletName);
@@ -576,8 +574,8 @@ public class PortletServlet3 extends HttpServlet {
             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){
+            System.out.println("We have "+CDIEventsStore.CDIEventBus.size()+" events in universal event list.");
+            for(PortletCDIEvent newPortletCDIEvent : CDIEventsStore.CDIEventBus){
                Object value = newPortletCDIEvent.getData();
                if(value!=null){
                   ClassLoader cl = Thread.currentThread().getContextClassLoader();
@@ -660,8 +658,8 @@ public class PortletServlet3 extends HttpServlet {
 
                   if (xml != null) {
                      try {
-                        System.out.println("Universal event list size is "+CDIEventsStore.universalEventList.size());
-                        for(PortletCDIEvent portletCDIEvent : CDIEventsStore.universalEventList){
+                        System.out.println("Universal event list size is "+CDIEventsStore.CDIEventBus.size());
+                        for(PortletCDIEvent portletCDIEvent : CDIEventsStore.CDIEventBus){
                            if(portletCDIEvent.getData().equals(value)){
                               ClassLoader loader = portletContext.getClassLoader();
                               Class<? extends Serializable> clazz = loader.loadClass(
@@ -760,7 +758,7 @@ public class PortletServlet3 extends HttpServlet {
                   
                } else {
                   filterManager.processFilter(eventRequest, eventResponse, invoker, portletContext);
-                  for(PortletCDIEvent newPortletCDIEvent : CDIEventsStore.universalEventList){
+                  for(PortletCDIEvent newPortletCDIEvent : CDIEventsStore.CDIEventBus){
                      if(!newPortletCDIEvent.isProcessing()){
                         Object value = newPortletCDIEvent.getData();
                         if(value!=null){

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/dac95440/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/CDIEventsStore.java
----------------------------------------------------------------------
diff --git a/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/CDIEventsStore.java b/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/CDIEventsStore.java
index a83a60e..63136f7 100644
--- a/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/CDIEventsStore.java
+++ b/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/CDIEventsStore.java
@@ -1,56 +1,36 @@
 package org.apache.pluto.container.bean.processor;
 
-import java.lang.annotation.Annotation;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.Map;
-import java.util.Set;
-import java.util.Stack;
 
 import javax.enterprise.context.ApplicationScoped;
-import javax.enterprise.inject.spi.AnnotatedField;
-import javax.enterprise.inject.spi.ObserverMethod;
 
 import org.apache.pluto.container.om.portlet.PortletApplicationDefinition;
-import org.apache.pluto.container.om.portlet.PortletDefinition;
 
 @ApplicationScoped
 public class CDIEventsStore {
-   
-   public static Map<AnnotatedField<?>, HashSet<ObserverMethod<?>>> event_observers = Collections.synchronizedMap(new HashMap<AnnotatedField<?>, HashSet<ObserverMethod<?>>>());
-   public static Map<ObserverMethod<?>, Object> observerInvocation = Collections.synchronizedMap(new HashMap<ObserverMethod<?>, Object>());
-   public static Map<Object, Set<Annotation>> eventStore = Collections.synchronizedMap(new HashMap<Object, Set<Annotation>>());
-   public static ArrayList<PortletCDIEvent> universalEventList = new ArrayList<PortletCDIEvent>();
-   public static ArrayList<ObserverMethod<?>> universalObserverList = new ArrayList<ObserverMethod<?>>();
-   public static boolean firedFromBeanManager = false; 
-   public static Set<String> recieverPortlets = new HashSet<String>();
-   public static Map<PortletApplicationDefinition, Set<PortletCDIEvent>> portletAppCDIEventList = Collections.synchronizedMap(new HashMap<PortletApplicationDefinition, Set<PortletCDIEvent>>());
-   public static Map<PortletApplicationDefinition, String> portletAdded = Collections.synchronizedMap(new HashMap<PortletApplicationDefinition, String>());
-   public static Stack<Map<PortletApplicationDefinition, String>> lifo = new Stack<Map<PortletApplicationDefinition, String>>();
-   
-   public static synchronized void addEventToUniversalList(PortletCDIEvent newPortletCDIEvent){
+
+   public static ArrayList<PortletCDIEvent>                CDIEventBus   = new ArrayList<PortletCDIEvent>();
+   public static boolean                                   firedFromBeanManager = false;
+   public static Map<PortletApplicationDefinition, String> portletAdded         = Collections
+         .synchronizedMap(new HashMap<PortletApplicationDefinition, String>());
+
+   public static synchronized void addEventToEventBus(
+         PortletCDIEvent newPortletCDIEvent) {
       boolean contains = false;
-      for(PortletCDIEvent PortletCDIEvent : universalEventList){
-         if(PortletCDIEvent.equals(newPortletCDIEvent)){
-            if(!PortletCDIEvent.getObserverBeanClass().equals(newPortletCDIEvent.getObserverBeanClass())){
+      for (PortletCDIEvent PortletCDIEvent : CDIEventBus) {
+         if (PortletCDIEvent.equals(newPortletCDIEvent)) {
+            if (!PortletCDIEvent.getObserverBeanClass()
+                  .equals(newPortletCDIEvent.getObserverBeanClass())) {
                contains = true;
                break;
             }
          }
       }
-      if(!contains){
-         universalEventList.add(newPortletCDIEvent);
-      }
-   }
-   
-   /*
-   public static void printInvokedObservers(){
-      Set<Entry<ObserverMethod<?>, Serializable>> observerInvokation = CDIEventsStore.observerInvocation.entrySet();
-      for(Entry<ObserverMethod<?>, Serializable> hi : observerInvokation){
-         System.out.println(hi.getValue().toString());
+      if (!contains) {
+         CDIEventBus.add(newPortletCDIEvent);
       }
    }
-   */
 }

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/dac95440/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/PortletCDIEventExtension.java
----------------------------------------------------------------------
diff --git a/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/PortletCDIEventExtension.java b/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/PortletCDIEventExtension.java
index cf3e674..0b62629 100644
--- a/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/PortletCDIEventExtension.java
+++ b/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/PortletCDIEventExtension.java
@@ -2,6 +2,7 @@ package org.apache.pluto.container.bean.processor;
 
 import java.io.Serializable;
 import java.lang.annotation.Annotation;
+import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.lang.reflect.Type;
 import java.util.ArrayList;
@@ -33,7 +34,7 @@ class PortletCDIEventExtension implements Extension {
    private static final Logger LOG = LoggerFactory.getLogger(PortletCDIEventExtension.class);
    
    // To make reference to the original observers 
-   private HashSet<ObserverMethod<?>> originalObserverMethods = new HashSet<ObserverMethod<?>>();
+   private HashSet<ObserverMethod<?>> emptyObserverMethods = new HashSet<ObserverMethod<?>>();
 
    // Starting the scanning process 
    void beforeBeanDiscovery(@Observes BeforeBeanDiscovery bbd) {
@@ -50,9 +51,9 @@ class PortletCDIEventExtension implements Extension {
       
       for (final AnnotatedField<? super T> field : fields) {
          
-         if (isFieldCDIEvent(field.getBaseType())) {
-            ObserverMethod<T> emptyObserverMethod = getEmptyObserver(field);
-            originalObserverMethods.add(emptyObserverMethod);
+         if (isFieldCDIEventDefinition(field.getJavaMember())) {
+            ObserverMethod<T> emptyObserverMethod = createEmptyObserverFor(field);
+            emptyObserverMethods.add(emptyObserverMethod);
          }
       }      
       
@@ -127,6 +128,7 @@ class PortletCDIEventExtension implements Extension {
                      return firstParameter.getTypeClosure();
                   }
 
+                  @SuppressWarnings("hiding")
                   @Override
                   public <T extends Annotation> T getAnnotation(
                         Class<T> annotationType) {
@@ -151,6 +153,7 @@ class PortletCDIEventExtension implements Extension {
                      return firstParameter.getPosition();
                   }
 
+                  @SuppressWarnings("unchecked")
                   @Override
                   public AnnotatedCallable<T> getDeclaringCallable() {
                      return (AnnotatedCallable<T>) firstParameter.getDeclaringCallable();
@@ -176,6 +179,7 @@ class PortletCDIEventExtension implements Extension {
                      return method.isStatic();
                   }
 
+                  @SuppressWarnings("unchecked")
                   @Override
                   public AnnotatedType<T> getDeclaringType() {
                      return (AnnotatedType<T>) method.getDeclaringType();
@@ -191,6 +195,7 @@ class PortletCDIEventExtension implements Extension {
                      return method.getTypeClosure();
                   }
 
+                  @SuppressWarnings("hiding")
                   @Override
                   public <T extends Annotation> T getAnnotation(
                         Class<T> annotationType) {
@@ -227,6 +232,7 @@ class PortletCDIEventExtension implements Extension {
          
          // Wrapper for annotated type
          AnnotatedType<T> wrappedAnnotatedType = new AnnotatedType<T>() {
+            @SuppressWarnings("hiding")
             @Override
             public <T extends Annotation> T getAnnotation(Class<T> arg0) {
                return at.getAnnotation(arg0);
@@ -283,18 +289,18 @@ class PortletCDIEventExtension implements Extension {
    // Finish the scanning process
    void afterBeanDiscovery(@Observes AfterBeanDiscovery abd) {
       
-      for(ObserverMethod<?> observerMethod : originalObserverMethods){
+      for(ObserverMethod<?> observerMethod : emptyObserverMethods){
          abd.addObserverMethod(observerMethod);
       }
       
-      originalObserverMethods.clear();
+      emptyObserverMethods.clear();
       
       
       System.out.println("Finished the scanning process");
       LOG.debug("Finished the scanning process");
    } 
    
-   private <T> ObserverMethod<T> getEmptyObserver(final AnnotatedField<? super T> field) {
+   private <T> ObserverMethod<T> createEmptyObserverFor(final AnnotatedField<? super T> field) {
       
       final Set<Annotation> annotations = new HashSet<Annotation>();
       for(Annotation annotation : field.getAnnotations()){
@@ -341,7 +347,7 @@ class PortletCDIEventExtension implements Extension {
             public void notify(T event) {
                if(!CDIEventsStore.firedFromBeanManager){
                   annotations.add(new MyPortletEvent());
-                  CDIEventsStore.addEventToUniversalList(new PortletCDIEvent(annotations, (Serializable) event, field.getJavaMember().getDeclaringClass()));
+                  CDIEventsStore.addEventToEventBus(new PortletCDIEvent(annotations, (Serializable) event, field.getJavaMember().getDeclaringClass()));
                }
             }
          }; 
@@ -352,22 +358,9 @@ class PortletCDIEventExtension implements Extension {
       
    }
 
-   private boolean isFieldCDIEvent(Type baseType) {
-      String fieldType = baseType.toString();
-      if(fieldType.contains("javax.enterprise.event.Event")){
-         String fieldClassName = fieldType.split("<")[0];
-         try {
-            @SuppressWarnings("rawtypes")
-            Class fieldClass = Class.forName(fieldClassName);
-            if(fieldClass.equals(javax.enterprise.event.Event.class)){
-               return true;
-            } else {
-               return false;
-            }
-         } catch (ClassNotFoundException e) {
-            e.printStackTrace();
-            return false;
-         }
+   private <T> boolean isFieldCDIEventDefinition(Field field) {
+      if(field.getType().equals(javax.enterprise.event.Event.class)){
+         return true;
       } else {
          return false;
       }

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/dac95440/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 cd5cdfe..a4d87a4 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
@@ -349,21 +349,8 @@ 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())
                 {
-                   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);
                 }
             }
@@ -578,19 +565,6 @@ public class PortletContainerImpl implements PortletContainer
 
         if (events != null && !events.isEmpty())
         {
-           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);
         }
 

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/dac95440/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 5eb2523..b62b1b2 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
@@ -107,6 +107,19 @@ public class EventCoordinationServiceImpl implements EventCoordinationService {
 
       QName CDI_EVENT_QNAME = new QName("javax.portlet.cdi.event", "javax.portlet.cdi.event");
       
+      List<Event> cdiEvents = new ArrayList<Event>();
+      List<Event> portletEvents = new ArrayList<Event>();
+      for(Event event : events){
+         if(event.getQName().equals(CDI_EVENT_QNAME)){
+            cdiEvents.add(event);
+         } else {
+            portletEvents.add(event);
+         }
+      }
+      events.clear();
+      events.addAll(cdiEvents);
+      events.addAll(portletEvents);
+      
       for (Event event : events) {
          List<String> portletNames = getAllPortletsRegisteredForEvent(event,
                driverConfig, containerServletContext, portalURL);
@@ -162,11 +175,11 @@ public class EventCoordinationServiceImpl implements EventCoordinationService {
                }
             }
          }
-         for(PortletCDIEvent portletCDIEvent : CDIEventsStore.universalEventList){
+         for(PortletCDIEvent portletCDIEvent : CDIEventsStore.CDIEventBus){
             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);
+               CDIEventsStore.CDIEventBus.remove(portletCDIEvent);
                break;
             }
          }