001 /* $Id: ObjectParamRule.java 471661 2006-11-06 08:09:25Z skitching $
002 *
003 * Licensed to the Apache Software Foundation (ASF) under one or more
004 * contributor license agreements. See the NOTICE file distributed with
005 * this work for additional information regarding copyright ownership.
006 * The ASF licenses this file to You under the Apache License, Version 2.0
007 * (the "License"); you may not use this file except in compliance with
008 * the License. You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018
019
020 package org.apache.commons.digester;
021
022 import org.xml.sax.Attributes;
023
024 /**
025 * <p>Rule implementation that saves a parameter for use by a surrounding
026 * <code>CallMethodRule<code>.</p>
027 *
028 * <p>This parameter may be:
029 * <ul>
030 * <li>an arbitrary Object defined programatically, assigned when the element
031 * pattern associated with the Rule is matched. See
032 * {@link #ObjectParamRule(int paramIndex, Object param)}.
033 * <li>an arbitrary Object defined programatically, assigned if the element
034 * pattern AND specified attribute name are matched. See
035 * {@link #ObjectParamRule(int paramIndex, String attributeName, Object param)}.
036 * </ul>
037 * </p>
038 *
039 * @since 1.4
040 */
041
042 public class ObjectParamRule extends Rule {
043 // ----------------------------------------------------------- Constructors
044 /**
045 * Construct a "call parameter" rule that will save the given Object as
046 * the parameter value.
047 *
048 * @param paramIndex The zero-relative parameter number
049 * @param param the parameter to pass along
050 */
051 public ObjectParamRule(int paramIndex, Object param) {
052 this(paramIndex, null, param);
053 }
054
055
056 /**
057 * Construct a "call parameter" rule that will save the given Object as
058 * the parameter value, provided that the specified attribute exists.
059 *
060 * @param paramIndex The zero-relative parameter number
061 * @param attributeName The name of the attribute to match
062 * @param param the parameter to pass along
063 */
064 public ObjectParamRule(int paramIndex, String attributeName, Object param) {
065 this.paramIndex = paramIndex;
066 this.attributeName = attributeName;
067 this.param = param;
068 }
069
070
071 // ----------------------------------------------------- Instance Variables
072
073 /**
074 * The attribute which we are attempting to match
075 */
076 protected String attributeName = null;
077
078 /**
079 * The zero-relative index of the parameter we are saving.
080 */
081 protected int paramIndex = 0;
082
083 /**
084 * The parameter we wish to pass to the method call
085 */
086 protected Object param = null;
087
088
089 // --------------------------------------------------------- Public Methods
090
091 /**
092 * Process the start of this element.
093 *
094 * @param attributes The attribute list for this element
095 */
096 public void begin(String namespace, String name,
097 Attributes attributes) throws Exception {
098 Object anAttribute = null;
099 Object parameters[] = (Object[]) digester.peekParams();
100
101 if (attributeName != null) {
102 anAttribute = attributes.getValue(attributeName);
103 if(anAttribute != null) {
104 parameters[paramIndex] = param;
105 }
106 // note -- if attributeName != null and anAttribute == null, this rule
107 // will pass null as its parameter!
108 }else{
109 parameters[paramIndex] = param;
110 }
111 }
112
113 /**
114 * Render a printable version of this Rule.
115 */
116 public String toString() {
117 StringBuffer sb = new StringBuffer("ObjectParamRule[");
118 sb.append("paramIndex=");
119 sb.append(paramIndex);
120 sb.append(", attributeName=");
121 sb.append(attributeName);
122 sb.append(", param=");
123 sb.append(param);
124 sb.append("]");
125 return (sb.toString());
126 }
127 }