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 es...@apache.org on 2007/12/29 18:32:18 UTC

svn commit: r607450 [8/36] - in /portals/pluto/trunk: ./ assembly/src/main/assembly/ assembly/src/main/resources/ maven-pluto-plugin/ maven-pluto-plugin/src/main/java/org/apache/pluto/maven/ pluto-ant-tasks/ pluto-ant-tasks/src/assemble/ pluto-ant-task...

Modified: portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/internal/impl/PortletRequestImpl.java
URL: http://svn.apache.org/viewvc/portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/internal/impl/PortletRequestImpl.java?rev=607450&r1=607449&r2=607450&view=diff
==============================================================================
--- portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/internal/impl/PortletRequestImpl.java (original)
+++ portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/internal/impl/PortletRequestImpl.java Sat Dec 29 09:31:56 2007
@@ -1,696 +1,696 @@
-/*
- * 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 java.io.BufferedReader;
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.security.Principal;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Set;
-import java.util.Vector;
-
-import javax.portlet.PortalContext;
-import javax.portlet.PortletContext;
-import javax.portlet.PortletMode;
-import javax.portlet.PortletRequest;
-import javax.portlet.PortletSession;
-import javax.portlet.WindowState;
-import javax.servlet.RequestDispatcher;
-import javax.servlet.ServletInputStream;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletRequestWrapper;
-import javax.servlet.http.HttpSession;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.pluto.PortletContainer;
-import org.apache.pluto.PortletContainerException;
-import org.apache.pluto.descriptors.common.SecurityRoleRefDD;
-import org.apache.pluto.descriptors.portlet.PortletAppDD;
-import org.apache.pluto.descriptors.portlet.PortletDD;
-import org.apache.pluto.descriptors.portlet.SupportsDD;
-import org.apache.pluto.descriptors.portlet.UserAttributeDD;
-import org.apache.pluto.internal.InternalPortletRequest;
-import org.apache.pluto.internal.InternalPortletWindow;
-import org.apache.pluto.internal.PortletEntity;
-import org.apache.pluto.util.ArgumentUtility;
-import org.apache.pluto.util.Enumerator;
-import org.apache.pluto.util.NamespaceMapper;
-import org.apache.pluto.util.StringManager;
-import org.apache.pluto.util.StringUtils;
-import org.apache.pluto.util.impl.NamespaceMapperImpl;
-
-/**
- * Abstract <code>javax.portlet.PortletRequest</code> implementation.
- * This class also implements InternalPortletRequest.
- *
- */
-public abstract class PortletRequestImpl extends HttpServletRequestWrapper
-    implements PortletRequest, InternalPortletRequest {
-
-    /**
-     * Logger.
-     */
-    private static final Log LOG = LogFactory.getLog(PortletRequestImpl.class);
-
-    private static final StringManager EXCEPTIONS =
-        StringManager.getManager(PortletRequestImpl.class.getPackage().getName());
-
-    // Private Member Variables ------------------------------------------------
-
-    /**
-     * The parent container within which this request was created.
-     */
-    private PortletContainer container;
-
-    /**
-     * The portlet window which is the target of this portlet request.
-     */
-    private InternalPortletWindow internalPortletWindow;
-
-    /**
-     * The PortletContext associated with this Request. This PortletContext must
-     * be initialized from within the <code>PortletServlet</code>.
-     */
-    private PortletContext portletContext;
-
-    /**
-     * The PortalContext within which this request is occuring.
-     */
-    private PortalContext portalContext;
-
-    /**
-     * The portlet session.
-     */
-    private PortletSession portletSession;
-
-    /**
-     * Response content types.
-     */
-    private Vector contentTypes;
-
-    /**
-     * TODO: javadoc
-     */
-    private final NamespaceMapper mapper = new NamespaceMapperImpl();
-
-    /**
-     * FIXME: do we really need this?
-     * Flag indicating if the HTTP-Body has been accessed.
-     */
-    private boolean bodyAccessed = false;
-
-    // Constructors ------------------------------------------------------------
-
-    public PortletRequestImpl(InternalPortletRequest internalPortletRequest) {
-        this(internalPortletRequest.getPortletContainer(),
-            internalPortletRequest.getInternalPortletWindow(),
-            internalPortletRequest.getHttpServletRequest());
-    }
-
-    /**
-     * Creates a PortletRequestImpl instance.
-     *
-     * @param container             the portlet container.
-     * @param internalPortletWindow the internal portlet window.
-     * @param servletRequest        the underlying servlet request.
-     */
-    public PortletRequestImpl(PortletContainer container,
-                              InternalPortletWindow internalPortletWindow,
-                              HttpServletRequest servletRequest) {
-        super(servletRequest);
-        this.container = container;
-        this.internalPortletWindow = internalPortletWindow;
-        this.portalContext = container.getRequiredContainerServices().getPortalContext();
-    }
-
-    // PortletRequest Impl -----------------------------------------------------
-
-    /**
-     * Determine whether or not the specified WindowState is allowed for this
-     * portlet.
-     *
-     * @param state the state in question
-     * @return true if the state is allowed.
-     */
-    public boolean isWindowStateAllowed(WindowState state) {
-        for (Enumeration en = portalContext.getSupportedWindowStates();
-             en.hasMoreElements();) {
-            if (en.nextElement().toString().equals(state.toString())) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    public boolean isPortletModeAllowed(PortletMode mode) {
-        return (isPortletModeAllowedByPortlet(mode)
-            && isPortletModeAllowedByPortal(mode));
-    }
-
-    public PortletMode getPortletMode() {
-        return internalPortletWindow.getPortletMode();
-    }
-
-    public WindowState getWindowState() {
-        return internalPortletWindow.getWindowState();
-    }
-
-    public PortletSession getPortletSession() {
-        return getPortletSession(true);
-    }
-
-    /**
-     * Returns the portlet session.
-     * <p/>
-     * Note that since portlet request instance is created everytime the portlet
-     * container receives an incoming request, the portlet session instance held
-     * by the request instance is also re-created for each incoming request.
-     * </p>
-     */
-    public PortletSession getPortletSession(boolean create) {
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("Retreiving portlet session (create=" + create + ")");
-        }
-        //
-        // It is critical that we don't retrieve the portlet session until the
-        //   cross context dispatch has been completed.  If we do then we risk
-        //   having a cached version which is invalid for the context within
-        //   which it exists.
-        //
-        if (portletContext == null) {
-            throw new IllegalStateException(
-                EXCEPTIONS.getString("error.session.illegalState"));
-        }
-        //
-        // We must make sure that if the session has been invalidated (perhaps
-        //   through setMaxIntervalTimeout()) and the underlying request
-        //   returns null that we no longer use the cached version.
-        // We have to check (ourselves) if the session has exceeded its max
-        //   inactive interval. If so, we should invalidate the underlying
-        //   HttpSession and recreate a new one (if the create flag is set to
-        //   true) -- We just cannot depend on the implementation of
-        //   javax.servlet.http.HttpSession!
-        //
-        HttpSession httpSession = getHttpServletRequest().getSession(create);
-        if (httpSession != null) {
-            // HttpSession is not null does NOT mean that it is valid.
-            int maxInactiveInterval = httpSession.getMaxInactiveInterval();
-            long lastAccesstime = httpSession.getLastAccessedTime();//lastAccesstime checks added for PLUTO-436
-            if (maxInactiveInterval >= 0 && lastAccesstime > 0) {    // < 0 => Never expires.
-                long maxInactiveTime = httpSession.getMaxInactiveInterval() * 1000L;
-                long currentInactiveTime = System.currentTimeMillis() - lastAccesstime;
-                if (currentInactiveTime > maxInactiveTime) {
-                    if (LOG.isDebugEnabled()) {
-                        LOG.debug("The underlying HttpSession is expired and "
-                            + "should be invalidated.");
-                    }
-                    httpSession.invalidate();
-                    httpSession = getHttpServletRequest().getSession(create);
-                    //Added for PLUTO-436
-                    // a cached portletSession is no longer useable.
-                    // a new one will be created below.
-                    portletSession = null;
-                }
-            }
-        }
-
-        if (httpSession == null) {
-            if (LOG.isDebugEnabled()) {
-                LOG.debug("The underlying HttpSession is not available: "
-                    + "no session will be returned.");
-            }
-            return null;
-        }
-
-        //
-        // If we reach here, we are sure that the underlying HttpSession is
-        //   available. If we haven't created and cached a portlet session
-        //   instance, we will create and cache one now.
-        //
-        if (portletSession == null) {
-            if (LOG.isDebugEnabled()) {
-                LOG.debug("Creating new portlet session...");
-            }
-            portletSession = new PortletSessionImpl(
-                portletContext,
-                internalPortletWindow,
-                httpSession);
-        }
-        return portletSession;
-    }
-
-    public String getProperty(String name) throws IllegalArgumentException {
-        ArgumentUtility.validateNotNull("propertyName", name);
-        String property = this.getHttpServletRequest().getHeader(name);
-        if (property == null) {
-            Map propertyMap = container.getRequiredContainerServices()
-                .getPortalCallbackService()
-                .getRequestProperties(
-                    getHttpServletRequest(),
-                    internalPortletWindow);
-
-            if (propertyMap != null) {
-                String[] properties = (String[]) propertyMap.get(name);
-                if (properties != null && properties.length > 0) {
-                    property = properties[0];
-                }
-            }
-        }
-        return property;
-    }
-
-    public Enumeration getProperties(String name) {
-        ArgumentUtility.validateNotNull("propertyName", name);
-        Set v = new HashSet();
-        Enumeration props = this.getHttpServletRequest().getHeaders(name);
-        if (props != null) {
-            while (props.hasMoreElements()) {
-                v.add(props.nextElement());
-            }
-        }
-
-        // get properties from PropertyManager
-        Map map = container.getRequiredContainerServices()
-            .getPortalCallbackService()
-            .getRequestProperties(
-                getHttpServletRequest(),
-                internalPortletWindow);
-
-        if (map != null) {
-            String[] properties = (String[]) map.get(name);
-
-            if (properties != null) {
-                // add properties to vector
-                for (int i = 0; i < properties.length; i++) {
-                    v.add(properties[i]);
-                }
-            }
-        }
-
-        return new Enumerator(v.iterator());
-    }
-
-    public Enumeration getPropertyNames() {
-        Set v = new HashSet();
-
-        // get properties from PropertyManager
-        Map map = container.getRequiredContainerServices()
-            .getPortalCallbackService()
-            .getRequestProperties(getHttpServletRequest(), internalPortletWindow);
-
-        if (map != null) {
-            v.addAll(map.keySet());
-        }
-
-        // get properties from request header
-        Enumeration props = this.getHttpServletRequest().getHeaderNames();
-        if (props != null) {
-            while (props.hasMoreElements()) {
-                v.add(props.nextElement());
-            }
-        }
-
-        return new Enumerator(v.iterator());
-    }
-
-    public PortalContext getPortalContext() {
-        return container.getRequiredContainerServices().getPortalContext();
-    }
-
-    public String getAuthType() {
-        return this.getHttpServletRequest().getAuthType();
-    }
-
-    public String getContextPath() {
-        String contextPath = internalPortletWindow.getContextPath();
-        if ("/".equals(contextPath)) {
-            contextPath = "";
-        }
-        return contextPath;
-    }
-
-    public String getRemoteUser() {
-        return this.getHttpServletRequest().getRemoteUser();
-    }
-
-    public Principal getUserPrincipal() {
-        return this.getHttpServletRequest().getUserPrincipal();
-    }
-
-    /**
-     * Determines whether a user is mapped to the specified role.  As specified
-     * in PLT-20-3, we must reference the &lt;security-role-ref&gt; mappings
-     * within the deployment descriptor. If no mapping is available, then, and
-     * only then, do we check use the actual role name specified against the web
-     * application deployment descriptor.
-     *
-     * @param roleName the name of the role
-     * @return true if it is determined the user has the given role.
-     */
-    public boolean isUserInRole(String roleName) {
-        PortletEntity entity = internalPortletWindow.getPortletEntity();
-        PortletDD def = entity.getPortletDefinition();
-
-        SecurityRoleRefDD ref = null;
-        Iterator refs = def.getSecurityRoleRefs().iterator();
-        while (refs.hasNext()) {
-            SecurityRoleRefDD r = (SecurityRoleRefDD) refs.next();
-            if (r.getRoleName().equals(roleName)) {
-                ref = r;
-                break;
-            }
-        }
-
-        String link;
-        if (ref != null && ref.getRoleLink() != null) {
-            link = ref.getRoleLink();
-        } else {
-            link = roleName;
-        }
-
-        return this.getHttpServletRequest().isUserInRole(link);
-    }
-
-    public Object getAttribute(String name) {
-        ArgumentUtility.validateNotNull("attributeName", name);
-
-        if (PortletRequest.USER_INFO.equals(name)) {
-            return createUserInfoMap();
-        }
-
-        String encodedName = isNameReserved(name) ?
-            name :
-            mapper.encode(internalPortletWindow.getId(), name);
-
-        Object attribute = getHttpServletRequest()
-            .getAttribute(encodedName);
-
-        if (attribute == null) {
-            attribute = getHttpServletRequest().getAttribute(name);
-        }
-        return attribute;
-    }
-
-    public Enumeration getAttributeNames() {
-        Enumeration attributes = this.getHttpServletRequest()
-            .getAttributeNames();
-
-        Vector portletAttributes = new Vector();
-
-        while (attributes.hasMoreElements()) {
-            String attribute = (String) attributes.nextElement();
-            
-            //Fix for PLUTO-369
-            String portletAttribute = isNameReserved(attribute) ?
-            		attribute :
-            	mapper.decode(
-                internalPortletWindow.getId(), attribute);
-
-            if (portletAttribute != null) { // it is in the portlet's namespace
-                portletAttributes.add(portletAttribute);
-            }
-        }
-
-        return portletAttributes.elements();
-    }
-
-    public Map createUserInfoMap() {
-
-        Map userInfoMap = new HashMap();
-        try {
-
-            PortletAppDD dd = container.getOptionalContainerServices()
-                .getPortletRegistryService()
-                .getPortletApplicationDescriptor(internalPortletWindow.getContextPath());
-
-            Map allMap = container.getOptionalContainerServices()
-            	//PLUTO-388 fix:
-            	//The PortletWindow is currently ignored in the implementing class
-            	// See: org.apache.pluto.core.DefaultUserInfoService
-            	.getUserInfoService().getUserInfo( this, this.internalPortletWindow );
-
-            Iterator i = dd.getUserAttributes().iterator();
-            while(i.hasNext()) {
-                UserAttributeDD udd = (UserAttributeDD)i.next();
-                userInfoMap.put(udd.getName(), allMap.get(udd.getName()));
-            }
-        } catch (PortletContainerException e) {
-            LOG.warn("Unable to retrieve user attribute map for user " + getRemoteUser() + ".  Returning null.");
-            return null;
-        }
-
-        return Collections.unmodifiableMap(userInfoMap);
-    }
-
-    public String getParameter(String name) {
-        ArgumentUtility.validateNotNull("parameterName", name);
-        String[] values = (String[]) baseGetParameterMap().get(name);
-        if (values != null && values.length > 0) {
-            return values[0];
-        } else {
-            return null;
-        }
-    }
-
-    public Enumeration getParameterNames() {
-        return Collections.enumeration(baseGetParameterMap().keySet());
-    }
-
-    public String[] getParameterValues(String name) {
-        ArgumentUtility.validateNotNull("parameterName", name);
-        String[] values = (String[]) baseGetParameterMap().get(name);
-        if (values != null) {
-            values = StringUtils.copy(values);
-        }
-        return values;
-    }
-
-    public Map getParameterMap() {
-        return Collections.unmodifiableMap(StringUtils.copyParameters(baseGetParameterMap()));
-    }
-
-    public boolean isSecure() {
-        return this.getHttpServletRequest().isSecure();
-    }
-
-    public void setAttribute(String name, Object value) {
-        ArgumentUtility.validateNotNull("attributeName", name);
-        String encodedName = isNameReserved(name) ?
-            name : mapper.encode(internalPortletWindow.getId(), name);
-        if (value == null) {
-            removeAttribute(name);
-        } else {
-            getHttpServletRequest().setAttribute(encodedName, value);
-        }
-    }
-
-    public void removeAttribute(String name) {
-        ArgumentUtility.validateNotNull("attributeName", name);
-        String encodedName = isNameReserved(name) ?
-            name : mapper.encode(internalPortletWindow.getId(), name);
-        getHttpServletRequest().removeAttribute(encodedName);
-    }
-
-    public String getRequestedSessionId() {
-        return this.getHttpServletRequest().getRequestedSessionId();
-    }
-
-    public boolean isRequestedSessionIdValid() {
-        if (LOG.isDebugEnabled()) {
-            LOG.debug(" ***** IsRequestedSessionIdValid? " + getHttpServletRequest().isRequestedSessionIdValid());
-        }
-        return getHttpServletRequest().isRequestedSessionIdValid();
-    }
-
-    public String getResponseContentType() {
-        Enumeration enumeration = getResponseContentTypes();
-        while (enumeration.hasMoreElements()) {
-            return (String) enumeration.nextElement();
-        }
-        return "text/html";
-    }
-
-    public Enumeration getResponseContentTypes() {
-        if (contentTypes == null) {
-            contentTypes = new Vector();
-            PortletDD dd = internalPortletWindow.getPortletEntity().getPortletDefinition();
-            Iterator supports = dd.getSupports().iterator();
-            while (supports.hasNext()) {
-                SupportsDD sup = (SupportsDD) supports.next();
-                contentTypes.add(sup.getMimeType());
-            }
-            if (contentTypes.size() < 1) {
-                contentTypes.add("text/html");
-            }
-        }
-        return contentTypes.elements();
-    }
-
-    public Locale getLocale() {
-        return this.getHttpServletRequest().getLocale();
-    }
-
-    public Enumeration getLocales() {
-        return this.getHttpServletRequest().getLocales();
-    }
-
-    public String getScheme() {
-        return this.getHttpServletRequest().getScheme();
-    }
-
-    public String getServerName() {
-        return this.getHttpServletRequest().getServerName();
-    }
-
-    public int getServerPort() {
-        return this.getHttpServletRequest().getServerPort();
-    }
-
-    // Protected Methods -------------------------------------------------------
-
-    /**
-     * The base method that returns the parameter map in this portlet request.
-     * All parameter-related methods call this base method. Subclasses may just
-     * overwrite this protected method to change behavior of all parameter-
-     * related methods.
-     *
-     * @return the base parameter map from which parameters are retrieved.
-     */
-    protected Map baseGetParameterMap() {
-        bodyAccessed = true;
-        return this.getHttpServletRequest().getParameterMap();
-    }
-
-    protected void setBodyAccessed() {
-        bodyAccessed = true;
-    }
-
-    // InternalPortletRequest Impl ---------------------------------------------
-
-    public InternalPortletWindow getInternalPortletWindow() {
-        return internalPortletWindow;
-    }
-
-    public PortletContainer getPortletContainer() {
-        return container;
-    }
-
-    public HttpServletRequest getHttpServletRequest() {
-        return (HttpServletRequest) super.getRequest();
-    }
-
-    public void init(PortletContext portletContext, HttpServletRequest req) {
-        this.portletContext = portletContext;
-        setRequest(req);
-    }
-
-    /**
-     * TODO: Implement this properly.  Not required now
-     */
-    public void release() {
-        // TODO:
-    }
-
-    // TODO: Additional Methods of HttpServletRequestWrapper -------------------
-
-    public BufferedReader getReader()
-        throws UnsupportedEncodingException, IOException {
-        // the super class will ensure that a IllegalStateException is thrown
-        //   if getInputStream() was called earlier
-        BufferedReader reader = getHttpServletRequest().getReader();
-        bodyAccessed = true;
-        return reader;
-    }
-
-    public ServletInputStream getInputStream() throws IOException {
-        ServletInputStream stream = getHttpServletRequest().getInputStream();
-        bodyAccessed = true;
-        return stream;
-    }
-
-    public RequestDispatcher getRequestDispatcher(String path) {
-        return getHttpServletRequest().getRequestDispatcher(path);
-    }
-
-    /**
-     * TODO: why check bodyAccessed?
-     */
-    public void setCharacterEncoding(String encoding)
-        throws UnsupportedEncodingException {
-        if (bodyAccessed) {
-            throw new IllegalStateException("Cannot set character encoding "
-                + "after HTTP body is accessed.");
-        }
-        super.setCharacterEncoding(encoding);
-    }
-
-    // Private Methods ---------------------------------------------------------
-
-    /**
-     * Is this attribute name a reserved name (by the J2EE spec)?. Reserved
-     * names begin with "java." or "javax.".
-     *
-     * @return true if the name is reserved.
-     */
-    private boolean isNameReserved(String name) {
-        return name.startsWith("java.") || name.startsWith("javax.");
-    }
-
-    private boolean isPortletModeAllowedByPortlet(PortletMode mode) {
-        if (isPortletModeMandatory(mode)) {
-            return true;
-        }
-
-        PortletDD dd = internalPortletWindow.getPortletEntity()
-            .getPortletDefinition();
-
-        Iterator mimes = dd.getSupports().iterator();
-        while (mimes.hasNext()) {
-            Iterator modes = ((SupportsDD) mimes.next()).getPortletModes().iterator();
-            while (modes.hasNext()) {
-                String m = (String) modes.next();
-                if (m.equals(mode.toString())) {
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-
-    private boolean isPortletModeAllowedByPortal(PortletMode mode) {
-        Enumeration supportedModes = portalContext.getSupportedPortletModes();
-        while (supportedModes.hasMoreElements()) {
-            if (supportedModes.nextElement().toString().equals(
-                (mode.toString()))) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    private boolean isPortletModeMandatory(PortletMode mode) {
-        return PortletMode.VIEW.equals(mode) || PortletMode.EDIT.equals(mode) || PortletMode.HELP.equals(mode);
-    }
-}
+/*
+ * 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 java.io.BufferedReader;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.security.Principal;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+import java.util.Vector;
+
+import javax.portlet.PortalContext;
+import javax.portlet.PortletContext;
+import javax.portlet.PortletMode;
+import javax.portlet.PortletRequest;
+import javax.portlet.PortletSession;
+import javax.portlet.WindowState;
+import javax.servlet.RequestDispatcher;
+import javax.servlet.ServletInputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
+import javax.servlet.http.HttpSession;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.pluto.PortletContainer;
+import org.apache.pluto.PortletContainerException;
+import org.apache.pluto.descriptors.common.SecurityRoleRefDD;
+import org.apache.pluto.descriptors.portlet.PortletAppDD;
+import org.apache.pluto.descriptors.portlet.PortletDD;
+import org.apache.pluto.descriptors.portlet.SupportsDD;
+import org.apache.pluto.descriptors.portlet.UserAttributeDD;
+import org.apache.pluto.internal.InternalPortletRequest;
+import org.apache.pluto.internal.InternalPortletWindow;
+import org.apache.pluto.internal.PortletEntity;
+import org.apache.pluto.util.ArgumentUtility;
+import org.apache.pluto.util.Enumerator;
+import org.apache.pluto.util.NamespaceMapper;
+import org.apache.pluto.util.StringManager;
+import org.apache.pluto.util.StringUtils;
+import org.apache.pluto.util.impl.NamespaceMapperImpl;
+
+/**
+ * Abstract <code>javax.portlet.PortletRequest</code> implementation.
+ * This class also implements InternalPortletRequest.
+ *
+ */
+public abstract class PortletRequestImpl extends HttpServletRequestWrapper
+    implements PortletRequest, InternalPortletRequest {
+
+    /**
+     * Logger.
+     */
+    private static final Log LOG = LogFactory.getLog(PortletRequestImpl.class);
+
+    private static final StringManager EXCEPTIONS =
+        StringManager.getManager(PortletRequestImpl.class.getPackage().getName());
+
+    // Private Member Variables ------------------------------------------------
+
+    /**
+     * The parent container within which this request was created.
+     */
+    private PortletContainer container;
+
+    /**
+     * The portlet window which is the target of this portlet request.
+     */
+    private InternalPortletWindow internalPortletWindow;
+
+    /**
+     * The PortletContext associated with this Request. This PortletContext must
+     * be initialized from within the <code>PortletServlet</code>.
+     */
+    private PortletContext portletContext;
+
+    /**
+     * The PortalContext within which this request is occuring.
+     */
+    private PortalContext portalContext;
+
+    /**
+     * The portlet session.
+     */
+    private PortletSession portletSession;
+
+    /**
+     * Response content types.
+     */
+    private Vector contentTypes;
+
+    /**
+     * TODO: javadoc
+     */
+    private final NamespaceMapper mapper = new NamespaceMapperImpl();
+
+    /**
+     * FIXME: do we really need this?
+     * Flag indicating if the HTTP-Body has been accessed.
+     */
+    private boolean bodyAccessed = false;
+
+    // Constructors ------------------------------------------------------------
+
+    public PortletRequestImpl(InternalPortletRequest internalPortletRequest) {
+        this(internalPortletRequest.getPortletContainer(),
+            internalPortletRequest.getInternalPortletWindow(),
+            internalPortletRequest.getHttpServletRequest());
+    }
+
+    /**
+     * Creates a PortletRequestImpl instance.
+     *
+     * @param container             the portlet container.
+     * @param internalPortletWindow the internal portlet window.
+     * @param servletRequest        the underlying servlet request.
+     */
+    public PortletRequestImpl(PortletContainer container,
+                              InternalPortletWindow internalPortletWindow,
+                              HttpServletRequest servletRequest) {
+        super(servletRequest);
+        this.container = container;
+        this.internalPortletWindow = internalPortletWindow;
+        this.portalContext = container.getRequiredContainerServices().getPortalContext();
+    }
+
+    // PortletRequest Impl -----------------------------------------------------
+
+    /**
+     * Determine whether or not the specified WindowState is allowed for this
+     * portlet.
+     *
+     * @param state the state in question
+     * @return true if the state is allowed.
+     */
+    public boolean isWindowStateAllowed(WindowState state) {
+        for (Enumeration en = portalContext.getSupportedWindowStates();
+             en.hasMoreElements();) {
+            if (en.nextElement().toString().equals(state.toString())) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public boolean isPortletModeAllowed(PortletMode mode) {
+        return (isPortletModeAllowedByPortlet(mode)
+            && isPortletModeAllowedByPortal(mode));
+    }
+
+    public PortletMode getPortletMode() {
+        return internalPortletWindow.getPortletMode();
+    }
+
+    public WindowState getWindowState() {
+        return internalPortletWindow.getWindowState();
+    }
+
+    public PortletSession getPortletSession() {
+        return getPortletSession(true);
+    }
+
+    /**
+     * Returns the portlet session.
+     * <p/>
+     * Note that since portlet request instance is created everytime the portlet
+     * container receives an incoming request, the portlet session instance held
+     * by the request instance is also re-created for each incoming request.
+     * </p>
+     */
+    public PortletSession getPortletSession(boolean create) {
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("Retreiving portlet session (create=" + create + ")");
+        }
+        //
+        // It is critical that we don't retrieve the portlet session until the
+        //   cross context dispatch has been completed.  If we do then we risk
+        //   having a cached version which is invalid for the context within
+        //   which it exists.
+        //
+        if (portletContext == null) {
+            throw new IllegalStateException(
+                EXCEPTIONS.getString("error.session.illegalState"));
+        }
+        //
+        // We must make sure that if the session has been invalidated (perhaps
+        //   through setMaxIntervalTimeout()) and the underlying request
+        //   returns null that we no longer use the cached version.
+        // We have to check (ourselves) if the session has exceeded its max
+        //   inactive interval. If so, we should invalidate the underlying
+        //   HttpSession and recreate a new one (if the create flag is set to
+        //   true) -- We just cannot depend on the implementation of
+        //   javax.servlet.http.HttpSession!
+        //
+        HttpSession httpSession = getHttpServletRequest().getSession(create);
+        if (httpSession != null) {
+            // HttpSession is not null does NOT mean that it is valid.
+            int maxInactiveInterval = httpSession.getMaxInactiveInterval();
+            long lastAccesstime = httpSession.getLastAccessedTime();//lastAccesstime checks added for PLUTO-436
+            if (maxInactiveInterval >= 0 && lastAccesstime > 0) {    // < 0 => Never expires.
+                long maxInactiveTime = httpSession.getMaxInactiveInterval() * 1000L;
+                long currentInactiveTime = System.currentTimeMillis() - lastAccesstime;
+                if (currentInactiveTime > maxInactiveTime) {
+                    if (LOG.isDebugEnabled()) {
+                        LOG.debug("The underlying HttpSession is expired and "
+                            + "should be invalidated.");
+                    }
+                    httpSession.invalidate();
+                    httpSession = getHttpServletRequest().getSession(create);
+                    //Added for PLUTO-436
+                    // a cached portletSession is no longer useable.
+                    // a new one will be created below.
+                    portletSession = null;
+                }
+            }
+        }
+
+        if (httpSession == null) {
+            if (LOG.isDebugEnabled()) {
+                LOG.debug("The underlying HttpSession is not available: "
+                    + "no session will be returned.");
+            }
+            return null;
+        }
+
+        //
+        // If we reach here, we are sure that the underlying HttpSession is
+        //   available. If we haven't created and cached a portlet session
+        //   instance, we will create and cache one now.
+        //
+        if (portletSession == null) {
+            if (LOG.isDebugEnabled()) {
+                LOG.debug("Creating new portlet session...");
+            }
+            portletSession = new PortletSessionImpl(
+                portletContext,
+                internalPortletWindow,
+                httpSession);
+        }
+        return portletSession;
+    }
+
+    public String getProperty(String name) throws IllegalArgumentException {
+        ArgumentUtility.validateNotNull("propertyName", name);
+        String property = this.getHttpServletRequest().getHeader(name);
+        if (property == null) {
+            Map propertyMap = container.getRequiredContainerServices()
+                .getPortalCallbackService()
+                .getRequestProperties(
+                    getHttpServletRequest(),
+                    internalPortletWindow);
+
+            if (propertyMap != null) {
+                String[] properties = (String[]) propertyMap.get(name);
+                if (properties != null && properties.length > 0) {
+                    property = properties[0];
+                }
+            }
+        }
+        return property;
+    }
+
+    public Enumeration getProperties(String name) {
+        ArgumentUtility.validateNotNull("propertyName", name);
+        Set v = new HashSet();
+        Enumeration props = this.getHttpServletRequest().getHeaders(name);
+        if (props != null) {
+            while (props.hasMoreElements()) {
+                v.add(props.nextElement());
+            }
+        }
+
+        // get properties from PropertyManager
+        Map map = container.getRequiredContainerServices()
+            .getPortalCallbackService()
+            .getRequestProperties(
+                getHttpServletRequest(),
+                internalPortletWindow);
+
+        if (map != null) {
+            String[] properties = (String[]) map.get(name);
+
+            if (properties != null) {
+                // add properties to vector
+                for (int i = 0; i < properties.length; i++) {
+                    v.add(properties[i]);
+                }
+            }
+        }
+
+        return new Enumerator(v.iterator());
+    }
+
+    public Enumeration getPropertyNames() {
+        Set v = new HashSet();
+
+        // get properties from PropertyManager
+        Map map = container.getRequiredContainerServices()
+            .getPortalCallbackService()
+            .getRequestProperties(getHttpServletRequest(), internalPortletWindow);
+
+        if (map != null) {
+            v.addAll(map.keySet());
+        }
+
+        // get properties from request header
+        Enumeration props = this.getHttpServletRequest().getHeaderNames();
+        if (props != null) {
+            while (props.hasMoreElements()) {
+                v.add(props.nextElement());
+            }
+        }
+
+        return new Enumerator(v.iterator());
+    }
+
+    public PortalContext getPortalContext() {
+        return container.getRequiredContainerServices().getPortalContext();
+    }
+
+    public String getAuthType() {
+        return this.getHttpServletRequest().getAuthType();
+    }
+
+    public String getContextPath() {
+        String contextPath = internalPortletWindow.getContextPath();
+        if ("/".equals(contextPath)) {
+            contextPath = "";
+        }
+        return contextPath;
+    }
+
+    public String getRemoteUser() {
+        return this.getHttpServletRequest().getRemoteUser();
+    }
+
+    public Principal getUserPrincipal() {
+        return this.getHttpServletRequest().getUserPrincipal();
+    }
+
+    /**
+     * Determines whether a user is mapped to the specified role.  As specified
+     * in PLT-20-3, we must reference the &lt;security-role-ref&gt; mappings
+     * within the deployment descriptor. If no mapping is available, then, and
+     * only then, do we check use the actual role name specified against the web
+     * application deployment descriptor.
+     *
+     * @param roleName the name of the role
+     * @return true if it is determined the user has the given role.
+     */
+    public boolean isUserInRole(String roleName) {
+        PortletEntity entity = internalPortletWindow.getPortletEntity();
+        PortletDD def = entity.getPortletDefinition();
+
+        SecurityRoleRefDD ref = null;
+        Iterator refs = def.getSecurityRoleRefs().iterator();
+        while (refs.hasNext()) {
+            SecurityRoleRefDD r = (SecurityRoleRefDD) refs.next();
+            if (r.getRoleName().equals(roleName)) {
+                ref = r;
+                break;
+            }
+        }
+
+        String link;
+        if (ref != null && ref.getRoleLink() != null) {
+            link = ref.getRoleLink();
+        } else {
+            link = roleName;
+        }
+
+        return this.getHttpServletRequest().isUserInRole(link);
+    }
+
+    public Object getAttribute(String name) {
+        ArgumentUtility.validateNotNull("attributeName", name);
+
+        if (PortletRequest.USER_INFO.equals(name)) {
+            return createUserInfoMap();
+        }
+
+        String encodedName = isNameReserved(name) ?
+            name :
+            mapper.encode(internalPortletWindow.getId(), name);
+
+        Object attribute = getHttpServletRequest()
+            .getAttribute(encodedName);
+
+        if (attribute == null) {
+            attribute = getHttpServletRequest().getAttribute(name);
+        }
+        return attribute;
+    }
+
+    public Enumeration getAttributeNames() {
+        Enumeration attributes = this.getHttpServletRequest()
+            .getAttributeNames();
+
+        Vector portletAttributes = new Vector();
+
+        while (attributes.hasMoreElements()) {
+            String attribute = (String) attributes.nextElement();
+            
+            //Fix for PLUTO-369
+            String portletAttribute = isNameReserved(attribute) ?
+            		attribute :
+            	mapper.decode(
+                internalPortletWindow.getId(), attribute);
+
+            if (portletAttribute != null) { // it is in the portlet's namespace
+                portletAttributes.add(portletAttribute);
+            }
+        }
+
+        return portletAttributes.elements();
+    }
+
+    public Map createUserInfoMap() {
+
+        Map userInfoMap = new HashMap();
+        try {
+
+            PortletAppDD dd = container.getOptionalContainerServices()
+                .getPortletRegistryService()
+                .getPortletApplicationDescriptor(internalPortletWindow.getContextPath());
+
+            Map allMap = container.getOptionalContainerServices()
+            	//PLUTO-388 fix:
+            	//The PortletWindow is currently ignored in the implementing class
+            	// See: org.apache.pluto.core.DefaultUserInfoService
+            	.getUserInfoService().getUserInfo( this, this.internalPortletWindow );
+
+            Iterator i = dd.getUserAttributes().iterator();
+            while(i.hasNext()) {
+                UserAttributeDD udd = (UserAttributeDD)i.next();
+                userInfoMap.put(udd.getName(), allMap.get(udd.getName()));
+            }
+        } catch (PortletContainerException e) {
+            LOG.warn("Unable to retrieve user attribute map for user " + getRemoteUser() + ".  Returning null.");
+            return null;
+        }
+
+        return Collections.unmodifiableMap(userInfoMap);
+    }
+
+    public String getParameter(String name) {
+        ArgumentUtility.validateNotNull("parameterName", name);
+        String[] values = (String[]) baseGetParameterMap().get(name);
+        if (values != null && values.length > 0) {
+            return values[0];
+        } else {
+            return null;
+        }
+    }
+
+    public Enumeration getParameterNames() {
+        return Collections.enumeration(baseGetParameterMap().keySet());
+    }
+
+    public String[] getParameterValues(String name) {
+        ArgumentUtility.validateNotNull("parameterName", name);
+        String[] values = (String[]) baseGetParameterMap().get(name);
+        if (values != null) {
+            values = StringUtils.copy(values);
+        }
+        return values;
+    }
+
+    public Map getParameterMap() {
+        return Collections.unmodifiableMap(StringUtils.copyParameters(baseGetParameterMap()));
+    }
+
+    public boolean isSecure() {
+        return this.getHttpServletRequest().isSecure();
+    }
+
+    public void setAttribute(String name, Object value) {
+        ArgumentUtility.validateNotNull("attributeName", name);
+        String encodedName = isNameReserved(name) ?
+            name : mapper.encode(internalPortletWindow.getId(), name);
+        if (value == null) {
+            removeAttribute(name);
+        } else {
+            getHttpServletRequest().setAttribute(encodedName, value);
+        }
+    }
+
+    public void removeAttribute(String name) {
+        ArgumentUtility.validateNotNull("attributeName", name);
+        String encodedName = isNameReserved(name) ?
+            name : mapper.encode(internalPortletWindow.getId(), name);
+        getHttpServletRequest().removeAttribute(encodedName);
+    }
+
+    public String getRequestedSessionId() {
+        return this.getHttpServletRequest().getRequestedSessionId();
+    }
+
+    public boolean isRequestedSessionIdValid() {
+        if (LOG.isDebugEnabled()) {
+            LOG.debug(" ***** IsRequestedSessionIdValid? " + getHttpServletRequest().isRequestedSessionIdValid());
+        }
+        return getHttpServletRequest().isRequestedSessionIdValid();
+    }
+
+    public String getResponseContentType() {
+        Enumeration enumeration = getResponseContentTypes();
+        while (enumeration.hasMoreElements()) {
+            return (String) enumeration.nextElement();
+        }
+        return "text/html";
+    }
+
+    public Enumeration getResponseContentTypes() {
+        if (contentTypes == null) {
+            contentTypes = new Vector();
+            PortletDD dd = internalPortletWindow.getPortletEntity().getPortletDefinition();
+            Iterator supports = dd.getSupports().iterator();
+            while (supports.hasNext()) {
+                SupportsDD sup = (SupportsDD) supports.next();
+                contentTypes.add(sup.getMimeType());
+            }
+            if (contentTypes.size() < 1) {
+                contentTypes.add("text/html");
+            }
+        }
+        return contentTypes.elements();
+    }
+
+    public Locale getLocale() {
+        return this.getHttpServletRequest().getLocale();
+    }
+
+    public Enumeration getLocales() {
+        return this.getHttpServletRequest().getLocales();
+    }
+
+    public String getScheme() {
+        return this.getHttpServletRequest().getScheme();
+    }
+
+    public String getServerName() {
+        return this.getHttpServletRequest().getServerName();
+    }
+
+    public int getServerPort() {
+        return this.getHttpServletRequest().getServerPort();
+    }
+
+    // Protected Methods -------------------------------------------------------
+
+    /**
+     * The base method that returns the parameter map in this portlet request.
+     * All parameter-related methods call this base method. Subclasses may just
+     * overwrite this protected method to change behavior of all parameter-
+     * related methods.
+     *
+     * @return the base parameter map from which parameters are retrieved.
+     */
+    protected Map baseGetParameterMap() {
+        bodyAccessed = true;
+        return this.getHttpServletRequest().getParameterMap();
+    }
+
+    protected void setBodyAccessed() {
+        bodyAccessed = true;
+    }
+
+    // InternalPortletRequest Impl ---------------------------------------------
+
+    public InternalPortletWindow getInternalPortletWindow() {
+        return internalPortletWindow;
+    }
+
+    public PortletContainer getPortletContainer() {
+        return container;
+    }
+
+    public HttpServletRequest getHttpServletRequest() {
+        return (HttpServletRequest) super.getRequest();
+    }
+
+    public void init(PortletContext portletContext, HttpServletRequest req) {
+        this.portletContext = portletContext;
+        setRequest(req);
+    }
+
+    /**
+     * TODO: Implement this properly.  Not required now
+     */
+    public void release() {
+        // TODO:
+    }
+
+    // TODO: Additional Methods of HttpServletRequestWrapper -------------------
+
+    public BufferedReader getReader()
+        throws UnsupportedEncodingException, IOException {
+        // the super class will ensure that a IllegalStateException is thrown
+        //   if getInputStream() was called earlier
+        BufferedReader reader = getHttpServletRequest().getReader();
+        bodyAccessed = true;
+        return reader;
+    }
+
+    public ServletInputStream getInputStream() throws IOException {
+        ServletInputStream stream = getHttpServletRequest().getInputStream();
+        bodyAccessed = true;
+        return stream;
+    }
+
+    public RequestDispatcher getRequestDispatcher(String path) {
+        return getHttpServletRequest().getRequestDispatcher(path);
+    }
+
+    /**
+     * TODO: why check bodyAccessed?
+     */
+    public void setCharacterEncoding(String encoding)
+        throws UnsupportedEncodingException {
+        if (bodyAccessed) {
+            throw new IllegalStateException("Cannot set character encoding "
+                + "after HTTP body is accessed.");
+        }
+        super.setCharacterEncoding(encoding);
+    }
+
+    // Private Methods ---------------------------------------------------------
+
+    /**
+     * Is this attribute name a reserved name (by the J2EE spec)?. Reserved
+     * names begin with "java." or "javax.".
+     *
+     * @return true if the name is reserved.
+     */
+    private boolean isNameReserved(String name) {
+        return name.startsWith("java.") || name.startsWith("javax.");
+    }
+
+    private boolean isPortletModeAllowedByPortlet(PortletMode mode) {
+        if (isPortletModeMandatory(mode)) {
+            return true;
+        }
+
+        PortletDD dd = internalPortletWindow.getPortletEntity()
+            .getPortletDefinition();
+
+        Iterator mimes = dd.getSupports().iterator();
+        while (mimes.hasNext()) {
+            Iterator modes = ((SupportsDD) mimes.next()).getPortletModes().iterator();
+            while (modes.hasNext()) {
+                String m = (String) modes.next();
+                if (m.equals(mode.toString())) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    private boolean isPortletModeAllowedByPortal(PortletMode mode) {
+        Enumeration supportedModes = portalContext.getSupportedPortletModes();
+        while (supportedModes.hasMoreElements()) {
+            if (supportedModes.nextElement().toString().equals(
+                (mode.toString()))) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private boolean isPortletModeMandatory(PortletMode mode) {
+        return PortletMode.VIEW.equals(mode) || PortletMode.EDIT.equals(mode) || PortletMode.HELP.equals(mode);
+    }
+}

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

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=607450&r1=607449&r2=607450&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 Sat Dec 29 09:31:56 2007
@@ -1,186 +1,186 @@
-/*
+/*
  * 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 java.io.IOException;
-import java.io.PrintWriter;
-
-import javax.portlet.PortletResponse;
-import javax.servlet.ServletOutputStream;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpServletResponseWrapper;
-
-import org.apache.pluto.PortletContainer;
-import org.apache.pluto.internal.InternalPortletResponse;
-import org.apache.pluto.internal.InternalPortletWindow;
-import org.apache.pluto.spi.ResourceURLProvider;
-import org.apache.pluto.util.ArgumentUtility;
-import org.apache.pluto.util.PrintWriterServletOutputStream;
-
-/**
- * Abstract <code>javax.portlet.PortletResponse</code> implementation.
- * This class also implements InternalPortletResponse.
- *
- */
-public abstract class PortletResponseImpl extends HttpServletResponseWrapper
-implements PortletResponse, InternalPortletResponse {
-
-	// Private Member Variables ------------------------------------------------
-
-	/** The portlet container. */
-    private PortletContainer container;
-
-    /** The internal portlet window. */
-    private InternalPortletWindow internalPortletWindow;
-
-    /** The servlet request of the target/portlet's web module. */
-    private HttpServletRequest httpServletRequest;
-
-    private boolean usingWriter;
-    private boolean usingStream;
-
-    private ServletOutputStream wrappedWriter;
-
-
-    // Constructor -------------------------------------------------------------
-
-    public PortletResponseImpl(PortletContainer container,
-                               InternalPortletWindow internalPortletWindow,
-                               HttpServletRequest servletRequest,
-                               HttpServletResponse servletResponse) {
-        super(servletResponse);
-        this.container = container;
-        this.httpServletRequest = servletRequest;
-        this.internalPortletWindow = internalPortletWindow;
-    }
-
-
-    // PortletResponse Impl ----------------------------------------------------
-
-    public void addProperty(String name, String value) {
-    	ArgumentUtility.validateNotNull("propertyName", name);
-        container.getRequiredContainerServices()
-        		.getPortalCallbackService()
-        		.addResponseProperty(
-        				getHttpServletRequest(),
-        				internalPortletWindow,
-        				name, value);
-    }
-
-    public void setProperty(String name, String value) {
-    	ArgumentUtility.validateNotNull("propertyName", name);
-        container.getRequiredContainerServices()
-                .getPortalCallbackService()
-                .setResponseProperty(
-                        getHttpServletRequest(),
-                        internalPortletWindow,
-                        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,
-        				internalPortletWindow);
-        if (path.indexOf("://") != -1) {
-            provider.setAbsoluteURL(path);
-        } else {
-            provider.setFullPath(path);
-        }
-        return getHttpServletResponse().encodeURL(provider.toString());
-    }
-
-
-    // InternalPortletResponse impl --------------------------------------------
-
-    public InternalPortletWindow getInternalPortletWindow() {
-        return internalPortletWindow;
-    }
-
-
-    // Internal Methods --------------------------------------------------------
-
-    /**
-     * Returns the portlet container.
-     * @return the portlet container.
-     */
-    protected PortletContainer getContainer() {
-        return container;
-    }
-
-    /**
-     * Returns the nested HttpServletRequest instance.
-     * @return the nested HttpServletRequest instance.
-     */
-    protected HttpServletRequest getHttpServletRequest() {
-        return httpServletRequest;
-    }
-
-    /**
-     * Returns the nested HttpServletResponse instance.
-     * @return the nested HttpServletResponse instance.
-     */
-    public HttpServletResponse getHttpServletResponse() {
-        return (HttpServletResponse) super.getResponse();
-    }
-
-
-    // HttpServletResponse Methods ---------------------------------------------
-
-    public String encodeUrl(String url) {
-        return this.encodeURL(url);
-    }
-
-    /**
-     * 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) {
-            wrappedWriter = new PrintWriterServletOutputStream(
-            		getHttpServletResponse().getWriter());
-        }
-        usingStream = true;
-        return wrappedWriter;
-    }
-
-    public PrintWriter getWriter()
-    throws IllegalStateException, IOException {
-        if (usingStream) {
-            throw new IllegalStateException(
-            		"getWriter can't be used "
-            		+ "after getOutputStream was invoked.");
-        }
-        usingWriter = true;
-        return getHttpServletResponse().getWriter();
-    }
-
-}
+ * 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 java.io.IOException;
+import java.io.PrintWriter;
+
+import javax.portlet.PortletResponse;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpServletResponseWrapper;
+
+import org.apache.pluto.PortletContainer;
+import org.apache.pluto.internal.InternalPortletResponse;
+import org.apache.pluto.internal.InternalPortletWindow;
+import org.apache.pluto.spi.ResourceURLProvider;
+import org.apache.pluto.util.ArgumentUtility;
+import org.apache.pluto.util.PrintWriterServletOutputStream;
+
+/**
+ * Abstract <code>javax.portlet.PortletResponse</code> implementation.
+ * This class also implements InternalPortletResponse.
+ *
+ */
+public abstract class PortletResponseImpl extends HttpServletResponseWrapper
+implements PortletResponse, InternalPortletResponse {
+
+	// Private Member Variables ------------------------------------------------
+
+	/** The portlet container. */
+    private PortletContainer container;
+
+    /** The internal portlet window. */
+    private InternalPortletWindow internalPortletWindow;
+
+    /** The servlet request of the target/portlet's web module. */
+    private HttpServletRequest httpServletRequest;
+
+    private boolean usingWriter;
+    private boolean usingStream;
+
+    private ServletOutputStream wrappedWriter;
+
+
+    // Constructor -------------------------------------------------------------
+
+    public PortletResponseImpl(PortletContainer container,
+                               InternalPortletWindow internalPortletWindow,
+                               HttpServletRequest servletRequest,
+                               HttpServletResponse servletResponse) {
+        super(servletResponse);
+        this.container = container;
+        this.httpServletRequest = servletRequest;
+        this.internalPortletWindow = internalPortletWindow;
+    }
+
+
+    // PortletResponse Impl ----------------------------------------------------
+
+    public void addProperty(String name, String value) {
+    	ArgumentUtility.validateNotNull("propertyName", name);
+        container.getRequiredContainerServices()
+        		.getPortalCallbackService()
+        		.addResponseProperty(
+        				getHttpServletRequest(),
+        				internalPortletWindow,
+        				name, value);
+    }
+
+    public void setProperty(String name, String value) {
+    	ArgumentUtility.validateNotNull("propertyName", name);
+        container.getRequiredContainerServices()
+                .getPortalCallbackService()
+                .setResponseProperty(
+                        getHttpServletRequest(),
+                        internalPortletWindow,
+                        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,
+        				internalPortletWindow);
+        if (path.indexOf("://") != -1) {
+            provider.setAbsoluteURL(path);
+        } else {
+            provider.setFullPath(path);
+        }
+        return getHttpServletResponse().encodeURL(provider.toString());
+    }
+
+
+    // InternalPortletResponse impl --------------------------------------------
+
+    public InternalPortletWindow getInternalPortletWindow() {
+        return internalPortletWindow;
+    }
+
+
+    // Internal Methods --------------------------------------------------------
+
+    /**
+     * Returns the portlet container.
+     * @return the portlet container.
+     */
+    protected PortletContainer getContainer() {
+        return container;
+    }
+
+    /**
+     * Returns the nested HttpServletRequest instance.
+     * @return the nested HttpServletRequest instance.
+     */
+    protected HttpServletRequest getHttpServletRequest() {
+        return httpServletRequest;
+    }
+
+    /**
+     * Returns the nested HttpServletResponse instance.
+     * @return the nested HttpServletResponse instance.
+     */
+    public HttpServletResponse getHttpServletResponse() {
+        return (HttpServletResponse) super.getResponse();
+    }
+
+
+    // HttpServletResponse Methods ---------------------------------------------
+
+    public String encodeUrl(String url) {
+        return this.encodeURL(url);
+    }
+
+    /**
+     * 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) {
+            wrappedWriter = new PrintWriterServletOutputStream(
+            		getHttpServletResponse().getWriter());
+        }
+        usingStream = true;
+        return wrappedWriter;
+    }
+
+    public PrintWriter getWriter()
+    throws IllegalStateException, IOException {
+        if (usingStream) {
+            throw new IllegalStateException(
+            		"getWriter can't be used "
+            		+ "after getOutputStream was invoked.");
+        }
+        usingWriter = true;
+        return getHttpServletResponse().getWriter();
+    }
+
+}

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

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=607450&r1=607449&r2=607450&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 Sat Dec 29 09:31:56 2007
@@ -1,280 +1,280 @@
-/*
+/*
  * 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 java.util.Enumeration;
-import java.util.Vector;
-
-import javax.portlet.PortletContext;
-import javax.portlet.PortletSession;
-import javax.portlet.PortletSessionUtil;
-import javax.servlet.http.HttpSessionContext;
-import javax.servlet.http.HttpSession;
-import javax.servlet.ServletContext;
-
-import org.apache.pluto.internal.InternalPortletWindow;
-import org.apache.pluto.util.ArgumentUtility;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-/**
- * Implementation of the <code>javax.portlet.PortletSession</code> interface.
- *
- */
-public class PortletSessionImpl implements PortletSession, HttpSession {
-
-	/** Logger. */
-    private static final Log LOG = LogFactory.getLog(PortletSessionImpl.class);
-
-    /** The default scope (<code>PORTLET_SCOPE</code>) for storing objects. */
-    private static final int DEFAULT_SCOPE = PortletSession.PORTLET_SCOPE;
-
-    /** The portlet scope namespace as defined in PLT. 15.3. */
-    private static final String PORTLET_SCOPE_NAMESPACE = "javax.portlet.p.";
-
-    /** The portlet window ID / attribute name separator as defined in PLT. 15.3. */
-    private static final char ID_NAME_SEPARATOR = '?';
-
-
-    // Private Member Variables ------------------------------------------------
-
-    /** The wrapped HttpSession object. */
-    private HttpSession httpSession;
-
-    /** The portlet context. */
-    private PortletContext portletContext;
-
-    /** The internal portlet window. */
-    private InternalPortletWindow internalPortletWindow;
-
-
-    // Constructor -------------------------------------------------------------
-
-    /**
-     * Constructs an instance.
-     */
-    public PortletSessionImpl(PortletContext portletContext,
-                              InternalPortletWindow internalPortletWindow,
-                              HttpSession httpSession) {
-        this.portletContext = portletContext;
-        this.internalPortletWindow = internalPortletWindow;
-        this.httpSession = httpSession;
-    }
-
-
-    // PortletSession Impl: Attributes -----------------------------------------
-
-    public Object getAttribute(String name) {
-        return getAttribute(name, DEFAULT_SCOPE);
-    }
-
-    /**
-     * Returns the attribute of the specified name under the given scope.
-     *
-     * @param name  the attribute name.
-     * @param scope  the scope under which the attribute object is stored.
-     * @return the attribute object.
-     */
-    public Object getAttribute(String name, int scope) {
-    	ArgumentUtility.validateNotNull("attributeName", name);
-    	String key = (scope == PortletSession.APPLICATION_SCOPE)
-    			? name : createPortletScopedId(name);
-    	return httpSession.getAttribute(key);
-    }
-
-    public Enumeration getAttributeNames() {
-        return getAttributeNames(DEFAULT_SCOPE);
-    }
-
-    public Enumeration getAttributeNames(int scope) {
-    	// Return all attribute names in the nested HttpSession object.
-        if (scope == PortletSession.APPLICATION_SCOPE) {
-            return httpSession.getAttributeNames();
-        }
-        // Return attribute names with the portlet-scoped prefix.
-        else {
-            Vector portletScopedNames = new Vector();
-            for (Enumeration en = httpSession.getAttributeNames();
-            		en.hasMoreElements(); ) {
-            	String name = (String) en.nextElement();
-                if (isInCurrentPortletScope(name)) {
-                	portletScopedNames.add(
-                			PortletSessionUtil.decodeAttributeName(name));
-                }
-           }
-            return portletScopedNames.elements();
-        }
-    }
-
-    public void removeAttribute(String name) {
-        removeAttribute(name, DEFAULT_SCOPE);
-    }
-
-    public void removeAttribute(String name, int scope) {
-    	ArgumentUtility.validateNotNull("attributeName", name);
-    	if (scope == PortletSession.APPLICATION_SCOPE) {
-    		httpSession.removeAttribute(name);
-    	} else {
-    		httpSession.removeAttribute(createPortletScopedId(name));
-    	}
-    }
-
-    public void setAttribute(String name, Object value) {
-        setAttribute(name, value, DEFAULT_SCOPE);
-    }
-
-    public void setAttribute(String name, Object value, int scope) {
-    	ArgumentUtility.validateNotNull("attributeName", name);
-    	if (scope == PortletSession.APPLICATION_SCOPE) {
-    		httpSession.setAttribute(name, value);
-    	} else {
-    		httpSession.setAttribute(createPortletScopedId(name),  value);
-    	}
-    }
-
-
-    // PortletSession Impl: Other Methods --------------------------------------
-
-    public PortletContext getPortletContext() {
-        return portletContext;
-    }
-
-    public long getCreationTime() {
-        return httpSession.getCreationTime();
-    }
-
-    public String getId() {
-        return httpSession.getId();
-    }
-
-    public long getLastAccessedTime() {
-        return httpSession.getLastAccessedTime();
-    }
-
-    public int getMaxInactiveInterval() {
-        return httpSession.getMaxInactiveInterval();
-    }
-
-    public void invalidate() throws IllegalStateException {
-        httpSession.invalidate();
-    }
-
-    public boolean isNew() throws IllegalStateException {
-        return httpSession.isNew();
-    }
-
-    /**
-     * Specifies the time, in seconds, between client requests, before the
-     * portlet container invalidates this session. A negative time indicates
-     * the session should never timeout.
-     * <p>
-     * [Portlet Spec. PLT. 15.4.] If the PortletSession object is invalidated
-     * by a portlet, the portlet container must invalidate the associated
-     * HttpSession object.
-     * </p>
-     * @param interval  an integer specifying the number of seconds.
-     */
-    public void setMaxInactiveInterval(int interval) {
-        httpSession.setMaxInactiveInterval(interval);
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("Session timeout set to: " + interval);
-        }
-    }
-
-
-    // Private Methods ---------------------------------------------------------
-
-    /**
-     * Creates portlet-scoped ID for the specified attribute name.
-     * Portlet-scoped ID for a given attribute name has the following form:
-     * <code>javax.portlet.p.&lt;ID&gt;?&lt;name&gt;</code>
-     * where <code>ID</code> is a unique identification for the portlet window
-     * (assigned by the portal/portlet-container) that must not contain a '?'
-     * character. <code>name</code> is the attribute name.
-     * <p>
-     * Refer to Portlet Specification PLT. 15.3 for more details.
-     * </p>
-     * @param name  the attribute name.
-     * @return portlet-scoped ID for the attribute name.
-     */
-    private String createPortletScopedId(String name) {
-    	StringBuffer buffer = new StringBuffer();
-    	buffer.append(PORTLET_SCOPE_NAMESPACE);
-    	buffer.append(internalPortletWindow.getId().getStringId());
-    	buffer.append(ID_NAME_SEPARATOR);
-    	buffer.append(name);
-    	return buffer.toString();
-    }
-
-    /**
-     * Checks if the attribute name in APPLICATION_SCOPE is in the current
-     * portlet scope.
-     * @param name  the attribute name to check.
-     * @return true if the attribute name is in the current portlet scope.
-     * @see #createPortletScopedId(String)
-     */
-    private boolean isInCurrentPortletScope(String name) {
-    	// Portlet-scoped attribute names MUST start with "javax.portlet.p.",
-    	//   and contain the ID-name separator '?'.
-    	if (name.startsWith(PORTLET_SCOPE_NAMESPACE)
-    			&& name.indexOf(ID_NAME_SEPARATOR) > -1) {
-        	String id = name.substring(PORTLET_SCOPE_NAMESPACE.length(),
-        	                           name.indexOf(ID_NAME_SEPARATOR));
-        	return (id.equals(internalPortletWindow.getId().getStringId()));
-        }
-    	// Application-scoped attribute names are not in portlet scope.
-    	else {
-        	return false;
-        }
-    }
-
-
-    // HttpSession Impl --------------------------------------------------------
-
-    public ServletContext getServletContext() {
-        return httpSession.getServletContext();
-    }
-
-    /**
-     * DEPRECATED: implemented for backwards compatability with HttpSession.
-     * @deprecated
-     */
-    public HttpSessionContext getSessionContext() {
-        return httpSession.getSessionContext();
-    }
-
-    public Object getValue(String name) {
-        return this.getAttribute(name, DEFAULT_SCOPE);
-    }
-
-    /**
-     * DEPRECATED: Implemented for backwards compatibility with HttpSession.
-     * @deprecated
-     */
-    public String[] getValueNames() {
-        return httpSession.getValueNames();
-    }
-
-    public void putValue(String name, Object value) {
-        this.setAttribute(name, value, DEFAULT_SCOPE);
-    }
-
-    public void removeValue(String name) {
-        this.removeAttribute(name, DEFAULT_SCOPE);
-    }
-
-}
+ * 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 java.util.Enumeration;
+import java.util.Vector;
+
+import javax.portlet.PortletContext;
+import javax.portlet.PortletSession;
+import javax.portlet.PortletSessionUtil;
+import javax.servlet.http.HttpSessionContext;
+import javax.servlet.http.HttpSession;
+import javax.servlet.ServletContext;
+
+import org.apache.pluto.internal.InternalPortletWindow;
+import org.apache.pluto.util.ArgumentUtility;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * Implementation of the <code>javax.portlet.PortletSession</code> interface.
+ *
+ */
+public class PortletSessionImpl implements PortletSession, HttpSession {
+
+	/** Logger. */
+    private static final Log LOG = LogFactory.getLog(PortletSessionImpl.class);
+
+    /** The default scope (<code>PORTLET_SCOPE</code>) for storing objects. */
+    private static final int DEFAULT_SCOPE = PortletSession.PORTLET_SCOPE;
+
+    /** The portlet scope namespace as defined in PLT. 15.3. */
+    private static final String PORTLET_SCOPE_NAMESPACE = "javax.portlet.p.";
+
+    /** The portlet window ID / attribute name separator as defined in PLT. 15.3. */
+    private static final char ID_NAME_SEPARATOR = '?';
+
+
+    // Private Member Variables ------------------------------------------------
+
+    /** The wrapped HttpSession object. */
+    private HttpSession httpSession;
+
+    /** The portlet context. */
+    private PortletContext portletContext;
+
+    /** The internal portlet window. */
+    private InternalPortletWindow internalPortletWindow;
+
+
+    // Constructor -------------------------------------------------------------
+
+    /**
+     * Constructs an instance.
+     */
+    public PortletSessionImpl(PortletContext portletContext,
+                              InternalPortletWindow internalPortletWindow,
+                              HttpSession httpSession) {
+        this.portletContext = portletContext;
+        this.internalPortletWindow = internalPortletWindow;
+        this.httpSession = httpSession;
+    }
+
+
+    // PortletSession Impl: Attributes -----------------------------------------
+
+    public Object getAttribute(String name) {
+        return getAttribute(name, DEFAULT_SCOPE);
+    }
+
+    /**
+     * Returns the attribute of the specified name under the given scope.
+     *
+     * @param name  the attribute name.
+     * @param scope  the scope under which the attribute object is stored.
+     * @return the attribute object.
+     */
+    public Object getAttribute(String name, int scope) {
+    	ArgumentUtility.validateNotNull("attributeName", name);
+    	String key = (scope == PortletSession.APPLICATION_SCOPE)
+    			? name : createPortletScopedId(name);
+    	return httpSession.getAttribute(key);
+    }
+
+    public Enumeration getAttributeNames() {
+        return getAttributeNames(DEFAULT_SCOPE);
+    }
+
+    public Enumeration getAttributeNames(int scope) {
+    	// Return all attribute names in the nested HttpSession object.
+        if (scope == PortletSession.APPLICATION_SCOPE) {
+            return httpSession.getAttributeNames();
+        }
+        // Return attribute names with the portlet-scoped prefix.
+        else {
+            Vector portletScopedNames = new Vector();
+            for (Enumeration en = httpSession.getAttributeNames();
+            		en.hasMoreElements(); ) {
+            	String name = (String) en.nextElement();
+                if (isInCurrentPortletScope(name)) {
+                	portletScopedNames.add(
+                			PortletSessionUtil.decodeAttributeName(name));
+                }
+           }
+            return portletScopedNames.elements();
+        }
+    }
+
+    public void removeAttribute(String name) {
+        removeAttribute(name, DEFAULT_SCOPE);
+    }
+
+    public void removeAttribute(String name, int scope) {
+    	ArgumentUtility.validateNotNull("attributeName", name);
+    	if (scope == PortletSession.APPLICATION_SCOPE) {
+    		httpSession.removeAttribute(name);
+    	} else {
+    		httpSession.removeAttribute(createPortletScopedId(name));
+    	}
+    }
+
+    public void setAttribute(String name, Object value) {
+        setAttribute(name, value, DEFAULT_SCOPE);
+    }
+
+    public void setAttribute(String name, Object value, int scope) {
+    	ArgumentUtility.validateNotNull("attributeName", name);
+    	if (scope == PortletSession.APPLICATION_SCOPE) {
+    		httpSession.setAttribute(name, value);
+    	} else {
+    		httpSession.setAttribute(createPortletScopedId(name),  value);
+    	}
+    }
+
+
+    // PortletSession Impl: Other Methods --------------------------------------
+
+    public PortletContext getPortletContext() {
+        return portletContext;
+    }
+
+    public long getCreationTime() {
+        return httpSession.getCreationTime();
+    }
+
+    public String getId() {
+        return httpSession.getId();
+    }
+
+    public long getLastAccessedTime() {
+        return httpSession.getLastAccessedTime();
+    }
+
+    public int getMaxInactiveInterval() {
+        return httpSession.getMaxInactiveInterval();
+    }
+
+    public void invalidate() throws IllegalStateException {
+        httpSession.invalidate();
+    }
+
+    public boolean isNew() throws IllegalStateException {
+        return httpSession.isNew();
+    }
+
+    /**
+     * Specifies the time, in seconds, between client requests, before the
+     * portlet container invalidates this session. A negative time indicates
+     * the session should never timeout.
+     * <p>
+     * [Portlet Spec. PLT. 15.4.] If the PortletSession object is invalidated
+     * by a portlet, the portlet container must invalidate the associated
+     * HttpSession object.
+     * </p>
+     * @param interval  an integer specifying the number of seconds.
+     */
+    public void setMaxInactiveInterval(int interval) {
+        httpSession.setMaxInactiveInterval(interval);
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("Session timeout set to: " + interval);
+        }
+    }
+
+
+    // Private Methods ---------------------------------------------------------
+
+    /**
+     * Creates portlet-scoped ID for the specified attribute name.
+     * Portlet-scoped ID for a given attribute name has the following form:
+     * <code>javax.portlet.p.&lt;ID&gt;?&lt;name&gt;</code>
+     * where <code>ID</code> is a unique identification for the portlet window
+     * (assigned by the portal/portlet-container) that must not contain a '?'
+     * character. <code>name</code> is the attribute name.
+     * <p>
+     * Refer to Portlet Specification PLT. 15.3 for more details.
+     * </p>
+     * @param name  the attribute name.
+     * @return portlet-scoped ID for the attribute name.
+     */
+    private String createPortletScopedId(String name) {
+    	StringBuffer buffer = new StringBuffer();
+    	buffer.append(PORTLET_SCOPE_NAMESPACE);
+    	buffer.append(internalPortletWindow.getId().getStringId());
+    	buffer.append(ID_NAME_SEPARATOR);
+    	buffer.append(name);
+    	return buffer.toString();
+    }
+
+    /**
+     * Checks if the attribute name in APPLICATION_SCOPE is in the current
+     * portlet scope.
+     * @param name  the attribute name to check.
+     * @return true if the attribute name is in the current portlet scope.
+     * @see #createPortletScopedId(String)
+     */
+    private boolean isInCurrentPortletScope(String name) {
+    	// Portlet-scoped attribute names MUST start with "javax.portlet.p.",
+    	//   and contain the ID-name separator '?'.
+    	if (name.startsWith(PORTLET_SCOPE_NAMESPACE)
+    			&& name.indexOf(ID_NAME_SEPARATOR) > -1) {
+        	String id = name.substring(PORTLET_SCOPE_NAMESPACE.length(),
+        	                           name.indexOf(ID_NAME_SEPARATOR));
+        	return (id.equals(internalPortletWindow.getId().getStringId()));
+        }
+    	// Application-scoped attribute names are not in portlet scope.
+    	else {
+        	return false;
+        }
+    }
+
+
+    // HttpSession Impl --------------------------------------------------------
+
+    public ServletContext getServletContext() {
+        return httpSession.getServletContext();
+    }
+
+    /**
+     * DEPRECATED: implemented for backwards compatability with HttpSession.
+     * @deprecated
+     */
+    public HttpSessionContext getSessionContext() {
+        return httpSession.getSessionContext();
+    }
+
+    public Object getValue(String name) {
+        return this.getAttribute(name, DEFAULT_SCOPE);
+    }
+
+    /**
+     * DEPRECATED: Implemented for backwards compatibility with HttpSession.
+     * @deprecated
+     */
+    public String[] getValueNames() {
+        return httpSession.getValueNames();
+    }
+
+    public void putValue(String name, Object value) {
+        this.setAttribute(name, value, DEFAULT_SCOPE);
+    }
+
+    public void removeValue(String name) {
+        this.removeAttribute(name, DEFAULT_SCOPE);
+    }
+
+}

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