/* Copyright 2005-2006 Tim Fennell
*
* Licensed 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 net.sourceforge.stripes.tag;
import net.sourceforge.stripes.exception.StripesJspException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTag;
import java.io.IOException;
/**
* Tag for generating links to pages or ActionBeans within a Stripes application. Provides
* basic services such as including the context path at the start of the href URL (only
* when the URL starts with a '/' and does not contain the context path already), and
* including a parameter to name the source page from which the link came. Also provides the
* ability to add complex parameters to the URL through the use of nested Param tags.
*
* @see ParamTag
* @author Tim Fennell
*/
public class LinkTag extends LinkTagSupport implements BodyTag {
/**
* Does nothing.
* @return EVAL_BODY_BUFFERED in all cases
*/
@Override
public int doStartTag() throws JspException {
return EVAL_BODY_BUFFERED;
}
/** Does nothing. */
public void doInitBody() throws JspException { /* Do Nothing. */ }
/**
* Does nothing.
* @return SKIP_BODY in all cases
*/
public int doAfterBody() throws JspException {
return SKIP_BODY;
}
/**
* Prepends the context to the href attribute if necessary, and then folds all the
* registered parameters into the URL.
*
* @return EVAL_PAGE in all cases
* @throws JspException
*/
@Override
public int doEndTag() throws JspException {
try {
set("href", buildUrl());
writeOpenTag(getPageContext().getOut(), "a");
String body = getBodyContentAsString();
if (body == null || body.trim().length() == 0) {
body = get("href");
}
if (body != null) {
getPageContext().getOut().write(body.trim());
}
writeCloseTag(getPageContext().getOut(), "a");
}
catch (IOException ioe) {
throw new StripesJspException("IOException while writing output in LinkTag.", ioe);
}
// Restore state and go on with the page
getAttributes().remove("href");
clearParameters();
return EVAL_PAGE;
}
/** Pass through to {@link LinkTagSupport#setUrl(String)}. */
public void setHref(String href) { setUrl(href); }
/** Pass through to {@link LinkTagSupport#getUrl()}. */
public String getHref() { return getUrl(); }
///////////////////////////////////////////////////////////////////////////
// Additional HTML Attributes supported by the tag
///////////////////////////////////////////////////////////////////////////
public void setCharset(String charset) { set("charset", charset); }
public String getCharset() { return get("charset"); }
public void setCoords(String coords) { set("coords", coords); }
public String getCoords() { return get("coords"); }
public void setHreflang(String hreflang) { set("hreflang", hreflang); }
public String getHreflang() { return get("hreflang"); }
public void setName(String name) { set("name", name); }
public String getName() { return get("name"); }
public void setRel(String rel) { set("rel", rel); }
public String getRel() { return get("rel"); }
public void setRev(String rev) { set("rev", rev); }
public String getRev() { return get("rev"); }
public void setShape(String shape) { set("shape", shape); }
public String getShape() { return get("shape"); }
public void setTarget(String target) { set("target", target); }
public String getTarget() { return get("target"); }
public void setType(String type) { set("type", type); }
public String getType() { return get("type"); }
}