01: /*
02: * Title: AbstractTag
03: * Description:
04: *
05: * This software is published under the terms of the OpenSymphony Software
06: * License version 1.1, of which a copy has been included with this
07: * distribution in the LICENSE.txt file.
08: */
09:
10: package com.opensymphony.module.sitemesh.taglib;
11:
12: import com.opensymphony.module.sitemesh.Page;
13: import com.opensymphony.module.sitemesh.RequestConstants;
14: import com.opensymphony.module.sitemesh.util.OutputConverter;
15:
16: import javax.servlet.jsp.JspException;
17: import javax.servlet.jsp.PageContext;
18: import javax.servlet.jsp.tagext.Tag;
19: import javax.servlet.jsp.tagext.BodyTagSupport;
20: import java.io.Writer;
21:
22: /**
23: * Convenience implementation of Tag containing generice methods required
24: * by all (or most) taglibs.
25: *
26: * @author <a href="mailto:joe@truemesh.com">Joe Walnes</a>
27: * @version $Revision: 1.4 $
28: */
29: public abstract class AbstractTag extends BodyTagSupport implements
30: RequestConstants {
31: protected PageContext pageContext;
32: protected Tag parent;
33:
34: /** To be implemented by all empty tags. */
35: public abstract int doEndTag() throws JspException;
36:
37: /** Returns SKIP_BODY. */
38: public int doStartTag() {
39: return SKIP_BODY;
40: }
41:
42: public void release() {
43: }
44:
45: public Tag getParent() {
46: return parent;
47: }
48:
49: public void setParent(Tag parent) {
50: this .parent = parent;
51: }
52:
53: public void setPageContext(PageContext pageContext) {
54: this .pageContext = pageContext;
55: }
56:
57: /**
58: * Return the Page object from the PAGE scope. If this is found in REQUEST scope
59: * instead, it will be moved into PAGE scope - to handle multi-level includes.
60: */
61: protected Page getPage() {
62: Page p = (Page) pageContext.getAttribute(PAGE,
63: PageContext.PAGE_SCOPE);
64:
65: if (p == null) {
66: p = (Page) pageContext.getAttribute(PAGE,
67: PageContext.REQUEST_SCOPE);
68: if (p == null) {
69: pageContext.removeAttribute(PAGE,
70: PageContext.PAGE_SCOPE);
71: } else {
72: pageContext.setAttribute(PAGE, p,
73: PageContext.PAGE_SCOPE);
74: }
75: pageContext
76: .removeAttribute(PAGE, PageContext.REQUEST_SCOPE);
77: }
78: return p;
79: }
80:
81: /** Log exception generated by taglib. */
82: protected static void trace(Exception e) {
83: e.printStackTrace();
84: }
85:
86: /**
87: * Get the outputWriter. This method should be used in preference to
88: * <code>pageContext.getOut()</code>, as some charset conversions may need
89: * to happen in some servers.
90: * @return the writer for use in the tag
91: */
92: protected Writer getOut() {
93: return OutputConverter.getWriter(pageContext.getOut());
94: }
95: }
|