001 package org.apache.commons.digester3.binder;
002
003 /*
004 * Licensed to the Apache Software Foundation (ASF) under one
005 * or more contributor license agreements. See the NOTICE file
006 * distributed with this work for additional information
007 * regarding copyright ownership. The ASF licenses this file
008 * to you under the Apache License, Version 2.0 (the
009 * "License"); you may not use this file except in compliance
010 * with the License. You may obtain a copy of the License at
011 *
012 * http://www.apache.org/licenses/LICENSE-2.0
013 *
014 * Unless required by applicable law or agreed to in writing,
015 * software distributed under the License is distributed on an
016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017 * KIND, either express or implied. See the License for the
018 * specific language governing permissions and limitations
019 * under the License.
020 */
021
022 import java.util.HashMap;
023 import java.util.Map;
024
025 import org.apache.commons.digester3.SetNestedPropertiesRule;
026
027 /**
028 * Builder chained when invoking {@link LinkedRuleBuilder#setNestedProperties()}.
029 *
030 * @since 3.0
031 */
032 public final class NestedPropertiesBuilder
033 extends AbstractBackToLinkedRuleBuilder<SetNestedPropertiesRule>
034 {
035
036 private final Map<String, String> elementNames = new HashMap<String, String>();
037
038 private boolean trimData = true;
039
040 private boolean allowUnknownChildElements = false;
041
042 NestedPropertiesBuilder( String keyPattern, String namespaceURI, RulesBinder mainBinder,
043 LinkedRuleBuilder mainBuilder )
044 {
045 super( keyPattern, namespaceURI, mainBinder, mainBuilder );
046 }
047
048 /**
049 * Allows ignore a matching element.
050 *
051 * @param elementName The child xml element to be ignored
052 * @return this builder instance
053 */
054 public NestedPropertiesBuilder ignoreElement( String elementName )
055 {
056 if ( elementName == null )
057 {
058 reportError( "setNestedProperties().ignoreElement( String )", "empty 'elementName' not allowed" );
059 }
060 else
061 {
062 addAlias( elementName, null );
063 }
064 return this;
065 }
066
067 /**
068 * Allows element2property mapping to be overridden.
069 *
070 * @param elementName The child xml element to match
071 * @param propertyName The java bean property to be assigned the value
072 * @return this builder instance
073 */
074 public NestedPropertiesBuilder addAlias( String elementName, String propertyName )
075 {
076 if ( elementName == null )
077 {
078 reportError( "setNestedProperties().addAlias( String,String )", "empty 'elementName' not allowed" );
079 }
080 else
081 {
082 elementNames.put( elementName, propertyName );
083 }
084 return this;
085 }
086
087 /**
088 * When set to true, any text within child elements will have leading
089 * and trailing whitespace removed before assignment to the target
090 * object.
091 *
092 * @param trimData Flag to set any text within child elements will have leading
093 * and trailing whitespace removed
094 * @return this builder instance
095 */
096 public NestedPropertiesBuilder trimData( boolean trimData )
097 {
098 this.trimData = trimData;
099 return this;
100 }
101
102 /**
103 * Determines whether an error is reported when a nested element is encountered for which there is no corresponding
104 * property-setter method.
105 *
106 * @param allowUnknownChildElements flag to ignore any child element for which there is no corresponding
107 * object property
108 * @return this builder instance
109 */
110 public NestedPropertiesBuilder allowUnknownChildElements( boolean allowUnknownChildElements )
111 {
112 this.allowUnknownChildElements = allowUnknownChildElements;
113 return this;
114 }
115
116 /**
117 * {@inheritDoc}
118 */
119 @Override
120 protected SetNestedPropertiesRule createRule()
121 {
122 SetNestedPropertiesRule rule = new SetNestedPropertiesRule( elementNames );
123 rule.setTrimData( trimData );
124 rule.setAllowUnknownChildElements( allowUnknownChildElements );
125 return rule;
126 }
127
128 }