| /* |
| * 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.tags; |
| |
| import java.io.IOException; |
| import java.util.ArrayList; |
| import java.util.HashMap; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.Set; |
| |
| import javax.portlet.BaseURL; |
| import javax.portlet.PortletSecurityException; |
| import javax.servlet.http.HttpServletResponse; |
| import javax.servlet.jsp.JspException; |
| import javax.servlet.jsp.JspWriter; |
| import javax.servlet.jsp.PageContext; |
| import javax.servlet.jsp.tagext.TagData; |
| import javax.servlet.jsp.tagext.TagExtraInfo; |
| import javax.servlet.jsp.tagext.TagSupport; |
| import javax.servlet.jsp.tagext.VariableInfo; |
| |
| /** |
| * Abstract supporting class for actionURL tag, renderURL tag |
| * and resourceURL tag. (for JSR168 and JSR286 URL tag's) |
| * |
| * @version 2.0 |
| */ |
| |
| public abstract class BaseURLTag extends TagSupport { |
| private static final long serialVersionUID = -267464414827109840L; |
| |
| private String secure = null; |
| |
| private Boolean secureBoolean = null; |
| |
| protected String var = null; |
| |
| //Attention: for JSR 286 Tags the default value is true |
| private String escapeXml = null; |
| |
| protected Map<String, List<String>> parametersMap = |
| new HashMap<String, List<String>>(); |
| |
| protected List<String> removedParametersList = |
| new ArrayList<String>(); |
| |
| protected Map<String, List<String>> propertiesMap = |
| new HashMap<String, List<String>>(); |
| |
| |
| /** |
| * Sets the secure flag on the URl as required |
| * |
| * @throws JspException |
| */ |
| protected void handleSecureFlag() throws JspException { |
| |
| BaseURL url = getUrl(); |
| |
| if (secure != null && !secure.equalsIgnoreCase("true") && !secure.equalsIgnoreCase("false")) { |
| StringBuilder txt = new StringBuilder(128); |
| txt.append("Invalid secure option: ").append(secure); |
| txt.append(", valid options: true, false"); |
| throw new JspException(txt.toString()); |
| } |
| |
| if(url == null){ |
| throw new IllegalStateException("internal error: url not set"); |
| } |
| |
| if (var != null) { |
| pageContext.removeAttribute(var, PageContext.PAGE_SCOPE); |
| } |
| |
| if (secure != null) { |
| try { |
| url.setSecure(isSecure()); |
| } catch (PortletSecurityException e) { |
| // ignore exception as Pluto doesn't support setSecure |
| // throw new JspException(e); |
| } |
| } |
| } |
| |
| /* (non-Javadoc) |
| * @see javax.servlet.jsp.tagext.TagSupport#doStartTag() |
| */ |
| @Override |
| public int doStartTag() throws JspException{ |
| handleSecureFlag(); |
| |
| if (escapeXml != null && |
| !escapeXml.equalsIgnoreCase("true") && |
| !escapeXml.equalsIgnoreCase("false")) { |
| StringBuilder txt = new StringBuilder(128); |
| txt.append("Invalid escapeXml option: ").append(escapeXml); |
| txt.append(", valid options: true, false"); |
| throw new JspException(txt.toString()); |
| } |
| |
| return EVAL_BODY_INCLUDE; |
| } |
| |
| |
| /* (non-Javadoc) |
| * @see javax.servlet.jsp.tagext.TagSupport#doEndTag() |
| */ |
| @Override |
| public int doEndTag() throws JspException{ |
| |
| BaseURL url = getUrl(); |
| |
| if(url == null){ |
| throw new IllegalStateException("internal error: url not set"); |
| } |
| |
| setUrlParameters(url); |
| setUrlProperties(url); |
| |
| HttpServletResponse response = |
| (HttpServletResponse) pageContext.getResponse(); |
| |
| // properly encoding urls to allow non-cookie enabled sessions - PLUTO-252 |
| String urlString = response.encodeURL(url.toString()); |
| |
| if(Boolean.parseBoolean(escapeXml)) |
| { |
| urlString = doEscapeXml(urlString); |
| } |
| |
| if (var == null) { |
| try { |
| JspWriter writer = pageContext.getOut(); |
| writer.print(urlString); |
| } catch (IOException ioe) { |
| throw new JspException( |
| "Portlet/ResourceURL-Tag Exception: cannot write to the output writer."); |
| } |
| } |
| else { |
| pageContext.setAttribute(var, urlString, |
| PageContext.PAGE_SCOPE); |
| } |
| |
| /*cleanup*/ |
| propertiesMap.clear(); |
| parametersMap.clear(); |
| removedParametersList.clear(); |
| |
| setUrl(null); |
| |
| return EVAL_PAGE; |
| } |
| |
| |
| |
| /* (non-Javadoc) |
| * @see javax.servlet.jsp.tagext.TagSupport#release() |
| */ |
| @Override |
| public void release(){ |
| secureBoolean = null; |
| super.release(); |
| } |
| |
| |
| /** |
| * Returns secure property as String. |
| * @return String |
| */ |
| public String getSecure() { |
| return secure; |
| } |
| |
| |
| /** |
| * Sets secure property to boolean value of the string. |
| * @param secure |
| * @return void |
| */ |
| public void setSecure(String secure) { |
| this.secure = secure; |
| this.secureBoolean = new Boolean(secure); |
| } |
| |
| /** |
| * Returns secure property as Boolean. |
| * @return boolean |
| */ |
| private boolean isSecure() { |
| if(this.secureBoolean != null){ |
| return this.secureBoolean.booleanValue(); |
| } |
| else{ |
| return false; |
| } |
| } |
| |
| |
| /** |
| * Returns the var property. |
| * @return String |
| */ |
| public String getVar() { |
| return var; |
| } |
| |
| |
| /** |
| * Sets the var property. |
| * @param var The var to set |
| * @return void |
| */ |
| public void setVar(String var) { |
| this.var = var; |
| } |
| |
| /** |
| * Returns escapeXml property. |
| * @return Boolean |
| */ |
| public String getEscapeXml() { |
| return escapeXml; |
| } |
| |
| |
| /** |
| * Sets the escapeXml property. |
| * @param escapeXml |
| * @return void |
| */ |
| public void setEscapeXml(String escapeXml) { |
| this.escapeXml = escapeXml; |
| } |
| |
| /** |
| * Adds a key,value pair to the parameter map. |
| * @param key String |
| * @param value String |
| * @return void |
| */ |
| protected void addParameter(String key,String value) { |
| if((key == null) || (key.length() == 0)){ |
| throw new IllegalArgumentException( |
| "the argument key must not be null or empty!"); |
| } |
| |
| if((value == null) || (value.length() == 0)){//remove parameter |
| if(parametersMap.containsKey(key)){ |
| parametersMap.remove(key); |
| } |
| removedParametersList.add(key); |
| } |
| else{//add value |
| List<String> valueList = null; |
| |
| if(parametersMap.containsKey(key)){ |
| valueList = parametersMap.get(key);//get old value list |
| } |
| else{ |
| valueList = new ArrayList<String>();// create new value list |
| } |
| |
| valueList.add(value); |
| |
| parametersMap.put(key, valueList); |
| } |
| } |
| |
| |
| /** |
| * Adds a key,value pair to the property map. |
| * @param key String |
| * @param value String |
| * @return void |
| */ |
| protected void addProperty(String key,String value) { |
| if(key == null){ |
| throw new NullPointerException(); |
| } |
| |
| List<String> valueList = null; |
| |
| if(propertiesMap.containsKey(key)){ |
| valueList = propertiesMap.get(key);//get old value list |
| } |
| else{ |
| valueList = new ArrayList<String>();// create new value list |
| } |
| |
| valueList.add(value); |
| |
| propertiesMap.put(key, valueList); |
| |
| } |
| |
| |
| /** |
| * Copies the parameters from map to the BaseURL. |
| * @param url BaseURL |
| * @return void |
| */ |
| @SuppressWarnings("deprecation") |
| protected void setUrlParameters(BaseURL url) { |
| |
| Set<String> keySet = parametersMap.keySet(); |
| |
| for(String key : keySet){ |
| |
| List<String> valueList = parametersMap.get(key); |
| |
| String[] valueArray = valueList.toArray(new String[0]); |
| |
| url.setParameter(key, valueArray); |
| } |
| } |
| |
| |
| /** |
| * Copies the properties from map to the BaseURL. |
| * @param url BaseURL |
| * @return void |
| */ |
| protected void setUrlProperties(BaseURL url) { |
| Set<String> keySet = propertiesMap.keySet(); |
| |
| for(String key : keySet){ |
| |
| List<String> valueList = propertiesMap.get(key); |
| |
| for(String value:valueList){ |
| url.addProperty(key, value); |
| } |
| } |
| } |
| |
| |
| /** |
| * @return the url |
| */ |
| protected abstract BaseURL getUrl(); |
| |
| |
| /** |
| * @param url the url to set |
| */ |
| protected abstract void setUrl(BaseURL url); |
| |
| |
| /** |
| * Replaces in String str the characters &,>,<,",' |
| * with their corresponding character entity codes. |
| * @param str - the String where to replace |
| * @return String |
| */ |
| protected String doEscapeXml(String str) { |
| if(!isEmpty(str)){ |
| str = str.replaceAll("&", "&"); |
| str = str.replaceAll("<", "<"); |
| str = str.replaceAll(">", ">"); |
| str = str.replaceAll("\"", """); |
| str = str.replaceAll("'", "'"); |
| } |
| return str; |
| } |
| |
| |
| /** |
| * Checks if the string is empty. |
| * @param str String |
| * @return boolean |
| */ |
| private boolean isEmpty(String str) { |
| return ((str == null) || (str.length() == 0)); |
| } |
| |
| |
| /* -------------------------------------------------------------------*/ |
| |
| /** |
| * TagExtraInfo class for BaseUrlTag. |
| */ |
| public static class TEI extends TagExtraInfo { |
| |
| public VariableInfo[] getVariableInfo(TagData tagData) { |
| VariableInfo vi[] = null; |
| String var = tagData.getAttributeString("var"); |
| if (var != null) { |
| vi = new VariableInfo[1]; |
| vi[0] = |
| new VariableInfo(var, "java.lang.String", true, |
| VariableInfo.AT_BEGIN); |
| } |
| return vi; |
| } |
| |
| } |
| } |