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/08 15:40:28 UTC
[16/34] 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/V3Prototype
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);
+ }
+
}
}