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