Felix
  1. Felix
  2. FELIX-2834

@Validate method is called when the @Requires components are not validated yet

    Details

      Description

      Declare two components one that requires the other.
      Have an @Validate method.
      Depending on the declaration order in the metadata.xml, the component that requires the other may have acces to a component which has not been validated.

      Example:

      @Component
      class Component1
      {
      @Requires
      Component2 c2;

      @Validate
      public void init() {
      // this may cause an NullPointerException, as c2.usefullData is created in the @Validate method
      if (c2.usefullData.length()>0)

      { // Do something }

      }
      }

      @Component
      class Component2
      {
      String usefullData;
      @Validate
      public void init()

      { usefullData="ready"; }

      }

      If you declare this metadata.xml, the @Validate will fail:
      <ipojo>
      <instance component="Component1" />
      <instance component="Component2" />
      </ipojo>

      Changing the order of components in xml solves the problem, although I think the validation should be called only when the required components are validated.

        Activity

        Hide
        Clement Escoffier added a comment -

        How does c2 expose itself ? Is it a service ?

        Because with:
        @Component
        class Component1
        {
        @Requires
        Component2 c2;

        @Validate
        public void init() {
        // this may cause an NullPointerException, as c2.usefullData is created in the @Validate method
        if (c2.usefullData.length()>0)

        { System.out.println("Youhou " + c2.usefullData); }

        }
        }

        @Component
        @Provides(specifications=Component2.class)
        public class Component2
        {
        String usefullData;
        @Validate
        public void init()

        { usefullData="ready"; }

        }

        and this metadata:
        <instance component="ipojo.test.org.apache.felix.ipojo.felix2834.Component1"/>
        <instance component="ipojo.test.org.apache.felix.ipojo.felix2834.Component2"/>

        I got the expected result:
        Youhou ready

        I'm using iPOJO 1.8.0.

        Show
        Clement Escoffier added a comment - How does c2 expose itself ? Is it a service ? Because with: @Component class Component1 { @Requires Component2 c2; @Validate public void init() { // this may cause an NullPointerException, as c2.usefullData is created in the @Validate method if (c2.usefullData.length()>0) { System.out.println("Youhou " + c2.usefullData); } } } @Component @Provides(specifications=Component2.class) public class Component2 { String usefullData; @Validate public void init() { usefullData="ready"; } } and this metadata: <instance component="ipojo.test.org.apache.felix.ipojo.felix2834.Component1"/> <instance component="ipojo.test.org.apache.felix.ipojo.felix2834.Component2"/> I got the expected result: Youhou ready I'm using iPOJO 1.8.0.
        Hide
        Vincent Vandemeulebrouck added a comment -

        Thanks for the quick answer

        As indicated in the "affects version", it was iPOJO-1.6.0
        This might be solved in 1.8.0, I will see if we can upgrade.
        Anyway, we have the workaround to prevent the issue (sorting the components in the metadata.xml).

        Vincent

        Show
        Vincent Vandemeulebrouck added a comment - Thanks for the quick answer As indicated in the "affects version", it was iPOJO-1.6.0 This might be solved in 1.8.0, I will see if we can upgrade. Anyway, we have the workaround to prevent the issue (sorting the components in the metadata.xml). Vincent
        Hide
        Clement Escoffier added a comment -

        Already fixed in the 1.8.0.

        Show
        Clement Escoffier added a comment - Already fixed in the 1.8.0.

          People

          • Assignee:
            Clement Escoffier
            Reporter:
            Vincent Vandemeulebrouck
          • Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development