Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-6554525

javax.scripting javascript string equality incorrect for wrapped java Strings

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Not an Issue
    • Icon: P4 P4
    • 8-pool
    • 6
    • core-libs

      FULL PRODUCT VERSION :
      h:\>java -version
      java version "1.6.0_01"
      Java(TM) SE Runtime Environment (build 1.6.0_01-b06)
      Java HotSpot(TM) Client VM (build 1.6.0_01-b06, mixed mode, sharing)


      ADDITIONAL OS VERSION INFORMATION :

      Microsoft Windows XP [Version 5.1.2600]


      A DESCRIPTION OF THE PROBLEM :
      This is not a swing problem, it is just that swing is the nearest matching subcategory it starts with pjavax !) and I had to choose one.

      When running the javascript scripting engine, java Strings that are equal() but != and have been wrapped as javascript objects after being returned from a method call on another java object are NOT considered == whereas they should be.

      However the same two java Strings, when wrapped using engine.put() do compare ==

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      run attached junit test

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      eq4 is true
      ACTUAL -
      eq4 is false

      REPRODUCIBILITY :
      This bug can be reproduced always.

      ---------- BEGIN SOURCE ----------
      import java.util.Arrays;
      import javax.script.ScriptEngine;
      import javax.script.ScriptEngineManager;
      import javax.script.ScriptException;
      import junit.framework.*;
      /*
       * StringEqualityTest.java
       * JUnit based test
       *
       * Created on 3 May 2007, 10:59
       */

      /**
       *
       * @author bchapman
       */
      public class StringEqualityTest extends TestCase {
          
          public StringEqualityTest(String testName) {
              super(testName);
          }

          public void testStringEquality() throws ScriptException {
              ScriptEngineManager manager = new ScriptEngineManager();
              ScriptEngine engine = manager.getEngineByName("JavaScript");
              String alpha = "ABCD";
              String beta = new String(alpha);
              assertTrue(alpha.equals(beta));
              assertFalse(alpha == beta);
              engine.put("alpha",alpha);
              engine.put("beta", beta);
              engine.put("list", Arrays.asList(alpha,beta,beta.intern()));
              engine.eval("var eq1 = (alpha == beta);");
              engine.eval("alpha = list.get(0); beta = list.get(1);");
              engine.eval("var eq2 = (alpha == list.get(2));");
              engine.eval("var eq3 = alpha.equals(beta);");
              engine.eval("var eq4 = (alpha == beta);");
              assertTrue((Boolean)engine.get("eq1")); // == when non identical strings via engine.put()
              assertTrue((Boolean)engine.get("eq2")); // == when java returns identical Strings
              assertTrue((Boolean)engine.get("eq3")); // .equal() when java (List) returns non identical Strings
              assertTrue((Boolean)engine.get("eq4")); // fails == when java (List) returns non identical Strings
          }
      }

      ---------- END SOURCE ----------

      CUSTOMER SUBMITTED WORKAROUND :
      call intern() on any String return values from java methods that are exposed to javascript scripts.

            sundar Sundararajan Athijegannathan
            ryeung Roger Yeung (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

              Created:
              Updated:
              Resolved:
              Imported:
              Indexed: