You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@struts.apache.org by cr...@apache.org on 2001/02/14 00:53:38 UTC

cvs commit: jakarta-struts/src/share/org/apache/struts/digester CallMethodRule.java Digester.java

craigmcc    01/02/13 15:53:37

  Modified:    src/share/org/apache/struts/digester CallMethodRule.java
                        Digester.java
  Log:
  Enhance the configuration of a CallMethod rule so that you can pass an
  array of Class objects, instead of an array of class names.  Among other
  things, this lets you create rules to call methods that accept parameters
  that are a Java primitive (like int or boolean):
  
    Digester digester = new Digester();
    ...
    Class types[] = new Class[1];
    types[0] = Integer.TYPE;  // Class representing a Java int
    digester.addCallMethod("...pattern...",
      "setIntegerProperty", 1, types);
    digester.addCallParam("...pattern...", 0); // Converts nested body
                                               // content to an int and
                                               // calls setIntegerProperty()
  
  Submitted by: Yuhong Guo <yg...@yahoo.com>
  PR: Bugzilla #590
  
  (I will attach a sample program and XML file to this bug report if you
  want something a little more complete than the above.)
  
  Revision  Changes    Path
  1.7       +56 -26    jakarta-struts/src/share/org/apache/struts/digester/CallMethodRule.java
  
  Index: CallMethodRule.java
  ===================================================================
  RCS file: /home/cvs/jakarta-struts/src/share/org/apache/struts/digester/CallMethodRule.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- CallMethodRule.java	2001/01/23 03:35:52	1.6
  +++ CallMethodRule.java	2001/02/13 23:53:36	1.7
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/digester/CallMethodRule.java,v 1.6 2001/01/23 03:35:52 craigmcc Exp $
  - * $Revision: 1.6 $
  - * $Date: 2001/01/23 03:35:52 $
  + * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/digester/CallMethodRule.java,v 1.7 2001/02/13 23:53:36 craigmcc Exp $
  + * $Revision: 1.7 $
  + * $Date: 2001/02/13 23:53:36 $
    *
    * ====================================================================
    * 
  @@ -75,7 +75,7 @@
    * element.
    *
    * @author Craig McClanahan
  - * @version $Revision: 1.6 $ $Date: 2001/01/23 03:35:52 $
  + * @version $Revision: 1.7 $ $Date: 2001/02/13 23:53:36 $
    */
   
   public final class CallMethodRule extends Rule {
  @@ -96,7 +96,7 @@
       public CallMethodRule(Digester digester, String methodName,
       			  int paramCount) {
   
  -	this(digester, methodName, paramCount, null);
  +	this(digester, methodName, paramCount, (Class[]) null);
   
       }
   
  @@ -120,25 +120,50 @@
   	this.methodName = methodName;
   	this.paramCount = paramCount;
   	if (paramTypes == null) {
  -	    if (this.paramCount == 0)
  -	        this.paramTypes = new Class[1];
  -	    else
  -	    	this.paramTypes = new Class[this.paramCount];
  -	    for (int i = 0; i < this.paramTypes.length; i++) {
  -		if (i == 0)
  -		    this.paramTypes[i] = "abc".getClass();
  -		else
  -		    this.paramTypes[i] = this.paramTypes[0];
  -	    }
  -	} else {
  -	    this.paramTypes = new Class[paramTypes.length];
  -	    for (int i = 0; i < this.paramTypes.length; i++) {
  -		try {
  -		    this.paramTypes[i] = Class.forName(paramTypes[i]);
  -		} catch (ClassNotFoundException e) {
  -		    this.paramTypes[i] = null;	// Will trigger NPE later
  -		}
  -	    }
  +            this.paramTypes = new Class[paramCount];
  +            for (int i = 0; i < this.paramTypes.length; i++)
  +                this.paramTypes[i] = "abc".getClass();
  +        } else {
  +            this.paramTypes = new Class[paramTypes.length];
  +            for (int i = 0; i < this.paramTypes.length; i++) {
  +                try {
  +                    this.paramTypes[i] = Class.forName(paramTypes[i]);
  +                } catch (ClassNotFoundException e) {
  +                    this.paramTypes[i] = null; // Will cause NPE later
  +                }
  +            }
  +        }
  +
  +    }
  +
  +
  +    /**
  +     * Construct a "call method" rule with the specified method name.
  +     *
  +     * @param digester The associated Digester
  +     * @param methodName Method name of the parent method to call
  +     * @param paramCount The number of parameters to collect, or
  +     *  zero for a single argument from the body of ths element
  +     * @param paramTypes The Java classes that represent the
  +     *  parameter types of the method arguments
  +     *  (if you wish to use a primitive type, specify the corresonding
  +     *  Java wrapper class instead, such as <code>java.lang.Boolean.TYPE</code>
  +     *  for a <code>boolean</code> parameter)
  +     */
  +    public CallMethodRule(Digester digester, String methodName,
  +                          int paramCount, Class paramTypes[]) {
  +
  +	super(digester);
  +	this.methodName = methodName;
  +	this.paramCount = paramCount;
  +	if (paramTypes == null) {
  +            this.paramTypes = new Class[paramCount];
  +            for (int i = 0; i < this.paramTypes.length; i++)
  +                this.paramTypes[i] = "abc".getClass();
  +        } else {
  +            this.paramTypes = new Class[paramTypes.length];
  +            for (int i = 0; i < this.paramTypes.length; i++)
  +                this.paramTypes[i] = paramTypes[i];
           }
   
       }
  @@ -224,9 +249,9 @@
   
   	// Construct the parameter values array we will need
   	Object paramValues[] = new Object[paramTypes.length];
  -	for (int i = 0; i < this.paramTypes.length; i++)
  +	for (int i = 0; i < paramTypes.length; i++)
   	    paramValues[i] =
  -	      ConvertUtils.convert(parameters[i], this.paramTypes[i]);
  +	      ConvertUtils.convert(parameters[i], paramTypes[i]);
   
   	// Invoke the required method on the top object
   	Object top = digester.peek();
  @@ -243,6 +268,11 @@
   		    sb.append("null");
   		else
   		    sb.append(paramValues[i].toString());
  +                sb.append("/");
  +                if (paramTypes[i] == null)
  +                    sb.append("null");
  +                else
  +                    sb.append(paramTypes[i].getName());
   	    }
   	    sb.append(")");
   	    digester.log(sb.toString());
  
  
  
  1.15      +26 -4     jakarta-struts/src/share/org/apache/struts/digester/Digester.java
  
  Index: Digester.java
  ===================================================================
  RCS file: /home/cvs/jakarta-struts/src/share/org/apache/struts/digester/Digester.java,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- Digester.java	2001/01/23 03:35:52	1.14
  +++ Digester.java	2001/02/13 23:53:36	1.15
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/digester/Digester.java,v 1.14 2001/01/23 03:35:52 craigmcc Exp $
  - * $Revision: 1.14 $
  - * $Date: 2001/01/23 03:35:52 $
  + * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/digester/Digester.java,v 1.15 2001/02/13 23:53:36 craigmcc Exp $
  + * $Revision: 1.15 $
  + * $Date: 2001/02/13 23:53:36 $
    *
    * ====================================================================
    * 
  @@ -102,7 +102,7 @@
    * even from the same thread.</p>
    *
    * @author Craig McClanahan
  - * @version $Revision: 1.14 $ $Date: 2001/01/23 03:35:52 $
  + * @version $Revision: 1.15 $ $Date: 2001/02/13 23:53:36 $
    */
   
   public final class Digester extends HandlerBase {
  @@ -806,6 +806,28 @@
        */
       public void addCallMethod(String pattern, String methodName,
       			      int paramCount, String paramTypes[]) {
  +
  +	addRule(pattern,
  +	        new CallMethodRule(this, methodName,
  +	        		   paramCount, paramTypes));
  +
  +    }
  +
  +
  +    /**
  +     * Add an "call method" rule for the specified parameters.
  +     *
  +     * @param pattern Element matching pattern
  +     * @param methodName Method name to be called
  +     * @param paramCount Number of expected parameters (or zero
  +     *  for a single parameter from the body of this element)
  +     * @param paramTypes The Java class names of the arguments
  +     *  (if you wish to use a primitive type, specify the corresonding
  +     *  Java wrapper class instead, such as <code>java.lang.Boolean</code>
  +     *  for a <code>boolean</code> parameter)
  +     */
  +    public void addCallMethod(String pattern, String methodName,
  +    			      int paramCount, Class paramTypes[]) {
   
   	addRule(pattern,
   	        new CallMethodRule(this, methodName,