modified the PortletRequestImpl for the servlet-forward now a forward forwards to an include
git-svn-id: https://svn.apache.org/repos/asf/portals/pluto/branches/1.1-286-trunk-merge@609794 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/pluto-container/src/main/java/org/apache/pluto/internal/impl/PortletRequestImpl.java b/pluto-container/src/main/java/org/apache/pluto/internal/impl/PortletRequestImpl.java
index e2da47f..3015008 100644
--- a/pluto-container/src/main/java/org/apache/pluto/internal/impl/PortletRequestImpl.java
+++ b/pluto-container/src/main/java/org/apache/pluto/internal/impl/PortletRequestImpl.java
@@ -20,6 +20,7 @@
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.Principal;
+import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
@@ -29,6 +30,7 @@
import java.util.Locale;
import java.util.Map;
import java.util.Set;
+import java.util.StringTokenizer;
import java.util.Vector;
import javax.ccpp.Profile;
@@ -40,7 +42,10 @@
import javax.portlet.PortletSession;
import javax.portlet.WindowState;
import javax.servlet.RequestDispatcher;
+import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
@@ -121,6 +126,9 @@
/** The corresponding servlet request. */
private HttpServletRequest servletRequest = null;
+
+ /** The parameters including parameters appended to the dispatching URI. */
+ private Map parameters;
// Constructors ------------------------------------------------------------
@@ -634,8 +642,14 @@
* @return the base parameter map from which parameters are retrieved.
*/
protected Map baseGetParameterMap() {
- bodyAccessed = true;
- return this.getHttpServletRequest().getParameterMap();
+ if (isIncluded() && parameters != null) {
+ setBodyAccessed();
+ return parameters;
+ } else {
+ return this.getHttpServletRequest().getParameterMap();
+ }
+// bodyAccessed = true;
+// return this.getHttpServletRequest().getParameterMap();
}
protected void setBodyAccessed() {
@@ -690,7 +704,8 @@
}
public RequestDispatcher getRequestDispatcher(String path) {
- return getHttpServletRequest().getRequestDispatcher(path);
+
+ return new ServletRequestDispatcher(getHttpServletRequest().getRequestDispatcher(path));
}
/**
@@ -774,8 +789,11 @@
public void setIncluded(boolean included) {
this.included = included;
+ if (!included) {
+ this.parameters = null;
+ }
if (LOG.isDebugEnabled()) {
- LOG.debug("Portlet request's included mode: " + included);
+ LOG.debug("Render request's included mode: " + included);
}
}
@@ -791,10 +809,10 @@
}
if (queryString != null && queryString.trim().length() > 0) {
// Copy all the original render parameters.
- //parameters = new HashMap(super.getParameterMap());
+ parameters = new HashMap(super.getParameterMap());
// Merge the appended parameters to the render parameter map.
// The original render parameters should not be overwritten.
- //mergeQueryString(parameters, queryString);
+ mergeQueryString(parameters, queryString);
// Log the new render parameter map.
if (LOG.isDebugEnabled()) {
LOG.debug("Merged parameters: ");
@@ -805,6 +823,68 @@
}
}
}
+
+ /**
+ * Parses the appended query string and merges the appended parameters to
+ * the original parameters. Query parameters are name-value pairs separated
+ * by the '<code>&</code>' character.
+ * @param parameters the original parameters map.
+ * @param queryString the appended query string.
+ */
+ private void mergeQueryString(Map parameters, String queryString) {
+
+ // Create the appended parameters map:
+ // key is the parameter name as a string,
+ // value is a List of parameter values (List of String).
+ Map appendedParameters = new HashMap();
+
+ // Parse the appended query string.
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Parsing appended query string: " + queryString);
+ }
+ StringTokenizer st = new StringTokenizer(queryString, "&", false);
+ while (st.hasMoreTokens()) {
+ String token = st.nextToken();
+ int equalIndex = token.indexOf("=");
+ if (equalIndex > 0) {
+ String key = token.substring(0, equalIndex);
+ String value = null;
+ if (equalIndex < token.length() - 1) {
+ value = token.substring(equalIndex + 1);
+ } else { value = "";
+ }
+ List values = (List) appendedParameters.get(key);
+ if (values == null) {
+ values = new ArrayList();
+ }
+ values.add(value);
+ appendedParameters.put(key, values);
+ }
+ }
+ if (LOG.isDebugEnabled()) {
+ LOG.debug(appendedParameters.size() + " parameters appended.");
+ }
+
+ // Merge the appended parameters and the original parameters.
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Merging appended parameters and original parameters...");
+ }
+ for (Iterator it = appendedParameters.keySet().iterator();
+ it.hasNext(); ) {
+ String key = (String) it.next();
+ List values = (List) appendedParameters.get(key);
+ // If the parameter name (key) exists, merge parameter values.
+ if (parameters.containsKey(key)) {
+ String[] originalValues = (String[]) parameters.get(key);
+ if (originalValues != null) {
+ for (int i = 0; i < originalValues.length; i++) {
+ values.add(originalValues[i]);
+ }
+ }
+ }
+ parameters.put(key, values.toArray(new String[values.size()]));
+ }
+ }
public PortletPreferences getPreferences() {
// TODO Auto-generated method stub
@@ -1020,3 +1100,19 @@
this.setAttribute(CCPP_PROFILE, profile);
}
}
+
+class ServletRequestDispatcher implements RequestDispatcher {
+ javax.servlet.RequestDispatcher dispatcher;
+ public ServletRequestDispatcher(javax.servlet.RequestDispatcher dispatcher){
+ this.dispatcher = dispatcher;
+ }
+
+ public void forward(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
+ dispatcher.include(arg0, arg1);
+
+ }
+
+ public void include(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
+ dispatcher.include(arg0, arg1);
+ }
+}