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 org.apache.commons.digester3.ObjectParamRule;
023    
024    /**
025     * Builder chained when invoking {@link LinkedRuleBuilder#objectParam(Object)}.
026     *
027     * @param <T> The object type represented by this builder
028     * @since 3.0
029     */
030    public final class ObjectParamBuilder<T>
031        extends AbstractBackToLinkedRuleBuilder<ObjectParamRule>
032    {
033    
034        private final T paramObj;
035    
036        private int paramIndex = 0;
037    
038        private String attributeName;
039    
040        ObjectParamBuilder( String keyPattern, String namespaceURI, RulesBinder mainBinder, LinkedRuleBuilder mainBuilder,
041                            /* @Nullable */T paramObj )
042        {
043            super( keyPattern, namespaceURI, mainBinder, mainBuilder );
044            this.paramObj = paramObj;
045        }
046    
047        /**
048         * The zero-relative index of the parameter we are saving.
049         *
050         * @param paramIndex The zero-relative index of the parameter we are saving
051         * @return this builder instance
052         */
053        public ObjectParamBuilder<T> ofIndex( int paramIndex )
054        {
055            if ( paramIndex < 0 )
056            {
057                this.reportError( "objectParam( %s ).ofIndex( int )", "negative index argument not allowed" );
058            }
059    
060            this.paramIndex = paramIndex;
061            return this;
062        }
063    
064        /**
065         * The attribute which we are attempting to match.
066         *
067         * @param attributeName The attribute which we are attempting to match
068         * @return this builder instance
069         */
070        public ObjectParamBuilder<T> matchingAttribute( /* @Nullable */String attributeName )
071        {
072            this.attributeName = attributeName;
073            return this;
074        }
075    
076        /**
077         * {@inheritDoc}
078         */
079        @Override
080        protected ObjectParamRule createRule()
081        {
082            return new ObjectParamRule( paramIndex, attributeName, paramObj );
083        }
084    
085    }