1 23 package org.infoglue.deliver.taglib.common; 24 25 import java.util.ArrayList ; 26 import java.util.HashMap ; 27 import java.util.Iterator ; 28 import java.util.List ; 29 import java.util.Map ; 30 import java.util.StringTokenizer ; 31 32 import javax.servlet.http.HttpServletRequest ; 33 import javax.servlet.jsp.JspException ; 34 import javax.servlet.jsp.JspTagException ; 35 36 import org.apache.log4j.Logger; 37 import org.infoglue.deliver.taglib.TemplateControllerTag; 38 39 45 public class URLTag extends TemplateControllerTag 46 { 47 48 private final static Logger logger = Logger.getLogger(URLTag.class.getName()); 49 50 53 private static final long serialVersionUID = 4433903132736259601L; 54 55 58 59 62 private String baseURL; 63 64 67 private String query; 68 69 72 private String excludedQueryStringParameters; 73 74 77 private boolean fullBaseUrl = false; 78 79 82 private List parameters; 84 87 private Map parameterNames; 89 92 93 private boolean disableNiceURI = false; 94 95 98 private boolean allowMultipleArguments = false; 99 100 103 public URLTag() 104 { 105 super(); 106 } 107 108 114 public int doStartTag() throws JspException 115 { 116 return EVAL_BODY_INCLUDE; 117 } 118 119 126 public int doEndTag() throws JspException 127 { 128 addQueryParameters(); 129 produceResult(generateURL()); 130 parameters = null; 131 parameterNames = null; 132 return EVAL_PAGE; 133 } 134 135 140 private List getParameters() 141 { 142 if(parameters == null) 143 { 144 parameters = new ArrayList (); 145 } 146 return parameters; 147 } 148 149 154 private Map getParameterNames() 155 { 156 if(parameterNames == null) 157 { 158 parameterNames = new HashMap (); 159 } 160 return parameterNames; 161 } 162 163 166 protected final void addParameter(final String name, final String value) 167 { 168 getParameters().add(name + "=" + value); 169 getParameterNames().put(name, name); 170 } 171 172 177 private String getBaseURL() 178 { 179 String newBaseUrl = ""; 180 try 181 { 182 logger.info("fullBaseUrl:" + fullBaseUrl); 183 if(this.fullBaseUrl) 184 { 185 int indexOfProtocol = getRequest().getRequestURL().indexOf("://"); 186 int indexFirstSlash = getRequest().getRequestURL().indexOf("/", indexOfProtocol + 3); 187 String base = null; 188 if(indexFirstSlash > -1) 189 base = getRequest().getRequestURL().substring(0, indexFirstSlash); 190 else 191 base = getRequest().getRequestURL().substring(0); 192 193 String currentPageUrl = this.getController().getCurrentPageUrl().toString(); 194 currentPageUrl = currentPageUrl.split("\\?")[0]; 195 newBaseUrl = (baseURL == null) ? base + currentPageUrl : baseURL; 196 } 197 else 198 { 199 String currentPageUrl = this.getController().getCurrentPageUrl().toString(); 200 currentPageUrl = currentPageUrl.split("\\?")[0]; 201 newBaseUrl = (baseURL == null) ? currentPageUrl : baseURL; 202 } 203 } 204 catch(Exception e) 205 { 206 logger.warn("Error:", e); 207 newBaseUrl = (baseURL == null) ? getRequest().getRequestURL().toString() : baseURL; 208 } 209 logger.info("newBaseUrl:" + newBaseUrl); 210 return newBaseUrl; 211 } 212 213 218 private String getQuery() 219 { 220 String q = (query == null) ? getRequest().getQueryString() : query; 221 if(q != null && (q.startsWith("?") || q.startsWith("&"))) 222 { 223 return q.substring(1); 224 } 225 return q; 226 } 227 228 233 private final HttpServletRequest getRequest() 234 { 235 return (HttpServletRequest ) pageContext.getRequest(); 236 } 237 238 245 private void addQueryParameters() throws JspException 246 { 247 if(getQuery() != null) 248 { 249 for(final StringTokenizer st = new StringTokenizer (getQuery(), "&"); st.hasMoreTokens(); ) 250 { 251 final String token = st.nextToken(); 252 final StringTokenizer parameter = new StringTokenizer (token, "="); 253 if(parameter.countTokens() == 0 || parameter.countTokens() > 2) 254 { 255 throw new JspTagException ("Illegal query parameter [" + token + "]."); 256 } 257 final String name = parameter.nextToken(); 258 final String value = parameter.hasMoreTokens() ? parameter.nextToken() : ""; 259 if(allowMultipleArguments || !getParameterNames().containsKey(name)) 260 { 261 if(excludedQueryStringParameters == null || excludedQueryStringParameters.indexOf(name) == -1) 262 addParameter(name, value); 263 } 264 } 265 } 266 } 267 268 273 public String generateURL() 274 { 275 if(!getParameters().isEmpty()) 276 { 277 StringBuffer sb = new StringBuffer (); 278 for(Iterator i = getParameters().iterator(); i.hasNext(); ) 279 { 280 String parameter = i.next().toString(); 281 sb.append(parameter + (i.hasNext() ? "&" : "")); 282 } 283 if(getBaseURL().indexOf("?") > -1) 284 return getBaseURL() + (sb.toString().length() > 0 ? "&" + sb.toString() : ""); 285 else 286 return getBaseURL() + (sb.toString().length() > 0 ? "?" + sb.toString() : ""); 287 } 288 return getBaseURL(); 289 } 290 291 297 public void setBaseURL(final String baseURL) throws JspException 298 { 299 this.baseURL = evaluateString("url", "baseURL", baseURL); 300 } 301 302 308 public void setQuery(final String query) throws JspException 309 { 310 this.query = evaluateString("url", "query", query); 311 } 312 313 public void setExcludedQueryStringParameters(String excludedQueryStringParameters) throws JspException 314 { 315 this.excludedQueryStringParameters = evaluateString("url", "excludedQueryStringParameters", excludedQueryStringParameters); 316 } 317 318 public void setFullBaseUrl(boolean fullBaseUrl) 319 { 320 this.fullBaseUrl = fullBaseUrl; 321 } 322 323 public void setDisableNiceURI(boolean disableNiceURI) 324 { 325 this.disableNiceURI = disableNiceURI; 326 } 327 328 public void setAllowMultipleArguments(boolean allowMultipleArguments) 329 { 330 this.allowMultipleArguments = allowMultipleArguments; 331 } 332 } 333 | Popular Tags |