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 at...@apache.org on 2009/03/06 17:11:52 UTC

svn commit: r750954 [4/5] - in /portals/pluto/trunk: pluto-container/src/main/java/org/apache/pluto/core/ pluto-container/src/main/java/org/apache/pluto/descriptors/portlet/ pluto-container/src/main/java/org/apache/pluto/descriptors/services/jaxb/ plut...

Modified: portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/internal/impl/PortletResponseImpl.java
URL: http://svn.apache.org/viewvc/portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/internal/impl/PortletResponseImpl.java?rev=750954&r1=750953&r2=750954&view=diff
==============================================================================
--- portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/internal/impl/PortletResponseImpl.java (original)
+++ portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/internal/impl/PortletResponseImpl.java Fri Mar  6 16:11:51 2009
@@ -16,399 +16,201 @@
  */
 package org.apache.pluto.internal.impl;
 
-import java.io.IOException;
-import java.io.PrintWriter;
+import java.util.Enumeration;
 
+import javax.portlet.PortalContext;
+import javax.portlet.PortletMode;
 import javax.portlet.PortletResponse;
-import javax.portlet.PortletURL;
-import javax.portlet.ResourceURL;
-import javax.servlet.ServletOutputStream;
 import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpServletResponseWrapper;
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.apache.pluto.NamespaceMapper;
 import org.apache.pluto.PortletContainer;
 import org.apache.pluto.PortletWindow;
-import org.apache.pluto.internal.InternalPortletResponse;
+import org.apache.pluto.om.portlet.Supports;
 import org.apache.pluto.spi.ResourceURLProvider;
+import org.apache.pluto.spi.optional.PortletResponseContext;
 import org.apache.pluto.util.ArgumentUtility;
-import org.apache.pluto.util.DummyPrintWriter;
-import org.apache.pluto.util.PrintWriterServletOutputStream;
 import org.w3c.dom.DOMException;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
 /**
  * Abstract <code>javax.portlet.PortletResponse</code> implementation.
- * This class also implements InternalPortletResponse.
- *
  */
-public abstract class PortletResponseImpl extends HttpServletResponseWrapper
-implements PortletResponse, InternalPortletResponse {
+public abstract class PortletResponseImpl implements PortletResponse
+{
 	
 	/** Logger. */
     private static final Log LOG = LogFactory.getLog(PortletResponseImpl.class);
-	// Private Member Variables ------------------------------------------------
 	
-	/** The portlet container. */
-    private PortletContainer container;
-    
-    /** The portlet window. */
-    private PortletWindow portletWindow;
-
-    /** The servlet request of the target/portlet's web module. */
-    private HttpServletRequest httpServletRequest;
-    
-    private boolean usingWriter;
-    private boolean usingStream;
-
-    private ServletOutputStream wrappedWriter;
-    
-    private NamespaceMapper mapper;
-    
-    /** True if we are in an include call. */
-    private boolean included = false;
-    
-    /** True if we are in an forwarded call. */
-    private boolean forwarded = false;
-    
-    private boolean requestForwarded = false;
+    private String namespace;    
+    private PortletResponseContext responseContext;
     
     // Constructor -------------------------------------------------------------
     
-    public PortletResponseImpl(PortletContainer container,
-                               PortletWindow portletWindow,
-                               HttpServletRequest servletRequest,
-                               HttpServletResponse servletResponse) {
-        super(servletResponse);
-        this.container = container;
-        this.httpServletRequest = servletRequest;
-        this.portletWindow = portletWindow;
-        this.mapper = container.getOptionalContainerServices().getNamespaceMapper();
+    public PortletResponseImpl(PortletResponseContext responseContext) {
+        this.responseContext = responseContext;
     }
     
-    
-    // PortletResponse Impl ----------------------------------------------------
-    
-    public void addProperty(String name, String value) {
-    	ArgumentUtility.validateNotNull("propertyName", name);
-        container.getRequiredContainerServices()
-        		.getPortalCallbackService().getPropertyManager()
-        		.addResponseProperty(
-        				getHttpServletRequest(), getHttpServletResponse(),
-        				portletWindow, 
-        				container.getRequiredContainerServices().getContainerInvocationService().getInvocation().getMethod(),
-        				name, value);
-    }
-    
-    public void addProperty(String name, String value, int scope) {
-    	// FIXME: What should this do? (scope seems to be new)
-    	ArgumentUtility.validateNotNull("propertyName", name);
-        container.getRequiredContainerServices()
-        		.getPortalCallbackService().getPropertyManager()
-        		.addResponseProperty(
-        		        getHttpServletRequest(), getHttpServletResponse(),
-        				portletWindow,
-                        container.getRequiredContainerServices().getContainerInvocationService().getInvocation().getMethod(),
-        				name, value);
-    }
-    
-    public void addProperty(String key, Element element) {
-        container.getRequiredContainerServices()
-        .getPortalCallbackService().getPropertyManager()
-        .addResponseProperty(
-                getHttpServletRequest(), getHttpServletResponse(),
-                portletWindow,
-                container.getRequiredContainerServices().getContainerInvocationService().getInvocation().getMethod(),
-                key, element);
-	}
-
-
-	public void addProperty(Cookie cookie) {
-        container.getRequiredContainerServices()
-        .getPortalCallbackService().getPropertyManager()
-        .addResponseProperty(
-                getHttpServletRequest(), getHttpServletResponse(),
-                portletWindow,
-                container.getRequiredContainerServices().getContainerInvocationService().getInvocation().getMethod(),
-                cookie);
-	}
-
-    public void setProperty(String name, String value) {
-    	ArgumentUtility.validateNotNull("propertyName", name);
-        container.getRequiredContainerServices()
-        .getPortalCallbackService().getPropertyManager()
-        .setResponseProperty(
-                getHttpServletRequest(), getHttpServletResponse(),
-                portletWindow,
-                container.getRequiredContainerServices().getContainerInvocationService().getInvocation().getMethod(),
-                name, value);
-    }
-
-    public String encodeURL(String path) {
-        if (path.indexOf("://") == -1 && !path.startsWith("/")) {
-            throw new IllegalArgumentException(
-                "only absolute URLs or full path URIs are allowed");
-        }
-        
-        ResourceURLProvider provider = getContainer()
-        		.getRequiredContainerServices()
-        		.getPortalCallbackService()
-        		.getResourceURLProvider(
-        				httpServletRequest,
-        				portletWindow);
-        if (path.indexOf("://") != -1) {
-            provider.setAbsoluteURL(path);
-        } else {
-            provider.setFullPath(path);
-        }
-        return getHttpServletResponse().encodeURL(provider.toString());
+    protected PortletResponseContext getResponseContext()
+    {
+        return responseContext;
     }
     
-    
-    // InternalPortletResponse impl --------------------------------------------
-    
-    public PortletWindow getPortletWindow() {
-        return portletWindow;
+    protected PortletWindow getPortletWindow() 
+    {
+        return responseContext.getPortletWindow();
     }
-    
-    
-    // Internal Methods --------------------------------------------------------
-    
-    /**
-     * Returns the portlet container.
-     * @return the portlet container.
-     */
-    protected PortletContainer getContainer() {
-        return container;
+
+    protected PortletContainer getPortletContainer() 
+    {
+        return responseContext.getContainer();
     }
     
-    /**
-     * Returns the nested HttpServletRequest instance.
-     * @return the nested HttpServletRequest instance.
-     */
-    protected HttpServletRequest getHttpServletRequest() {
-        return httpServletRequest;
+    protected PortalContext getPortalContext()
+    {
+        return getPortletContainer().getRequiredContainerServices().getPortalContext();
     }
-    
-    /**
-     * Returns the nested HttpServletResponse instance.
-     * @return the nested HttpServletResponse instance.
-     */
-    public HttpServletResponse getHttpServletResponse() {
-        return (HttpServletResponse) super.getResponse();
+
+    protected HttpServletRequest getServletRequest()
+    {
+        return responseContext.getServletRequest();
     }
     
-    
-    // HttpServletResponse Methods ---------------------------------------------
-    
-    public String encodeUrl(String url) {
-        return this.encodeURL(url);
+    protected HttpServletResponse getServletResponse()
+    {
+        return responseContext.getServletResponse();
     }
-    
-    /**
-     * TODO: javadoc about why we are using a wrapped writer here.
-     * @see org.apache.pluto.util.PrintWriterServletOutputStream
-     */
-    public ServletOutputStream getOutputStream()
-    throws IllegalStateException, IOException {
-        if (usingWriter) {
-            throw new IllegalStateException(
-            		"getPortletOutputStream can't be used "
-            		+ "after getWriter was invoked.");
-        }
-        if (wrappedWriter == null) {
-            try {
-                wrappedWriter = getHttpServletResponse().getOutputStream();
-            }
-            catch (IllegalStateException ise) {
-                // handle situation where underlying ServletResponse its getWriter()
-                // has been called already anyway: return a wrapped PrintWriter in that case
-                wrappedWriter = new PrintWriterServletOutputStream(getHttpServletResponse().getWriter(),
-                                                                   getHttpServletResponse().getCharacterEncoding());
+
+    protected boolean isPortletModeAllowed(PortletMode mode)
+    {
+        return isPortletModeAllowedByPortlet(mode) && isPortletModeAllowedByPortal(mode);
+    }
+
+    protected boolean isPortletModeAllowedByPortlet(PortletMode portletMode)
+    {
+        //Not checking for VIEW mode in portetlDefinition, as VIEW mode is default
+        // as per specs.
+        if(PortletMode.VIEW.equals(portletMode))
+            return true;
+        
+        String mode = portletMode.toString();
+        for (Supports sub : getPortletWindow().getPortletEntity().getPortletDefinition().getSupports())
+        {
+            for (String pm : sub.getPortletModes())
+            {
+                if (mode.equalsIgnoreCase(pm))
+                {
+                    return true;
+                }
             }
         }
-        usingStream = true;
-        return wrappedWriter;
+        return false;
     }
-    
-    public PrintWriter getWriter()
-    throws IllegalStateException, IOException {
-        if (usingStream) {
-            throw new IllegalStateException(
-            		"getWriter can't be used "
-            		+ "after getOutputStream was invoked.");
+
+    protected boolean isPortletModeAllowedByPortal(PortletMode mode)
+    {
+        Enumeration<PortletMode> supportedModes = getPortalContext().getSupportedPortletModes();
+        while (supportedModes.hasMoreElements())
+        {
+            if (supportedModes.nextElement().equals(mode))
+            {
+                return true;
+            }
         }
-        usingWriter = true;
-        if (isRequestForwarded()&& !isForwarded() && !isIncluded()){
-			return new DummyPrintWriter(super.getWriter());
-		}
-        return getHttpServletResponse().getWriter();
+        return false;
     }
 
-    public PortletURL createRenderURL() {
-	    return createURL(false,false);
-	}
+    
+    // PortletResponse Impl ----------------------------------------------------
+    
+    public void addProperty(Cookie cookie)
+    {
+        ArgumentUtility.validateNotNull("cookie", cookie);
+        responseContext.addProperty(cookie);
+    }
 
+    public void addProperty(String key, Element element)
+    {
+        ArgumentUtility.validateNotEmpty("key", key);
+        responseContext.addProperty(key, element);
+    }
 
-	public PortletURL createActionURL() {
-	    return createURL(true,false);
-	}
-	
-	public ResourceURL createResourceURL(){
-		return new ResourceURLImpl(getContainer(),
-	                              getPortletWindow(),
-	                              getHttpServletRequest(),
-	                              getHttpServletResponse());
-	}
-	
-	public ResourceURL createResourceURL(boolean markupContainsPortletURLs){
-		throw new UnsupportedOperationException("This method needs to be implemented.");
-	}
-
-	/**
-	 * Creates a portlet URL.
-	 * TODO: make dynamic? as service?
-	 * @param isAction  true for an action URL, false for a render URL.
-	 * @return the created portlet (action/render) URL.
-	 */
-	private PortletURL createURL(boolean isAction, boolean isResourceServing) {
-	    return new PortletURLImpl(getContainer(),
-	                              getPortletWindow(),
-	                              getHttpServletRequest(),
-	                              getHttpServletResponse(),
-	                              isAction);
-	}
-
-
-	public String getNamespace() {
-	     String namespace = mapper.encode(getPortletWindow().getId(), "");
-	     StringBuffer validNamespace = new StringBuffer();
-	     for (int i = 0; i < namespace.length(); i++) {
-	     	char ch = namespace.charAt(i);
-	     	if (Character.isJavaIdentifierPart(ch)) {
-	     		validNamespace.append(ch);
-	     	} else {
-	     		validNamespace.append('_');
-	     	}
-	     }
-	     return validNamespace.toString();
-	}
-	
-    @Override
-	public void addCookie(Cookie arg0) {
-		if (isIncluded()){
-			//no operation
-		}
-		else if (isForwarded()){
-			addProperty(arg0);
-		}
-		else
-			super.addCookie(arg0);
-	}
-	
-    @Override
-	public boolean containsHeader(String arg0) {
-		if (isForwarded() || isIncluded()){
-			return false;
-		}
-		else
-			return super.containsHeader(arg0);
-	}
-	
-	@Override
-	public String encodeRedirectUrl(String arg0) {
-		if (isForwarded() || isIncluded()){
-			return null;
-		}
-		else
-		return super.encodeRedirectUrl(arg0);
-	}
-
-	@Override
-	public String encodeRedirectURL(String arg0) {
-		if (isForwarded() || isIncluded()){
-			return null;
-		}
-		else
-			return super.encodeRedirectURL(arg0);
-	}
-	
-	@Override
-	public void sendError(int arg0) throws IOException {
-		if (isForwarded() || isIncluded()){
-			// no operation
-		}
-		else
-			super.sendError(arg0);
-	}
-	
-	
 
-	@Override
-	public void sendError(int arg0, String arg1) throws IOException {
-		if (isForwarded() || isIncluded()){
-			// no operation
-		}
-		else
-			super.sendError(arg0, arg1);
-	}
-	
-	public Element createElement(String tagName) throws DOMException {
+    public void addProperty(String key, String value)
+    {
+    	ArgumentUtility.validateNotEmpty("key", key);
+    	responseContext.addProperty(key, value);
+    }
+    
+    public Element createElement(String tagName) throws DOMException
+    {
         DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();
         DocumentBuilder docBuilder;
-		try {
-			docBuilder = dbfac.newDocumentBuilder();
-			Document doc = docBuilder.newDocument();
-			return doc.createElement(tagName);
-		} catch (ParserConfigurationException e) {
+        try
+        {
+            docBuilder = dbfac.newDocumentBuilder();
+            Document doc = docBuilder.newDocument();
+            return doc.createElement(tagName);
+        }
+        catch (ParserConfigurationException e)
+        {
             LOG.warn(e);
-		}
-		throw new DOMException((short) 0, "Initialization fail");
-	}
-// InternalRenderResponse Impl ---------------------------------------------
-
-	public void setIncluded(boolean included) {
-        this.included = included;
+            throw new DOMException((short) 0, "Initialization failure");
+        }
     }
-
-    public boolean isIncluded() {
-        return included;
+    
+    public String encodeURL(String path)
+    {
+        if (path.indexOf("://") == -1 && !path.startsWith("/"))
+        {
+            throw new IllegalArgumentException("only absolute URLs or full path URIs are allowed");
+        }
+        
+        ResourceURLProvider provider = getPortletContainer()
+                .getRequiredContainerServices()
+                .getPortalCallbackService()
+                .getResourceURLProvider(getServletRequest(), getPortletWindow());
+        if (path.indexOf("://") != -1) {
+            provider.setAbsoluteURL(path);
+        } else {
+            provider.setFullPath(path);
+        }
+        return getServletResponse().encodeURL(provider.toString());
     }
     
-    public boolean isForwarded() {
-		return forwarded;
-	}
-
-
-	public void setForwarded(boolean forwared) {
-		this.forwarded = forwared;
-		
-	}
-
-	public boolean isForwardedAllowed(){
-		if (usingWriter || usingStream)
-			return false;
-		else
-			return true;
-	}
-
-
-	public boolean isRequestForwarded() {
-		return requestForwarded;
-	}
-
-
-	public void setRequestForwarded() {
-		requestForwarded = true;
-	}
-	
-	
+    public String getNamespace()
+    {
+        if (namespace == null)
+        {
+             namespace = getPortletContainer().getOptionalContainerServices().getNamespaceMapper().encode(getPortletWindow().getId(), "");
+             StringBuffer validNamespace = new StringBuffer();
+             for (int i = 0; i < namespace.length(); i++)
+             {
+                char ch = namespace.charAt(i);
+                if (Character.isJavaIdentifierPart(ch))
+                {
+                    validNamespace.append(ch);
+                } 
+                else
+                {
+                    validNamespace.append('_');
+                }
+             }
+             namespace = validNamespace.toString();
+        }
+        return namespace;
+    }
+    
+    public void setProperty(String key, String value)
+    {
+        ArgumentUtility.validateNotEmpty("key", key);
+        responseContext.setProperty(key, value);
+    }
 }

Modified: portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/internal/impl/PortletSessionImpl.java
URL: http://svn.apache.org/viewvc/portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/internal/impl/PortletSessionImpl.java?rev=750954&r1=750953&r2=750954&view=diff
==============================================================================
--- portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/internal/impl/PortletSessionImpl.java (original)
+++ portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/internal/impl/PortletSessionImpl.java Fri Mar  6 16:11:51 2009
@@ -31,14 +31,13 @@
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.pluto.PortletWindow;
-import org.apache.pluto.internal.InternalPortletSession;
 import org.apache.pluto.util.ArgumentUtility;
 
 /**
  * Implementation of the <code>javax.portlet.PortletSession</code> interface.
  * 
  */
-public class PortletSessionImpl implements InternalPortletSession {
+public class PortletSessionImpl implements PortletSession {
 	
 	/** Logger. */
     private static final Log LOG = LogFactory.getLog(PortletSessionImpl.class);
@@ -104,7 +103,7 @@
     	return httpSession.getAttribute(key);
     }
     
-    public Enumeration getAttributeNames() {
+    public Enumeration<String> getAttributeNames() {
         return getAttributeNames(DEFAULT_SCOPE);
     }
     

Modified: portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/internal/impl/PortletURLImpl.java
URL: http://svn.apache.org/viewvc/portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/internal/impl/PortletURLImpl.java?rev=750954&r1=750953&r2=750954&view=diff
==============================================================================
--- portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/internal/impl/PortletURLImpl.java (original)
+++ portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/internal/impl/PortletURLImpl.java Fri Mar  6 16:11:51 2009
@@ -16,71 +16,403 @@
  */
 package org.apache.pluto.internal.impl;
 
+import java.io.IOException;
+import java.io.Writer;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
+import javax.portlet.PortalContext;
 import javax.portlet.PortletMode;
 import javax.portlet.PortletModeException;
+import javax.portlet.PortletSecurityException;
 import javax.portlet.PortletURL;
+import javax.portlet.ResourceURL;
 import javax.portlet.WindowState;
 import javax.portlet.WindowStateException;
 
-import org.apache.pluto.PortletContainer;
-import org.apache.pluto.PortletWindow;
+import org.apache.pluto.om.portlet.PortletApplicationDefinition;
+import org.apache.pluto.om.portlet.PortletDefinition;
+import org.apache.pluto.om.portlet.Supports;
+import org.apache.pluto.spi.PortletURLListener;
+import org.apache.pluto.spi.PortletURLProvider;
+import org.apache.pluto.spi.optional.PortletResponseContext;
+import org.apache.pluto.util.ArgumentUtility;
 
 /**
  * Refactoring where functionality was pushed into JSR-286 <code>BaseURL</code>.
  *
  * @since 2.0
  */
-public class PortletURLImpl extends BaseURLImpl implements PortletURL {
+public class PortletURLImpl implements PortletURL, ResourceURL {
 
-    public PortletURLImpl(PortletContainer container,
-                          PortletWindow portletWindow,
-                          javax.servlet.http.HttpServletRequest servletRequest,
-                          javax.servlet.http.HttpServletResponse servletResponse,
-                          boolean isAction) {
-    	super(container,portletWindow,servletRequest,
-    			servletResponse,isAction,false);
-    }
-
-    // javax.portlet.PortletURL -------------------------------------------------------------------
-    public void setWindowState(WindowState windowState)
-        throws WindowStateException {
-        if (windowState != null && isWindowStateAllowed(windowState)) {
-            state = windowState;
-            return;
-        }
-
-        throw new WindowStateException(
-            "unsupported Window State used: " + windowState, windowState);
-    }
-
-    public void setPortletMode(PortletMode portletMode)
-        throws PortletModeException {
-        // Test and throw exception if not allowed.
-        isPortletModeAllowed(portletMode);
-        mode = portletMode;
-    }
-    
-    public javax.portlet.PortletMode getPortletMode(){
-    	return super.getPortletMode();
-    }
-    public javax.portlet.WindowState getWindowState(){
-    	return super.getWindowState();
-    }
-
-	public void removePublicRenderParameter(String name) {
-		List<String> publicRenderParameterNames = portletWindow.getPortletEntity().getPortletDefinition().getSupportedPublicRenderParameters();
-	    
-	    if (publicRenderParameterNames != null){
-	    	if (publicRenderParameterNames.contains(name)){
-	    		publicRenderParameters.put(name,new String[] {null});
-		    }
-	    	else{
-	    		throw new IllegalArgumentException(
-	            	"name and value must not be null");
-	    	}
-	    }
-	}
+    private PortletResponseContext responseContext;
+    private PortalContext portalContext;
+    private PortletURLProvider urlProvider;
+    private String cacheLevel;
+    private boolean filtering;
+    
+    public PortletURLImpl(PortletResponseContext responseContext, boolean actionURL, boolean resourceURL)
+    {
+        this.responseContext = responseContext;
+        this.portalContext = responseContext.getContainer().getRequiredContainerServices().getPortalContext();
+        // TODO: actionURL/resourceURL parameters
+        urlProvider = responseContext.getContainer().getRequiredContainerServices().getPortalCallbackService().getPortletURLProvider(responseContext.getServletRequest(), responseContext.getPortletWindow());
+    }
+    
+    public PortletURLImpl(PortletResponseContext responseContext, boolean actionURL, boolean resourceURL, String cacheLevel)
+    {
+        this(responseContext, actionURL, resourceURL);
+        this.cacheLevel = cacheLevel == null ? ResourceURL.PAGE : cacheLevel;
+    }
+
+    private boolean isPortletModeAllowed(PortletMode mode)
+    {
+        return isPortletModeAllowedByPortlet(mode) && isPortletModeAllowedByPortal(mode);
+    }
+
+    private boolean isPortletModeAllowedByPortlet(PortletMode mode) 
+    {
+        if(PortletMode.VIEW.equals(mode))
+        {
+            return true;
+        }
+
+        PortletDefinition dd = responseContext.getPortletWindow().getPortletEntity().getPortletDefinition();
+
+        for (Supports sup : dd.getSupports())
+        {
+            for (String m : sup.getPortletModes())
+            {
+                if (m.equalsIgnoreCase(mode.toString())) 
+                {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    private boolean isPortletModeAllowedByPortal(PortletMode mode) 
+    {
+        Enumeration<PortletMode> supportedModes = portalContext.getSupportedPortletModes();
+        while (supportedModes.hasMoreElements()) 
+        {
+            if (supportedModes.nextElement().toString().equalsIgnoreCase(
+                    (mode.toString()))) 
+            {
+                return true;
+            }
+        }
+        return false;
+    }    
+    
+    private boolean isWindowStateAllowed(WindowState state)
+    {
+        Enumeration<WindowState> supportedStates = portalContext.getSupportedWindowStates();
+        while (supportedStates.hasMoreElements()) {
+            if (supportedStates.nextElement().equals(state))
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+        
+    private static String[] cloneParameterValues(String[] values)
+    {
+        int count = 0;
+        for (String s : values)
+        {
+            if (!(s == null || s.length() == 0))
+            {
+                count++;
+            }
+        }
+        if (count == 0)
+        {
+            return null;
+        }
+        else if (count < values.length)
+        {
+            String[] copy = new String[count];
+            count = 0;
+            for (String s : values)
+            {
+                if (!(s == null || s.length() == 0))
+                {
+                    copy[count++] = s;
+                }
+            }
+            return copy;
+        }
+        else
+        {
+            return values.clone();
+        }
+    }
+    
+    private void filterURL()
+    {
+        if (filtering)
+        {
+            throw new IllegalStateException("Calling PortletURL toString or write methods from a PortletURLGenerationListener not allowed");
+        }
+        filtering = true;
+        try
+        {
+            PortletURLListener portletURLFilterListener = responseContext.getContainer()
+            .getRequiredContainerServices()
+            .getPortalCallbackService().getPortletURLListener();
+            PortletApplicationDefinition portletApp = responseContext.getPortletWindow().getPortletEntity().getPortletDefinition().getApplication();
+            portletURLFilterListener.callListener(portletApp, this, urlProvider.isActionURL(), urlProvider.isResourceURL());
+
+        }
+        finally
+        {
+            filtering = false;
+        }
+    }
+
+    
+    // BaseURL impl ------------------------------------------------------------
+    
+    public void addProperty(String key, String value)
+    {
+        ArgumentUtility.validateNotEmpty("key", key);
+        if (value != null)
+        {
+            Map<String, List<String>> properties = urlProvider.getProperties();
+            List<String> values = properties.get(key);
+            if (values == null)
+            {
+                values = new ArrayList<String>();
+                urlProvider.getProperties().put(key, values);
+            }
+            values.add(value);
+        }
+    }
+
+    public Map<String, String[]> getParameterMap()
+    {
+        Map<String, String[]> parameters = urlProvider.getRenderParameters();
+        if (parameters.isEmpty())
+        {
+            parameters = Collections.emptyMap();
+        }
+        else
+        {
+            parameters = new HashMap<String,String[]>(parameters);
+            for (Map.Entry<String,String[]> entry : parameters.entrySet())
+            {
+                entry.setValue(entry.getValue().clone());
+            }
+        }
+        return parameters;
+    }
+
+    public void setParameter(String name, String value)
+    {
+        ArgumentUtility.validateNotEmpty("name", name);
+        Map<String, String[]> parameters = urlProvider.getRenderParameters();
+        if (value == null )            
+        {
+            parameters.remove(name);
+        }
+        else
+        {
+            parameters.put(name, new String[]{value});
+            urlProvider.getRemovedPublicRenderParameters().remove(name);
+        }
+    }
+
+    public void setParameter(String name, String[] values)
+    {
+        ArgumentUtility.validateNotEmpty("name", name);
+        Map<String, String[]> parameters = urlProvider.getRenderParameters();
+        values = cloneParameterValues(values);
+        if (values == null )            
+        {
+            parameters.remove(name);
+        }
+        else
+        {
+            parameters.put(name, values);
+            urlProvider.getRemovedPublicRenderParameters().remove(name);
+        }
+    }
+
+    public void setParameters(Map<String, String[]> parameters)
+    {
+        ArgumentUtility.validateNotNull("parameters", parameters);
+        
+        // validate map first
+        for (Map.Entry<? extends Object, ? extends Object> entry : parameters.entrySet())
+        {
+            if (entry.getKey() == null || entry.getValue() == null)
+            {
+                throw new IllegalArgumentException("RenderParameters contains a null key or value entry");
+            }
+            if (!(entry.getKey() instanceof String))
+            {
+                throw new IllegalArgumentException("RenderParameters contains a key which is not of type String");
+            }
+            if (!(entry.getValue() instanceof String[]))
+            {
+                throw new IllegalArgumentException("RenderParameters contains a value which is not of type String[]");
+            }
+        }
+        Map<String, String[]> map = urlProvider.getRenderParameters();
+        map.clear();
+        for (Map.Entry<String,String[]> entry : parameters.entrySet())
+        {
+            String[] values = cloneParameterValues(entry.getValue());
+            if (values != null)
+            {
+                map.put(entry.getKey(), values);
+                urlProvider.getRemovedPublicRenderParameters().remove(entry.getKey());
+            }
+        }
+    }
+
+    public void setProperty(String key, String value)
+    {
+        ArgumentUtility.validateNotEmpty("key", key);
+        Map<String, List<String>> properties = urlProvider.getProperties();
+        if (value == null)
+        {
+            properties.remove(key);
+        }
+        else
+        {
+            List<String> values = properties.get(key);
+            if (values == null)
+            {
+                values = new ArrayList<String>();
+                properties.put(key,values);
+            }
+            else
+            {
+                values.clear();
+            }
+            values.add(value);
+        }
+    }
+
+    public void setSecure(boolean secure) throws PortletSecurityException
+    {
+        urlProvider.setSecure(secure);
+    }
+
+    public void write(Writer out, boolean escapeXML) throws IOException
+    {
+        filterURL();
+        urlProvider.write(out, escapeXML);
+    }
+
+    public void write(Writer out) throws IOException
+    {
+        filterURL();
+        urlProvider.write(out);
+    }
+    
+    public String toString()
+    {
+        filterURL();
+        return urlProvider.toString();
+    }
+
+    // PortletURL impl ------------------------------------------------------------    
+    
+    public PortletMode getPortletMode() 
+    {
+        return urlProvider.getPortletMode();
+    }
+    
+    public WindowState getWindowState() 
+    {
+        return urlProvider.getWindowState();
+    }
+    
+    public void setPortletMode(PortletMode portletMode) throws PortletModeException 
+    {
+        ArgumentUtility.validateNotNull("portletMode", portletMode);
+        if (isPortletModeAllowed(portletMode))
+        {
+            urlProvider.setPortletMode(portletMode);
+        }
+        else 
+        {
+            throw new PortletModeException("Can't set this PortletMode", portletMode);
+        }
+    }
+
+    public void setWindowState(WindowState windowState) throws WindowStateException
+    {
+        ArgumentUtility.validateNotNull("windowState", windowState);
+        if (isWindowStateAllowed(windowState))
+        {
+            urlProvider.setWindowState(windowState);
+        }
+        else 
+        {
+            throw new WindowStateException("Can't set this WindowState", windowState);
+        }
+    }
+
+    public void removePublicRenderParameter(String name)
+    {
+        ArgumentUtility.validateNotEmpty("name", name);
+        urlProvider.getRemovedPublicRenderParameters().add(name);
+        urlProvider.getRenderParameters().remove(name);
+    }
+
+    // ResourceURL impl ------------------------------------------------------------    
+    
+    public String getCacheability()
+    {
+        String cacheability = urlProvider.getCacheability();
+        return cacheability == null ? this.cacheLevel : cacheability;
+    }
+
+    public void setCacheability(String cacheLevel)
+    {
+        ArgumentUtility.validateNotEmpty("cachelevel", cacheLevel);
+        if (FULL.equals(cacheLevel))
+        {
+            // always OK
+        }
+        else if (PORTLET.equals(cacheLevel))
+        {
+            if (FULL.equals(cacheLevel))
+            {
+                throw new IllegalStateException("Current Cachelevel is FULL: URLs with cacheability PORTLET not allowed");
+            }
+            
+        }
+        else if (PAGE.equals(cacheLevel))
+        {
+            if (FULL.equals(cacheLevel))
+            {
+                throw new IllegalStateException("Current Cachelevel is FULL: URLs with cacheability PORTLET not allowed");
+            }
+            else if (PORTLET.equals(cacheLevel))
+            {
+                throw new IllegalStateException("Current Cachelevel is PORTLET: URLs with cacheability PAGE not allowed");
+            }
+        }
+        else
+        {
+            throw new IllegalArgumentException("Unknown cacheLevel: "+cacheLevel);
+        }
+        urlProvider.setCacheability(cacheLevel);
+    }
 
+    public void setResourceID(String resourceID)
+    {
+        urlProvider.setResourceID(resourceID);
+    }        
 }

Modified: portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/internal/impl/RenderRequestImpl.java
URL: http://svn.apache.org/viewvc/portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/internal/impl/RenderRequestImpl.java?rev=750954&r1=750953&r2=750954&view=diff
==============================================================================
--- portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/internal/impl/RenderRequestImpl.java (original)
+++ portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/internal/impl/RenderRequestImpl.java Fri Mar  6 16:11:51 2009
@@ -16,120 +16,34 @@
  */
 package org.apache.pluto.internal.impl;
 
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-
+import javax.portlet.CacheControl;
+import javax.portlet.PortletRequest;
 import javax.portlet.RenderRequest;
-import javax.servlet.ServletInputStream;
-import javax.servlet.http.HttpServletRequest;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.pluto.Constants;
-import org.apache.pluto.PortletContainer;
-import org.apache.pluto.PortletWindow;
-import org.apache.pluto.internal.InternalPortletRequest;
-import org.apache.pluto.internal.InternalRenderRequest;
+import org.apache.pluto.spi.optional.PortletRequestContext;
 
 /**
  * Implementation of the <code>javax.portlet.RenderRequest</code> interface.
  * 
  */
-public class RenderRequestImpl extends PortletRequestImpl
-                implements RenderRequest, InternalRenderRequest 
+public class RenderRequestImpl extends PortletRequestImpl implements RenderRequest 
 {
-    private static final Log LOG = LogFactory.getLog(RenderRequestImpl.class);
-       
-    public RenderRequestImpl(InternalPortletRequest request) 
-    {
-        super(request);    
-    }
-
-    public RenderRequestImpl(PortletContainer container,
-                             PortletWindow portletWindow,
-                             HttpServletRequest servletRequest) 
-    {
-        super(container, portletWindow, servletRequest);
-        if (LOG.isDebugEnabled()) 
-        {
-        	LOG.debug("Created render request for: " + portletWindow);
-        }
-    }
-
-    protected Integer getRequestMethod()
-    {
-        return Constants.METHOD_RENDER; 
-    }
+    private CacheControl cacheControl;
     
-    public String getMethod() 
+    public RenderRequestImpl(PortletRequestContext requestContext, CacheControl cacheControl) 
     {
-        return "GET";
+        super(requestContext, PortletRequest.RENDER_PHASE);
+        this.cacheControl = cacheControl;
     }
-    
-    // Included HttpServletRequest (Limited) Impl ------------------------------
-    
-    public String getCharacterEncoding() 
-    {
-        return (super.isIncluded() || super.isForwarded()) ? null : super.getCharacterEncoding();
-    }
-    
-    public void setCharacterEncoding(String encoding)
-    throws UnsupportedEncodingException 
-    {
-        if (!super.isIncluded() && !super.isForwarded()) 
-        {
-        	super.setCharacterEncoding(encoding);
-        }
-    }        
 
-	public String getETag() 
-	{
-		// TODO Return ETag
-		return null;
-	}
-	
-	public String getLifecyclePhase() 
-	{
-		return RENDER_PHASE;
-	}
-	
-	/* TODO: DST: not sure of the requirements for these */
-    /**
-     * Checks the included flag and returns the content type. If the included
-     * flag is set to true, this method returns null.
-     */
-    public String getContentType() 
-    {
-        return (super.isIncluded() || super.isForwarded()) ? null : super.getContentType();
-    }
-    
-    /**
-     * Checks the included flag and returns the content length. If the included
-     * flag is set to true, this method returns 0.
-     */
-    public int getContentLength() 
+    @Override
+    public String getProperty(String name)
     {
-        return (super.isIncluded() || super.isForwarded()) ? 0 : super.getContentLength();
-    }
-	
-    /**
-     * Checks the included flag and returns the reader to this rende response.
-     * If the included flag is set to true, this method returns null.
-     */
-    public BufferedReader getReader()
-    throws UnsupportedEncodingException, IOException 
-    {
-        return (super.isIncluded() || super.isForwarded()) ? null : super.getReader();
+        return getMimeRequestProperty(name, cacheControl);
     }
 
-    /**
-     * Checks the included flag and returns the input stream to this render
-     * response. If the included flag is set to true, this method returns null.
-     */
-    public ServletInputStream getInputStream() throws IOException 
+    public String getETag()
     {
-        return (super.isIncluded() || super.isForwarded()) ? null : super.getInputStream();
+        return cacheControl.getETag();
     }
-    
 }

Modified: portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/internal/impl/RenderResponseImpl.java
URL: http://svn.apache.org/viewvc/portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/internal/impl/RenderResponseImpl.java?rev=750954&r1=750953&r2=750954&view=diff
==============================================================================
--- portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/internal/impl/RenderResponseImpl.java (original)
+++ portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/internal/impl/RenderResponseImpl.java Fri Mar  6 16:11:51 2009
@@ -16,22 +16,13 @@
  */
 package org.apache.pluto.internal.impl;
 
+import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Locale;
 
 import javax.portlet.PortletMode;
-import javax.portlet.PortletModeException;
 import javax.portlet.RenderResponse;
-import javax.portlet.StateAwareResponse;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.pluto.PortletContainer;
-import org.apache.pluto.PortletWindow;
-import org.apache.pluto.internal.InternalRenderResponse;
-import org.apache.pluto.spi.PortalCallbackService;
+import org.apache.pluto.spi.optional.PortletRenderResponseContext;
 import org.apache.pluto.util.ArgumentUtility;
 import org.apache.pluto.util.StringUtils;
 
@@ -40,104 +31,91 @@
  * Implementation of the <code>javax.portlet.RenderResponse</code> interface.
  * 
  */
-public class RenderResponseImpl extends MimeResponseImpl
-implements RenderResponse, InternalRenderResponse {
-	
-	/** Logger. */
-    private static final Log LOG = LogFactory.getLog(RenderResponseImpl.class);
-	private String contenType;
+public class RenderResponseImpl extends MimeResponseImpl implements RenderResponse
+{	
+    private PortletRenderResponseContext responseContext;
     
-    public RenderResponseImpl(PortletContainer container,
-                              PortletWindow portletWindow,
-                              HttpServletRequest servletRequest,
-                              HttpServletResponse servletResponse) {
-        super(container, portletWindow, servletRequest, servletResponse);
+    public RenderResponseImpl(PortletRenderResponseContext responseContext)
+    {
+        super(responseContext);
+        this.responseContext = responseContext;
     }
-
-    public void setTitle(String title) {
-        PortalCallbackService callback = getContainer()
-        		.getRequiredContainerServices()
-        		.getPortalCallbackService();
-        callback.setTitle(this.getHttpServletRequest(),
-                          getPortletWindow(),
-                          title);
+    
+    /**
+     * Checks if the specified content type is valid (supported by the portlet).
+     * The specified content type should be a tripped mime type without any
+     * character encoding suffix.
+     * @param contentType  the content type to check.
+     * @return true if the content type is valid, false otherwise.
+     */
+    protected boolean isValidContentType(String contentType)
+    {
+        boolean valid = false;
+        for (String supportedType : getResponseContentTypes())
+        {
+            // Content type is supported by an exact match.
+            if (supportedType.equals(contentType))
+            {
+                valid = true;
+            }
+            // The supported type contains a wildcard.
+            else if (supportedType.indexOf("*") >= 0)
+            {
+                int index = supportedType.indexOf("/");
+                String supportedPrefix = supportedType.substring(0, index);
+                String supportedSuffix = supportedType.substring(index + 1);
+                index = contentType.indexOf("/");
+                String typePrefix = contentType.substring(0, index);
+                String typeSuffix = contentType.substring(index + 1);
+                // Check if the prefixes match AND the suffixes match.
+                if (supportedPrefix.equals("*") || supportedPrefix.equals(typePrefix))
+                {
+                    if (supportedSuffix.equals("*") || supportedSuffix.equals(typeSuffix))
+                    {
+                        valid = true;
+                    }
+                }
+            }
+        }
+        // Return the check result.
+        return valid;
     }
-
-	public void setNextPossiblePortletModes(Collection<PortletMode> portletModes) {
-		PortletMode tmpPortletMode = super.getPortletWindow().getPortletMode();
-		PortletMode portletMode = PortletMode.VIEW;
-		boolean next = false;
-		boolean first = true;
-		for (PortletMode mode : portletModes) {
-			if (first)
-				portletMode = mode;
-			if (next){
-				portletMode = mode;
-				next = false;
-			}
-			if (mode.equals(tmpPortletMode)){
-				next = true;
-			}
-		}
-		try {
-			((StateAwareResponse)(super.getResponse())).setPortletMode(portletMode) ;
-		} catch (PortletModeException e) {
-            LOG.warn(e);
-		}
-	}
-	
-	@Override
-	public void setCharacterEncoding(String arg0) {
-		if (super.isIncluded() || super.isForwarded()){
-			//no operation
-		}
-		else
-			super.setCharacterEncoding(arg0);
-	}
-
-	@Override
-	public void setContentLength(int arg0) {
-		if (super.isIncluded() || super.isForwarded()){
-			//no operation
-		}
-		else
-			super.setContentLength(arg0);
-	}
-
-	@Override
-	public void setLocale(Locale arg0) {
-		if (super.isIncluded() || super.isForwarded()){
-			//no operation
-		}
-		else
-			super.setLocale(arg0);
-	}
-	
-	@Override
-	public int getBufferSize() {
-			return 0;
-	}
-	
-	@Override
-    public void setContentType(String contentType){
-    	
-    	if (super.isIncluded()){
-    		//no operation
-    	}
-    	else{
-    		ArgumentUtility.validateNotNull("contentType", contentType);
-            String mimeType = StringUtils.getMimeTypeWithoutEncoding(contentType);
-            if (!isValidContentType(mimeType)) {
-                throw new IllegalArgumentException("Specified content type '"
-                		+ mimeType + "' is not supported.");
+    
+    public void setContentType(String contentType)
+    {
+        ArgumentUtility.validateNotNull("contentType", contentType);
+        String mimeType = StringUtils.getMimeTypeWithoutEncoding(contentType);
+        if (!isValidContentType(mimeType))
+        {
+            throw new IllegalArgumentException("Specified content type '" + mimeType + "' is not supported.");
+        }
+        responseContext.setContentType(mimeType);
+    }
+    
+    public void setNextPossiblePortletModes(Collection<PortletMode> portletModes)
+    {
+        ArgumentUtility.validateNotNull("portletModes", portletModes);
+        if (portletModes.isEmpty())
+        {
+            throw new IllegalArgumentException("At least one possible PortletMode should be specified.");            
+        }
+        ArrayList<PortletMode> modes = new ArrayList<PortletMode>();
+        for (PortletMode mode : portletModes)
+        {
+            if (isPortletModeAllowed(mode))
+            {
+                modes.add(mode);
             }
-            getHttpServletResponse().setContentType(mimeType);
-            this.contenType = contentType;
-    	}
+        }
+        if (modes.isEmpty())
+        {
+            modes.add(getPortletWindow().getPortletMode());
+        }
+        responseContext.setNextPossiblePortletModes(modes);
     }
-	
-	@Override
-	public String getContentType() {
-		return contenType;
+    
+    public void setTitle(String title)
+    {
+        responseContext.setTitle(title);
     }
 }

Added: portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/internal/impl/RequestDispatcherPathInfoImpl.java
URL: http://svn.apache.org/viewvc/portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/internal/impl/RequestDispatcherPathInfoImpl.java?rev=750954&view=auto
==============================================================================
--- portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/internal/impl/RequestDispatcherPathInfoImpl.java (added)
+++ portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/internal/impl/RequestDispatcherPathInfoImpl.java Fri Mar  6 16:11:51 2009
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.pluto.internal.impl;
+
+import org.apache.pluto.internal.RequestDispatcherPathInfo;
+
+/**
+ * @author <a href="mailto:ate@douma.nu">Ate Douma</a>
+ * @version $Id$
+ */
+public class RequestDispatcherPathInfoImpl implements RequestDispatcherPathInfo
+{
+    private final boolean named;
+    private final String requestURI;
+    private final String servletPath;
+    private final String pathInfo;
+    private final String queryString;
+    
+    public RequestDispatcherPathInfoImpl()
+    {
+        named = true;
+        this.requestURI = null;
+        this.servletPath = null;
+        this.pathInfo = null;
+        this.queryString = null;
+    }
+    
+    public RequestDispatcherPathInfoImpl(String contextPath, String servletPath, String pathInfo, String queryString)
+    {
+        this.named = false;
+        this.requestURI = contextPath + (servletPath != null ? servletPath : "") + (pathInfo != null ? pathInfo : "");
+        this.servletPath = servletPath;
+        this.pathInfo = pathInfo;
+        this.queryString = queryString;
+    }
+    
+    public boolean isNamedRequestDispatcher()
+    {
+        return named;
+    }
+
+    public String getRequestURI()
+    {
+        return requestURI;
+    }
+
+    public String getServletPath()
+    {
+        return servletPath;
+    }
+
+    public String getPathInfo()
+    {
+        return pathInfo;
+    }
+
+    public String getQueryString()
+    {
+        return queryString;
+    }
+}

Propchange: portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/internal/impl/RequestDispatcherPathInfoImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/internal/impl/RequestDispatcherPathInfoImpl.java
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/internal/impl/RequestDispatcherPathInfoImpl.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/internal/impl/ResourceRequestImpl.java
URL: http://svn.apache.org/viewvc/portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/internal/impl/ResourceRequestImpl.java?rev=750954&r1=750953&r2=750954&view=diff
==============================================================================
--- portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/internal/impl/ResourceRequestImpl.java (original)
+++ portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/internal/impl/ResourceRequestImpl.java Fri Mar  6 16:11:51 2009
@@ -16,121 +16,61 @@
  */
 package org.apache.pluto.internal.impl;
 
-import java.io.IOException;
+import java.util.Enumeration;
 import java.util.Map;
 
+import javax.portlet.CacheControl;
+import javax.portlet.PortletRequest;
 import javax.portlet.ResourceRequest;
-import javax.servlet.ServletInputStream;
-import javax.servlet.http.HttpServletRequest;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.pluto.Constants;
-import org.apache.pluto.PortletContainer;
-import org.apache.pluto.PortletWindow;
-import org.apache.pluto.internal.InternalResourceRequest;
+import org.apache.pluto.spi.optional.PortletResourceRequestContext;
 
-public class ResourceRequestImpl extends ClientDataRequestImpl
-implements ResourceRequest, InternalResourceRequest {
-
-	/** Logger. */
-    private static final Log LOG = LogFactory.getLog(ResourceRequestImpl.class);
-
-
-    // Constructor -------------------------------------------------------------
-
-    public ResourceRequestImpl(PortletContainer container,
-                             PortletWindow portletWindow,
-                             HttpServletRequest servletRequest) {
-        super(container, portletWindow, servletRequest);
-        if (LOG.isDebugEnabled()) {
-        	LOG.debug("Created action request for: " + portletWindow);
-        }
+public class ResourceRequestImpl extends ClientDataRequestImpl implements ResourceRequest
+{
+    private PortletResourceRequestContext requestContext;
+    private CacheControl cacheControl;
+    
+    public ResourceRequestImpl(PortletResourceRequestContext requestContext, CacheControl cacheControl)
+    {
+        super(requestContext, PortletRequest.RESOURCE_PHASE);
+        this.requestContext = requestContext;
+        this.cacheControl = cacheControl;
     }
 
-    // ResourceRequest impl ------------------------------------------------------
-
-    protected Integer getRequestMethod()
+    @Override
+    public String getProperty(String name)
     {
-        return Constants.METHOD_RESOURCE;
+        return getMimeRequestProperty(name, cacheControl);
     }
 
-    public String getResponseContentType(){
-    	return super.getResponseContentType();
+    public String getCacheability()
+    {
+        return requestContext.getCacheability();
     }
 
-    @SuppressWarnings("unchecked")
-	public java.util.Enumeration getResponseContentTypes(){
-    	return super.getResponseContentTypes();
+    public String getETag()
+    {
+        return cacheControl.getETag();
     }
 
-    public String[] getParameterValues(String name) {
-    	String values1[] = super.getParameterValues(name);
-    	String values2[] = urlProvider.getPrivateRenderParameters(name);
-    	String values[] = null;
-    	int length1 = 0;
-    	int length2 = 0;
-    	if (values1 != null)
-    		length1 = values1.length;
-    	if (values2 != null){
-    		length2 += values2.length;
-    		values = new String[length1+length2];
-    		System.arraycopy(values2, 0, values, length1, length2);
-    	}
-    	else if (length1>0){
-    		values = new String[length1];
-    	}
-
-    	if (length1>0){
-    		System.arraycopy(values1, 0, values, 0, length1);
-    	}
-    	if ((length1+length2) == 0){
-    		values = null;
-    	}
-        if (values != null) {
-            values = values.clone();
-        }
-        return values;
-    }
-
-    public String getParameter(String name) {
-    	String value = super.getParameter(name);
-    	if (value == null){
-        	String[] values1 = urlProvider.getPrivateRenderParameters(name);
-        	if (values1!= null){
-        		if (values1.length>0){
-        			value = values1[0];
-        		}
-        	}
-    	}
-		return value;
-    }
-
-    // PortletRequestImpl impl -------------------------------------------------
-
-	public String getETag() {
-		// TODO: get ETag
-		return null;
-	}
+    public Map<String, String[]> getPrivateRenderParameterMap()
+    {
+        return cloneParameterMap(requestContext.getPrivateRenderParameterMap());
+    }
 
-	public String getLifecyclePhase()
+    public String getResourceID()
 	{
-		return RESOURCE_PHASE;
-	}
-
-	public String getResourceID() {
-		return getParameter("resourceID");
+		return requestContext.getResourceID();
 	}
 
-	public ServletInputStream getInputStream() throws IOException {
-        return (super.isIncluded() || super.isForwarded()) ? (ServletInputStream)getPortletInputStream() : super.getInputStream();
+    public String getResponseContentType()
+    {
+        return getServletRequest().getHeader("accept");
     }
 
-	public Map<String, String[]> getPrivateRenderParameterMap() {
-		return super.getPrivateParameterMap();
-	}
-
-	public String getCacheability() {
-		return null;
-	}
+    @SuppressWarnings("unchecked")
+    public Enumeration<String> getResponseContentTypes()
+    {
+        return getServletRequest().getHeaders("accept");
+    }
 }

Modified: portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/internal/impl/ResourceResponseImpl.java
URL: http://svn.apache.org/viewvc/portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/internal/impl/ResourceResponseImpl.java?rev=750954&r1=750953&r2=750954&view=diff
==============================================================================
--- portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/internal/impl/ResourceResponseImpl.java (original)
+++ portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/internal/impl/ResourceResponseImpl.java Fri Mar  6 16:11:51 2009
@@ -18,96 +18,52 @@
 
 import java.util.Locale;
 
+import javax.portlet.PortletURL;
 import javax.portlet.ResourceResponse;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import javax.portlet.ResourceURL;
 
-import org.apache.pluto.PortletContainer;
-import org.apache.pluto.PortletWindow;
-import org.apache.pluto.internal.InternalResourceResponse;
-import org.apache.pluto.util.ArgumentUtility;
-import org.apache.pluto.util.StringUtils;
+import org.apache.pluto.spi.optional.PortletResourceResponseContext;
 
-public class ResourceResponseImpl extends MimeResponseImpl
-implements ResourceResponse, InternalResourceResponse {
-	
-
-    public ResourceResponseImpl(PortletContainer container,
-                              PortletWindow portletWindow,
-                              HttpServletRequest servletRequest,
-                              HttpServletResponse servletResponse) {
-        super(container, portletWindow, servletRequest,
-              servletResponse);
+public class ResourceResponseImpl extends MimeResponseImpl implements ResourceResponse
+{
+    private String requestCacheLevel;
+    private PortletResourceResponseContext responseContext;
+    
+    public ResourceResponseImpl(PortletResourceResponseContext responseContext, String requestCachelevel)
+    {
+        super(responseContext);
+        this.responseContext = responseContext;
+        this.requestCacheLevel = requestCachelevel;
     }
 	
-	@Override
-	public void setCharacterEncoding(String arg0) {
-		if (super.isIncluded()){
-			//no operation
-		}
-		else
-			super.setCharacterEncoding(arg0);
-	}
-
-	@Override
-	public void setContentLength(int arg0) {
-		if (super.isIncluded()){
-			//no operation
-		}
-		else
-			super.setContentLength(arg0);
-	}
-
-	@Override
-	public void setLocale(Locale arg0) {
-		if (super.isIncluded()){
-			//no operation
-		}
-		else
-			super.setLocale(arg0);
-	}
-	
-	@Override
-	public int getBufferSize() {
-		return 0;
-	}
-	
-	@Override
-    public void setContentType(String contentType)
-    		throws IllegalArgumentException {
-    	
-    	if (super.isIncluded()){
-    		//no operation
-    	}
-    	else{
-    		ArgumentUtility.validateNotNull("contentType", contentType);
-            String mimeType = StringUtils.getMimeTypeWithoutEncoding(contentType);
-          /*
-            if (!isValidContentType(mimeType)) {
-                throw new IllegalArgumentException("Specified content type '"
-                		+ mimeType + "' is not supported.");
-            }
-          */
-            getHttpServletResponse().setContentType(mimeType);
-    	}
+    public PortletURL createActionURL()
+    {
+        return new PortletURLImpl(responseContext, true, false, requestCacheLevel);
     }
-	
-	@Override
-	public String getContentType() {
-        return getHttpServletResponse().getContentType();
+    
+    public PortletURL createRenderURL()
+    {
+        return new PortletURLImpl(responseContext, false, false, requestCacheLevel);
     }
 
-	public String getCacheability() {
-		return null;
-	}	
-	
-	public javax.portlet.PortletURL createRenderURL() throws java.lang.IllegalStateException{
-		return super.createRenderURL();
+
+    public ResourceURL createResourceURL()
+    {
+        return new PortletURLImpl(responseContext, false, true, requestCacheLevel);
+    }
+    
+	public void setCharacterEncoding(String charset)
+	{
+	    responseContext.setCharacterEncoding(charset);
 	}
-	public javax.portlet.PortletURL createActionURL() throws java.lang.IllegalStateException{
-		return super.createActionURL();
+
+	public void setContentLength(int len)
+	{
+	    responseContext.setContentLength(len);
 	}
-	public javax.portlet.ResourceURL createResourceURL() throws java.lang.IllegalStateException{
-		return super.createResourceURL();
+
+	public void setLocale(Locale locale)
+	{
+	    responseContext.setLocale(locale);
 	}
 }

Modified: portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/internal/impl/StateAwareResponseImpl.java
URL: http://svn.apache.org/viewvc/portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/internal/impl/StateAwareResponseImpl.java?rev=750954&r1=750953&r2=750954&view=diff
==============================================================================
--- portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/internal/impl/StateAwareResponseImpl.java (original)
+++ portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/internal/impl/StateAwareResponseImpl.java Fri Mar  6 16:11:51 2009
@@ -16,582 +16,223 @@
  */
 package org.apache.pluto.internal.impl;
 
-import java.io.IOException;
-import java.io.PrintWriter;
 import java.io.Serializable;
 import java.util.Enumeration;
 import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
 import java.util.Map;
 
-import javax.portlet.EventRequest;
-import javax.portlet.PortalContext;
+import javax.portlet.Event;
 import javax.portlet.PortletMode;
 import javax.portlet.PortletModeException;
 import javax.portlet.StateAwareResponse;
 import javax.portlet.WindowState;
 import javax.portlet.WindowStateException;
-import javax.servlet.ServletOutputStream;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpServletResponseWrapper;
 import javax.xml.namespace.QName;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.pluto.PortletContainer;
 import org.apache.pluto.PortletWindow;
-import org.apache.pluto.om.portlet.PortletDefinition;
-import org.apache.pluto.om.portlet.Supports;
-import org.apache.pluto.spi.EventProvider;
 import org.apache.pluto.spi.PortalCallbackService;
-import org.apache.pluto.spi.ResourceURLProvider;
-import org.apache.pluto.util.DummyPrintWriter;
-import org.apache.pluto.util.DummyServletOutputStream;
+import org.apache.pluto.spi.optional.PortletStateAwareResponseContext;
+import org.apache.pluto.util.ArgumentUtility;
 
 /**
  * Implementation of JSR-286 <code>StateAwareResponse</code>.
  *
  * @since 2.0
  */
-public class StateAwareResponseImpl extends PortletResponseImpl implements
-		StateAwareResponse {
-
-	/** Logger. */
-    private static final Log LOG = LogFactory.getLog(StateAwareResponseImpl.class);
-
-	boolean redirectAllowed = true;
-	protected boolean redirected;
-	private String redirectLocation;
-
-
-	private Map<String, String[]> publicRenderParameter = new HashMap<String, String[]>();
-
-    private Map<String, String[]> renderParameters = new HashMap<String, String[]>();
-    private WindowState windowState = null;
-    private PortletMode portletMode = null;
-	protected PortalCallbackService callback;
-    private PortalContext context;
-    private EventRequest eventRequest;
-
-	public StateAwareResponseImpl(PortletContainer container,
-			            PortletWindow portletWindow,
-			            HttpServletRequest servletRequest,
-			            HttpServletResponse servletResponse) {
-		super(container, portletWindow, servletRequest,
-		servletResponse);
-		context = container.getRequiredContainerServices().getPortalContext();
-		callback = container.getRequiredContainerServices().getPortalCallbackService();
-	}
-
-	/* (non-Javadoc)
-	 * @see javax.portlet.StateAwareResponse#setEvent(javax.xml.namespace.QName, java.lang.Object)
-	 */
-	public void setEvent(QName qname, Serializable value){
-		if (qname == null) {
-			throw new IllegalArgumentException();
-		}
-
-		EventProvider provider = callback.getEventProvider(
-				getHttpServletRequest(),getPortletWindow());
-
-		provider.registerToFireEvent(qname, value);
-		redirectAllowed = false;
-	}
-
-	/* (non-Javadoc)
-	 * @see javax.portlet.StateAwareResponse#setEvent(java.lang.String, java.lang.Object)
-	 */
-	public void setEvent(String name, Serializable value) {
-	    PortletWindow window = getPortletWindow();
-        String defaultNamespace;
-        defaultNamespace = window.getPortletEntity().getPortletDefinition().getApplication().getDefaultNamespace();
-        QName qname = new QName(defaultNamespace, name);
-        setEvent(qname, value);
-        redirectAllowed = false;
-	}
-
-	/* (non-Javadoc)
-	 * @see javax.servlet.http.HttpServletResponseWrapper#sendRedirect(java.lang.String)
-	 */
-	public void sendRedirect(String location) throws java.io.IOException {
-        if (redirectAllowed) {
-            if (location != null) {
-                HttpServletResponse redirectResponse = getHttpServletResponse();
-                while (redirectResponse instanceof HttpServletResponseWrapper) {
-                    redirectResponse = (HttpServletResponse)
-                        ((HttpServletResponseWrapper)redirectResponse).getResponse();
-                }
-
-                ResourceURLProvider provider = callback.getResourceURLProvider(
-                                getHttpServletRequest(),
-                                getPortletWindow()
-                );
-
-                if (location.indexOf("://") != -1) {
-                    provider.setAbsoluteURL(location);
-                } else {
-                    provider.setFullPath(location);
-                }
-                location =
-                redirectResponse.encodeRedirectURL(provider.toString());
-                if (location.indexOf("/") == -1)
-                	throw new IllegalArgumentException("There is a relative path given, an IllegalArgumentException must be thrown.");
-                //redirectResponse.sendRedirect(location);
-                redirectLocation = location;
-                redirected = true;
-            }
-        } else {
-            throw new java.lang.IllegalStateException(
-                "Can't invoke sendRedirect() after certain methods have been called");
-        }
-    }
-
-
-
-    public String getRedirectLocation() {
-        return redirectLocation;
-    }
-	//
-//	 javax.portlet.ActionResponse
-	//
-    public void setWindowState(WindowState windowState)
-        throws WindowStateException {
-        if (redirected) {
-            throw new IllegalStateException(
-                "it is not allowed to invoke setWindowState after sendRedirect has been called");
-        }
-
-        if (isWindowStateAllowed(windowState)) {
-            this.windowState = windowState;
-        } else {
-            throw new WindowStateException("Can't set this WindowState",
-                                           windowState);
-        }
-        redirectAllowed = false;
-    }
-
-    public void setPortletMode(PortletMode portletMode)
-        throws PortletModeException {
-        if (redirected) {
-            throw new IllegalStateException(
-                "it is not allowed to invoke setPortletMode after sendRedirect has been called");
-        }
-
-        // check if portal supports portlet mode
-        boolean supported = isPortletModeAllowed(portletMode);
-
-
-        // if porlet mode is allowed
-        if (supported) {
-            this.portletMode = portletMode;
-        } else {
-            throw new PortletModeException("Can't set this PortletMode",
-                                           portletMode);
-        }
-
-        redirectAllowed = false;
-
-    }
-
-    public void setRenderParameters(java.util.Map<String, String[]> parameters) {
-        if (redirected) {
-            throw new IllegalStateException(
-                "Can't invoke setRenderParameters() after sendRedirect() has been called");
-        }
-        if (parameters == null) {
-            throw new IllegalArgumentException(
-                "Render parameters must not be null.");
-        }
-        for (Iterator iter = parameters.entrySet().iterator(); iter.hasNext();) {
-            Map.Entry entry = (Map.Entry) iter.next();
-            if (!(entry.getKey() instanceof String)) {
-                throw new IllegalArgumentException(
-                    "Key must not be null and of type java.lang.String.");
-            }
-            if (!(entry.getValue() instanceof String[])) {
-                throw new IllegalArgumentException(
-                    "Value must not be null and of type java.lang.String[].");
-            }
-        }
-
-        renderParameters.clear();
-        publicRenderParameter.clear();
-        if (parameters.keySet()!= null){
-        	for (Object key : parameters.keySet()) {
-        		this.setRenderParameter((String)key, parameters.get(key));
-    		}
-        }
-
-        redirectAllowed = false;
-    }
-
-    public void setRenderParameter(String key, String value) {
-        if (redirected) {
-            throw new IllegalStateException(
-                "Can't invoke setRenderParameter() after sendRedirect() has been called");
-        }
-
-        if ((key == null || value == null)) {
-            throw new IllegalArgumentException(
-                "Render parameter key must not be null.");
-        }
-        List<String> publicRenderParameterNames = super.getPortletWindow().getPortletEntity().getPortletDefinition().getSupportedPublicRenderParameters();
-        if (publicRenderParameterNames != null){
-	    	if (publicRenderParameterNames.contains(key)){
-	        	publicRenderParameter.put(key, new String[] {value});
+public abstract class StateAwareResponseImpl extends PortletResponseImpl implements StateAwareResponse
+{
+    private PortletStateAwareResponseContext responseContext;
+    
+	public StateAwareResponseImpl(PortletStateAwareResponseContext responseContext)
+	{
+		super(responseContext);
+		this.responseContext = responseContext;
+	}
+	
+	private static String[] cloneParameterValues(String[] values)
+	{
+	    int count = 0;
+	    for (String s : values)
+	    {
+	        if (!(s == null || s.length() == 0))
+	        {
+	            count++;
 	        }
-	        else{
-	        	renderParameters.put(key, new String[]{value});
-	        }
-        }
-        else{
-        	renderParameters.put(key, new String[]{value});
-        }
-        redirectAllowed = false;
-    }
-
-    public void setRenderParameter(String key, String[] values) {
-    	if (redirected) {
-            throw new IllegalStateException(
-                "Can't invoke setRenderParameter() after sendRedirect() has been called");
-        }
-
-        if (key == null || values == null) {
-	        throw new IllegalArgumentException(
-	        	"name and values must not be null or values be an empty array");
 	    }
-	    List<String> publicRenderParameterNames = super.getPortletWindow().getPortletEntity().getPortletDefinition().getSupportedPublicRenderParameters();
-	    if (publicRenderParameterNames != null){
-		    if (publicRenderParameterNames.contains(key)){
-		    	publicRenderParameter.put(key, values.clone());
-		    }
-		    else{
-		    	renderParameters.put(key, values.clone());
-		    }
+	    if (count == 0)
+	    {
+	        return null;
 	    }
-	    else{
-	    	renderParameters.put(key, values.clone());
+	    else if (count < values.length)
+	    {
+	        String[] copy = new String[count];
+	        count = 0;
+	        for (String s : values)
+	        {
+	            if (!(s == null || s.length() == 0))
+	            {
+	                copy[count++] = s;
+	            }
+	        }
+	        return copy;
+	    }
+	    else
+	    {
+	        return values.clone();
 	    }
-    }
-    // --------------------------------------------------------------------------------------------
-
-    // org.apache.pluto.core.InternalActionResponse implementation --------------------------------
-    public Map getRenderParameters() {
-        return renderParameters;
-    }
-
-    public Map<String, String[]> getRenderParameterMap() {
-		return renderParameters;
-	}
-
-    public Map<String, String[]> getPublicRenderParameter(){
-    	return publicRenderParameter;
-    }
-
-    public PortletMode getChangedPortletMode() {
-        return this.portletMode;
-    }
-
-    public PortletMode getPortletMode() {
-		return getChangedPortletMode();
-	}
-
-    public WindowState getChangedWindowState() {
-        return this.windowState;
-    }
-
-    public WindowState getWindowState() {
-		return getChangedWindowState();
 	}
-
-    protected boolean isPortletModeAllowed(PortletMode mode) {
-        return isPortletModeAllowedByPortlet(mode)
-               && isPortletModeAllowedByPortal(mode);
-    }
-
-    protected boolean isPortletModeAllowedByPortlet(PortletMode mode) {
-
-        //Not checking for VIEW mode in portetlDefinition, as VIEW mode is default
-        // as per specs.
-        if(PortletMode.VIEW.equals(mode))
-            return true;
-
-        PortletDefinition dd = getPortletWindow().getPortletEntity()
-            .getPortletDefinition();
-
-        Iterator supports = dd.getSupports().iterator();
-        while(supports.hasNext()) {
-            Supports sup = (Supports)supports.next();
-            List<String> portletModes = sup.getPortletModes();
-            if (portletModes == null)
-            	return false;
-            Iterator modes = portletModes.iterator();
-            while(modes.hasNext()) {
-                if (modes.next().toString().equalsIgnoreCase(mode.toString())) {
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-
-    protected boolean isPortletModeAllowedByPortal(PortletMode mode) {
-        Enumeration supportedModes = context.getSupportedPortletModes();
-        while (supportedModes.hasMoreElements()) {
-            if (supportedModes.nextElement().toString().equalsIgnoreCase(
-                (mode.toString()))) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    protected boolean isWindowStateAllowed(WindowState state) {
-        Enumeration supportedStates = context.getSupportedWindowStates();
+	
+	protected abstract void checkSetStateChanged();
+	
+    protected boolean isWindowStateAllowed(WindowState state)
+    {
+        Enumeration<WindowState> supportedStates = getPortalContext().getSupportedWindowStates();
         while (supportedStates.hasMoreElements()) {
-            if (supportedStates.nextElement().toString().equalsIgnoreCase(
-                (state.toString()))) {
+            if (supportedStates.nextElement().equals(state))
+            {
                 return true;
             }
         }
         return false;
     }
-
-	//	 access to a limited set of HttpServletResponse methods ------------------
-
-	@Override
-	public void reset() {
-		if (super.isForwarded() || super.isIncluded()){
-			// no operation
-		}
-		else
-			super.reset();
-	}
-
-	@Override
-	public void resetBuffer() {
-		if (super.isForwarded() || super.isIncluded()){
-			// no operation
-		}
-		else
-			super.resetBuffer();
-	}
-
-	@Override
-	public void setBufferSize(int arg0) {
-		if (super.isForwarded() || super.isIncluded()){
-			// no operation
-		}
-		else
-			super.setBufferSize(arg0);
-	}
-
-	@Override
-	public void setCharacterEncoding(String arg0) {
-		if (super.isForwarded() || super.isIncluded()){
-			// no operation
-		}
-		else
-			super.setCharacterEncoding(arg0);
-	}
-
-	@Override
-	public void setContentLength(int arg0) {
-		if (super.isForwarded() || super.isIncluded()){
-			// no operation
-		}
-		else
-			super.setContentLength(arg0);
+    
+    public PortletMode getPortletMode()
+    {
+        return responseContext.getPortletMode();
+    }
+
+    public Map<String, String[]> getRenderParameterMap()
+    {
+        Map<String, String[]> parameters = new HashMap<String, String[]>(responseContext.getRenderParameters());
+        for (Map.Entry<String,String[]> entry : parameters.entrySet())
+        {
+            entry.setValue(entry.getValue().clone());
+        }
+        return parameters;
+    }
+    
+    public WindowState getWindowState()
+    {
+        return responseContext.getWindowState();
+    }
+    
+    public void removePublicRenderParameter(String name)
+    {
+        ArgumentUtility.validateNotEmpty("name", name);
+        checkSetStateChanged();
+        responseContext.getRemovedPublicRenderParameters().add(name);
+        responseContext.getRenderParameters().remove(name);
+    }
+
+	public void setEvent(QName qname, Serializable value)
+	{
+        ArgumentUtility.validateNotNull("qname", qname);
+        PortalCallbackService callback = getPortletContainer().getRequiredContainerServices().getPortalCallbackService();
+		Event event = callback.getEventProvider(getServletRequest(),getPortletWindow()).createEvent(qname, value);
+		responseContext.getEvents().add(event);
 	}
 
-	@Override
-	public void setContentType(String arg0) {
-		if (super.isForwarded() || super.isIncluded()){
-			// no operation
-		}
-		else
-			super.setContentType(arg0);
-	}
-
-	@Override
-	public void setLocale(Locale arg0) {
-		if (super.isForwarded() || super.isIncluded()){
-			// no operation
-		}
-		else
-			super.setLocale(arg0);
-	}
-
-	@Override
-	public ServletOutputStream getOutputStream() throws IllegalStateException, IOException {
-		if (super.isForwarded() || super.isIncluded()){
-			return new DummyServletOutputStream();
-		}
-		else
-			return super.getOutputStream();
-	}
-
-	@Override
-	public PrintWriter getWriter() throws IllegalStateException, IOException {
-		if (super.isForwarded() || super.isIncluded()){
-			return new DummyPrintWriter(super.getWriter());
-		}
-		else
-			return super.getWriter();
-	}
-
-	@Override
-	public void addDateHeader(String arg0, long arg1) {
-		if (super.isForwarded() || super.isIncluded()){
-			// no operation
-		}
-		else
-			super.addDateHeader(arg0, arg1);
-	}
-
-	@Override
-	public void addHeader(String arg0, String arg1) {
-		if (super.isForwarded() || super.isIncluded()){
-			// no operation
-		}
-		else
-			super.addHeader(arg0, arg1);
-	}
-
-	@Override
-	public void addIntHeader(String arg0, int arg1) {
-		if (super.isForwarded() || super.isIncluded()){
-			// no operation
-		}
-		else
-			super.addIntHeader(arg0, arg1);
-	}
-
-	@Override
-	public void setStatus(int arg0, String arg1) {
-		if (super.isForwarded() || super.isIncluded()){
-			// no operation
-		}
-		else
-			super.setStatus(arg0, arg1);
-	}
-
-	@Override
-	public void setDateHeader(String arg0, long arg1) {
-		if (super.isForwarded() || super.isIncluded()){
-			// no operation
-		}
-		else
-			super.setDateHeader(arg0, arg1);
-	}
-
-	@Override
-	public void setHeader(String arg0, String arg1) {
-		if (super.isForwarded() || super.isIncluded()){
-			// no operation
-		}
-		else
-			super.setHeader(arg0, arg1);
-	}
-
-	@Override
-	public void setIntHeader(String arg0, int arg1) {
-		if (super.isForwarded() || super.isIncluded()){
-			// no operation
-		}
-		else
-			super.setIntHeader(arg0, arg1);
-	}
-
-	@Override
-	public void setStatus(int arg0) {
-		if (super.isForwarded() || super.isIncluded()){
-			// no operation
-		}
-		else
-			super.setStatus(arg0);
-	}
-
-	@Override
-	public void flushBuffer() throws IOException {
-		if (super.isForwarded() || super.isIncluded()){
-			// no operation
-		}
-		else
-			super.flushBuffer();
-	}
-
-	/*
-	 * The pluto implementation don't works with buffering.
-	 * @see javax.servlet.ServletResponseWrapper#getBufferSize()
-	 */
-	@Override
-	public int getBufferSize() {
-		if (super.isForwarded() || super.isIncluded()){
-			return 0;
-		}
-		else
-			return 0;
-	}
-
-	@Override
-	public String getCharacterEncoding() {
-		if (super.isForwarded() || super.isIncluded()){
-			return null;
-		}
-		else
-			return super.getCharacterEncoding();
-	}
-
-	@Override
-	public String getContentType() {
-		if (super.isForwarded() || super.isIncluded()){
-			return null;
-		}
-		else
-			return super.getContentType();
-	}
-
-	@Override
-	public Locale getLocale() {
-		if (super.isForwarded() || super.isIncluded()){
-			return null;
-		}
-		else
-			return super.getLocale();
-	}
-
-	@Override
-	public boolean isCommitted() {
-		if (super.isForwarded()){
-			return false;
-		}
-		else if (super.isIncluded()){
-			return true;
-		}
-		else
-			return super.isCommitted();
-	}
-
-	public void removePublicRenderParameter(String name) {
-		List<String> publicRenderParameterNames = super.getPortletWindow().getPortletEntity().getPortletDefinition().getSupportedPublicRenderParameters();
-		if (publicRenderParameterNames != null){
-			if (publicRenderParameterNames.contains(name)){
-	    		publicRenderParameter.put(name,new String[] {null});
-		    }
-	    	else{
-	    		throw new IllegalArgumentException(
-	    			"name and values must not be null or values be an empty array");
-	    	}
-		}
-		redirectAllowed = false;
-	}
-
-	public void setEventRequest(EventRequest eventRequest) {
-		this.eventRequest = eventRequest;
+	public void setEvent(String name, Serializable value)
+	{
+	    PortletWindow window = getPortletWindow();
+        String defaultNamespace;
+        defaultNamespace = window.getPortletEntity().getPortletDefinition().getApplication().getDefaultNamespace();
+        QName qname = new QName(defaultNamespace, name);
+        setEvent(qname, value);
 	}
 
+    public void setPortletMode(PortletMode portletMode) throws PortletModeException 
+    {
+        ArgumentUtility.validateNotNull("portletMode", portletMode);
+        if (isPortletModeAllowed(portletMode))
+        {
+            checkSetStateChanged();
+            responseContext.setPortletMode(portletMode);
+        }
+        else 
+        {
+            throw new PortletModeException("Can't set this PortletMode", portletMode);
+        }
+    }
+
+    public void setWindowState(WindowState windowState) throws WindowStateException
+    {
+        ArgumentUtility.validateNotNull("windowState", windowState);
+        if (isWindowStateAllowed(windowState))
+        {
+            checkSetStateChanged();
+            responseContext.setWindowState(windowState);
+        }
+        else 
+        {
+            throw new WindowStateException("Can't set this WindowState", windowState);
+        }
+    }
+	    
+    public void setRenderParameters(java.util.Map<String, String[]> parameters)
+    {
+        ArgumentUtility.validateNotNull("parameters", parameters);
+        
+        // validate map first
+        for (Map.Entry<? extends Object, ? extends Object> entry : parameters.entrySet())
+        {
+            if (entry.getKey() == null || entry.getValue() == null)
+            {
+                throw new IllegalArgumentException("RenderParameters contains a null key or value entry");
+            }
+            if (!(entry.getKey() instanceof String))
+            {
+                throw new IllegalArgumentException("RenderParameters contains a key which is not of type String");
+            }
+            if (!(entry.getValue() instanceof String[]))
+            {
+                throw new IllegalArgumentException("RenderParameters contains a value which is not of type String[]");
+            }
+        }
+        checkSetStateChanged();
+        Map<String, String[]> map = responseContext.getRenderParameters();
+        map.clear();
+        for (Map.Entry<String,String[]> entry : parameters.entrySet())
+        {
+            String[] values = cloneParameterValues(entry.getValue());
+            if (values != null)
+            {
+                map.put(entry.getKey(), values);
+                responseContext.getRemovedPublicRenderParameters().remove(entry.getKey());
+            }
+        }
+    }
+    
+    public void setRenderParameter(String key, String value)
+    {
+        ArgumentUtility.validateNotEmpty("key", key);
+        
+        checkSetStateChanged();
+        if (value == null || value.length() == 0)
+        {
+            responseContext.getRenderParameters().remove(key);
+        }
+        else
+        {
+            responseContext.getRenderParameters().put(key, new String[]{value});
+            responseContext.getRemovedPublicRenderParameters().remove(key);
+        }
+    }
+    
+    public void setRenderParameter(String key, String[] values)
+    {
+        ArgumentUtility.validateNotEmpty("key", key);
+        ArgumentUtility.validateNotNull("values", values);
+        String[] copy = cloneParameterValues(values);
+        checkSetStateChanged();
+        if (copy == null)
+        {
+            responseContext.getRenderParameters().remove(key);
+        }
+        else
+        {
+            responseContext.getRenderParameters().put(key, copy);
+            responseContext.getRemovedPublicRenderParameters().remove(key);
+        }
+    }
 }

Modified: portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/util/DummyPrintWriter.java
URL: http://svn.apache.org/viewvc/portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/util/DummyPrintWriter.java?rev=750954&r1=750953&r2=750954&view=diff
==============================================================================
--- portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/util/DummyPrintWriter.java (original)
+++ portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/util/DummyPrintWriter.java Fri Mar  6 16:11:51 2009
@@ -16,34 +16,42 @@
  */
 package org.apache.pluto.util;
 
+import java.io.OutputStream;
 import java.io.PrintWriter;
-import java.io.Writer;
 import java.util.Locale;
 
-public class DummyPrintWriter extends PrintWriter{
-
-	public DummyPrintWriter(Writer out) {
+public final class DummyPrintWriter extends PrintWriter
+{
+    private static final DummyPrintWriter instance = new DummyPrintWriter(DummyServletOutputStream.getInstance());
+    
+    public static PrintWriter getInstance()
+    {
+        return instance;
+    }
+    
+	private DummyPrintWriter(OutputStream out)
+	{
 		super(out);
 	}
 	
 	@Override
 	public PrintWriter append(char c) {
-		return super.append(null);
+		return this;
 	}
 
 	@Override
 	public PrintWriter append(CharSequence csq, int start, int end) {
-		return super.append(null);
+		return this;
 	}
 
 	@Override
 	public PrintWriter append(CharSequence csq) {
-		return super.append(null);
+		return this;
 	}
 
 	@Override
 	public boolean checkError() {
-		return super.checkError();
+		return false;
 	}
 
 	@Override
@@ -56,12 +64,12 @@
 
 	@Override
 	public PrintWriter format(Locale l, String format, Object... args) {
-		return super.format(null, null, null);
+		return this;
 	}
 
 	@Override
 	public PrintWriter format(String format, Object... args) {
-		return super.format(null, null);
+		return this;
 	}
 
 	@Override
@@ -102,12 +110,12 @@
 
 	@Override
 	public PrintWriter printf(Locale l, String format, Object... args) {
-		return super.printf(null, null, null);
+		return this;
 	}
 
 	@Override
 	public PrintWriter printf(String format, Object... args) {
-		return super.printf(null, null);
+        return this;
 	}
 
 	@Override
@@ -152,7 +160,6 @@
 
 	@Override
 	protected void setError() {
-		super.setError();
 	}
 
 	@Override
@@ -174,5 +181,4 @@
 	@Override
 	public void write(String s) {
 	}
-
 }