1 /* 2 * $Id: DefinitionsFactoryConfig.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 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 // Add property attributes using old names 220 /* 221 map.put(DEFINITIONS_CONFIG_PARAMETER_NAME, getDefinitionConfigFiles()); 222 map.put(TILES_DETAILS_PARAMETER_NAME, Integer.toString(getDebugLevel()) ); 223 map.put(PARSER_DETAILS_PARAMETER_NAME, Integer.toString(getParserDebugLevel()) ); 224 map.put(PARSER_VALIDATE_PARAMETER_NAME, new Boolean(getParserValidate()).toString() ); 225 226 if( ! "org.apache.struts.tiles.xmlDefinition.I18nFactorySet".equals(getFactoryClassname()) ) 227 map.put(FACTORY_CLASSNAME_PARAMETER_NAME, getFactoryClassname()); 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 // link old parameter names for backward compatibility 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 }