FileDocCategorySizeDatePackage
CallParamRule.javaAPI DocApache Tomcat 6.0.148296Fri Jul 20 04:20:32 BST 2007org.apache.tomcat.util.digester

CallParamRule

public class CallParamRule extends Rule

Rule implementation that saves a parameter for use by a surrounding CallMethodRule.

This parameter may be:

  • from an attribute of the current element See {@link #CallParamRule(int paramIndex, String attributeName)}
  • from current the element body See {@link #CallParamRule(int paramIndex)}
  • from the top object on the stack. See {@link #CallParamRule(int paramIndex, boolean fromStack)}
  • the current path being processed (separate Rule). See {@link PathCallParamRule}

Fields Summary
protected String
attributeName
The attribute from which to save the parameter value
protected int
paramIndex
The zero-relative index of the parameter we are saving.
protected boolean
fromStack
Is the parameter to be set from the stack?
protected int
stackIndex
The position of the object from the top of the stack
protected ArrayStack
bodyTextStack
Stack is used to allow nested body text to be processed. Lazy creation.
Constructors Summary
public CallParamRule(Digester digester, int paramIndex)
Construct a "call parameter" rule that will save the body text of this element as the parameter value.

param
digester The associated Digester
param
paramIndex The zero-relative parameter number
deprecated
The digester instance is now set in the {@link Digester#addRule} method. Use {@link #CallParamRule(int paramIndex)} instead.


        this(paramIndex);

    
public CallParamRule(Digester digester, int paramIndex, String attributeName)
Construct a "call parameter" rule that will save the value of the specified attribute as the parameter value.

param
digester The associated Digester
param
paramIndex The zero-relative parameter number
param
attributeName The name of the attribute to save
deprecated
The digester instance is now set in the {@link Digester#addRule} method. Use {@link #CallParamRule(int paramIndex, String attributeName)} instead.


        this(paramIndex, attributeName);

    
public CallParamRule(int paramIndex)
Construct a "call parameter" rule that will save the body text of this element as the parameter value.

param
paramIndex The zero-relative parameter number


        this(paramIndex, null);

    
public CallParamRule(int paramIndex, String attributeName)
Construct a "call parameter" rule that will save the value of the specified attribute as the parameter value.

param
paramIndex The zero-relative parameter number
param
attributeName The name of the attribute to save


        this.paramIndex = paramIndex;
        this.attributeName = attributeName;

    
public CallParamRule(int paramIndex, boolean fromStack)
Construct a "call parameter" rule.

param
paramIndex The zero-relative parameter number
param
fromStack should this parameter be taken from the top of the stack?

    
        this.paramIndex = paramIndex;  
        this.fromStack = fromStack;

    
public CallParamRule(int paramIndex, int stackIndex)
Constructs a "call parameter" rule which sets a parameter from the stack. If the stack contains too few objects, then the parameter will be set to null.

param
paramIndex The zero-relative parameter number
param
stackIndex the index of the object which will be passed as a parameter. The zeroth object is the top of the stack, 1 is the next object down and so on.

    
        this.paramIndex = paramIndex;  
        this.fromStack = true;
        this.stackIndex = stackIndex;
    
Methods Summary
public voidbegin(org.xml.sax.Attributes attributes)
Process the start of this element.

param
attributes The attribute list for this element


    // --------------------------------------------------------- Public Methods


                       
          

        Object param = null;
        
        if (attributeName != null) {
        
            param = attributes.getValue(attributeName);
            
        } else if(fromStack) {
        
            param = digester.peek(stackIndex);
            
            if (digester.log.isDebugEnabled()) {
            
                StringBuffer sb = new StringBuffer("[CallParamRule]{");
                sb.append(digester.match);
                sb.append("} Save from stack; from stack?").append(fromStack);
                sb.append("; object=").append(param);
                digester.log.debug(sb.toString());
            }   
        }
        
        // Have to save the param object to the param stack frame here.
        // Can't wait until end(). Otherwise, the object will be lost.
        // We can't save the object as instance variables, as 
        // the instance variables will be overwritten
        // if this CallParamRule is reused in subsequent nesting.
        
        if(param != null) {
            Object parameters[] = (Object[]) digester.peekParams();
            parameters[paramIndex] = param;
        }
    
public voidbody(java.lang.String bodyText)
Process the body text of this element.

param
bodyText The body text of this element


        if (attributeName == null && !fromStack) {
            // We must wait to set the parameter until end
            // so that we can make sure that the right set of parameters
            // is at the top of the stack
            if (bodyTextStack == null) {
                bodyTextStack = new ArrayStack();
            }
            bodyTextStack.push(bodyText.trim());
        }

    
public voidend(java.lang.String namespace, java.lang.String name)
Process any body texts now.

        if (bodyTextStack != null && !bodyTextStack.empty()) {
            // what we do now is push one parameter onto the top set of parameters
            Object parameters[] = (Object[]) digester.peekParams();
            parameters[paramIndex] = bodyTextStack.pop();
        }
    
public java.lang.StringtoString()
Render a printable version of this Rule.


        StringBuffer sb = new StringBuffer("CallParamRule[");
        sb.append("paramIndex=");
        sb.append(paramIndex);
        sb.append(", attributeName=");
        sb.append(attributeName);
        sb.append(", from stack=");
        sb.append(fromStack);
        sb.append("]");
        return (sb.toString());