Author: wglass Date: Fri Sep 23 22:34:39 2005 New Revision: 291252 URL: http://svn.apache.org/viewcvs?rev=291252&view=rev Log: equality and not equality now based on toString when classes are different. See VELOCITY-350
Modified: jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/node/ASTEQNode.java jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/node/ASTNENode.java jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/TemplateTestCase.java jakarta/velocity/core/trunk/test/templates/compare/logical.cmp jakarta/velocity/core/trunk/test/templates/logical.vm Modified: jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/node/ASTEQNode.java URL: http://svn.apache.org/viewcvs/jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/node/ASTEQNode.java?rev=291252&r1=291251&r2=291252&view=diff ============================================================================== --- jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/node/ASTEQNode.java (original) +++ jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/node/ASTEQNode.java Fri Sep 23 22:34:39 2005 @@ -111,27 +111,41 @@ } - /* - * check to see if they are the same class. I don't think this is slower - * as I don't think that getClass() results in object creation, and we can - * extend == to handle all classes - */ - if (left.getClass().equals( right.getClass() ) ) + /** + * assume that if one class is a subclass of the other + * that we should use the equals operator + */ + + if (left.getClass().isAssignableFrom(right.getClass()) || + right.getClass().isAssignableFrom(left.getClass()) ) { return left.equals( right ); } else { - rsvc.error("Error in evaluation of == expression." - + " Both arguments must be of the same Class." - + " Currently left = " + left.getClass() + ", right = " - + right.getClass() + ". " - + context.getCurrentTemplateName() + " [line " + getLine() - + ", column " + getColumn() + "] (ASTEQNode)"); + /** + * Compare the String representations + */ + if ((left.toString() == null) || (right.toString() == null)) + { + rsvc.error( ( left.toString() == null ? "Left" : "Right" ) + " string side " + + "String representation (" + + jjtGetChild( (left == null? 0 : 1) ).literal() + + ") of '!=' operation has null value." + + " Operation not possible. " + + context.getCurrentTemplateName() + " [line " + getLine() + + ", column " + getColumn() + "]"); + + return false; + } + + else + { + return left.toString().equals(right.toString()); + } } - return false; } public Object value(InternalContextAdapter context) Modified: jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/node/ASTNENode.java URL: http://svn.apache.org/viewcvs/jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/node/ASTNENode.java?rev=291252&r1=291251&r2=291252&view=diff ============================================================================== --- jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/node/ASTNENode.java (original) +++ jakarta/velocity/core/trunk/src/java/org/apache/velocity/runtime/parser/node/ASTNENode.java Fri Sep 23 22:34:39 2005 @@ -93,27 +93,41 @@ } - /* - * check to see if they are the same class. I don't think this is slower - * as I don't think that getClass() results in object creation, and we can - * extend == to handle all classes - */ - - if (left.getClass().equals( right.getClass() ) ) + /** + * assume that if one class is a subclass of the other + * that we should use the equals operator + */ + + if (left.getClass().isAssignableFrom(right.getClass()) || + right.getClass().isAssignableFrom(left.getClass()) ) { - return !(left.equals( right )); + return !left.equals( right ); } else { - rsvc.error("Error in evaluation of != expression." - + " Both arguments must be of the same Class." - + " Currently left = " + left.getClass() + ", right = " - + right.getClass() + ". " - + context.getCurrentTemplateName() + " [line " + getLine() - + ", column " + getColumn() + "] (ASTEQNode)"); + /** + * Compare the String representations + */ + if ((left.toString() == null) || (right.toString() == null)) + { + rsvc.error( ( left.toString() == null ? "Left" : "Right" ) + " string side " + + "String representation (" + + jjtGetChild( (left == null? 0 : 1) ).literal() + + ") of '!=' operation has null value." + + " Operation not possible. " + + context.getCurrentTemplateName() + " [line " + getLine() + + ", column " + getColumn() + "]"); + + return false; + } + + else + { + return !left.toString().equals(right.toString()); + } - return false; } + } public Object value(InternalContextAdapter context) Modified: jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/TemplateTestCase.java URL: http://svn.apache.org/viewcvs/jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/TemplateTestCase.java?rev=291252&r1=291251&r2=291252&view=diff ============================================================================== --- jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/TemplateTestCase.java (original) +++ jakarta/velocity/core/trunk/src/test/org/apache/velocity/test/TemplateTestCase.java Fri Sep 23 22:34:39 2005 @@ -125,6 +125,8 @@ context.put("provider", provider); context1.put("name", "jason"); + context1.put("name2", new StringBuffer("jason")); + context1.put("name3", new StringBuffer("geoge")); context2.put("providers", provider.getCustomers2()); context.put("list", al); context1.put("hashtable", h); Modified: jakarta/velocity/core/trunk/test/templates/compare/logical.cmp URL: http://svn.apache.org/viewcvs/jakarta/velocity/core/trunk/test/templates/compare/logical.cmp?rev=291252&r1=291251&r2=291252&view=diff ============================================================================== --- jakarta/velocity/core/trunk/test/templates/compare/logical.cmp (original) +++ jakarta/velocity/core/trunk/test/templates/compare/logical.cmp Fri Sep 23 22:34:39 2005 @@ -164,6 +164,14 @@ Should equal true : true +---------------------- +Compare String and StringBuffer +---------------------- +This should be true: true + +This should be false: false + +This should be true: true right Modified: jakarta/velocity/core/trunk/test/templates/logical.vm URL: http://svn.apache.org/viewcvs/jakarta/velocity/core/trunk/test/templates/logical.vm?rev=291252&r1=291251&r2=291252&view=diff ============================================================================== --- jakarta/velocity/core/trunk/test/templates/logical.vm (original) +++ jakarta/velocity/core/trunk/test/templates/logical.vm Fri Sep 23 22:34:39 2005 @@ -390,6 +390,17 @@ #set($fofo = ( ($t || $f) && $t)) Should equal true : $fofo +---------------------- +Compare String and StringBuffer +---------------------- +#set($compClass = ($name == $name2)) +This should be true: $compClass + +#set($compClass2 = ($name == $name3)) +This should be false: $compClass2 + +#set($compClass3 = ($name != $name3)) +This should be true: $compClass3 #set($x = !true) --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]