001: /*
002: * $Id: NestedIterateTag.java 471754 2006-11-06 14:55:09Z husted $
003: *
004: * Licensed to the Apache Software Foundation (ASF) under one
005: * or more contributor license agreements. See the NOTICE file
006: * distributed with this work for additional information
007: * regarding copyright ownership. The ASF licenses this file
008: * to you under the Apache License, Version 2.0 (the
009: * "License"); you may not use this file except in compliance
010: * with the License. You may obtain a copy of the License at
011: *
012: * http://www.apache.org/licenses/LICENSE-2.0
013: *
014: * Unless required by applicable law or agreed to in writing,
015: * software distributed under the License is distributed on an
016: * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017: * KIND, either express or implied. See the License for the
018: * specific language governing permissions and limitations
019: * under the License.
020: */
021: package org.apache.struts.taglib.nested.logic;
022:
023: import org.apache.struts.taglib.logic.IterateTag;
024: import org.apache.struts.taglib.nested.NestedNameSupport;
025: import org.apache.struts.taglib.nested.NestedPropertyHelper;
026:
027: import javax.servlet.http.HttpServletRequest;
028: import javax.servlet.jsp.JspException;
029:
030: import java.util.Map;
031:
032: /**
033: * NestedIterateTag. Slightly more complex that the other extensions. This one
034: * has to yield a proper index property. Very taxing.
035: *
036: * @version $Rev: 471754 $ $Date: 2004-10-16 12:38:42 -0400 (Sat, 16 Oct 2004)
037: * $
038: * @since Struts 1.1
039: */
040: public class NestedIterateTag extends IterateTag implements
041: NestedNameSupport {
042: // The current nesting
043: private String nesting = null;
044:
045: // original tag properties
046: private String originalName = null;
047: private String originalProperty = null;
048:
049: // original nesting environment
050: private String originalNesting = null;
051: private String originalNestingName = null;
052:
053: /**
054: * Overriding method of the heart of the matter. Gets the relative
055: * property and leaves the rest up to the original tag implementation.
056: * Sweet.
057: *
058: * @return int JSP continuation directive. This is in the hands of the
059: * super class.
060: */
061: public int doStartTag() throws JspException {
062: // original values
063: originalName = getName();
064: originalProperty = getProperty();
065:
066: // set the ID to make the super tag happy
067: if ((id == null) || (id.trim().length() == 0)) {
068: id = property;
069: }
070:
071: // the request object
072: HttpServletRequest request = (HttpServletRequest) pageContext
073: .getRequest();
074:
075: // original nesting details
076: originalNesting = NestedPropertyHelper
077: .getCurrentProperty(request);
078: originalNestingName = NestedPropertyHelper.getCurrentName(
079: request, this );
080:
081: // set the bean if it's been provided
082: // (the bean that's been provided! get it!?... nevermind)
083: if (getName() == null) {
084: // the qualified nesting value
085: nesting = NestedPropertyHelper.getAdjustedProperty(request,
086: getProperty());
087: } else {
088: // it's just the property
089: nesting = getProperty();
090: }
091:
092: // set the properties
093: NestedPropertyHelper.setNestedProperties(request, this );
094:
095: // get the original result
096: int temp = super .doStartTag();
097:
098: // set the new reference (including the index etc)
099: NestedPropertyHelper.setName(request, getName());
100: NestedPropertyHelper.setProperty(request,
101: deriveNestedProperty());
102:
103: // return the result
104: return temp;
105: }
106:
107: /**
108: * The only added property to the class. For use in proper nesting.
109: *
110: * @return String value of the property and the current index or mapping.
111: */
112: private String deriveNestedProperty() {
113: Object idObj = pageContext.getAttribute(id);
114:
115: if (idObj instanceof Map.Entry) {
116: return nesting + "(" + ((Map.Entry) idObj).getKey() + ")";
117: } else {
118: return nesting + "[" + this .getIndex() + "]";
119: }
120: }
121:
122: /**
123: * This is only overriden as the include reference will need it's index
124: * updated.
125: *
126: * @return int JSP continuation directive.
127: */
128: public int doAfterBody() throws JspException {
129: // store original result
130: int temp = super .doAfterBody();
131: HttpServletRequest request = (HttpServletRequest) pageContext
132: .getRequest();
133:
134: if (temp != SKIP_BODY) {
135: // set the new reference
136: NestedPropertyHelper.setProperty(request,
137: deriveNestedProperty());
138: }
139:
140: // return super result
141: return temp;
142: }
143:
144: /**
145: * Complete the processing of the tag. The nested tags here will restore
146: * all the original value for the tag itself and the nesting context.
147: *
148: * @return int to describe the next step for the JSP processor
149: * @throws JspException for the bad things JSP's do
150: */
151: public int doEndTag() throws JspException {
152: // the super's thing
153: int i = super .doEndTag();
154:
155: // request
156: HttpServletRequest request = (HttpServletRequest) pageContext
157: .getRequest();
158:
159: // reset the original tag values
160: super .setName(originalName);
161: super .setProperty(originalProperty);
162:
163: // reset the original nesting values
164: if (originalNesting == null) {
165: NestedPropertyHelper.deleteReference(request);
166: } else {
167: NestedPropertyHelper.setProperty(request, originalNesting);
168: NestedPropertyHelper.setName(request, originalNestingName);
169: }
170:
171: // job done
172: return i;
173: }
174:
175: /**
176: * Release the tag's resources and reset the values.
177: */
178: public void release() {
179: // let the super release
180: super .release();
181:
182: // reset the original value place holders
183: originalName = null;
184: originalProperty = null;
185: originalNesting = null;
186: originalNestingName = null;
187: }
188: }
|