📄 portalurlparserimpl.java.svn-base
字号:
/* * 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.url.impl;import java.io.UnsupportedEncodingException;import java.net.URLDecoder;import java.net.URLEncoder;import java.util.Iterator;import java.util.Map;import java.util.StringTokenizer;import javax.portlet.PortletMode;import javax.portlet.WindowState;import javax.servlet.http.HttpServletRequest;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.apache.pluto.driver.url.PortalURL;import org.apache.pluto.driver.url.PortalURLParameter;import org.apache.pluto.driver.url.PortalURLParser;import org.apache.pluto.util.StringUtils;/** * @version 1.0 * @since Sep 30, 2004 */public class PortalURLParserImpl implements PortalURLParser { /** Logger. */ private static final Log LOG = LogFactory.getLog(PortalURLParserImpl.class); /** The singleton parser instance. */ private static final PortalURLParser PARSER = new PortalURLParserImpl(); // Constants used for Encoding/Decoding ------------------------------------ private static final String PREFIX = "__"; private static final String DELIM = "_"; private static final String PORTLET_ID = "pd"; private static final String ACTION = "ac"; private static final String RESOURCE = "rs"; private static final String RENDER_PARAM = "rp"; private static final String PUBLIC_RENDER_PARAM = "sp"; private static final String WINDOW_STATE = "ws"; private static final String PORTLET_MODE = "pm"; private static final String VALUE_DELIM = "0x0"; //This is a list of characters that need to be encoded to be protected //The ? is necessary to protect URI's with a query portion that is being passed as a parameter private static final String[][] ENCODINGS = new String[][] { new String[] { "_", "0x1" }, new String[] { ".", "0x2" }, new String[] { "/", "0x3" }, new String[] { "\r", "0x4" }, new String[] { "\n", "0x5" }, new String[] { "<", "0x6" }, new String[] { ">", "0x7" }, new String[] { " ", "0x8" }, new String[] { "#", "0x9" }, new String[] { "?", "0xa" }, new String[] { "\\", "0xb" }, new String[] { "%", "0xc" }, }; // Constructor ------------------------------------------------------------- /** * Private constructor that prevents external instantiation. */ private PortalURLParserImpl() { // Do nothing. } /** * Returns the singleton parser instance. * @return the singleton parser instance. */ public static PortalURLParser getParser() { return PARSER; } // Public Methods ---------------------------------------------------------- /** * Parse a servlet request to a portal URL. * @param request the servlet request to parse. * @return the portal URL. */ public PortalURL parse(HttpServletRequest request) { if (LOG.isDebugEnabled()) { LOG.debug("Parsing URL: " + request.getRequestURI()); } String contextPath = request.getContextPath(); String servletName = request.getServletPath(); // Construct portal URL using info retrieved from servlet request. PortalURL portalURL = new RelativePortalURLImpl(contextPath, servletName, this); // Support added for filter. Should we seperate into a different impl? String pathInfo = request.getPathInfo(); if (pathInfo == null) { if(servletName.contains(".jsp") && !servletName.endsWith(".jsp")) { int idx = servletName.indexOf(".jsp")+".jsp".length(); pathInfo = servletName.substring(idx); servletName = servletName.substring(0, idx); portalURL = new RelativePortalURLImpl(contextPath, servletName, this); } else { return portalURL; } } if (LOG.isDebugEnabled()) { LOG.debug("Parsing request pathInfo: " + pathInfo); } StringBuffer renderPath = new StringBuffer(); StringTokenizer st = new StringTokenizer(pathInfo, "/", false); while (st.hasMoreTokens()) { String token = st.nextToken(); // Part of the render path: append to renderPath. if (!token.startsWith(PREFIX)) {// renderPath.append(token); //Fix for PLUTO-243 renderPath.append('/').append(token); }// Resource window definition: portalURL.setResourceWindow(). else if (token.startsWith(PREFIX + RESOURCE)) { portalURL.setResourceWindow(decodeControlParameter(token)[0]); } // Action window definition: portalURL.setActionWindow(). else if (token.startsWith(PREFIX + ACTION)) { portalURL.setActionWindow(decodeControlParameter(token)[0]); } // Window state definition: portalURL.setWindowState(). else if (token.startsWith(PREFIX + WINDOW_STATE)) { String[] decoded = decodeControlParameter(token); portalURL.setWindowState(decoded[0], new WindowState(decoded[1])); } // Portlet mode definition: portalURL.setPortletMode(). else if (token.startsWith(PREFIX + PORTLET_MODE)) { String[] decoded = decodeControlParameter(token); portalURL.setPortletMode(decoded[0], new PortletMode(decoded[1])); } // Portal URL parameter: portalURL.addParameter(). else if(token.startsWith(PREFIX + RENDER_PARAM)) { String value = null; if (st.hasMoreTokens()) { value = st.nextToken(); } //set the PortalURLParameter param = decodeParameter(token, value); portalURL.addParameter(param); } else{ // besser if PREFIX + PUBLIC_PARAM String value = null; if (st.hasMoreTokens()) { value = st.nextToken(); } PortalURLParameter param = decodePublicParameter(token, value); if( param != null ) { //set public parameter in portalURL portalURL.addPublicParameterCurrent(param.getName(), param.getValues()); } } } if (renderPath.length() > 0) { portalURL.setRenderPath(renderPath.toString()); } // Return the portal URL. return portalURL; } /** * Converts a portal URL to a URL string. * @param portalURL the portal URL to convert. * @return a URL string representing the portal URL. */ public String toString(PortalURL portalURL) { StringBuffer buffer = new StringBuffer(); // Append the server URI and the servlet path. buffer.append(portalURL.getServletPath().startsWith("/")?"":"/") .append(portalURL.getServletPath()); // Start the pathInfo with the path to the render URL (page). if (portalURL.getRenderPath() != null) { buffer.append("/").append(portalURL.getRenderPath()); } //Append the resource window definition, if it exists. if (portalURL.getResourceWindow() != null){ buffer.append("/"); buffer.append(PREFIX).append(RESOURCE) .append(encodeCharacters(portalURL.getResourceWindow())); } // Append the action window definition, if it exists. if (portalURL.getActionWindow() != null) { buffer.append("/"); buffer.append(PREFIX).append(ACTION) .append(encodeCharacters(portalURL.getActionWindow())); } // Append portlet mode definitions. for (Iterator it = portalURL.getPortletModes().entrySet().iterator(); it.hasNext(); ) { Map.Entry entry = (Map.Entry) it.next(); buffer.append("/").append( encodeControlParameter(PORTLET_MODE, entry.getKey().toString(), entry.getValue().toString())); } // Append window state definitions. for (Iterator it = portalURL.getWindowStates().entrySet().iterator(); it.hasNext(); ) { Map.Entry entry = (Map.Entry) it.next(); buffer.append("/").append( encodeControlParameter(WINDOW_STATE, entry.getKey().toString(), entry.getValue().toString()));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -