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.CallParamRule; 023 024 /** 025 * Builder chained when invoking {@link LinkedRuleBuilder#callParam()}. 026 * 027 * @since 3.0 028 */ 029 public final class CallParamBuilder 030 extends AbstractBackToLinkedRuleBuilder<CallParamRule> 031 { 032 033 private int paramIndex = 0; 034 035 private int stackIndex = 0; 036 037 private boolean fromStack = false; 038 039 private String attributeName; 040 041 CallParamBuilder( String keyPattern, String namespaceURI, RulesBinder mainBinder, LinkedRuleBuilder mainBuilder ) 042 { 043 super( keyPattern, namespaceURI, mainBinder, mainBuilder ); 044 } 045 046 /** 047 * Sets the zero-relative parameter number. 048 * 049 * @param paramIndex The zero-relative parameter number 050 * @return this builder instance 051 */ 052 public CallParamBuilder ofIndex( int paramIndex ) 053 { 054 if ( paramIndex < 0 ) 055 { 056 reportError( "callParam().ofIndex( int )", "negative index argument not allowed" ); 057 } 058 059 this.paramIndex = paramIndex; 060 return this; 061 } 062 063 /** 064 * Sets the attribute from which to save the parameter value. 065 * 066 * @param attributeName The attribute from which to save the parameter value 067 * @return this builder instance 068 */ 069 public CallParamBuilder fromAttribute( /* @Nullable */String attributeName ) 070 { 071 this.attributeName = attributeName; 072 return this; 073 } 074 075 /** 076 * Flags the parameter to be set from the stack. 077 * 078 * @param fromStack the parameter flag to be set from the stack 079 * @return this builder instance 080 */ 081 public CallParamBuilder fromStack( boolean fromStack ) 082 { 083 this.fromStack = fromStack; 084 return this; 085 } 086 087 /** 088 * Sets the position of the object from the top of the stack. 089 * 090 * @param stackIndex The position of the object from the top of the stack 091 * @return this builder instance 092 */ 093 public CallParamBuilder withStackIndex( int stackIndex ) 094 { 095 this.stackIndex = stackIndex; 096 this.fromStack = true; 097 return this; 098 } 099 100 /** 101 * {@inheritDoc} 102 */ 103 @Override 104 protected CallParamRule createRule() 105 { 106 CallParamRule rule; 107 108 if ( fromStack ) 109 { 110 rule = new CallParamRule( paramIndex, stackIndex ); 111 } 112 else 113 { 114 rule = new CallParamRule( paramIndex ); 115 } 116 117 rule.setAttributeName( attributeName ); 118 119 return rule; 120 } 121 122 }