Thanks, now I see what's happening there.

If the LoggerComponent had @Required fields and its instance was created via an 
explicit constructor, it wouldn't get an InstanceManager instance in __IM 
initialized: it is only initialized from iPOJO own constructor that wouldn't be 
called. Hence it also wouldn't evaluate any of the @Required fields. So if I 
understand it correctly, to make the @Required fields work:

- Upon calling LoggerComponentStrategy.getServiceFactory(InstanceManager im), 
the strategy creates a new ServiceObjectFactory that is parametrized by im and 
returns it as its result.
- This returned ServiceObjectFactory would implement 
getService(ComponentInstance) so that it invokes _setInstanceManager (via 
reflection as it is private) on the resulting iPOJO component instance, passing 
it the im instance manager as an argument. Then the @Required fields of the 
result would be able to provide correct values.

Is that correct?

--Hynek

On 02.8.2010 13:51:27, clement escoffier wrote:
> 2010/8/2 Hynek Mlnařík <[email protected]>
> > However the problem with calling a parameterless constructor remains. I've
> > made a short research into the issue and created a test case which could be
> > found at http://www.sendspace.com/file/imhlcx. It is a simple
> > two-component sample (one component requires the other). The components are
> > created programmatically (via IPOJOHelper class fragment taken from
> > junit4osgi project). It correctly does not invoke a parameterless
> > constructor of a.b.LoggerComponent when a.b.LoggerComponent class does not
> > contain a @Validate annotated method. However, if such a method exists in
> > the class, a parameterless constructor is invoked. This seems a bug to me.
> > Could you please confirm it or let me know what I'm doing wrong?
>
> The @Validate callback will create the object using a parameterless
> constructor. Indeed, to call the validate method, iPOJO needs to create an
> object first. This object is created by using a parameterless argument or a
> static factory method (@Component.factory_method). This method is also
> called without parameters. If you want to set 'fields', just declare
> properties and give the values in the instance configuration.
>
> But in your case, it will not help :-). You're using service object creation
> strategy, so you can't use the @Validate annotation because both have
> the responsibility to create the service objects. @Validate is called first
> and immediately after the instance validation. The object is created using
> the parameterless constructor. However, to get your code working correctly,
> just call the method annotated with @Validate in the constructor and remove
> the @Validate.
> LoggerComponent(final String name) {
>         this.name = name;
>         System.out.println("constructor with parameter " + name);
>         validateLoggerComponent(); // <-- Added
> }
>
> Only the service providing strategy has the responsibility to create your
> object. And so, it will call the correct constructor.
>
> Regards,
>
> Clement

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to