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);