View Javadoc
1   /*
2    * $Id$
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  
22  package org.apache.struts.tiles.xmlDefinition;
23  
24  import org.apache.struts.tiles.DefinitionNameAttribute;
25  import org.apache.struts.tiles.DirectStringAttribute;
26  import org.apache.struts.tiles.PathAttribute;
27  import org.apache.struts.tiles.UntypedAttribute;
28  
29  /**
30   * A property key-value pair.  This class is used to read configuration files.
31   */
32  public class XmlAttribute {
33  
34      /**
35       * Attribute name or key.
36       */
37      private String name = null;
38  
39      /**
40       * Attribute value.
41       * Value read from description file.
42       */
43      private Object value = null;
44  
45      /**
46       * Attribute value.
47       */
48      private String direct = null;
49  
50      /**
51       * Attribute value.
52       */
53      private String valueType = null;
54  
55      /**
56       * Attribute value.
57       */
58      private String role = null;
59  
60      /**
61       * Real attribute value.
62       * Real value is the value after processing of valueType.
63       * I.e. if a type is defined, realValue contains wrapper for this type.
64       */
65      private Object realValue = null;
66  
67      /**
68       * Constructor.
69       */
70      public XmlAttribute() {
71          super();
72      }
73  
74      /**
75       * Constructor.
76       */
77      public XmlAttribute(String name, Object value) {
78          this.name = name;
79          this.value = value;
80      }
81  
82      /**
83       * Access method for the name property.
84       *
85       * @return The current value of the name property.
86       */
87      public String getName() {
88          return name;
89      }
90  
91      /**
92       * Sets the value of the name property.
93       *
94       * @param role the new value of the name property
95       */
96      public void setRole(String role) {
97          this.role = role;
98      }
99  
100     /**
101      * Access method for the name property.
102      *
103      * @return The current value of the name property.
104      */
105     public String getRole() {
106         return role;
107     }
108 
109     /**
110      * Sets the value of the name property.
111      *
112      * @param aName the new value of the name property.
113      */
114     public void setName(String aName) {
115         name = aName;
116     }
117 
118     /**
119      * Another access method for the name property.
120      *
121      * @return   the current value of the name property
122      */
123     public String getAttribute() {
124         return name;
125     }
126 
127     /**
128      * Sets the value of the name property.
129      *
130      * @param aName the new value of the name property
131      */
132     public void setAttribute(String aName) {
133         name = aName;
134     }
135 
136     /**
137      * Access method for the value property. Return the value or a
138      * QualifiedAttribute containing the value if 'direct' is set.
139      *
140      * @return The current value of the value property.
141      */
142     public Object getValue() {
143         // Compatibility with JSP Template
144         if (this.realValue == null) {
145             this.realValue = this.computeRealValue();
146         }
147 
148         return this.realValue;
149     }
150 
151     /**
152      * Sets the value of the value property.
153      *
154      * @param aValue the new value of the value property
155      */
156     public void setValue(Object aValue) {
157         realValue = null;
158         value = aValue;
159     }
160 
161     /**
162      * Sets the value of the value property.
163      *
164      * @param aValue the new value of the value property
165      */
166     public void setContent(Object aValue) {
167         setValue(aValue);
168     }
169 
170     /**
171      * Sets the value of the value property.
172      *
173      * @param body the new value of the value property
174      */
175     public void setBody(String body) {
176         if (body.length() == 0) {
177             return;
178         }
179 
180         setValue(body);
181     }
182 
183     /**
184      * Sets the value of the value property.
185      *
186      * @param value the new value of the value property
187      */
188     public void setDirect(String value) {
189         this.direct = value;
190     }
191 
192     /**
193      * Sets the value of the value property.
194      *
195      * @param value the new value of the value property
196      */
197     public void setType(String value) {
198         this.valueType = value;
199     }
200 
201     /**
202      * Compute  real value from attributes setting.
203      */
204     protected Object computeRealValue() {
205         Object realValue = value;
206         // Is there a type set ?
207         // First check direct attribute, and translate it to a valueType.
208         // Then, evaluate valueType, and create requested typed attribute.
209         if (direct != null) {
210             this.valueType =
211                 Boolean.valueOf(direct).booleanValue() ? "string" : "path";
212         }
213 
214         if (value != null && valueType != null) {
215             String strValue = value.toString();
216 
217             if (valueType.equalsIgnoreCase("string")) {
218                 realValue = new DirectStringAttribute(strValue);
219 
220             } else if (valueType.equalsIgnoreCase("page")) {
221                 realValue = new PathAttribute(strValue);
222 
223             } else if (valueType.equalsIgnoreCase("template")) {
224                 realValue = new PathAttribute(strValue);
225 
226             } else if (valueType.equalsIgnoreCase("instance")) {
227                 realValue = new DefinitionNameAttribute(strValue);
228             }
229 
230             // Set realValue's role value if needed
231             if (role != null) {
232                 ((UntypedAttribute) realValue).setRole(role);
233             }
234         }
235 
236         // Create attribute wrapper to hold role if role is set and no type
237         // specified
238         if (role != null && value != null && valueType == null) {
239             realValue = new UntypedAttribute(value.toString(), role);
240         }
241 
242         return realValue;
243     }
244 }