It's probably a timing issue. Factory are normal OSGi services, that means that they come and go at will (usually depends if iPOJO has activated a starting bundle); So you should use a ServiceListener waiting for the Factory service.
Hmmm, using a ServiceTracker is probably a more easier way to achieve this. Once the tracker gives you the Factory reference, you can use it to create instances. --G 2014-01-26 Zaid Jamal Saeed Al Mahmoud <[email protected]> > 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.htmlthathis > 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] > >

