1 10 package org.mmbase.bridge.jsp.taglib.pageflow; 11 12 import java.util.*; 13 import java.io.*; 14 import java.net.*; 15 import org.mmbase.bridge.jsp.taglib.*; 16 import org.mmbase.bridge.jsp.taglib.util.Attribute; 17 import org.mmbase.bridge.jsp.taglib.util.Referids; 18 19 import javax.servlet.jsp.JspTagException ; 20 import javax.servlet.jsp.JspException ; 21 22 23 import org.mmbase.util.transformers.Url; 24 import org.mmbase.util.transformers.CharTransformer; 25 26 import org.mmbase.util.Casting; 27 import org.mmbase.util.Entry; 28 29 import org.mmbase.util.logging.Logger; 30 import org.mmbase.util.logging.Logging; 31 32 33 39 40 public class UrlTag extends CloudReferrerTag implements ParamHandler { 41 42 private static final Logger log = Logging.getLoggerInstance(UrlTag.class); 43 44 private static final CharTransformer paramEscaper = new Url(Url.ESCAPE); 45 46 private static Boolean makeRelative = null; 47 private Attribute referids = Attribute.NULL; 48 protected final List extraParameters = new ArrayList(); 49 protected Attribute page = Attribute.NULL; 50 protected Attribute escapeAmps = Attribute.NULL; 51 private Attribute absolute = Attribute.NULL; 52 protected Attribute encode = Attribute.NULL; 53 54 public void setReferids(String r) throws JspTagException { 55 referids = getAttribute(r); 56 } 57 58 public void setPage(String p) throws JspTagException { 59 page = getAttribute(p); 60 } 61 62 public void setEscapeamps(String e) throws JspTagException { 63 escapeAmps = getAttribute(e); 64 } 65 66 public void setEncode(String e) throws JspTagException { 67 encode = getAttribute(e); 68 } 69 70 73 public void setAbsolute(String a) throws JspTagException { 74 absolute = getAttribute(a); 75 } 76 77 78 public void addParameter(String key, Object value) throws JspTagException { 79 if (log.isDebugEnabled()) { 80 log.debug("adding parameter " + key + "/" + value); 81 } 82 extraParameters.add(new Entry(key, value)); 83 } 84 85 86 87 public int doStartTag() throws JspTagException { 88 log.debug("starttag"); 89 extraParameters.clear(); 90 helper.useEscaper(false); 91 return EVAL_BODY_BUFFERED; 92 } 93 94 95 protected String getPage() throws JspTagException { 96 return page.getString(this); 97 } 98 99 107 protected StringBuffer makeRelative(StringBuffer show) { 108 javax.servlet.http.HttpServletRequest req = (javax.servlet.http.HttpServletRequest )pageContext.getRequest(); 109 if (show.charAt(0) == '/') { if (show.length() > 1 && show.charAt(1) == '/') { 111 log.debug("'absolute' url, not making relative"); 112 if (addContext()) { 113 show.deleteCharAt(0); 114 show.insert(0, req.getContextPath()); 115 } 116 } else { 117 log.debug("'absolute' url"); 118 String thisDir = new java.io.File (req.getServletPath()).getParent(); 119 show.insert(0, org.mmbase.util.UriParser.makeRelative(thisDir, "/")); } 121 } 122 return show; 123 } 124 125 133 protected boolean doMakeRelative() { 134 if (makeRelative == null) { 135 String setting = pageContext.getServletContext().getInitParameter("mmbase.taglib.url.makerelative"); 136 makeRelative = "true".equals(setting) ? Boolean.TRUE : Boolean.FALSE; 137 } 138 return makeRelative.booleanValue(); 139 } 140 141 protected boolean addContext() { 142 return true; 143 } 144 145 148 protected boolean useAbsoluteAttribute(StringBuffer show, String page) throws JspTagException { 149 String abs = absolute.getString(this); 150 if ("".equals(abs) || "false".equals(abs)) return false; 151 javax.servlet.http.HttpServletRequest req = (javax.servlet.http.HttpServletRequest ) pageContext.getRequest(); 152 153 if (abs.equals("true")) { 154 String scheme = req.getScheme(); 155 show.append(scheme).append("://"); 156 show.append(req.getServerName()); 157 int port = req.getServerPort(); 158 show.append((port == 80 && "http".equals(scheme)) || 159 (port == 443 && "https".equals(scheme)) 160 ? "" : ":" + port); 161 } else if (abs.equals("server")) { 162 } else if (abs.equals("context")) { 164 } else { 165 throw new JspTagException ("Unknown value for 'absolute' attribute '" + abs + "' (must be either 'true', 'false', 'server' or 'context')"); 166 } 167 if (! abs.equals("context")) { 168 show.append(req.getContextPath()); 169 } 170 char firstChar = page.charAt(0); 171 try { 172 URI uri; 173 if (firstChar != '/') { 174 uri = new URI("servlet", req.getServletPath() + "/../" + page, null); 175 } else { 176 uri = new URI("servlet", page, null); 177 } 178 uri = uri.normalize(); show.append(uri.getSchemeSpecificPart()); 180 } catch (URISyntaxException use) { 181 throw new TaglibException(use.getMessage(), use); 182 } 183 return true; 184 } 185 186 189 protected String getUrl(boolean writeamp, boolean encodeUrl) throws JspTagException { 190 StringWriter w = new StringWriter(); 191 StringBuffer show = w.getBuffer(); 192 193 194 if (referid != Attribute.NULL) { 195 if (page != Attribute.NULL) throw new TaglibException("Cannot specify both 'referid' and 'page' attributes"); 196 String url = (String ) getObject(getReferid()); 197 if (writeamp) { 198 url = url.replaceAll("&", "&"); 199 } 200 if (! useAbsoluteAttribute(show, url)) { 201 show.append(url); 202 } 203 } else { 204 String page = getPage(); 205 javax.servlet.http.HttpServletRequest req = (javax.servlet.http.HttpServletRequest ) pageContext.getRequest(); 206 if (page.equals("")) { String requestURI = req.getRequestURI(); 208 if (requestURI.endsWith("/")) { 209 page = "."; 210 } else { 211 page = new File(requestURI).getName(); 212 } 213 214 } 215 if (!useAbsoluteAttribute(show, page)) { 216 if (doMakeRelative()) { 217 show.append(page); 218 page = ""; 219 makeRelative(show); 220 } else { 221 if (addContext() && page.charAt(0) == '/') { show.append(req.getContextPath()); 223 } 224 } 225 show.append(page); 226 } 227 228 } 229 230 231 233 234 String amp = (writeamp ? "&" : "&"); 235 String connector = (show.toString().indexOf('?') == -1 ? "?" : amp); 236 237 if (referids != Attribute.NULL) { 238 Iterator refs = Referids.getReferids(referids, this).entrySet().iterator(); 239 while (refs.hasNext()) { 240 Map.Entry entry = (Map.Entry) refs.next(); 241 show.append(connector).append(entry.getKey()).append("="); 242 paramEscaper.transform(new StringReader(Casting.toString(entry.getValue())), w); 243 connector = amp; 244 } 245 } 246 Iterator i = extraParameters.iterator(); 247 while (i.hasNext()) { 248 Entry param = (Entry) i.next(); 249 if (param.getValue() == null) continue; 250 show.append(connector).append(param.getKey()).append('='); 251 paramEscaper.transform(new StringReader(Casting.toString(param.getValue())), w); 252 connector = amp; 253 } 254 if (encodeUrl) { 255 javax.servlet.http.HttpServletResponse response = (javax.servlet.http.HttpServletResponse )pageContext.getResponse(); 256 return response.encodeURL(show.toString()); 257 } else { 258 return show.toString(); 259 } 260 } 261 262 protected String getUrl() throws JspTagException { 263 return getUrl(escapeAmps.getBoolean(this, true)); 264 } 265 266 protected String getUrl(boolean e) throws JspTagException { 267 return getUrl(e, encode.getBoolean(this, true)); 268 } 269 270 protected void doAfterBodySetValue() throws JspTagException { 271 helper.setValue(getUrl()); 272 } 273 274 public int doAfterBody() throws JspException { 275 if (bodyContent != null) bodyContent.clearBody(); return helper.doAfterBody(); 277 } 278 279 280 protected void initDoEndTag() throws JspTagException { 281 log.debug("endtag of url tag"); 282 if (helper.getJspvar() == null) { 283 helper.overrideWrite(true); 284 } 287 288 } 289 public int doEndTag() throws JspTagException { 290 if (getId() != null) { 291 getContextProvider().getContextContainer().register(getId(), getUrl(false, false)); } 293 initDoEndTag(); 294 doAfterBodySetValue(); 295 helper.doEndTag(); 296 extraParameters.clear(); 297 return super.doEndTag(); 298 } 299 300 301 } 302 | Popular Tags |