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 ms...@apache.org on 2016/04/14 14:29:11 UTC

[31/50] [abbrv] portals-pluto git commit: more work on async portlet

more work on async portlet


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

Branch: refs/heads/master
Commit: 870277c87101e668b4cf384ad94e800e847ed958
Parents: f0e0b11
Author: Scott Nicklous <ms...@apache.org>
Authored: Tue Mar 29 12:53:05 2016 +0200
Committer: Scott Nicklous <ms...@apache.org>
Committed: Tue Mar 29 12:53:05 2016 +0200

----------------------------------------------------------------------
 .../apache/portals/samples/AsyncDialogBean.java |   4 +
 .../portals/samples/AsyncPortletResource.java   | 162 ++++++++++++++-----
 2 files changed, 126 insertions(+), 40 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/870277c8/PortletV3AnnotatedDemo/src/main/java/org/apache/portals/samples/AsyncDialogBean.java
----------------------------------------------------------------------
diff --git a/PortletV3AnnotatedDemo/src/main/java/org/apache/portals/samples/AsyncDialogBean.java b/PortletV3AnnotatedDemo/src/main/java/org/apache/portals/samples/AsyncDialogBean.java
index 5f824a2..08389b2 100644
--- a/PortletV3AnnotatedDemo/src/main/java/org/apache/portals/samples/AsyncDialogBean.java
+++ b/PortletV3AnnotatedDemo/src/main/java/org/apache/portals/samples/AsyncDialogBean.java
@@ -213,6 +213,10 @@ public class AsyncDialogBean implements PortletSerializable {
       String auto = req.getActionParameters().getValue(PARAM_AUTO);
       if (auto != null) {
          autoDispatch = true;
+         if (reps > 1) {
+            msg = "Repetitions cannot be > 1 for non-recursive use.";
+            reps = 1;
+         }
       } else {
          autoDispatch = false;
       }

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/870277c8/PortletV3AnnotatedDemo/src/main/java/org/apache/portals/samples/AsyncPortletResource.java
----------------------------------------------------------------------
diff --git a/PortletV3AnnotatedDemo/src/main/java/org/apache/portals/samples/AsyncPortletResource.java b/PortletV3AnnotatedDemo/src/main/java/org/apache/portals/samples/AsyncPortletResource.java
index 221de53..a61550d 100644
--- a/PortletV3AnnotatedDemo/src/main/java/org/apache/portals/samples/AsyncPortletResource.java
+++ b/PortletV3AnnotatedDemo/src/main/java/org/apache/portals/samples/AsyncPortletResource.java
@@ -23,6 +23,8 @@ import java.util.logging.Level;
 import java.util.logging.Logger;
 
 import javax.inject.Inject;
+import javax.portlet.PortletException;
+import javax.portlet.PortletRequestDispatcher;
 import javax.portlet.ResourceRequest;
 import javax.portlet.ResourceResponse;
 import javax.portlet.annotations.ServeResourceMethod;
@@ -37,19 +39,21 @@ import org.apache.portals.samples.AsyncDialogBean.OutputType;
  * Implements the async resource method for the async portlet.
  * 
  * @author Scott Nicklous
- *
+ * 
  */
 public class AsyncPortletResource {
-   private static final Logger LOGGER = Logger.getLogger(AsyncPortletResource.class.getName());
-   
-   private final static String JSP = "/WEB-INF/jsp/asyncOutput.jsp";
+   private static final Logger LOGGER      = Logger.getLogger(AsyncPortletResource.class.getName());
+
+   private final static String JSP         = "/WEB-INF/jsp/asyncOutput.jsp";
+   private final static String ATTRIB_REPS = "reps";
+   private final static String ATTRIB_AUTO = "auto";
 
    private class AsyncRunnable implements Runnable {
-      
+
       private final AsyncContext ctx;
-      private final int delay;
-      private final OutputType type;
-      private final boolean done;
+      private final int          delay;
+      private final OutputType   type;
+      private final boolean      done;
 
       public AsyncRunnable(AsyncContext ctx, int delay, OutputType type, boolean done) {
          this.ctx = ctx;
@@ -68,36 +72,42 @@ public class AsyncPortletResource {
             RequestDispatcher rd;
 
             switch (type) {
-               case TEXT:
-                  StringBuilder txt = new StringBuilder(128);
-                  txt.append("<p>AsyncRunnable:");
-                  txt.append(" dispatcher type: ").append(hreq.getDispatcherType().toString());
-                  txt.append("</p>");
-                  hresp.getWriter().write(txt.toString());
-                  if (done) {
-                     ctx.complete();
-                  }
-                  break;
-               case AUTO:
-                  ctx.dispatch();
-                  break;
-               case DISPATCH:
-                  ctx.dispatch(JSP);
-                  break;
-               case FWD:
-                  rd = hreq.getRequestDispatcher(JSP);
-                  rd.forward(hreq, hresp);
-                  if (done) {
-                     ctx.complete();
-                  }
-                  break;
-               case INC:
-                  rd = hreq.getRequestDispatcher(JSP);
-                  rd.include(hreq, hresp);
-                  if (done) {
-                     ctx.complete();
-                  }
-                  break;
+            case TEXT:
+               LOGGER.fine("Producing text output.");
+               StringBuilder txt = new StringBuilder(128);
+               txt.append("<p>AsyncRunnable.");
+               txt.append(" dispatcher type: ").append(hreq.getDispatcherType().toString());
+               txt.append("</p>");
+               hresp.getWriter().write(txt.toString());
+               if (done) {
+                  ctx.complete();
+               }
+               break;
+            case AUTO:
+               LOGGER.fine("Dispatching to resource method.");
+               hreq.setAttribute(ATTRIB_AUTO, new Boolean(true));
+               ctx.dispatch();
+               break;
+            case DISPATCH:
+               LOGGER.fine("Dispatching to JSP.");
+               ctx.dispatch(JSP);
+               break;
+            case FWD:
+               LOGGER.fine("Doing request dispatcher forward to JSP.");
+               rd = hreq.getRequestDispatcher(JSP);
+               rd.forward(hreq, hresp);
+               if (done) {
+                  ctx.complete();
+               }
+               break;
+            case INC:
+               LOGGER.fine("Doing request dispatcher include of JSP.");
+               rd = hreq.getRequestDispatcher(JSP);
+               rd.include(hreq, hresp);
+               if (done) {
+                  ctx.complete();
+               }
+               break;
             }
 
          } catch (Exception e) {
@@ -111,7 +121,79 @@ public class AsyncPortletResource {
    private AsyncDialogBean adb;
 
    @ServeResourceMethod(portletNames = "AsyncPortlet", asyncSupported = true)
-   public void getResource(ResourceRequest req, ResourceResponse resp) throws IOException {
-      resp.getWriter().write("<p>Hello from the resource method!</p>");
+   public void getResource(ResourceRequest req, ResourceResponse resp) throws IOException, PortletException {
+
+      Integer reps = (Integer) req.getAttribute(ATTRIB_REPS);
+      if (reps == null) {
+         reps = adb.getReps();
+      }
+
+      boolean done = false;
+      if (--reps <= 0 || !adb.isAutoDispatch()) {
+         done = true;
+      }
+      req.setAttribute(ATTRIB_REPS, reps);
+
+      Boolean auto = (Boolean) req.getAttribute(ATTRIB_AUTO);
+      req.removeAttribute(ATTRIB_AUTO);
+
+      if ((adb.getDelay() <= 0) || (auto != null)) {
+         
+         PortletRequestDispatcher rd;
+         AsyncContext ctx = null;
+         try {
+            ctx = req.getAsyncContext();
+         } catch (Exception e) {}
+
+         switch (adb.getType()) {
+         case TEXT:
+            LOGGER.fine("Producing text output.");
+            StringBuilder txt = new StringBuilder(128);
+            txt.append("<p>AsyncRunnable.");
+            txt.append(" dispatcher type: ").append(req.getDispatcherType().toString());
+            txt.append("</p>");
+            resp.getWriter().write(txt.toString());
+            if (done && ctx != null) {
+               ctx.complete();
+            }
+            break;
+         case DISPATCH:
+            LOGGER.fine("Dispatching to JSP.");
+            if (ctx != null) {
+               ctx.dispatch(JSP);
+            }
+            break;
+         case FWD:
+            LOGGER.fine("Doing request dispatcher forward to JSP.");
+            rd = req.getPortletContext().getRequestDispatcher(JSP);
+            rd.forward(req, resp);
+            if (done && ctx != null) {
+               ctx.complete();
+            }
+            break;
+         case INC:
+            LOGGER.fine("Doing request dispatcher include of JSP.");
+            rd = req.getPortletContext().getRequestDispatcher(JSP);
+            rd.include(req, resp);
+            if (done && ctx != null) {
+               ctx.complete();
+            }
+            break;
+         default:
+            break;
+         }
+      }
+      
+      if (adb.getDelay() > 0 && (!done || auto == null)) {
+         AsyncContext ctx = req.startAsync();
+         ctx.setTimeout(4000);
+         OutputType type = adb.getType();
+         if (adb.isAutoDispatch()) {
+            type = OutputType.AUTO;
+         }
+         AsyncRunnable ar = new AsyncRunnable(ctx, adb.getDelay(), type, done);
+         ctx.start(ar);
+      }
+
    }
 }