001package org.apache.turbine.util.uri; 002 003 004/* 005 * Licensed to the Apache Software Foundation (ASF) under one 006 * or more contributor license agreements. See the NOTICE file 007 * distributed with this work for additional information 008 * regarding copyright ownership. The ASF licenses this file 009 * to you under the Apache License, Version 2.0 (the 010 * "License"); you may not use this file except in compliance 011 * with the License. You may obtain a copy of the License at 012 * 013 * http://www.apache.org/licenses/LICENSE-2.0 014 * 015 * Unless required by applicable law or agreed to in writing, 016 * software distributed under the License is distributed on an 017 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 018 * KIND, either express or implied. See the License for the 019 * specific language governing permissions and limitations 020 * under the License. 021 */ 022 023 024import java.util.Iterator; 025 026import org.apache.commons.lang.StringUtils; 027import org.apache.fulcrum.parser.ParameterParser; 028import org.apache.turbine.util.RunData; 029import org.apache.turbine.util.ServerData; 030 031/** 032 * This class allows you to keep all the information needed for a single 033 * link at one place. It keeps your query data, path info, the server 034 * scheme, name, port and the script path. It is tuned for usage with a 035 * Template System e.g. Velocity. 036 * 037 * If you must generate a Turbine Link in a Template System, use this class. 038 * 039 * @author <a href="mailto:hps@intermeta.de">Henning P. Schmiedehausen</a> 040 * @version $Id: TemplateURI.java 1071038 2011-02-15 20:32:27Z tv $ 041 */ 042 043public class TemplateURI 044 extends TurbineURI 045{ 046 /** 047 * Empty C'tor. Uses Turbine.getDefaultServerData(). 048 * 049 */ 050 public TemplateURI() 051 { 052 super(); 053 } 054 055 /** 056 * Constructor with a RunData object 057 * 058 * @param runData A RunData object 059 */ 060 public TemplateURI(RunData runData) 061 { 062 super(runData); 063 } 064 065 /** 066 * Constructor, set explicit redirection 067 * 068 * @param runData A RunData object 069 * @param redirect True if redirection allowed. 070 */ 071 public TemplateURI(RunData runData, boolean redirect) 072 { 073 super(runData, redirect); 074 } 075 076 /** 077 * Constructor, set Template 078 * 079 * @param runData A RunData object 080 * @param template A Template Name 081 */ 082 public TemplateURI(RunData runData, String template) 083 { 084 super(runData); 085 setTemplate(template); 086 } 087 088 /** 089 * Constructor, set Template, set explicit redirection 090 * 091 * @param runData A RunData object 092 * @param template A Template Name 093 * @param redirect True if redirection allowed. 094 */ 095 public TemplateURI(RunData runData, String template, boolean redirect) 096 { 097 super(runData, redirect); 098 setTemplate(template); 099 } 100 101 /** 102 * Constructor, set Template and Action 103 * 104 * @param runData A RunData object 105 * @param template A Template Name 106 * @param action An Action Name 107 */ 108 public TemplateURI(RunData runData, String template, String action) 109 { 110 this(runData, template); 111 setAction(action); 112 } 113 114 /** 115 * Constructor, set Template and Action, set explicit redirection 116 * 117 * @param runData A RunData object 118 * @param template A Template Name 119 * @param action An Action Name 120 * @param redirect True if redirection allowed. 121 */ 122 public TemplateURI(RunData runData, String template, String action, boolean redirect) 123 { 124 this(runData, template, redirect); 125 setAction(action); 126 } 127 128 /** 129 * Constructor with a ServerData object 130 * 131 * @param serverData A ServerData object 132 */ 133 public TemplateURI(ServerData serverData) 134 { 135 super(serverData); 136 } 137 138 /** 139 * Constructor, set explicit redirection 140 * 141 * @param serverData A ServerData object 142 * @param redirect True if redirection allowed. 143 */ 144 public TemplateURI(ServerData serverData, boolean redirect) 145 { 146 super(serverData, redirect); 147 } 148 149 /** 150 * Constructor, set Template 151 * 152 * @param serverData A ServerData object 153 * @param template A Template Name 154 */ 155 public TemplateURI(ServerData serverData, String template) 156 { 157 super(serverData); 158 setTemplate(template); 159 } 160 161 /** 162 * Constructor, set Template, set explicit redirection 163 * 164 * @param serverData A ServerData object 165 * @param template A Template Name 166 * @param redirect True if redirection allowed. 167 */ 168 public TemplateURI(ServerData serverData, String template, boolean redirect) 169 { 170 super(serverData, redirect); 171 setTemplate(template); 172 } 173 174 /** 175 * Constructor, set Template and Action 176 * 177 * @param serverData A ServerData object 178 * @param template A Template Name 179 * @param action An Action Name 180 */ 181 public TemplateURI(ServerData serverData, String template, String action) 182 { 183 this(serverData, template); 184 setAction(action); 185 } 186 187 /** 188 * Constructor, set Template and Action, set explicit redirection 189 * 190 * @param serverData A ServerData object 191 * @param template A Template Name 192 * @param action An Action Name 193 * @param redirect True if redirection allowed. 194 */ 195 public TemplateURI(ServerData serverData, String template, String action, boolean redirect) 196 { 197 this(serverData, template, redirect); 198 setAction(action); 199 } 200 201 /** 202 * Constructor, user Turbine.getDefaultServerData(), set Template and Action 203 * 204 * @param template A Template Name 205 * @param action An Action Name 206 */ 207 public TemplateURI(String template, String action) 208 { 209 this(); 210 setTemplate(template); 211 setAction(action); 212 } 213 214 /** 215 * Sets the template= value for this URL. 216 * 217 * By default it adds the information to the path_info instead 218 * of the query data. An empty value (null or "") cleans out 219 * an existing value. 220 * 221 * @param template A String with the template value. 222 */ 223 public void setTemplate(String template) 224 { 225 if(StringUtils.isNotEmpty(template)) 226 { 227 add(PATH_INFO, CGI_TEMPLATE_PARAM, template); 228 } 229 else 230 { 231 clearTemplate(); 232 } 233 } 234 235 /** 236 * Clears the template= value for this URL. 237 * 238 */ 239 public void clearTemplate() 240 { 241 removePathInfo(CGI_TEMPLATE_PARAM); 242 } 243 244 /* 245 * ======================================================================== 246 * 247 * Protected / Private Methods 248 * 249 * ======================================================================== 250 * 251 */ 252 253 /** 254 * Method for a quick way to add all the parameters in a 255 * ParameterParser. 256 * 257 * <p>If the type is P (0), then add name/value to the pathInfo 258 * hashtable. 259 * 260 * <p>If the type is Q (1), then add name/value to the queryData 261 * hashtable. 262 * 263 * @param type Type of insertion (@see #add(char type, String name, String value)) 264 * @param pp A ParameterParser. 265 */ 266 protected void add(int type, 267 ParameterParser pp) 268 { 269 for(Iterator<?> it = pp.keySet().iterator(); it.hasNext();) 270 { 271 String key = (String) it.next(); 272 273 if (!key.equalsIgnoreCase(CGI_ACTION_PARAM) && 274 !key.equalsIgnoreCase(CGI_SCREEN_PARAM) && 275 !key.equalsIgnoreCase(CGI_TEMPLATE_PARAM)) 276 { 277 String[] values = pp.getStrings(key); 278 if(values != null) 279 { 280 for (int i = 0; i < values.length; i++) 281 { 282 add(type, key, values[i]); 283 } 284 } 285 else 286 { 287 add(type, key, ""); 288 } 289 } 290 } 291 } 292}