⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stateawareresponseimpl.java

📁 portal越来越流行了
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/*
 * 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 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.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.util.StringUtils;

/**
 * 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, (String[])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});
	        }
	        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,StringUtils.copy(values));
		    }
		    else{
		    	renderParameters.put(key, StringUtils.copy(values));
		    }
	    }
	    else{
	    	renderParameters.put(key, StringUtils.copy(values));
	    }
    }
    // --------------------------------------------------------------------------------------------
    
    // 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;
    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -