I still think that the easiest solution might be to use fileinstall and
declares component's instance though the config admin file support.

--G


2014-01-26 Clement Escoffier <[email protected]>

>
> On 26 janv. 2014, at 18:29, Zaid Jamal Saeed Al Mahmoud <
> [email protected]> wrote:
>
> > 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.
>
> There are several issues:
> 1) Why do you retrieve a service reference exposing HelloService while you
> want Factory
> 2) Unfortunately with your settings (retrieving services form outside the
> OSGi framework) it won’t be that easy. This should work:
>
> ServiceReference[] references =
> m_felix.getBundleContext().getServiceReferences(Factory.class.getName(), “(
> factory.name=…)”);
> if (references == null) {
>     System.out.println(“No references”);
> } else {
>      Object factory = m_felix.getBundleContext().getService(references[0]);
> }
>
> Unfortunately, all access to the retrieved service will be done using
> reflection.
> To avoid this, you can try to configure the Felix launcher to export the
> iPOJO packages from the system bundle (by setting
> org.osgi.framework.system.packages.extra). You should have a look to the
> ‘Using Services Provided By Bundles’ from
> http://felix.apache.org/site/apache-felix-framework-launching-and-embedding.html
>
> Regards,
>
> Clement
>
> >
> >
> >
> > -----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]
> >
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>
>

Reply via email to