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

generated code has verify* methods that do not check for equality of value

XMLWordPrintable

    • x86
    • windows_7

      FULL PRODUCT VERSION :
      java version "1.7.0_60"
      Java(TM) SE Runtime Environment (build 1.7.0_60-b19)
      Java HotSpot(TM) Client VM (build 24.60-b09, mixed mode, sharing)


      ADDITIONAL OS VERSION INFORMATION :
      Microsoft Windows 6.1.7601

      EXTRA RELEVANT SYSTEM CONFIGURATION :
      We are using maven idlj plugin to convert idl to java..

       <groupId>org.codehaus.mojo</groupId>
              <artifactId>idlj-maven-plugin</artifactId>
              <!--<version>1.2.1</version>-->
              <version>1.2.1</version>

      idlj version is 3.2

      A DESCRIPTION OF THE PROBLEM :
      We have a union defined in an idl file

      module xyz {
        enum VaryingSeqTypes {doubleType, longType, stringType};
        union VaryingSeqUnion switch(VaryingSeqTypes) {
          case doubleType: DoubleSeq doubles;
          case longType: LongSeq longs;
          case stringType: StringSeq strings;
        };

      }

      The generated code has verify* prefix methods [verifydoubles, verifystrings, verifylongs] for double, string and long types. These seem to check equality of discriminator and types by reference and not by value.

      This is not working in our case.


      Below is code generated:
      =====================================================




      /**
      * VaryingSeqUnion.java .
      * Generated by the IDL-to-Java compiler (portable), version "3.2"
      * from C:/UserData/NewTims/tims/src/main/idl/com/ti/mtc/dedb/dedb_structs.idl
      * Thursday, June 12, 2014 11:42:22 AM CDT
      */


      public final class VaryingSeqUnion implements org.omg.CORBA.portable.IDLEntity
      {
        private double[] ___doubles;
        private int[] ___longs;
        private String[] ___strings;
        private com.ti.mtc.dedb.DEDB_STRUCTS.VaryingSeqTypes __discriminator;
        private boolean __uninitialized = true;

        public VaryingSeqUnion ()
        {
        }

        public com.ti.mtc.dedb.DEDB_STRUCTS.VaryingSeqTypes discriminator ()
        {
          if (__uninitialized)
            throw new org.omg.CORBA.BAD_OPERATION ();
          return __discriminator;
        }

        public double[] doubles ()
        {
          if (__uninitialized)
            throw new org.omg.CORBA.BAD_OPERATION ();
          verifydoubles (__discriminator);
          return ___doubles;
        }

        public void doubles (double[] value)
        {
          __discriminator = com.ti.mtc.dedb.DEDB_STRUCTS.VaryingSeqTypes.doubleType;
          ___doubles = value;
          __uninitialized = false;
        }

        public void doubles (com.ti.mtc.dedb.DEDB_STRUCTS.VaryingSeqTypes discriminator, double[] value)
        {
          verifydoubles (discriminator);
          __discriminator = discriminator;
          ___doubles = value;
          __uninitialized = false;
        }

        private void verifydoubles (com.ti.mtc.dedb.DEDB_STRUCTS.VaryingSeqTypes discriminator)
        {
          if (discriminator != com.ti.mtc.dedb.DEDB_STRUCTS.VaryingSeqTypes.doubleType)
            throw new org.omg.CORBA.BAD_OPERATION ();
        }

        public int[] longs ()
        {
          if (__uninitialized)
            throw new org.omg.CORBA.BAD_OPERATION ();
          verifylongs (__discriminator);
          return ___longs;
        }

        public void longs (int[] value)
        {
          __discriminator = com.ti.mtc.dedb.DEDB_STRUCTS.VaryingSeqTypes.longType;
          ___longs = value;
          __uninitialized = false;
        }

        public void longs (com.ti.mtc.dedb.DEDB_STRUCTS.VaryingSeqTypes discriminator, int[] value)
        {
          verifylongs (discriminator);
          __discriminator = discriminator;
          ___longs = value;
          __uninitialized = false;
        }

        private void verifylongs (com.ti.mtc.dedb.DEDB_STRUCTS.VaryingSeqTypes discriminator)
        {
          if (discriminator!= com.ti.mtc.dedb.DEDB_STRUCTS.VaryingSeqTypes.longType)
            throw new org.omg.CORBA.BAD_OPERATION ();
        }

        public String[] strings ()
        {
          if (__uninitialized)
            throw new org.omg.CORBA.BAD_OPERATION ();
          verifystrings (__discriminator);
          return ___strings;
        }

        public void strings (String[] value)
        {
          __discriminator = com.ti.mtc.dedb.DEDB_STRUCTS.VaryingSeqTypes.stringType;
          ___strings = value;
          __uninitialized = false;
        }

        public void strings (com.ti.mtc.dedb.DEDB_STRUCTS.VaryingSeqTypes discriminator, String[] value)
        {
          verifystrings (discriminator);
          __discriminator = discriminator;
          ___strings = value;
          __uninitialized = false;
        }

        private void verifystrings (com.ti.mtc.dedb.DEDB_STRUCTS.VaryingSeqTypes discriminator)
        {
          if (discriminator != com.ti.mtc.dedb.DEDB_STRUCTS.VaryingSeqTypes.stringType)
            throw new org.omg.CORBA.BAD_OPERATION ();
        }

      } // class VaryingSeqUnion


      ====================================================================

      When we add below change, it seems to work in our distributed code:

       if (discriminator.value() != com.ti.mtc.dedb.DEDB_STRUCTS.VaryingSeqTypes.stringType.value())
            throw new org.omg.CORBA.BAD_OPERATION ();




      ADDITIONAL REGRESSION INFORMATION:
      C:\Users\a0216021>java -version
      java version "1.7.0_60"
      Java(TM) SE Runtime Environment (build 1.7.0_60-b19)
      Java HotSpot(TM) Client VM (build 24.60-b09, mixed mode, sharing)

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      Add an idl file.


      module xyz {
        enum VaryingSeqTypes {doubleType, longType, stringType};
        union VaryingSeqUnion switch(VaryingSeqTypes) {
          case doubleType: DoubleSeq doubles;
          case longType: LongSeq longs;
          case stringType: StringSeq strings;
        };

      }

      Using idlj generate classes.



      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      The verify* methods should check discriminator value and not reference.
      ACTUAL -
      The verify* methods are check discriminator by reference.

      ERROR MESSAGES/STACK TRACES THAT OCCUR :
      When we use generated code as it, it is not working across remote procedures.

      REPRODUCIBILITY :
      This bug can be reproduced always.

      ---------- BEGIN SOURCE ----------
      See above in Description.
      ---------- END SOURCE ----------

      CUSTOMER SUBMITTED WORKAROUND :
      When we add below change, it seems to work in our distributed code:

       if (discriminator.value() != com.ti.mtc.dedb.DEDB_STRUCTS.VaryingSeqTypes.stringType.value())
            throw new org.omg.CORBA.BAD_OPERATION ();

            coffeys Sean Coffey
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            5 Start watching this issue

              Created:
              Updated:
              Resolved: