View Javadoc

1   /*
2    * $Id: NestedRootTag.java 471754 2006-11-06 14:55:09Z husted $
3    *
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *  http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  package org.apache.struts.taglib.nested;
22  
23  import org.apache.struts.taglib.TagUtils;
24  
25  import javax.servlet.http.HttpServletRequest;
26  import javax.servlet.jsp.JspException;
27  import javax.servlet.jsp.tagext.BodyTagSupport;
28  
29  /**
30   * NestedRootTag.
31   *
32   * The only other addition in this nested suite of tags. This tag allows for a
33   * nested structure to start without relying on the bean and workings of the
34   * FormTag. Useful for view pages that don't update when returning to the
35   * server, or use hyperlinks rather than form submits.
36   *
37   * The Bean that it uses can come out of a jsp:useBean tag or define another
38   * bean that's already in scope. As long as the other Struts tags can find the
39   * bean by name, it'll work.
40   *
41   * It's simply recognised by the helper class and it's property is added to
42   * the nesting list.
43   *
44   * @version $Rev: 471754 $ $Date: 2004-10-16 12:38:42 -0400 (Sat, 16 Oct 2004)
45   *          $
46   * @since Struts 1.1
47   */
48  public class NestedRootTag extends BodyTagSupport implements NestedNameSupport {
49      /* usual member variables */
50      private String name = null;
51      private String originalName = "";
52      private String originalNesting = "";
53      private String originalNestingName = "";
54  
55      /**
56       * Getter method for the <i>property</i> property
57       *
58       * @return String value of the property property
59       */
60      public String getProperty() {
61          return "";
62      }
63  
64      /**
65       * Setter method for the <i>property</i> property
66       *
67       * @param property new value for the property property
68       */
69      public void setProperty(String property) {
70      }
71  
72      /**
73       * Getter method for the <i>name</i> property
74       *
75       * @return String value of the name property
76       */
77      public String getName() {
78          return this.name;
79      }
80  
81      /**
82       * Setter method for the <i>name</i> property
83       *
84       * @param name new value for the name property
85       */
86      public void setName(String name) {
87          this.name = name;
88      }
89  
90      /**
91       * Overriding method of the heart of the tag. Gets the relative property
92       * and tells the JSP engine to evaluate its body content.
93       *
94       * @return int JSP continuation directive.
95       */
96      public int doStartTag() throws JspException {
97          /* set the nested reference for possible inclusions etc */
98          HttpServletRequest request =
99              (HttpServletRequest) pageContext.getRequest();
100 
101         // get al the originals
102         originalName = name;
103         originalNesting = NestedPropertyHelper.getCurrentProperty(request);
104         originalNestingName =
105             NestedPropertyHelper.getCurrentName(request, this);
106 
107         // set what we have to
108         if (name != null) {
109             NestedPropertyHelper.setProperty(request, "");
110             NestedPropertyHelper.setName(request, this.name);
111         }
112 
113         // do the JSP thing
114         return (EVAL_BODY_TAG);
115     }
116 
117     /**
118      * Render the resulting content evaluation.
119      *
120      * @return int JSP continuation directive.
121      */
122     public int doAfterBody() throws JspException {
123         /* Render the output */
124         if (bodyContent != null) {
125             TagUtils.getInstance().writePrevious(pageContext,
126                 bodyContent.getString());
127             bodyContent.clearBody();
128         }
129 
130         return (SKIP_BODY);
131     }
132 
133     /**
134      * Evaluate the rest of the page
135      *
136      * @return int JSP continuation directive.
137      */
138     public int doEndTag() throws JspException {
139         /* reset the reference */
140         HttpServletRequest request =
141             (HttpServletRequest) pageContext.getRequest();
142 
143         if (originalNesting == null) {
144             NestedPropertyHelper.deleteReference(request);
145         } else {
146             NestedPropertyHelper.setName(request, originalNestingName);
147             NestedPropertyHelper.setProperty(request, originalNesting);
148         }
149 
150         this.name = originalName;
151 
152         return (EVAL_PAGE);
153     }
154 
155     /**
156      * JSP method to release all resources held by the tag.
157      */
158     public void release() {
159         super.release();
160         this.name = null;
161         this.originalName = null;
162         this.originalNesting = null;
163         this.originalNestingName = null;
164     }
165 }