001package 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 022import java.util.HashMap; 023import java.util.Map; 024 025import org.apache.commons.digester3.SetNestedPropertiesRule; 026 027/** 028 * Builder chained when invoking {@link LinkedRuleBuilder#setNestedProperties()}. 029 * 030 * @since 3.0 031 */ 032public 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 return addAlias( elementName ).forProperty( null ); 061 } 062 063 /** 064 * Allows element2property mapping to be overridden. 065 * 066 * @param elementName The child xml element to match 067 * @param propertyName The java bean property to be assigned the value 068 * @return this builder instance 069 * @deprecated 070 */ 071 @Deprecated 072 public NestedPropertiesBuilder addAlias( String elementName, String propertyName ) 073 { 074 return addAlias( elementName ).forProperty( propertyName ); 075 } 076 077 /** 078 * Allows element2property mapping to be overridden. 079 * 080 * @param elementName The child xml element to match 081 * @return the property alias builder 082 * @since 3.2 083 */ 084 public AddAliasBuilder<NestedPropertiesBuilder> addAlias( String elementName ) 085 { 086 if ( elementName == null ) 087 { 088 reportError( "setProperties().addAlias( String )", "empty 'elementName' not allowed" ); 089 } 090 return new AddAliasBuilder<NestedPropertiesBuilder>( this, elementNames, elementName ); 091 } 092 093 /** 094 * When set to true, any text within child elements will have leading 095 * and trailing whitespace removed before assignment to the target 096 * object. 097 * 098 * @param trimData Flag to set any text within child elements will have leading 099 * and trailing whitespace removed 100 * @return this builder instance 101 */ 102 public NestedPropertiesBuilder trimData( boolean trimData ) 103 { 104 this.trimData = trimData; 105 return this; 106 } 107 108 /** 109 * Determines whether an error is reported when a nested element is encountered for which there is no corresponding 110 * property-setter method. 111 * 112 * @param allowUnknownChildElements flag to ignore any child element for which there is no corresponding 113 * object property 114 * @return this builder instance 115 */ 116 public NestedPropertiesBuilder allowUnknownChildElements( boolean allowUnknownChildElements ) 117 { 118 this.allowUnknownChildElements = allowUnknownChildElements; 119 return this; 120 } 121 122 /** 123 * {@inheritDoc} 124 */ 125 @Override 126 protected SetNestedPropertiesRule createRule() 127 { 128 SetNestedPropertiesRule rule = new SetNestedPropertiesRule( elementNames ); 129 rule.setTrimData( trimData ); 130 rule.setAllowUnknownChildElements( allowUnknownChildElements ); 131 return rule; 132 } 133 134}