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-embedding.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-codes/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-ipoj > >>> 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\\Deskt > >>>> o p\ \plugins\\HelloService_1.0.0.201401222235.jar"); > >>>> b.start(); > >>>> > >>>> Bundle c = > >>>> bundleContext1.installBundle("file:C:\\Users\\zaid.almahmoud\\Deskt > >>>> 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] > >

