You are right. It is a java application, not a component.

I did this:

                       ServiceReference factoryServiceReference= 
m_felix.getBundleContext().getServiceReference(HelloService.class.getName());
                       Factory factory 
=(Factory)m_felix.getBundleContext().getService(factoryServiceReference);
                       ComponentInstance x= 
factory.createComponentInstance(null);
                           x.start();

But I got: java.lang.NullPointerException: Specified service reference cannot 
be null.



-----Original Message-----
From: Clement Escoffier [mailto:[email protected]] 
Sent: Sunday, January 26, 2014 5:24 PM
To: Apache Felix - Users Mailing List
Subject: Re: iPOJO Components instantiated but no visible output


On 26 janv. 2014, at 10:54, Zaid Jamal Saeed Al Mahmoud 
<[email protected]> wrote:

> Thank you Mr. Guillaume.
> 
> Where you mentioned, " Get the iPOJO Factory service (associated with the 
> type/component you want to instantiate) and call Factory.createInstance(...)"
> 
> I would love to achieve that. But I am seeking since a week for the syntax 
> code to achieve that. Here's what I did:
> 
> In my Java Application:
> 
>    @Requires(filter="(factory.name=my-factory)")
>    private Factory factory;

The @Requires only works in iPOJO component. According to your setup, this code 
is not an iPOJO component (Am I wrong ?). You have to do the service lookup 
using the bundle context to retrieve the Factory service.


Regards,

Clement



> 
> THEN,
> 
>                                ComponentInstance instance = 
> factory.createComponentInstance(null);                    
>                       instance.start();
> 
> This keeps raising a Null Pointer Exception that factory is NULL. But my 
> bundle has a component with the name factory and that bundle is up and 
> running, and I can see that my-factory is alive as well by the command:
> 
> g! ipojo:factories
> Factory my-factory (VALID)
> 
> 
> Can you just help me with the right syntax of getting a factory service, so I 
> can instantiate my component. Thanks.
> 
> 
> 
> 
> -----Original Message-----
> From: Guillaume Sauthier (OW2/GMail) [mailto:[email protected]]
> Sent: Sunday, January 26, 2014 12:29 PM
> To: [email protected]
> Subject: Re: iPOJO Components instantiated but no visible output
> 
> No, DefaultInstanceDeclaration CANNOT be used at the moment from outside of 
> iPOJO bundle.
> This is a dead-end.
> 
> A common use case is to define type (component) and instance statically:
> using the metadata.xml iPOJO description file.
> 
> A more dynamic use case is to only create instance dynamically 
> (type/components are still statically described).
> In that case, there are plenty solutions available:
> * Get the iPOJO Factory service (associated with the type/component 
> you want to instantiate) and call Factory.createInstance(...)
> * Using ConfigAdmin: you create Configuration objects and push them 
> the the CA service. iPOJO will obtain that configuration and create 
> the instance for you
> 
> You talked a bit about the all dynamic use case. I must tell that it's mode 
> complexe and probably less adapted to all cases.
> Imagine that you have a class designed for another component model: scr, dm, 
> blueprint, ...
> You don't want to change the code of these classes: the so-called iPOJO API 
> is for you.
> You'll be able to tell iPOJO to modify/manipulate the class bytecode and make 
> it a full-blown iPOJO component.
> And then, that API facilitate you the instance creation (but it's the Factory 
> methods that are used behind the hood).
> 
> Is this clearer ?
> So in your case, I would suggest you to start with metadata.xml (or
> annotations) to describes types of components.
> And then create instances through config admin.
> I would also suggest you to take a look at file install that have a nice file 
> format to declares configuration dynamically.
> 
> --G
> 
> 
> 2014/1/26 Zaid Jamal Saeed Al Mahmoud <[email protected]>
> 
>> Thank you Mr. Clement for your response.
>> 
>> Actually, I prefer to create the component types dynamically. 
>> Therefore, annotations is not my first preference when it comes to 
>> creating the component type. As I mentioned earlier, I am targeting 
>> ipojo APIs. The more things are dynamic, the happier I will be.
>> 
>> I've been reading in the link you sent me to configure the framework. 
>> It is not clear in that page which properties are used to solve my 
>> class loader issue. I've tried the following properties:
>> 
>> org.osgi.framework.system.packages.extra
>> 
>> org.osgi.framework.bundle.parent:
>> 
>> I suspected the later one since its description says, "Specifies 
>> which class loader is used for boot delegation", and you mentioned 
>> that I am using the wrong class loader.
>> 
>> I tried to configure the framework with different values for those 
>> properties but none of them helped solving my issues. My instance is 
>> still not available.
>> 
>> I'd appreciate it if you can possibly be more specific regarding 
>> which property/properties I need to set when configuring Felix, so it 
>> helps me solving the problem.
>> 
>> Thanks again for your help.
>> 
>> 
>> 
>> Zaid
>> -----Original Message-----
>> From: Clement Escoffier [mailto:[email protected]]
>> Sent: Saturday, January 25, 2014 6:32 PM
>> To: Apache Felix - Users Mailing List
>> Subject: Re: iPOJO Components instantiated but no visible output
>> 
>> Hi,
>> 
>> 
>> The example you just gave use the iPOJO API. This API is intended to 
>> create component types (i.e. factories) dynamically which does not 
>> seem to be what you want. This way works but is really cumbersome as 
>> you can't use the annotations.
>> 
>> What I proposed you was to use either the config admin or the factory 
>> service or instance declarations. It looks like iPOJO can't see your 
>> instance declaration because they are exposed using the wrong class 
>> loader (from code outside the OSGi framework). I realized the issue 
>> when reading all your mails again. To get it to work this way, check 
>> how to configure the framework to avoid class loader mismatch between 
>> code from inside and outside the framework:
>> http://felix.apache.org/site/apache-felix-framework-launching-and-emb
>> e
>> dding.html
>> 
>> Regards,
>> 
>> Clement
>> 
>> 
>> On 25 janv. 2014, at 14:33, Zaid Jamal Saeed Al Mahmoud < 
>> [email protected]> wrote:
>> 
>>> Dear Mr. Clement,
>>> 
>>> I really want to know so bad, why you told the person in this post:
>> http://apache-felix.18485.x6.nabble.com/Using-iPOJO-API-to-create-components-and-instances-td4881802.htmlthat
>>  his code should work if he used the following way:
>>> 
>>> new PrimitiveComponentType()
>>>                       .setBundleContext(localContext)
>>>                       .setClassName(ProviderA.class.getName())
>>>                       .setValidateMethod("start")
>>>                       .setInvalidateMethod("stop")
>>>                       .addService(new Service())
>>>                       .createInstance("TestProviderA");
>>> 
>>> But you told me not to use this way and to use
>> DefaultInstanceDeclaration instead.
>>> 
>>> This really confused me because I saw an answer for you in the same 
>>> post
>> with the following code:
>>> 
>>>       type = new
>> PrimitiveComponentType().setBundleContext(bundle.getBundleContext())
>>>               .setComponentTypeName("raw.type")
>>>               .setClassName("org.apache.felix.ipojo.test.asm.Raw")
>>>               .setImmediate(true);
>>>       type.start();
>>> 
>>>       instance = type.createInstance();
>>> 
>>> 
>>> What's different in my case? I can maybe switch to the other way if
>> Declaration Instance doesn't work. So, I need a clarification from you.
>>> 
>>> 
>>> 
>>> Zaid
>>> 
>>> -----Original Message-----
>>> From: Zaid Jamal Saeed Al Mahmoud
>>> Sent: Saturday, January 25, 2014 12:03 AM
>>> To: '[email protected]'
>>> Subject: RE: iPOJO Components instantiated but no visible output
>>> 
>>> Yes. This is the output:
>>> 
>>> ipojo:instances
>>> Instance org.apache.felix.ipojo.arch.gogo.Arch-0 -> valid
>>> 
>>> 
>>> 
>>> -----Original Message-----
>>> From: Clement Escoffier [mailto:[email protected]]
>>> Sent: Saturday, January 25, 2014 12:01 AM
>>> To: Apache Felix - Users Mailing List
>>> Subject: Re: iPOJO Components instantiated but no visible output
>>> 
>>> Hi,
>>> 
>>> Could you try :
>>> 
>>>> ipojo:instances
>>> 
>>> Regards,
>>> 
>>> Clement
>>> 
>>> On 24 janv. 2014, at 20:49, Zaid Jamal Saeed Al Mahmoud <
>> [email protected]> wrote:
>>> 
>>>> Hey, I manipulated my bundle using Ipojo Ant Task, as the following:
>>>> 
>>>> <project>
>>>> <target name="main">
>>>>  <!-- Change the path to point on the iPOJO Ant task jar-->  
>>>> <taskdef name="ipojo"
>>>>      classname="org.apache.felix.ipojo.task.IPojoTask"
>>>> 
>> classpath="C:/Users/zaid.almahmoud/Dropbox/EBTIC/ADERE/feasibility-co
>> d
>> es/ipojo/ipojo-distribution-1.11.0/bundle/org.apache.felix.ipojo.ant-
>> 1
>> .11.0.jar"/>
>>>>     <ipojo
>>>> 
>> input="C:/Users/zaid.almahmoud/Desktop/plugins/HelloService_1.0.0.201401222235.jar"
>>>> 
>> output="C:/Users/zaid.almahmoud/Desktop/plugins/Manipulated_HelloService.jar"
>>>>  />
>>>> </target>
>>>> </project>
>>>> 
>>>> 
>>>> Now, I can see in my app that the factory is valid. This is the 
>>>> output
>> in the command:
>>>> g! ipojo:factories
>>>> Factory my-factory (VALID)
>>>> Factory org.apache.felix.ipojo.arch.gogo.Arch (UNKNOWN) - Private
>>>> 
>>>> Therefore the factory "my-factory" is available unlike before.
>>>> 
>>>> 
>>>> However, my instance is not available, which was created as the
>> following:
>>>> DefaultInstanceDeclaration providerDeclaration = new
>> DefaultInstanceDeclaration(b.getBundleContext(), "my-factory");
>>>>                     providerDeclaration.start();
>>>> 
>>>> Again, this does not show an error, but it doesn't display the 
>>>> expected
>> output in the start() method of the bundle, and on the command, I can see:
>>>> 
>>>> g! ipojo:instance my-factory-0
>>>> Instance named 'my-factory-0' not found
>>>> 
>>>> 
>>>> Can you help please? Thanks.
>>>> 
>>>> 
>>>> 
>>>> 
>>>> 
>>>> 
>>>> -----Original Message-----
>>>> From: Zaid Jamal Saeed Al Mahmoud
>>>> [mailto:[email protected]]
>>>> Sent: Thursday, January 23, 2014 2:15 PM
>>>> To: [email protected]
>>>> Subject: RE: iPOJO Components instantiated but no visible output
>>>> 
>>>> It displays this:
>>>> 
>>>> ipojo:factories
>>>> Factory org.apache.felix.ipojo.arch.gogo.Arch (UNKNOWN) - Private
>>>> 
>>>> 
>>>> I am not sure what you mean by iPOJO manipulation on my bundles, 
>>>> But again, I am not using ANT or MAVEN. I export the bundles 
>>>> normally in
>> eclipse (Using export->deployable plugins and fragments).
>>>> Could it be the issue?
>>>> 
>>>> 
>>>> -----Original Message-----
>>>> From: Clement Escoffier [mailto:[email protected]]
>>>> Sent: Thursday, January 23, 2014 11:52 AM
>>>> To: Apache Felix - Users Mailing List
>>>> Subject: Re: iPOJO Components instantiated but no visible output
>>>> 
>>>> Hi,
>>>> 
>>>> The output are interesting, it looks like your instances are not
>> declared correctly. Can you try:
>>>> 
>>>>> ipojo:factories
>>>> 
>>>> 
>>>> By the way, how are you applying the iPOJO manipulation on your 
>>>> bundles
>> ?
>>>> 
>>>> Regards,
>>>> 
>>>> Clement
>>>> 
>>>> On 23 janv. 2014, at 08:30, Zaid Jamal Saeed Al Mahmoud <
>> [email protected]> wrote:
>>>> 
>>>>> Okay, I did that. Here's the output:
>>>>> 
>>>>> g! ipojo:instances
>>>>> Instance org.apache.felix.ipojo.arch.gogo.Arch-0 -> valid
>>>>> 
>>>>> g! ipojo:instance my-factory-0
>>>>> g! Instance named 'my-factory-0' not found
>>>>> 
>>>>> g! ipojo:instance my-consumer-factory-0 Instance named 
>>>>> 'my-consumer-factory-0' not found
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> -----Original Message-----
>>>>> From: Clement Escoffier [mailto:[email protected]]
>>>>> Sent: Thursday, January 23, 2014 10:58 AM
>>>>> To: Apache Felix - Users Mailing List
>>>>> Subject: Re: iPOJO Components instantiated but no visible output
>>>>> 
>>>>> Hi,
>>>>> 
>>>>> Could you use the 'instances' command to retrieve the list of
>> instances and their state ?
>>>>> (http://felix.apache.org/documentation/subprojects/apache-felix-ip
>>>>> oj
>>>>> o
>>>>> /apache-felix-ipojo-tools/ipojo-arch-command.html)
>>>>> 
>>>>>> ipojo:instances
>>>>> // dump all instances and declaration
>>>>>> ipojo:instance my-factory-0
>>>>> // introspect the first instance
>>>>>> ipojo:instance my-consumer-factory-0
>>>>> // introspect the second instance
>>>>> 
>>>>> Regards,
>>>>> 
>>>>> Clement
>>>>> 
>>>>> 
>>>>> On 22 janv. 2014, at 20:38, Zaid Jamal Saeed Al Mahmoud <
>> [email protected]> wrote:
>>>>> 
>>>>>> I have 2 iPOJO Components.
>>>>>> 1- A Provider bundle that provides "Hello" service. Below is the
>> implementation of the component:
>>>>>> package helloipojo;
>>>>>> 
>>>>>> 
>>>>>> import helloipojo.service.HelloService;
>>>>>> 
>>>>>> import org.apache.felix.ipojo.annotations.Component;
>>>>>> import org.apache.felix.ipojo.annotations.Invalidate;
>>>>>> import org.apache.felix.ipojo.annotations.Provides;
>>>>>> import org.apache.felix.ipojo.annotations.Validate;
>>>>>> 
>>>>>> 
>>>>>> @Component(name="my-factory")
>>>>>> @Provides
>>>>>> public class HelloServiceImpl implements HelloService{
>>>>>> 
>>>>>> @Override
>>>>>> public void sayHello() {
>>>>>> 
>>>>>>    System.out.println("Hello iPojo!");
>>>>>> 
>>>>>> }
>>>>>> 
>>>>>> 
>>>>>> @Validate
>>>>>> public void start() throws Exception {
>>>>>> 
>>>>>>    System.out.println("Hello, I am ipojo bundle start method");
>>>>>> 
>>>>>> }
>>>>>> 
>>>>>> @Invalidate
>>>>>> public void stop() throws Exception {
>>>>>> 
>>>>>>    System.out.println("Bye Bye, I am ipojo bundle stop method");
>>>>>> 
>>>>>> }
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> }
>>>>>> 2- Consumer bundle that uses HelloService object as the follwing:
>>>>>> package helloserviceconsumer;
>>>>>> 
>>>>>> import helloipojo.service.HelloService;
>>>>>> 
>>>>>> import org.apache.felix.ipojo.annotations.Component;
>>>>>> import org.apache.felix.ipojo.annotations.Invalidate;
>>>>>> import org.apache.felix.ipojo.annotations.Requires;
>>>>>> import org.apache.felix.ipojo.annotations.Validate;
>>>>>> 
>>>>>> @Component(name="my-consumer-factory")
>>>>>> public class HelloConsumer {
>>>>>>          @Requires
>>>>>>          HelloService helloObject;
>>>>>> 
>>>>>>          @Validate
>>>>>>          private void start() {
>>>>>>                   // Starting method
>>>>>>                   //...
>>>>>>                   helloObject.sayHello();
>>>>>>                   //...
>>>>>>            }
>>>>>> 
>>>>>>            @Invalidate
>>>>>>            protected void stop() {
>>>>>>                    // Stopping method
>>>>>>                    if(helloObject!=null) { 
>>>>>> helloObject.sayHello(); }
>>>>>> 
>>>>>>                    else System.out.println("hello service GONE!");
>>>>>>            }
>>>>>> }
>>>>>> In a seperate Java application, I load these two bundles and 
>>>>>> start
>> them on Apache Felix as the following:
>>>>>> Bundle b =
>>>>>> bundleContext1.installBundle("file:C:\\Users\\zaid.almahmoud\\Des
>>>>>> kt o p\ \plugins\\HelloService_1.0.0.201401222235.jar");
>>>>>> b.start();
>>>>>> 
>>>>>> Bundle c =
>>>>>> bundleContext1.installBundle("file:C:\\Users\\zaid.almahmoud\\Des
>>>>>> kt o p\ \plugins\\HelloServiceConsumer_1.0.0.201401222257.jar");
>>>>>> c.start();
>>>>>> All the above works fine.
>>>>>> Now, I would like to instantiate these two components dynamically 
>>>>>> and
>> observe the consumption of the bundle provider service by the bundle 
>> consumer. I used Instance Declaration, as the following:
>>>>>> DefaultInstanceDeclaration providerDeclaration = new
>> DefaultInstanceDeclaration(b.getBundleContext(), "my-factory");
>>>>>>                        providerDeclaration.start();
>>>>>> 
>>>>>> DefaultInstanceDeclaration consumerDeclaration = new
>> DefaultInstanceDeclaration(c.getBundleContext(),
>> "my-consumer-factory");
>>>>>>                        consumerDeclaration.start(); No errors 
>>>>>> when running the application. However, I could not see the "Hello"
>> Messages that exists in the start() methods of both the service 
>> provider and consumer. I see absolutely NOTHING. That means the 
>> components are not instantiated correctly. Where did I go wrong? Thanks.
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> Zaid.
>>>>>> 
>>>>> 
>>>>> 
>>>>> ------------------------------------------------------------------
>>>>> --
>>>>> - To unsubscribe, e-mail: [email protected]
>>>>> For additional commands, e-mail: [email protected]
>>>>> 
>>>> 
>>>> 
>>>> -------------------------------------------------------------------
>>>> -- To unsubscribe, e-mail: [email protected]
>>>> For additional commands, e-mail: [email protected]
>>>> 
>>>> 
>>>> -------------------------------------------------------------------
>>>> -- To unsubscribe, e-mail: [email protected]
>>>> For additional commands, e-mail: [email protected]
>>>> 
>>>> 
>>>> -------------------------------------------------------------------
>>>> -- To unsubscribe, e-mail: [email protected]
>>>> For additional commands, e-mail: [email protected]
>>>> 
>>> 
>>> 
>>> --------------------------------------------------------------------
>>> - To unsubscribe, e-mail: [email protected]
>>> For additional commands, e-mail: [email protected]
>>> 
>>> 
>>> --------------------------------------------------------------------
>>> - To unsubscribe, e-mail: [email protected]
>>> For additional commands, e-mail: [email protected]
>>> 
>> 
>> 
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: [email protected]
>> For additional commands, e-mail: [email protected]
>> 
>> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
> 


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


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

Reply via email to