/* $Id: SetPropertiesRule.java 992060 2010-09-02 19:09:47Z simonetripodi $ * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.digester; import java.util.HashMap; import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.beanutils.PropertyUtils; import org.xml.sax.Attributes; /** *
Rule implementation that sets properties on the object at the top of the * stack, based on attributes with corresponding names.
* *This rule supports custom mapping of attribute names to property names. * The default mapping for particular attributes can be overridden by using * {@link #SetPropertiesRule(String[] attributeNames, String[] propertyNames)}. * This allows attributes to be mapped to properties with different names. * Certain attributes can also be marked to be ignored.
*/ public class SetPropertiesRule extends Rule { // ----------------------------------------------------------- Constructors /** * Default constructor sets only the the associated Digester. * * @param digester The digester with which this rule is associated * * @deprecated The digester instance is now set in the {@link Digester#addRule} method. * Use {@link #SetPropertiesRule()} instead. */ @Deprecated public SetPropertiesRule(Digester digester) { this(); } /** * Base constructor. */ public SetPropertiesRule() { // nothing to set up } /** *Convenience constructor overrides the mapping for just one property.
* *For details about how this works, see * {@link #SetPropertiesRule(String[] attributeNames, String[] propertyNames)}.
* * @param attributeName map this attribute * @param propertyName to a property with this name */ public SetPropertiesRule(String attributeName, String propertyName) { attributeNames = new String[1]; attributeNames[0] = attributeName; propertyNames = new String[1]; propertyNames[0] = propertyName; } /** *Constructor allows attribute->property mapping to be overriden.
* *Two arrays are passed in. * One contains the attribute names and the other the property names. * The attribute name / property name pairs are match by position * In order words, the first string in the attribute name list matches * to the first string in the property name list and so on.
* *If a property name is null or the attribute name has no matching * property name, then this indicates that the attibute should be ignored.
* * The following constructs a rule that maps the alt-city
* attribute to the city
property and the alt-state
* to the state
property.
* All other attributes are mapped as usual using exact name matching.
*
*
*
* SetPropertiesRule(
* new String[] {"alt-city", "alt-state"},
* new String[] {"city", "state"});
*
The following constructs a rule that maps the class
* attribute to the className
property.
* The attribute ignore-me
is not mapped.
* All other attributes are mapped as usual using exact name matching.
*
*
* @param attributeNames names of attributes to map
* @param propertyNames names of properties mapped to
*/
public SetPropertiesRule(String[] attributeNames, String[] propertyNames) {
// create local copies
this.attributeNames = new String[attributeNames.length];
for (int i=0, size=attributeNames.length; i
* SetPropertiesRule(
* new String[] {"class", "ignore-me"},
* new String[] {"className"});
*
* If false, the parsing will interrupt with an NoSuchMethodException
* if a property specified in the XML is not found. The default is true.
*
NoSuchMethodException
* if an unmatched
* attribute is found. This allows to trap misspellings in the XML file.
* @param ignoreMissingProperty false to stop the parsing on unmatched attributes.
*/
public void setIgnoreMissingProperty(boolean ignoreMissingProperty) {
this.ignoreMissingProperty = ignoreMissingProperty;
}
}