1 /* 2 * $Id: NestedWriteNestingTag.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 * NestedWriteNestingTag. 31 * 32 * Created so developers could have a more elegant way of getting to the 33 * underlying nested property their tag properties are referencing. 34 * 35 * @version $Rev: 471754 $ 36 * @since Struts 1.1 37 */ 38 public class NestedWriteNestingTag extends BodyTagSupport { 39 /* the usual private member variables */ 40 private boolean filter = false; 41 private String property = null; 42 private String id = null; 43 private String originalProperty = null; 44 45 /** 46 * Getter method for the <i>property</i> property 47 * 48 * @return String value of the property property 49 */ 50 public String getProperty() { 51 return this.property; 52 } 53 54 /** 55 * Setter method for the <i>property</i> property 56 * 57 * @param newProperty new value for the property property 58 */ 59 public void setProperty(String newProperty) { 60 this.property = newProperty; 61 } 62 63 /** 64 * Getter method for the <i>id</i> property 65 * 66 * @return String value for the id property 67 */ 68 public String getId() { 69 return id; 70 } 71 72 /** 73 * Setter method for the <i>id</i> property 74 * 75 * @param id new value for the id property 76 */ 77 public void setId(String id) { 78 this.id = id; 79 } 80 81 /** 82 * Getter method for the <i>filter</i> property 83 * 84 * @return String value of the filter property 85 */ 86 public boolean getFilter() { 87 return this.filter; 88 } 89 90 /** 91 * Setter method for the <i>filter</i> property 92 * 93 * @param newFilter new value for the filter property 94 */ 95 public void setFilter(boolean newFilter) { 96 this.filter = newFilter; 97 } 98 99 /** 100 * Overriding method of the heart of the tag. Gets the relative property 101 * and tells the JSP engine to evaluate its body content. 102 * 103 * @return int JSP continuation directive. 104 */ 105 public int doStartTag() throws JspException { 106 // set the original property 107 originalProperty = property; 108 109 HttpServletRequest request = 110 (HttpServletRequest) pageContext.getRequest(); 111 String nesting = 112 NestedPropertyHelper.getAdjustedProperty(request, property); 113 114 if (id != null) { 115 // use it as a scripting variable instead 116 pageContext.setAttribute(id, nesting); 117 } else { 118 /* write output, filtering if required */ 119 if (this.filter) { 120 TagUtils.getInstance().write(pageContext, 121 TagUtils.getInstance().filter(nesting)); 122 } else { 123 TagUtils.getInstance().write(pageContext, nesting); 124 } 125 } 126 127 /* continue with page processing */ 128 return (SKIP_BODY); 129 } 130 131 public int doEndTag() throws JspException { 132 // do the super thing 133 int i = super.doEndTag(); 134 135 // reset the property 136 property = originalProperty; 137 138 // complete 139 return i; 140 } 141 142 /** 143 * JSP method to release all resources held by the tag. 144 */ 145 public void release() { 146 super.release(); 147 this.filter = false; 148 this.property = null; 149 this.originalProperty = null; 150 } 151 }