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]