org.apache.pluto.driver.util.PageState.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.pluto.driver.util.PageState.java

Source

/*  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.driver.util;

import java.util.Collection;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import javax.portlet.PortletConfig;
import javax.portlet.PortletMode;
import javax.portlet.WindowState;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang3.StringEscapeUtils;
import org.apache.pluto.driver.AttributeKeys;
import org.apache.pluto.driver.config.DriverConfiguration;
import org.apache.pluto.driver.core.PortalRequestContext;
import org.apache.pluto.driver.services.portal.PageConfig;
import org.apache.pluto.driver.services.portal.PublicRenderParameterMapper;
import org.apache.pluto.driver.url.PortalURL;
import org.apache.pluto.driver.url.PortalURLParameter;
import org.apache.pluto.driver.url.PortalURLPublicParameter;
import org.springframework.security.web.csrf.CsrfToken;

/**
 * @author Scott Nicklous
 * @author Neil Griffin
 * 
 * This is a utility class that collects all data needed by the portlet
 * hub in one location. The data is formatted appropriately for transmission to 
 * the client.
 *
 */
public class PageState {

    private CsrfToken csrfToken;
    private DriverConfiguration drvrConfig;
    private PageConfig pageConfig;
    private PortalRequestContext portalRC;
    private PortalURL portalUrl;
    private ServletContext servletContext;
    private Map<String, RenderData> renderDataMap;

    /**
     * Constructor. Access the classes containing the necessary data.
     *  
     * @param request
     */
    public PageState(HttpServletRequest request) {
        portalRC = PortalRequestContext.getContext(request);
        portalUrl = portalRC.getRequestedPortalURL();
        drvrConfig = (DriverConfiguration) portalRC.getServletContext().getAttribute(AttributeKeys.DRIVER_CONFIG);
        servletContext = portalRC.getServletContext();
        pageConfig = portalUrl.getPageConfig(servletContext);
        csrfToken = (CsrfToken) request.getAttribute(CsrfToken.class.getName());
    }

    public PageState(HttpServletRequest request, Map<String, RenderData> renderDataMap) {
        this(request);
        this.renderDataMap = renderDataMap;
    }

    public String getCsrfParameterName() {
        if (csrfToken == null) {
            return "";
        }

        return csrfToken.getParameterName();
    }

    public String getCsrfParameterValue() {
        if (csrfToken == null) {
            return "";
        }

        return csrfToken.getToken();
    }

    /**
     * Returns the portal URL parameters that are set on the current URL.
     * 
     * @return
     */
    public Collection<PortalURLParameter> getParameters() {
        return portalUrl.getParameters();
    }

    /**
     * Returns the public render parameters set on the current URL.
     * 
     * @return
     */
    public Map<String, String[]> getPublicParameters() {
        Map<String, String[]> tmp = new HashMap<String, String[]>();
        PublicRenderParameterMapper prpMapper = portalUrl.getPublicRenderParameterMapper();
        if (prpMapper != null) {
            for (int ind : prpMapper.getActiveIndexes()) {
                String name = prpMapper.getPublicParameterGroup(ind).get(0).getName();
                String[] vals = prpMapper.getValues(ind);
                tmp.put(name, vals);
            }
        }
        return tmp;
    }

    /**
     * Returns a collection containing the portlet IDs for the portlets on the page.
     * 
     * @return
     */
    public Collection<String> getPortletIds() {
        return pageConfig.getPortletIds();
    }

    /**
     * Returns a Pluto namespace string for the input portlet ID.
     * @param   portletId
     * @return  namespace string for the portlet ID
     */
    public String getNameSpace(String portletId) {
        StringBuffer ns = new StringBuffer("Pluto_");
        for (int ii = 0; ii < portletId.length(); ii++) {
            if (Character.isJavaIdentifierPart(portletId.charAt(ii))) {
                ns.append(portletId.charAt(ii));
            } else {
                ns.append("_");
            }
        }
        ns.append("_");
        return ns.toString();
    }

    /**
     * Returns the public render parameter names for the portlet ID as a set.
     * @param   portletId  
     * @return  Set of string public render parameter names
     */
    public Set<String> getPRPNames(String portletId) {
        Set<String> prpnames = new HashSet<String>();
        PortletConfig pc = null;

        try {
            pc = drvrConfig.getPortletConfig(portletId);
            Enumeration<String> prps = pc.getPublicRenderParameterNames();
            while (prps.hasMoreElements()) {
                String prp = prps.nextElement();
                prpnames.add(prp);
            }
        } catch (Exception e) {
        }
        return prpnames;
    }

    /**
     * Returns the public render parameter names for the portlet ID as a 
     * delimited string that can be used in a JSON array.
     * @param   portletId  
     * @return  Delimited string of public render parameter names
     */
    public String getPRPNamesAsString(String portletId) {
        PortletConfig pc = null;
        StringBuffer prpstring = new StringBuffer();
        ;

        String sep = "";
        try {
            pc = drvrConfig.getPortletConfig(portletId);
            Enumeration<String> prps = pc.getPublicRenderParameterNames();
            while (prps.hasMoreElements()) {
                String prp = prps.nextElement();
                prpstring.append(sep + "\"" + prp + "\"");
                sep = ", ";
            }
        } catch (Exception e) {
        }
        return prpstring.toString();
    }

    /**
     * Returns the supported portlet mode names for the portlet ID as a 
     * delimited string that can be used in a JSON array.
     * @param   portletId  
     * @return  Delimited string of portlet mode names
     */
    public String getPortletModesAsString(String portletId) {
        StringBuffer pmstring = new StringBuffer();
        try {
            Set<PortletMode> allowedPMs = drvrConfig.getSupportedPortletModes(portletId);
            String sep = "";
            for (PortletMode pm : allowedPMs) {
                pmstring.append(sep + "\"" + pm.toString() + "\"");
                sep = ", ";
            }
        } catch (Exception e) {
        }
        return pmstring.toString();
    }

    /**
     * Returns the supported window state names for the portlet ID as a 
     * delimited string that can be used in a JSON array.
     * @param   portletId  
     * @return  Delimited string of window state names
     */
    public String getWindowStatesAsString(String portletId) {
        StringBuffer wsstring = new StringBuffer();
        try {
            Set<WindowState> allowedWSs = drvrConfig.getSupportedWindowStates(portletId, "text/html");
            String sep = "";
            for (WindowState ws : allowedWSs) {
                wsstring.append(sep + "\"" + ws.toString() + "\"");
                sep = ", ";
            }
        } catch (Exception e) {
        }
        return wsstring.toString();
    }

    /**
     * Returns the current portlet mode for the portlet
     * 
     * @param portletId
     * @return
     */
    public String getPortletMode(String portletId) {
        return portalUrl.getPortletMode(portletId).toString();
    }

    /**
     * Returns the current window state for the portlet
     * 
     * @param portletId
     * @return
     */
    public String getWindowState(String portletId) {
        return portalUrl.getWindowState(portletId).toString();
    }

    /**
     * Returns a relative base base as needed by the portlet hub to generate
     * URLs. Must be encoded by the caller.
     * 
     * @return
     */
    public String getUrlBase() {
        StringBuffer ub = new StringBuffer();
        ub.append(portalUrl.getServletPath().startsWith("/") ? "" : "/").append(portalUrl.getServletPath())
                .append(portalUrl.getRenderPath());
        return ub.toString();
    }

    /**
     * Returns the page state needed by the portlet hub as a JSON string suitable
     * for transport to the client.
     * 
     * @return  JSON string representing the current page state
     */
    public String toJSONString() {
        StringBuffer json = new StringBuffer(1024);
        json.append("{\"portlets\" : {\n");

        Collection<PortalURLParameter> pups = getParameters();
        Map<String, String[]> pubparms = getPublicParameters();
        PublicRenderParameterMapper mapper = portalUrl.getPublicRenderParameterMapper();
        int numGroups = mapper.getNumberOfGroups();

        boolean sep = false;
        for (String pid : getPortletIds()) {
            if (sep) {
                json.append(",\n");
            }
            sep = true;
            json.append("   \"" + getNameSpace(pid) + "\" : {\n");
            json.append("      \"state\" : {\n");
            json.append("         \"parameters\" : {\n");

            // Add the portlet parameters
            String c1 = "            \"";
            for (PortalURLParameter pup : pups) {
                if (pup.getWindowId().equals(pid)) {
                    json.append(c1 + pup.getName() + "\" : [");
                    String c2 = "";
                    for (String val : pup.getValues()) {
                        json.append(c2 + " \"" + val + "\"");
                        c2 = ",";
                    }
                    json.append("]");
                    c1 = ",\n            \"";
                }
            }

            // Add the public render parameter values for this portlet

            for (PortalURLPublicParameter prp : mapper.getPRPsForWindow(pid, true)) {
                json.append(c1 + prp.getName() + "\" : [");
                String c2 = "";
                for (String val : prp.getValues()) {
                    json.append(c2 + " \"" + val + "\"");
                    c2 = ",";
                }
                json.append("]");
                c1 = ",\n            \"";
            }

            //          Set<String> prpnames = getPRPNames(pid);
            //          for (String prp : pubparms.keySet()) {
            //             if (prpnames.contains(prp)) {
            //                json.append(c1 + prp + "\" : [");
            //                String c2 = "";
            //                for (String val : (String[])pubparms.get(prp)) {
            //                   json.append(c2 + " \"" + val + "\"");
            //                   c2 = ",";
            //                }
            //                json.append("]");
            //                c1 = ",\n            \"";
            //             }
            //          }

            json.append("         }, \n");
            json.append("         \"portletMode\" : \"" + getPortletMode(pid) + "\", \n");
            json.append("         \"windowState\" : \"" + getWindowState(pid) + "\"\n");
            json.append("      },\n");
            //          json.append("      \"pubParms\" : [" + getPRPNamesAsString(pid) + "],\n");

            json.append("      \"pubParms\" : {");
            String c2 = "";
            for (PortalURLPublicParameter prp : mapper.getPRPsForWindow(pid, false)) {
                int group = mapper.getIndex(prp);
                json.append(c2);
                json.append("\"");
                json.append(prp.getName());
                json.append("\" : \"");
                json.append(String.valueOf(group));
                json.append("\"");
                c2 = ", ";
            }
            json.append("},\n");

            json.append("      \"allowedPM\" : [" + getPortletModesAsString(pid) + "],\n");
            json.append("      \"allowedWS\" : [" + getWindowStatesAsString(pid) + "],\n");
            json.append("      \"renderData\" : {\n");

            RenderData renderData = null;
            if (renderDataMap != null) {
                renderData = renderDataMap.get(pid);
            }
            if (renderData == null) {
                json.append("         \"content\" : null,\n");
                json.append("         \"mimeType\" : \"text/plain\"\n");
            } else {
                json.append("         \"content\" : \"");
                String content = StringEscapeUtils.escapeJson(renderData.getContent());
                json.append(content);
                json.append("\",\n");
                json.append("         \"mimeType\" : \"");
                json.append(renderData.getContentType());
                json.append("\"\n");
            }
            json.append("      },\n");
            json.append("      \"urlpid\" : \"" + pid + "\"\n");
            json.append("   }");
        }

        json.append("\n},\n\"prpMap\" : {");
        String sep1 = "";
        for (int ii = 0; ii < mapper.getNumberOfGroups(); ii++) {
            json.append(sep1).append("\n   \"").append(String.valueOf(ii)).append("\" : {");
            sep1 = ",";
            String sep2 = "";
            for (PortalURLPublicParameter prp : mapper.getPublicParameterGroup(ii)) {
                json.append(sep2).append("\n      \"").append(getNameSpace(prp.getWindowId())).append("\" : \"")
                        .append(prp.getName()).append("\"");
                sep2 = ", ";
            }
            json.append("   }");
        }
        json.append("\n}}");

        return json.toString();
    }
}