i think the fact that it wasn't valid VTL for most cases helps, but i believe we'll have to carefully decide on a good order of comparison to pull this off for 1.5.
here's a barely thought out proposal for doing #if( $foo == $bar ): 1. if foo and bar are both numbers, do a numeric comparison. 2. if foo and bar are strings, do a direct string comparison 3. if bar is an instance of foo's class and/or foo is an instance of bar's class, then do foo.equals(bar) 4. otherwise, compare foo.toString() with bar.toString() the key here for backwards compatibility is the *and* part of #3. equal classes will have to be compared using foo.equals(bar), as that has always been valid VTL. i'm not as sure about the *or* part of #3, as i can't recall or test at the moment (i'm in a hurry) whether it is valid to do #if( $a == $b ) when $b is a subclass of $a (or vice versa). i'm also not sure which the developer/designer is more likely to expect in that case: a string comparison or a java equals() comparison. thoughts? On 9/16/05, Will Glass-Husain <[EMAIL PROTECTED]> wrote: > yes! a related bug is that comparing items of two different classes gives > an error (doesn't even return false). > > I think if both items are numbers the comparison should be numeric, of > course. (integer 2 == double 2.0 even though the string representations are > different). Otherwise, it'd be nice to compare on Strings. > > Is this in bugzilla? cough... I mean JIRA? It's a pretty easy fix. > (ASTEquals if I remember from memory). Can we get away with this for the > 1.5 release or is that a backwards compatibility issue? (1.5 *must* stay > backwards compatible). My first reaction is that this is ok. (since this > wasn't even valid VTL before). > > WILL > > ----- Original Message ----- > From: "Nathan Bubna" <[EMAIL PROTECTED]> > To: "Velocity Users List" <velocity-user@jakarta.apache.org>; > <[EMAIL PROTECTED]> > Sent: Friday, September 16, 2005 2:09 PM > Subject: Re: Comparing strings > > > All good discussion, Henning is, of course, right on. > > but all this reminds me of a closely related velocity wish-list item > of mine: having == comparisons be done on the *rendered* value of the > references, rather than the class value. in other words, i would > like: > > #set( $two = 2 ) > #if( $two == '2' ) > to output this text! > #end > > after all, putting "$two equals 2" in a template (leave off the #if) > and rendering it will output "2 equals 2". why shouldn't things that > will be rendered identically by VTL be treated as equal in #if > statements? i think that is the most intuitive way to do comparisons > in a template language where the focus is on the rendered output. > perhaps it's time i put a page on the wiki for it, to perhaps build a > little momentum/consensus for getting this in future versions. > > On 9/16/05, Henning P. Schmiedehausen <[EMAIL PROTECTED]> wrote: > > "Steve O'Hara" <[EMAIL PROTECTED]> writes: > > > > >A while back I chastised someone for not using proper String comparison > > >operators in their templates. I looked in the Velocity code and sure > > >enough "==" operators are translated into equals. So I was looking a bit > > >stupid. > > > > >Somebody challenged me to come up with a situation where the equality > > >"==" operator doesn't work with Strings. > > >Well, finally, I've just found an example in my code; > > > > > #if ($SummarySortField==$Field.getUdmFieldName()) > > > #if ($SummarySortField==${Field.getUdmFieldName()}) > > > #if ($SummarySortField.equalsIgnoreCase($Field.getUdmFieldName())) > > > > >I thought perhaps I was going mad before when I raised this and plenty > > >of people on this list questioned me, but can anyone explain this? > > > > equalsIngoreCase != equals. > > > > In Java, equals != == > > > > Look at this: > > > > public class Test { > > public static void main(String [] argv) throws Exception { > > String s1 = "foo"; > > String s2 = "foobar".substring(0,3); > > > > System.out.println(s1); > > System.out.println(s2); > > System.out.println(s1 == s2); > > System.out.println(s1.equals(s2)); > > } > > > > } > > > > outputs > > > > foo > > foo > > false > > true > > > > However, in Velocity: > > > > --- cut --- > > import java.io.OutputStreamWriter; > > > > import org.apache.commons.lang.ObjectUtils; > > import org.apache.velocity.Template; > > import org.apache.velocity.VelocityContext; > > import org.apache.velocity.app.Velocity; > > > > public class Demo { > > public static void main(String[] args) { > > try { > > Velocity.init(); > > > > VelocityContext vc = new VelocityContext(); > > String s1 = "foo"; > > String s2 = "foobar".substring(0,3); > > vc.put("s1", s1); > > vc.put("s2", s2); > > > > vc.put("s1info", ObjectUtils.appendIdentityToString(null, > > s1).toString()); > > vc.put("s2info", ObjectUtils.appendIdentityToString(null, > > s2).toString()); > > > > Template template = Velocity.getTemplate("DemoTemplate.vm"); > > OutputStreamWriter osw = new OutputStreamWriter(System.out); > > > > template.merge(vc, osw); > > > > osw.flush(); > > osw.close(); > > } catch (Exception e) { > > e.printStackTrace(); > > } > > } > > } > > --- cut --- > > > > String1: ${s1}, Type is $s1.Class.Name > > String2: ${s2}, Type is $s2.Class.Name > > > > String1 Info: ${s1info} > > String2 Info: ${s2info} > > > > Equals: > > #if ($s1.equals($s2)) > > True > > #else > > False > > #end > > > > Compare: > > #if ($s1 == $s2) > > True > > #else > > False > > #end > > > > --- cut --- > > > > produces: > > > > String1: foo, Type is java.lang.String > > String2: foo, Type is java.lang.String > > > > String1 Info: [EMAIL PROTECTED] > > String2 Info: [EMAIL PROTECTED] > > > > Equals: > > True > > > > Compare: > > True > > > > So Velocity == is not the same as Java == for Strings. It is the same > > as equals(). > > > > Best regards > > Henning > > > > > > -- > > Dipl.-Inf. (Univ.) Henning P. Schmiedehausen INTERMETA GmbH > > [EMAIL PROTECTED] +49 9131 50 654 0 http://www.intermeta.de/ > > > > RedHat Certified Engineer -- Jakarta Turbine Development -- hero for hire > > Linux, Java, perl, Solaris -- Consulting, Training, Development > > > > 4 - 8 - 15 - 16 - 23 - 42 > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > For additional commands, e-mail: [EMAIL PROTECTED] > > > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]