JiBX
  1. JiBX
  2. JIBX-202

CLONE -binding compiler is not aware of inherited interfaces

    Details

    • Type: Bug Bug
    • Status: Closed Closed
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: JiBX 1.1.3
    • Fix Version/s: 1.0-RC1, JiBX 1.1.6
    • Component/s: core
    • Labels:
      None
    • Environment:
      win xp / java 1.4.2_08 / jibx 1.1.3 (December 18, 2006)
    • Testcase included:
      yes
    • Number of attachments :
      0

      Description

      Here is a short exmple (see attachment for full code):

      ==========================
      public interface Bug_Itf
      { }

      public abstract class Bug_Abstract implements Bug_Itf
      { }

      public class Bug_Impl extends Bug_Abstract
      // implements Bug_Itf // ==> if not explicitly mentioned, JiBX is not aware of this relationship
      { }

      public class Bug_Test {
      private Bug_Itf m_impl; // ==> Note: If m_impl is of type Bug_Impl or Bug_Abstract, the pb doesn't appear

      public static void main (String[] args) throws Exception

      { Bug_Test t = new Bug_Test(); IBindingFactory bfact = BindingDirectory.getFactory(Bug_Test.class); IMarshallingContext mctx = bfact.createMarshallingContext(); mctx.marshalDocument(t, "UTF-8", null, System.out); }

      }
      ==========================

      when applying the binding (see it below),
      javac -classpath '.;jibx-run.jar' *.java
      java -jar jibx-bind.jar Bug_binding.xml
      I get the error
      Error: No compatible mapping defined for type Bug_Itf; on structure element at (line 20, col 50, in Bug_binding.xml)
      Error running binding compiler
      org.jibx.runtime.JiBXException: Binding Bug_binding.xml is unusable because of validation errors
      at org.jibx.binding.Utility.loadBinding(Utility.java:346)
      at org.jibx.binding.Utility.loadFileBinding(Utility.java:413)
      at org.jibx.binding.Compile.compile(Compile.java:296)
      at org.jibx.binding.Compile.main(Compile.java:385)

      Mentioning explicitly the Bug_Impl implements Bug_Itf resolves the pb.

      Bug_binding.xml:
      =============================
      <?xml version='1.0' encoding='UTF-8' ?>

      <binding>

      <!-- abstract mapping for
      Bug_Abstract (implements interface Bug_Itf) -->
      <mapping class="Bug_Abstract" abstract="true" type-name="A_abstract" />

      <!-- abstract and concrete mappings for
      Bug_Impl (extends abstract class Bug_Itf) -->
      <mapping class="Bug_Impl" abstract="true" type-name="A_impl">
      <structure map-as="A_abstract" />
      </mapping>
      <mapping name="impl" class="Bug_Impl">
      <structure map-as="A_impl" />
      </mapping>

      <!-- the test class, contains a "private Bug_Itf m_impl" -->
      <mapping class="Bug_Test" abstract="true" type-name="A_test">
      <structure field="m_impl" usage="optional" />
      </mapping>
      <mapping name="test" class="Bug_Test">
      <structure map-as="A_test" />
      </mapping>

      </binding>
      =============================

        Activity

        Hide
        Jaquar added a comment -

        The above issue was fixed in 1.1.5 however
        The issue still exists if there is an interface extending another interface.

        public interface IFoo
        { }

        public interface IBar extends IFoo
        { }

        public class Bug_Test implements IBar { }

        If I have structure field which is of type IFoo, it fails to realize that Bug_Test is actually implementing it indirectly and throws the error:-
        Error: No compatible mapping defined for type IFoo;

        However, if I have a seperate mapping for IBar, it realizes that IBar extends to IFoo and eventually realizes that Bug_Test is implementing. It is similar to the above issue with the exception of interface instead of abstract class.

        Is there a bug fix available ?

        Show
        Jaquar added a comment - The above issue was fixed in 1.1.5 however The issue still exists if there is an interface extending another interface. public interface IFoo { } public interface IBar extends IFoo { } public class Bug_Test implements IBar { } If I have structure field which is of type IFoo, it fails to realize that Bug_Test is actually implementing it indirectly and throws the error:- Error: No compatible mapping defined for type IFoo; However, if I have a seperate mapping for IBar, it realizes that IBar extends to IFoo and eventually realizes that Bug_Test is implementing. It is similar to the above issue with the exception of interface instead of abstract class. Is there a bug fix available ?
        Hide
        Dennis Sosnoski added a comment -

        Fixed this to check both direct and indirect interfaces. I've verified that this case (interface I1 used as field type, interface I2 which extends I1, and class which implements I2 defined by <mapping>) now works.

        Show
        Dennis Sosnoski added a comment - Fixed this to check both direct and indirect interfaces. I've verified that this case (interface I1 used as field type, interface I2 which extends I1, and class which implements I2 defined by <mapping>) now works.

          People

          • Assignee:
            Dennis Sosnoski
            Reporter:
            Jaquar
          • Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved: