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/29 15:27:49 UTC

portals-pluto git commit: 1. Introduced new @EmptyEvent qualifier in event definition and empty observers. Doing so does not call the emtpy observers again when we call the cdi event later in event phase via bean manager. 2. CDI events fired in the obser

Repository: portals-pluto
Updated Branches:
  refs/heads/cross-context-cdi-events 99629609d -> 4a5f9847d


1. Introduced new @EmptyEvent qualifier in event definition and empty observers. Doing so does not call the emtpy observers again when we call the cdi event later in event phase via bean manager.
2. CDI events fired in the observer of another cdi event now works.
3. CDI events fired in the render/resource phase are delivered to the same application in which they were fired, but only at the end of render/resource phase.


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

Branch: refs/heads/cross-context-cdi-events
Commit: 4a5f9847ded17419dbda17c8cdb6005ddce624ea
Parents: 9962960
Author: ahmed <ma...@gmail.com>
Authored: Sun Jan 29 16:27:26 2017 +0100
Committer: ahmed <ma...@gmail.com>
Committed: Sun Jan 29 16:27:26 2017 +0100

----------------------------------------------------------------------
 .../pluto/container/driver/PortletServlet3.java | 108 +++++++++----------
 .../bean/processor/CDIEventsStore.java          |   1 -
 .../container/bean/processor/EmptyEvent.java    |  24 +++++
 .../bean/processor/EmptyEventImpl.java          |   8 ++
 .../processor/PortletCDIEventExtension.java     |  78 ++++++++++++--
 .../container/bean/processor/PortletEvent.java  |   7 +-
 .../container/EventCoordinationServiceImpl.java |   1 -
 7 files changed, 151 insertions(+), 76 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/4a5f9847/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 c44a15a..2878b70 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
@@ -536,6 +536,10 @@ public class PortletServlet3 extends HttpServlet {
             }
             RenderResponse renderResponse = (RenderResponse) portletResponse;
             filterManager.processFilter(renderRequest, renderResponse, invoker, portletContext);
+            for(PortletCDIEvent portletCDIEvent : CDIEventsStore.CDIEventBus){
+               beanmgr.fireEvent(portletCDIEvent.getData(), portletCDIEvent.getQualifiers());
+            }
+            CDIEventsStore.CDIEventBus.clear();
          }
 
          // The requested method is HEADER: call
@@ -559,6 +563,10 @@ public class PortletServlet3 extends HttpServlet {
 
             ResourceResponse resourceResponse = (ResourceResponse) portletResponse;
             filterManager.processFilter(resourceRequest, resourceResponse, invoker, portletContext);
+            for(PortletCDIEvent portletCDIEvent : CDIEventsStore.CDIEventBus){
+               beanmgr.fireEvent(portletCDIEvent.getData(), portletCDIEvent.getQualifiers());
+            }
+            CDIEventsStore.CDIEventBus.clear();
          }
 
          // The requested method is ACTION: call Portlet.processAction(..)
@@ -566,33 +574,8 @@ public class PortletServlet3 extends HttpServlet {
             ActionRequest actionRequest = (ActionRequest) portletRequest;
             ActionResponse actionResponse = (ActionResponse) portletResponse;
             filterManager.processFilter(actionRequest, actionResponse, invoker, portletContext);
-            
             for(PortletCDIEvent portletCDIEvent : CDIEventsStore.CDIEventBus){
-               Object value = portletCDIEvent.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();
-                     @SuppressWarnings("unchecked")
-                     JAXBElement<Serializable> element = new JAXBElement<Serializable>(CDI_EVENT_QNAME, clazz, (Serializable) value);
-                     marshaller.marshal(element, out);
-                     portletCDIEvent.setSerializedData(out.toString());
-                     portletCDIEvent.setProcessing(true);
-                     actionResponse.setEvent(CDI_EVENT_QNAME, out.toString());
-                     
-                  } catch(Exception e) {
-                     e.printStackTrace();
-                  } finally {
-                     Thread.currentThread().setContextClassLoader(cl);
-                     System.getProperties().remove("com.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize");
-                  }
-               }
+               convertFiredCDIEventstoPortletEvents(portletCDIEvent, actionResponse);
             }
          }
 
@@ -634,14 +617,18 @@ public class PortletServlet3 extends HttpServlet {
                               JAXBElement result = unmarshaller.unmarshal(xml, clazz);
                
                               try{
-                                    CDIEventsStore.firedFromBeanManager=true;
-                                    beanmgr.fireEvent(result.getValue(), portletCDIEvent.getQualifiers());
-                                    CDIEventsStore.firedFromBeanManager=false;
+                                 System.out.println("\nNow firing event from bean manager of "+portletName);
+                                 beanmgr.fireEvent(result.getValue(), portletCDIEvent.getQualifiers());
                               } catch (Exception e){
                                  e.printStackTrace();
                               }
                            }
                         }
+                        for(PortletCDIEvent portletCDIEvent : CDIEventsStore.CDIEventBus){
+                           if(!portletCDIEvent.isProcessing()){
+                              convertFiredCDIEventstoPortletEvents(portletCDIEvent, eventResponse);
+                           }
+                        }
                        
                      } catch (JAXBException e) {
                         throw new IllegalStateException(e);
@@ -655,39 +642,13 @@ public class PortletServlet3 extends HttpServlet {
                   
                } else {
                   filterManager.processFilter(eventRequest, eventResponse, invoker, portletContext);
-                  for(PortletCDIEvent newPortletCDIEvent : CDIEventsStore.CDIEventBus){
-                     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();
-                              @SuppressWarnings("unchecked")
-                              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());
-                              
-                           } catch(Exception e) {
-                              e.printStackTrace();
-                           } finally {
-                              Thread.currentThread().setContextClassLoader(cl);
-                              System.getProperties().remove("com.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize");
-                           }
-                        }
+                  for(PortletCDIEvent portletCDIEvent : CDIEventsStore.CDIEventBus){
+                     if(!portletCDIEvent.isProcessing()){
+                        convertFiredCDIEventstoPortletEvents(portletCDIEvent, eventResponse);
                      }
                   }
                }
-            } else {
-               System.out.println("Portlet Event is null.");
-            }
+            } 
          }
          // The requested method is ADMIN: call handlers.
          else if (methodId == PortletInvokerService.METHOD_ADMIN) {
@@ -768,6 +729,35 @@ public class PortletServlet3 extends HttpServlet {
       }
    }
 
+   private void convertFiredCDIEventstoPortletEvents(
+         PortletCDIEvent portletCDIEvent, StateAwareResponse portletResponse) {
+      Object value = portletCDIEvent.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();
+            @SuppressWarnings("unchecked")
+            JAXBElement<Serializable> element = new JAXBElement<Serializable>(CDI_EVENT_QNAME, clazz, (Serializable) value);
+            marshaller.marshal(element, out);
+            portletCDIEvent.setSerializedData(out.toString());
+            portletCDIEvent.setProcessing(true);
+            portletResponse.setEvent(CDI_EVENT_QNAME, out.toString());
+            
+         } catch(Exception e) {
+            e.printStackTrace();
+         } finally {
+            Thread.currentThread().setContextClassLoader(cl);
+            System.getProperties().remove("com.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize");
+         }
+      }
+   }
+
    protected void notify(PortletInvocationEvent event, boolean pre, Throwable e) {
       PortalAdministrationService pas = PlutoServices.getServices().getPortalAdministrationService();
 

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/4a5f9847/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 efee42e..f612ff0 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
@@ -16,7 +16,6 @@ public class CDIEventsStore {
 
    public static final QName CDI_EVENT_QNAME = new QName("javax.portlet.cdi.event", "javax.portlet.cdi.event");
    public static List<PortletCDIEvent>                CDIEventBus   = Collections.synchronizedList(new ArrayList<PortletCDIEvent>());
-   public static boolean                                   firedFromBeanManager = false;
    public static Set<PortletApplicationDefinition> CDIPortletEventSubscriberPADList = Collections.synchronizedSet(new HashSet<PortletApplicationDefinition>());
 
    public static synchronized void addEventToEventBus(

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/4a5f9847/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/EmptyEvent.java
----------------------------------------------------------------------
diff --git a/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/EmptyEvent.java b/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/EmptyEvent.java
new file mode 100644
index 0000000..fd3ec8a
--- /dev/null
+++ b/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/EmptyEvent.java
@@ -0,0 +1,24 @@
+package org.apache.pluto.container.bean.processor;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.METHOD;
+
+import javax.inject.Qualifier;
+
+/**
+ * An annotation that is used as a qualifier for events fired when
+ * a name is added.
+ * 
+ * @author nick
+ *
+ */
+
+@Retention(RetentionPolicy.RUNTIME)
+@Qualifier
+@Target({FIELD, METHOD, PARAMETER, TYPE})
+public @interface EmptyEvent {}

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/4a5f9847/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/EmptyEventImpl.java
----------------------------------------------------------------------
diff --git a/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/EmptyEventImpl.java b/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/EmptyEventImpl.java
new file mode 100644
index 0000000..3216677
--- /dev/null
+++ b/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/EmptyEventImpl.java
@@ -0,0 +1,8 @@
+package org.apache.pluto.container.bean.processor;
+
+import javax.enterprise.util.AnnotationLiteral;
+
+@SuppressWarnings("serial")
+public class EmptyEventImpl extends AnnotationLiteral<EmptyEvent> {
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/4a5f9847/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 d510025..b378e2f 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
@@ -48,12 +48,70 @@ class PortletCDIEventExtension implements Extension {
 
       // Get all fields of the class
       Set<AnnotatedField<? super T>> fields = at.getFields();
+      final Set<AnnotatedField<? super T>> modifiedFields = new HashSet<AnnotatedField<? super T>>();
       
       for (final AnnotatedField<? super T> field : fields) {
          
+         final Set<Annotation> modifiedAnnotations = new HashSet<Annotation>();
+         
+         for(Annotation annotation : field.getAnnotations()){
+            modifiedAnnotations.add(annotation);
+         }
+         
+         EmptyEventImpl emptyEventAnnotation = new EmptyEventImpl();
+         modifiedAnnotations.add(emptyEventAnnotation);
+         
          if (isFieldCDIEventDefinition(field.getJavaMember())) {
-            ObserverMethod<T> emptyObserverMethod = createEmptyObserverFor(field);
+            AnnotatedField<T> modifiedCDIEvent = new AnnotatedField<T>(){
+
+               @SuppressWarnings("unchecked")
+               @Override
+               public AnnotatedType<T> getDeclaringType() {
+                  return (AnnotatedType<T>) field.getDeclaringType();
+               }
+
+               @Override
+               public boolean isStatic() {
+                  return field.isStatic();
+               }
+
+               @SuppressWarnings("hiding")
+               @Override
+               public <T extends Annotation> T getAnnotation(Class<T> arg0) {
+                  return field.getAnnotation(arg0);
+               }
+
+               @Override
+               public Set<Annotation> getAnnotations() {
+                  return modifiedAnnotations;
+               }
+
+               @Override
+               public Type getBaseType() {
+                  return field.getBaseType();
+               }
+
+               @Override
+               public Set<Type> getTypeClosure() {
+                  return field.getTypeClosure();
+               }
+
+               @Override
+               public boolean isAnnotationPresent(
+                     Class<? extends Annotation> arg0) {
+                  return field.isAnnotationPresent(arg0);
+               }
+
+               @Override
+               public Field getJavaMember() {
+                  return field.getJavaMember();
+               }
+            };
+            ObserverMethod<T> emptyObserverMethod = createEmptyObserverFor(modifiedCDIEvent);
             emptyObserverMethods.add(emptyObserverMethod);
+            modifiedFields.add(modifiedCDIEvent);
+         } else {
+            modifiedFields.add(field);
          }
       }      
       
@@ -265,7 +323,7 @@ class PortletCDIEventExtension implements Extension {
 
             @Override
             public Set<AnnotatedField<? super T>> getFields() {
-               return at.getFields();
+               return modifiedFields;
             }
 
             @Override
@@ -300,12 +358,17 @@ class PortletCDIEventExtension implements Extension {
    
    private <T> ObserverMethod<T> createEmptyObserverFor(final AnnotatedField<? super T> field) {
       
-      final Set<Annotation> annotations = new HashSet<Annotation>();
+      final Set<Annotation> emptyAnnotations = new HashSet<Annotation>();
+      final Set<Annotation> portletAnnotations = new HashSet<Annotation>();
       for(Annotation annotation : field.getAnnotations()){
          if(!(annotation instanceof javax.inject.Inject)){
-            annotations.add(annotation);
+            emptyAnnotations.add(annotation);
+            if(!(annotation instanceof EmptyEventImpl)){
+               portletAnnotations.add(annotation);
+            }
          }
       }
+      portletAnnotations.add(new PortletEventImpl());
       
       String genericType = field.getJavaMember().getGenericType().toString();
       String genericTypeClassName = genericType.substring(genericType.indexOf("<")+1, genericType.indexOf(">"));
@@ -328,7 +391,7 @@ class PortletCDIEventExtension implements Extension {
 
             @Override
             public Set<Annotation> getObservedQualifiers() {
-               return annotations;
+               return emptyAnnotations;
             }
 
             @Override
@@ -343,10 +406,7 @@ class PortletCDIEventExtension implements Extension {
 
             @Override
             public void notify(T event) {
-               if(!CDIEventsStore.firedFromBeanManager){
-                  annotations.add(new PortletEventImpl());
-                  CDIEventsStore.addEventToEventBus(new PortletCDIEvent(annotations, (Serializable) event, field.getJavaMember().getDeclaringClass()));
-               }
+               CDIEventsStore.addEventToEventBus(new PortletCDIEvent(portletAnnotations, (Serializable) event, field.getJavaMember().getDeclaringClass()));
             }
          }; 
       } catch (ClassNotFoundException e) {

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/4a5f9847/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/PortletEvent.java
----------------------------------------------------------------------
diff --git a/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/PortletEvent.java b/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/PortletEvent.java
index 4efd937..f16ecbb 100644
--- a/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/PortletEvent.java
+++ b/pluto-container/src/main/java/org/apache/pluto/container/bean/processor/PortletEvent.java
@@ -17,12 +17,7 @@ import javax.inject.Qualifier;
  * @author nick
  *
  */
-/* 
- * Just making a new annotation for our event.
- * What we learn from here is not only implementations
- * but also events can be specified as a Qualifier.
- * To see the usage - See FormController class
- */
+
 @Retention(RetentionPolicy.RUNTIME)
 @Qualifier
 @Target({FIELD, METHOD, PARAMETER, TYPE})

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/4a5f9847/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 9daa036..51d56b8 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
@@ -117,7 +117,6 @@ public class EventCoordinationServiceImpl implements EventCoordinationService {
       for (Event event : events) {
          List<String> portletNames = getAllPortletsRegisteredForEvent(event,
                driverConfig, containerServletContext, portalURL);
-         System.out.println(portletNames.size() + "portlets are responsible for "+event.getName()+" event");
 
          // Deliver events to all portlets in the portal
          // Collection<PortletWindowConfig> portlets =