sboag 2002/06/10 13:47:44 Modified: java/src/org/apache/xalan/templates FuncDocument.java FuncFormatNumb.java java/src/org/apache/xpath/functions FuncConcat.java FuncExtFunction.java FuncSubstring.java Function.java Function2Args.java Function3Args.java FunctionDef1Arg.java FunctionMultiArgs.java FunctionOneArg.java java/src/org/apache/xpath/res XPATHErrorResources.properties Log: Patch submitted by [EMAIL PROTECTED]: To summarize what I did, the Function class and its subclasses have two methods that check the number of arguments: setArg and checkNumberArgs. The former checks whether too many arguments are specified, and the latter checks for too few (or too many, redundantly). In the case where there are optional arguments (as in substring), the class for the function (FuncSubstring, in this case) derives from a class that has a fixed number of arguments (Func3Arguments, in this case). If too few arguments are specified, the FuncSubstring.checkNumberArgs method reports that the function only allows 2 or 3 arguments; if too many arguments are specified, the Function3Arguments.setArg method reports that the function only allows 3 arguments. To fix the problem, I added reportWrongNumberArgs() methods to the Function class and to its subclasses, as appropriate, and I added code to call that from checkNumberArgs and setArg - that way, the correct number of arguments is always reported in the error messages. Alternatively, I could have changed the setArg method in all the classes that have optional arguments to report correctly the number of arguments, but I didn't like the idea of having it redundantly perform the same check that the setArg method of its base class was going to perform just to get a better message out. A third possibility would be to have setArg call the checkNumberArgs method when it detects too many arguments are specified; that would guarantee that setArg would report the same message, and avoid introducing a new method, as long as checkNumberArgs always checks for both too few and for too many arguments. A fourth possibility would be to report two different errors: the minimum number of arguments required in checkNumberArgs and the maximum permitted in setArg. I also noticed that the message produced for FuncSubstring when too few arguments are specified actually indicates that 0 or 1 arguments are required, so I fixed the XPATHErrorResources.properties file. I don't see the NPE that Dave Marston mentions in Bugzilla, so I assume that's been fixed. Revision Changes Path 1.27 +10 -0 xml-xalan/java/src/org/apache/xalan/templates/FuncDocument.java Index: FuncDocument.java =================================================================== RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/templates/FuncDocument.java,v retrieving revision 1.26 retrieving revision 1.27 diff -u -r1.26 -r1.27 --- FuncDocument.java 22 Mar 2002 01:04:40 -0000 1.26 +++ FuncDocument.java 10 Jun 2002 20:47:44 -0000 1.27 @@ -480,6 +480,16 @@ public void checkNumberArgs(int argNum) throws WrongNumberArgsException { if ((argNum < 1) || (argNum > 2)) + reportWrongNumberArgs(); + } + + /** + * Constructs and throws a WrongNumberArgException with the appropriate + * message for this function object. + * + * @throws WrongNumberArgsException + */ + protected void reportWrongNumberArgs() throws WrongNumberArgsException { throw new WrongNumberArgsException(XSLMessages.createMessage(XSLTErrorResources.ER_ONE_OR_TWO, null)); //"1 or 2"); } 1.17 +10 -0 xml-xalan/java/src/org/apache/xalan/templates/FuncFormatNumb.java Index: FuncFormatNumb.java =================================================================== RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/templates/FuncFormatNumb.java,v retrieving revision 1.16 retrieving revision 1.17 diff -u -r1.16 -r1.17 --- FuncFormatNumb.java 8 Aug 2001 04:59:07 -0000 1.16 +++ FuncFormatNumb.java 10 Jun 2002 20:47:44 -0000 1.17 @@ -215,6 +215,16 @@ public void checkNumberArgs(int argNum) throws WrongNumberArgsException { if ((argNum > 3) || (argNum < 2)) + reportWrongNumberArgs(); + } + + /** + * Constructs and throws a WrongNumberArgException with the appropriate + * message for this function object. + * + * @throws WrongNumberArgsException + */ + protected void reportWrongNumberArgs() throws WrongNumberArgsException { throw new WrongNumberArgsException(XSLMessages.createMessage(XSLTErrorResources.ER_TWO_OR_THREE, null)); //"2 or 3"); } } 1.7 +10 -0 xml-xalan/java/src/org/apache/xpath/functions/FuncConcat.java Index: FuncConcat.java =================================================================== RCS file: /home/cvs/xml-xalan/java/src/org/apache/xpath/functions/FuncConcat.java,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- FuncConcat.java 7 Jun 2002 17:13:55 -0000 1.6 +++ FuncConcat.java 10 Jun 2002 20:47:44 -0000 1.7 @@ -113,6 +113,16 @@ public void checkNumberArgs(int argNum) throws WrongNumberArgsException { if (argNum < 2) + reportWrongNumberArgs(); + } + + /** + * Constructs and throws a WrongNumberArgException with the appropriate + * message for this function object. + * + * @throws WrongNumberArgsException + */ + protected void reportWrongNumberArgs() throws WrongNumberArgsException { throw new WrongNumberArgsException(XSLMessages.createXPATHMessage("gtone", null)); } } 1.16 +17 -0 xml-xalan/java/src/org/apache/xpath/functions/FuncExtFunction.java Index: FuncExtFunction.java =================================================================== RCS file: /home/cvs/xml-xalan/java/src/org/apache/xpath/functions/FuncExtFunction.java,v retrieving revision 1.15 retrieving revision 1.16 diff -u -r1.15 -r1.16 --- FuncExtFunction.java 10 Jun 2002 19:24:42 -0000 1.15 +++ FuncExtFunction.java 10 Jun 2002 20:47:44 -0000 1.16 @@ -72,6 +72,8 @@ import org.apache.xml.dtm.*; import org.apache.xpath.axes.*; +import org.apache.xpath.res.XPATHErrorResources; +import org.apache.xalan.res.XSLMessages; /** * <meta name="usage" content="advanced"/> @@ -231,4 +233,19 @@ * @throws WrongNumberArgsException */ public void checkNumberArgs(int argNum) throws WrongNumberArgsException{} + + /** + * Constructs and throws a WrongNumberArgException with the appropriate + * message for this function object. This class supports an arbitrary + * number of arguments, so this method must never be called. + * + * @throws WrongNumberArgsException + */ + protected void reportWrongNumberArgs() throws WrongNumberArgsException { + String fMsg = XSLMessages.createXPATHMessage( + XPATHErrorResources.ER_INCORRECT_PROGRAMMER_ASSERTION, + new Object[]{ "Programmer's assertion: the method FunctionMultiArgs.reportWrongNumberArgs() should never be called." }); + + throw new RuntimeException(fMsg); + } } 1.8 +10 -0 xml-xalan/java/src/org/apache/xpath/functions/FuncSubstring.java Index: FuncSubstring.java =================================================================== RCS file: /home/cvs/xml-xalan/java/src/org/apache/xpath/functions/FuncSubstring.java,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- FuncSubstring.java 28 Jul 2001 00:26:00 -0000 1.7 +++ FuncSubstring.java 10 Jun 2002 20:47:44 -0000 1.8 @@ -149,6 +149,16 @@ public void checkNumberArgs(int argNum) throws WrongNumberArgsException { if (argNum < 2) + reportWrongNumberArgs(); + } + + /** + * Constructs and throws a WrongNumberArgException with the appropriate + * message for this function object. + * + * @throws WrongNumberArgsException + */ + protected void reportWrongNumberArgs() throws WrongNumberArgsException { throw new WrongNumberArgsException(XSLMessages.createXPATHMessage(XPATHErrorResources.ER_TWO_OR_THREE, null)); //"2 or 3"); } } 1.9 +13 -1 xml-xalan/java/src/org/apache/xpath/functions/Function.java Index: Function.java =================================================================== RCS file: /home/cvs/xml-xalan/java/src/org/apache/xpath/functions/Function.java,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- Function.java 7 Jun 2002 17:13:55 -0000 1.8 +++ Function.java 10 Jun 2002 20:47:44 -0000 1.9 @@ -93,7 +93,8 @@ public void setArg(Expression arg, int argNum) throws WrongNumberArgsException { - throw new WrongNumberArgsException(XSLMessages.createXPATHMessage("zero", null)); + // throw new WrongNumberArgsException(XSLMessages.createXPATHMessage("zero", null)); + reportWrongNumberArgs(); } /** @@ -109,6 +110,17 @@ public void checkNumberArgs(int argNum) throws WrongNumberArgsException { if (argNum != 0) + reportWrongNumberArgs(); + } + + /** + * Constructs and throws a WrongNumberArgException with the appropriate + * message for this function object. This method is meant to be overloaded + * by derived classes so that the message will be as specific as possible. + * + * @throws WrongNumberArgsException + */ + protected void reportWrongNumberArgs() throws WrongNumberArgsException { throw new WrongNumberArgsException(XSLMessages.createXPATHMessage("zero", null)); } 1.9 +11 -1 xml-xalan/java/src/org/apache/xpath/functions/Function2Args.java Index: Function2Args.java =================================================================== RCS file: /home/cvs/xml-xalan/java/src/org/apache/xpath/functions/Function2Args.java,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- Function2Args.java 7 Jun 2002 17:13:55 -0000 1.8 +++ Function2Args.java 10 Jun 2002 20:47:44 -0000 1.9 @@ -125,7 +125,7 @@ arg.exprSetParent(this); } else - throw new WrongNumberArgsException(XSLMessages.createXPATHMessage("two", null)); + reportWrongNumberArgs(); } /** @@ -139,6 +139,16 @@ public void checkNumberArgs(int argNum) throws WrongNumberArgsException { if (argNum != 2) + reportWrongNumberArgs(); + } + + /** + * Constructs and throws a WrongNumberArgException with the appropriate + * message for this function object. + * + * @throws WrongNumberArgsException + */ + protected void reportWrongNumberArgs() throws WrongNumberArgsException { throw new WrongNumberArgsException(XSLMessages.createXPATHMessage("two", null)); } 1.10 +11 -1 xml-xalan/java/src/org/apache/xpath/functions/Function3Args.java Index: Function3Args.java =================================================================== RCS file: /home/cvs/xml-xalan/java/src/org/apache/xpath/functions/Function3Args.java,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- Function3Args.java 7 Jun 2002 17:13:55 -0000 1.9 +++ Function3Args.java 10 Jun 2002 20:47:44 -0000 1.10 @@ -123,7 +123,7 @@ arg.exprSetParent(this); } else - throw new WrongNumberArgsException(XSLMessages.createXPATHMessage("three", null)); + reportWrongNumberArgs(); } /** @@ -137,6 +137,16 @@ public void checkNumberArgs(int argNum) throws WrongNumberArgsException { if (argNum != 3) + reportWrongNumberArgs(); + } + + /** + * Constructs and throws a WrongNumberArgException with the appropriate + * message for this function object. + * + * @throws WrongNumberArgsException + */ + protected void reportWrongNumberArgs() throws WrongNumberArgsException { throw new WrongNumberArgsException(XSLMessages.createXPATHMessage("three", null)); } 1.8 +10 -0 xml-xalan/java/src/org/apache/xpath/functions/FunctionDef1Arg.java Index: FunctionDef1Arg.java =================================================================== RCS file: /home/cvs/xml-xalan/java/src/org/apache/xpath/functions/FunctionDef1Arg.java,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- FunctionDef1Arg.java 28 Jul 2001 00:26:00 -0000 1.7 +++ FunctionDef1Arg.java 10 Jun 2002 20:47:44 -0000 1.8 @@ -182,6 +182,16 @@ public void checkNumberArgs(int argNum) throws WrongNumberArgsException { if (argNum > 1) + reportWrongNumberArgs(); + } + + /** + * Constructs and throws a WrongNumberArgException with the appropriate + * message for this function object. + * + * @throws WrongNumberArgsException + */ + protected void reportWrongNumberArgs() throws WrongNumberArgsException { throw new WrongNumberArgsException(XSLMessages.createXPATHMessage(XPATHErrorResources.ER_ZERO_OR_ONE, null)); //"0 or 1"); } 1.9 +17 -0 xml-xalan/java/src/org/apache/xpath/functions/FunctionMultiArgs.java Index: FunctionMultiArgs.java =================================================================== RCS file: /home/cvs/xml-xalan/java/src/org/apache/xpath/functions/FunctionMultiArgs.java,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- FunctionMultiArgs.java 22 Mar 2002 01:04:44 -0000 1.8 +++ FunctionMultiArgs.java 10 Jun 2002 20:47:44 -0000 1.9 @@ -62,6 +62,8 @@ import org.apache.xpath.ExpressionOwner; import org.apache.xpath.XPathVisitor; import org.apache.xpath.functions.Function3Args.Arg2Owner; +import org.apache.xpath.res.XPATHErrorResources; +import org.apache.xalan.res.XSLMessages; /** * <meta name="usage" content="advanced"/> @@ -144,6 +146,21 @@ * @throws WrongNumberArgsException */ public void checkNumberArgs(int argNum) throws WrongNumberArgsException{} + + /** + * Constructs and throws a WrongNumberArgException with the appropriate + * message for this function object. This class supports an arbitrary + * number of arguments, so this method must never be called. + * + * @throws WrongNumberArgsException + */ + protected void reportWrongNumberArgs() throws WrongNumberArgsException { + String fMsg = XSLMessages.createXPATHMessage( + XPATHErrorResources.ER_INCORRECT_PROGRAMMER_ASSERTION, + new Object[]{ "Programmer's assertion: the method FunctionMultiArgs.reportWrongNumberArgs() should never be called." }); + + throw new RuntimeException(fMsg); + } /** * Tell if this expression or it's subexpressions can traverse outside 1.9 +11 -1 xml-xalan/java/src/org/apache/xpath/functions/FunctionOneArg.java Index: FunctionOneArg.java =================================================================== RCS file: /home/cvs/xml-xalan/java/src/org/apache/xpath/functions/FunctionOneArg.java,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- FunctionOneArg.java 7 Jun 2002 17:13:55 -0000 1.8 +++ FunctionOneArg.java 10 Jun 2002 20:47:44 -0000 1.9 @@ -104,7 +104,7 @@ arg.exprSetParent(this); } else - throw new WrongNumberArgsException(XSLMessages.createXPATHMessage("one", null)); + reportWrongNumberArgs(); } /** @@ -118,6 +118,16 @@ public void checkNumberArgs(int argNum) throws WrongNumberArgsException { if (argNum != 1) + reportWrongNumberArgs(); + } + + /** + * Constructs and throws a WrongNumberArgException with the appropriate + * message for this function object. + * + * @throws WrongNumberArgsException + */ + protected void reportWrongNumberArgs() throws WrongNumberArgsException { throw new WrongNumberArgsException(XSLMessages.createXPATHMessage("one", null)); } 1.3 +1 -1 xml-xalan/java/src/org/apache/xpath/res/XPATHErrorResources.properties Index: XPATHErrorResources.properties =================================================================== RCS file: /home/cvs/xml-xalan/java/src/org/apache/xpath/res/XPATHErrorResources.properties,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- XPATHErrorResources.properties 7 Jun 2002 17:13:55 -0000 1.2 +++ XPATHErrorResources.properties 10 Jun 2002 20:47:44 -0000 1.3 @@ -173,7 +173,7 @@ # ER_FASTSTRINGBUFFER_CANNOT_BE_NULL ER0083=The FastStringBuffer argument can not be null # ER_TWO_OR_THREE -ER0084=0 or 1 +ER0084=2 or 3 # ER_VARIABLE_ACCESSED_BEFORE_BIND ER0085=Variable accessed before it is bound!
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]