1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 package org.apache.struts.tiles;
23
24 import java.io.Serializable;
25 import java.lang.reflect.InvocationTargetException;
26 import java.util.HashMap;
27 import java.util.Iterator;
28 import java.util.Map;
29 import java.util.Set;
30
31 import org.apache.commons.beanutils.BeanUtils;
32
33 /**
34 * A TilesFactoryConfig object hold configuration attributes for a tile
35 * definition factory.
36 *
37 * @since Struts 1.1
38 * @version $Rev: 471754 $ $Date: 2006-11-06 08:55:09 -0600 (Mon, 06 Nov 2006) $
39 */
40 public class DefinitionsFactoryConfig implements Serializable {
41
42 /**
43 * Fully qualified classname of the factory to create.
44 * If no classname is set, a default factory is created
45 * (of class "org.apache.struts.tiles.xmlDefinition.I18nFactorySet").
46 */
47 protected String factoryClassname =
48 "org.apache.struts.tiles.xmlDefinition.I18nFactorySet";
49
50 /**
51 * Specifies whether the parser will validate configuration files.
52 * Default value is true.
53 */
54 protected boolean parserValidate = true;
55
56 /**
57 * Definition configuration file specified by user.
58 */
59 protected String definitionConfigFiles = null;
60
61 /**
62 * Specifies whether the factory is "module-aware".
63 */
64 protected boolean moduleAware = true;
65
66 /**
67 * The name associated to this factory.
68 * <br>
69 * With Struts 1.1, this name is the module name to which this factory
70 * belong. It is set by the system.
71 * <br>
72 * In prior versions, this property is not used.
73 */
74 protected String factoryName;
75
76 /**
77 * Alternate name for parser debug details properties in configuration file.
78 * @deprecated This will be removed in a release after Struts 1.2.
79 */
80 public static final String PARSER_DETAILS_PARAMETER_NAME =
81 "definitions-parser-details";
82
83 /**
84 * Alternate name for parser validate properties in configuration file.
85 */
86 public static final String PARSER_VALIDATE_PARAMETER_NAME =
87 "definitions-parser-validate";
88
89 /**
90 * Alternate name for factory classname properties in configuration file.
91 */
92 public static final String FACTORY_CLASSNAME_PARAMETER_NAME =
93 "definitions-factory-class";
94
95 /**
96 * Alternate name for definition files properties in configuration file.
97 */
98 public static final String DEFINITIONS_CONFIG_PARAMETER_NAME =
99 "definitions-config";
100
101 /**
102 * Alternate name for definition debug details properties in configuration file.
103 * @deprecated This will be removed in a release after Struts 1.2.
104 */
105 public static final String TILES_DETAILS_PARAMETER_NAME = "definitions-debug";
106
107 /**
108 * Map of extra attribute available.
109 */
110 private Map extraAttributes = new HashMap();
111
112 /**
113 * Default constructor.
114 */
115 public DefinitionsFactoryConfig() {
116 super();
117 }
118
119 /**
120 * Constructor.
121 * Create configuration object, and initialize it with parameters from Map.
122 * Parameters corresponding to an attribute are filtered and stored in appropriate
123 * attribute.
124 * @param initParameters Map.
125 */
126 public DefinitionsFactoryConfig(Map initParameters) {
127 super();
128 }
129
130 /**
131 * Get the module aware flag.
132 * @return <code>true</code>: user wants a single factory instance,
133 * <code>false</code>: user wants multiple factory instances (one per module with Struts)
134 */
135 public boolean isModuleAware() {
136 return moduleAware;
137 }
138 /**
139 * Set the module aware flag.
140 * @param moduleAware <code>true</code>: user wants a single factory instance,
141 * <code>false</code>: user wants multiple factory instances (one per module with Struts)
142 */
143 public void setModuleAware(boolean moduleAware) {
144 this.moduleAware = moduleAware;
145 }
146
147 /**
148 * Get the classname of the factory.
149 * @return Classname.
150 */
151 public String getFactoryClassname() {
152 return factoryClassname;
153 }
154
155 /**
156 * Set the classname of the factory..
157 * @param aFactoryClassname Classname of the factory.
158 */
159 public void setFactoryClassname(String aFactoryClassname) {
160 factoryClassname = aFactoryClassname;
161 }
162
163 /**
164 * Determines if the parser is validating.
165 * @return <code>true<code> when in validating mode.
166 */
167 public boolean getParserValidate() {
168 return parserValidate;
169 }
170
171 /**
172 * Set the validating mode for the parser.
173 * @param aParserValidate <code>true</code> for validation, <code>false</code> otherwise
174 */
175 public void setParserValidate(boolean aParserValidate) {
176 parserValidate = aParserValidate;
177 }
178
179 /**
180 * Get the definition config files.
181 * @return Defition config files.
182 */
183 public String getDefinitionConfigFiles() {
184 return definitionConfigFiles;
185 }
186
187 /**
188 * Set the definition config files.
189 * @param aDefinitionConfigFiles Definition config files.
190 */
191 public void setDefinitionConfigFiles(String aDefinitionConfigFiles) {
192 definitionConfigFiles = aDefinitionConfigFiles;
193 }
194
195 /**
196 * Set value of an additional attribute.
197 * @param name Name of the attribute.
198 * @param value Value of the attribute.
199 */
200 public void setAttribute(String name, Object value) {
201 extraAttributes.put(name, value);
202 }
203
204 /**
205 * Get value of an additional attribute.
206 * @param name Name of the attribute.
207 * @return Value of the attribute, or null if not found.
208 */
209 public Object getAttribute(String name) {
210 return extraAttributes.get(name);
211 }
212
213 /**
214 * Get additional attributes as a Map.
215 * @return Map A Map containing attribute name - value pairs.
216 */
217 public Map getAttributes() {
218 Map map = new HashMap(extraAttributes);
219
220
221
222
223
224
225
226
227
228
229 return map;
230 }
231
232 /**
233 * Populate this config object from properties map, based on
234 * the specified name/value pairs. This method uses the populate() method from
235 * org.apache.commons.beanutils.BeanUtil.
236 * <p>
237 * Properties keys are scanned for old property names, and linked to the new name
238 * if necessary. This modifies the properties map.
239 * <p>
240 * The particular setter method to be called for each property is
241 * determined using the usual JavaBeans introspection mechanisms. Thus,
242 * you may identify custom setter methods using a BeanInfo class that is
243 * associated with the class of the bean itself. If no such BeanInfo
244 * class is available, the standard method name conversion ("set" plus
245 * the capitalized name of the property in question) is used.
246 * <p>
247 * <strong>NOTE</strong>: It is contrary to the JavaBeans Specification
248 * to have more than one setter method (with different argument
249 * signatures) for the same property.
250 *
251 * @param properties Map keyed by property name, with the
252 * corresponding (String or String[]) value(s) to be set.
253 *
254 * @exception IllegalAccessException if the caller does not have
255 * access to the property accessor method.
256 * @exception InvocationTargetException if the property accessor method
257 * throws an exception.
258 * @see org.apache.commons.beanutils.BeanUtils
259 */
260 public void populate(Map properties)
261 throws IllegalAccessException, InvocationTargetException {
262
263
264 linkOldPropertyNames(properties);
265 BeanUtils.populate(this, properties);
266 }
267
268 /**
269 * Link old property names to new property names.
270 * This modifies the map.
271 * @param properties Map keyed by property name, with the
272 * corresponding (String or String[]) value(s) to be set.
273 */
274 static public void linkOldPropertyNames(Map properties) {
275 Set entries = properties.entrySet();
276 Map toAdd = new HashMap();
277 Iterator i = entries.iterator();
278 while (i.hasNext()) {
279 Map.Entry entry = (Map.Entry) i.next();
280
281 if (DEFINITIONS_CONFIG_PARAMETER_NAME.equals(entry.getKey())) {
282 toAdd.put("definitionConfigFiles", entry.getValue());
283
284 } else if (FACTORY_CLASSNAME_PARAMETER_NAME.equals(entry.getKey())) {
285 toAdd.put("factoryClassname", entry.getValue());
286
287 } else if (PARSER_DETAILS_PARAMETER_NAME.equals(entry.getKey())) {
288 toAdd.put("parserDebugLevel", entry.getValue());
289
290 } else if (PARSER_VALIDATE_PARAMETER_NAME.equals(entry.getKey())) {
291 toAdd.put("parserValidate", entry.getValue());
292
293 } else if (TILES_DETAILS_PARAMETER_NAME.equals(entry.getKey())) {
294 toAdd.put("debugLevel", entry.getValue());
295 }
296 }
297
298 if (toAdd.size() > 0) {
299 properties.putAll(toAdd);
300 }
301 }
302
303 /**
304 * Get the factory name.
305 */
306 public String getFactoryName() {
307 return factoryName;
308 }
309 /**
310 * Set the factory name.
311 * @param factoryName Name of the factory.
312 */
313 public void setFactoryName(String factoryName) {
314 this.factoryName = factoryName;
315 }
316 }