Author: skitching
Date: Tue Feb 15 20:51:55 2005
New Revision: 153990

URL: http://svn.apache.org/viewcvs?view=rev&rev=153990
Log:
Support "target offset" feature of CallMethodRule in xmlrules.
Patch by Wendy Smoak (with minor alterations). See bugzilla #33550.

Modified:
    
jakarta/commons/proper/digester/trunk/src/java/org/apache/commons/digester/xmlrules/DigesterRuleParser.java
    
jakarta/commons/proper/digester/trunk/src/java/org/apache/commons/digester/xmlrules/digester-rules.dtd

Modified: 
jakarta/commons/proper/digester/trunk/src/java/org/apache/commons/digester/xmlrules/DigesterRuleParser.java
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/proper/digester/trunk/src/java/org/apache/commons/digester/xmlrules/DigesterRuleParser.java?view=diff&r1=153989&r2=153990
==============================================================================
--- 
jakarta/commons/proper/digester/trunk/src/java/org/apache/commons/digester/xmlrules/DigesterRuleParser.java
 (original)
+++ 
jakarta/commons/proper/digester/trunk/src/java/org/apache/commons/digester/xmlrules/DigesterRuleParser.java
 Tue Feb 15 20:51:55 2005
@@ -1,4 +1,4 @@
-/* $Id: DigesterRuleParser.java,v 1.32 2005/01/18 00:11:12 skitching Exp $
+/* $Id$
  *
  * Copyright 2001-2004 The Apache Software Foundation.
  * 
@@ -540,31 +540,53 @@
         public Object createObject(Attributes attributes) {
             Rule callMethodRule = null;
             String methodName = attributes.getValue("methodname");
+
+            // Select which element is to be the target. Default to zero,
+            // ie the top object on the stack.
+            int targetOffset = 0;
+            String targetOffsetStr = attributes.getValue("targetoffset");
+            if (targetOffsetStr != null) {
+                targetOffset = Integer.parseInt(targetOffsetStr);
+            }
+
             if (attributes.getValue("paramcount") == null) {
                 // call against empty method
-                callMethodRule = new CallMethodRule(methodName);
+                callMethodRule = new CallMethodRule(targetOffset, methodName);
             
             } else {
                 int paramCount = 
Integer.parseInt(attributes.getValue("paramcount"));
                 
                 String paramTypesAttr = attributes.getValue("paramtypes");
                 if (paramTypesAttr == null || paramTypesAttr.length() == 0) {
-                    callMethodRule = new CallMethodRule(methodName, 
paramCount);
+                    callMethodRule = new CallMethodRule(targetOffset, 
methodName, paramCount);
                 } else {
-                    // Process the comma separated list or paramTypes
-                    // into an array of String class names
-                    ArrayList paramTypes = new ArrayList();
-                    StringTokenizer tokens = new 
StringTokenizer(paramTypesAttr, " \t\n\r,");
-                    while (tokens.hasMoreTokens()) {
-                            paramTypes.add(tokens.nextToken());
-                    }
-                    callMethodRule = new CallMethodRule( methodName,
-                                                        paramCount,
-                                                        
(String[])paramTypes.toArray(new String[0]));
+                    String[] paramTypes = getParamTypes(paramTypesAttr);
+                    callMethodRule = new CallMethodRule(
+                        targetOffset, methodName, paramCount, paramTypes);
                 }
             }
             return callMethodRule;
         }
+
+        /**
+         * Process the comma separated list of paramTypes
+         * into an array of String class names
+         */
+        private String[] getParamTypes(String paramTypes) {
+            String[] paramTypesArray;
+            if( paramTypes != null ) {
+                ArrayList paramTypesList = new ArrayList();
+                StringTokenizer tokens = new StringTokenizer(
+                        paramTypes, " \t\n\r,");
+                while (tokens.hasMoreTokens()) {
+                    paramTypesList.add(tokens.nextToken());
+                }
+                paramTypesArray = (String[])paramTypesList.toArray(new 
String[0]);
+            } else {
+                paramTypesArray = new String[0];
+            }
+            return paramTypesArray;
+        }
     }
     
     /**
@@ -791,4 +813,5 @@
             rule.addAlias(attrName, propName);
         }
     }
+        
 }

Modified: 
jakarta/commons/proper/digester/trunk/src/java/org/apache/commons/digester/xmlrules/digester-rules.dtd
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/proper/digester/trunk/src/java/org/apache/commons/digester/xmlrules/digester-rules.dtd?view=diff&r1=153989&r2=153990
==============================================================================
--- 
jakarta/commons/proper/digester/trunk/src/java/org/apache/commons/digester/xmlrules/digester-rules.dtd
 (original)
+++ 
jakarta/commons/proper/digester/trunk/src/java/org/apache/commons/digester/xmlrules/digester-rules.dtd
 Tue Feb 15 20:51:55 2005
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 
-<!-- $Id: digester-rules.dtd,v 1.15 2005/01/18 00:11:12 skitching Exp $
+<!-- $Id$
   
- Copyright 2001-2004 The Apache Software Foundation.
+ Copyright 2001-2005 The Apache Software Foundation.
  
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
@@ -20,7 +20,7 @@
 <!--
         "Digester" component of the Jakarta Commons Subproject
         DTD for the definition of Digester rules in XML.
-        $Id: digester-rules.dtd,v 1.15 2005/01/18 00:11:12 skitching Exp $
+        $Id$
 
         Applications wishing to reference this DTD in their own documents
         should use the following DOCTYPE declaration:
@@ -96,13 +96,17 @@
     pattern      CDATA #IMPLIED
     propertyname CDATA #IMPLIED>
 
-<!-- CallMethodRule -->
+<!-- CallMethodRule
+  -
+  - Note that paramtypes is ignored unless paramcount is defined.
+  -->
 <!ELEMENT call-method-rule EMPTY>
 <!ATTLIST call-method-rule
-    pattern    CDATA #IMPLIED
-    methodname CDATA #REQUIRED
-    paramcount CDATA #IMPLIED
-    paramtypes CDATA #IMPLIED>
+    pattern      CDATA #IMPLIED
+    targetoffset CDATA #IMPLIED
+    methodname   CDATA #REQUIRED
+    paramcount   CDATA #IMPLIED
+    paramtypes   CDATA #IMPLIED>
 
 <!-- 
     CallParamRule 



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to