I am trying to learn how to use Felix iPOJO API to create components 
dynamically.

I have a simple bundle with the following files:

1- HelloService.java (Contains a Service Interface).

/*
 * @author zaid almahmoud
 *
*/
package helloipojo.service;

public interface HelloService
{

    public void sayHello();

}
2- Its implementation HelloServiceImpl.java:

package helloipojo;

import helloipojo.service.HelloService;


public class HelloServiceImpl implements HelloService{

    @Override
    public void sayHello() {

        System.out.println("Hello iPojo!");

    }


}
3- Activator.java :

package helloipojo;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;


public class Activator implements BundleActivator {


        public void start(BundleContext context) throws Exception {


            System.out.println("Bundle Started!");


        }
        public void stop(BundleContext context) throws Exception {

             context = null;
             System.out.println("Bundle Stopped!");


        }

}
MANIFEST.MF:

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: HelloIPojo
Bundle-SymbolicName: HelloIPojo
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: helloipojo.Activator
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Import-Package: org.osgi.framework
In my application, I start Felix framework and deploy the following bundles:

iPOJO (core)
iPOJO Composite
iPOJO API 
According to this source.

Next, I install my bundle, and instantiate the component. Below is my class:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.felix.framework.Felix;
import org.apache.felix.framework.util.FelixConstants;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleException;
import org.osgi.framework.Constants;
import org.osgi.framework.ServiceRegistration;
import org.apache.felix.ipojo.ComponentInstance;
import org.apache.felix.ipojo.ConfigurationException;
import org.apache.felix.ipojo.MissingHandlerException;
import org.apache.felix.ipojo.UnacceptableConfiguration;
import org.apache.felix.ipojo.api.ComponentType;
import org.apache.felix.ipojo.api.PrimitiveComponentType;
import org.apache.felix.ipojo.api.Service;

public class HostApplication
{
    private HostActivator m_activator = null;
    private Felix m_felix = null;


    public HostApplication()
    {
        // Create a configuration property map.
        Map config = new HashMap();
        config.put(Constants.FRAMEWORK_STORAGE_CLEAN, 
Constants.FRAMEWORK_STORAGE_CLEAN_ONFIRSTINIT);
        // Create host activator;
        m_activator = new HostActivator();
        List list = new ArrayList();
        list.add(m_activator);

        config.put(FelixConstants.SYSTEMBUNDLE_ACTIVATORS_PROP, list);

        try
        {
            // Now create an instance of the framework with
            // our configuration properties.
            m_felix = new Felix(config);
            // Now start Felix instance.
            m_felix.start();
        }
        catch (Exception ex)
        {
            System.err.println("Could not create framework: " + ex);
            ex.printStackTrace();
        }


        // Register the application's context as an OSGi service!
        BundleContext bundleContext1 = m_felix.getBundleContext();


                System.out.println("6");

                try {

                    //starting ipojo required bundles
                    Bundle coreBundle = 
bundleContext1.installBundle("file:C:\\Users\\zaid.almahmoud\\Dropbox\\EBTIC\\ADERE\\feasibility-codes\\ipojo\\ipojo-distribution-1.11.0\\bundle\\org.apache.felix.ipojo-1.6.2.jar");
                    coreBundle.start();
                    if(coreBundle.getState()== coreBundle.ACTIVE)
                        System.out.println("Core Bundle is Active!");

                    Bundle apiBundle = 
bundleContext1.installBundle("file:C:\\Users\\zaid.almahmoud\\Dropbox\\EBTIC\\ADERE\\feasibility-codes\\ipojo\\ipojo-distribution-1.11.0\\bundle\\org.apache.felix.ipojo.api-1.6.0.jar");
                    apiBundle.start();
                    if(apiBundle.getState()== apiBundle.ACTIVE)
                        System.out.println("API Bundle is Active!");


                    Bundle compositeBundle = 
bundleContext1.installBundle("file:C:\\Users\\zaid.almahmoud\\Dropbox\\EBTIC\\ADERE\\feasibility-codes\\ipojo\\ipojo-distribution-1.11.0\\bundle\\org.apache.felix.ipojo.composite-1.6.0.jar");
                    compositeBundle.start();
                    if(compositeBundle.getState()== compositeBundle.ACTIVE)
                        System.out.println("Composite Bundle is Active!");


//HERE INSTALLING AND STARTING MY BUNDLE!!
Bundle b = 
bundleContext1.installBundle("file:C:\\Users\\zaid.almahmoud\\Desktop\\plugins\\HelloIPojo_1.0.0.201401211340.jar");
                b.start();

                    try {

                        ComponentType type = new PrimitiveComponentType()
                                .setBundleContext(b.getBundleContext()) 
                                .setComponentTypeName("hello.type") 
                                .setClassName("helloipojo.HelloServiceImpl") 
                                .setImmediate(true); 
                        type.start(); 

                        ComponentInstance instance = type.createInstance();



                    } 

                    catch (UnacceptableConfiguration
                            | MissingHandlerException | ConfigurationException 
e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } // Create the instance







                    System.out.println("done starting bundles!");


                } catch (BundleException e) {

                    e.printStackTrace();

                    System.out.println("Not done!");
                }



                //shutdownApplication();

    }

    public Bundle[] getInstalledBundles()
    {
        // Use the system bundle activator to gain external
        // access to the set of installed bundles.
        return m_activator.getBundles();
    }

    public void shutdownApplication()
    {
        // Shut down the felix framework when stopping the
        // host application.
        try {
            m_felix.stop();
        } catch (BundleException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        try {
            m_felix.waitForStop(0);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
When I run my application, it shows the following output (with the error at the 
end):

6
Core Bundle is Active!
API Bundle is Active!
Composite Bundle is Active!
Bundle Started!
Exception in thread "main" java.lang.IllegalStateException: The factory 
associated with the component type is invalid (not started or missing handlers)
    at 
org.apache.felix.ipojo.api.ComponentType.ensureFactory(ComponentType.java:189)
    at 
org.apache.felix.ipojo.api.ComponentType.ensureAndGetFactory(ComponentType.java:177)
    at 
org.apache.felix.ipojo.api.ComponentType.createInstance(ComponentType.java:79)
    at HostApplication.<init>(HostApplication.java:109)
    at Embedder.main(Embedder.java:11)
Where did I go wrong? Thanks.

Update 1

I could see that I am missing 2 handlers. I knew that by adding the following 
two lines:

 System.out.println(type.getFactory().getRequiredHandlers());
 System.out.println(type.getFactory().getMissingHandlers());
The output of the above two lines is:

[org.apache.felix.ipojo:architecture, org.apache.felix.ipojo:callback]
[org.apache.felix.ipojo:architecture, org.apache.felix.ipojo:callback]
I also tried:

type.getFactory().createComponentInstance(new Properties());

then I got:

org.apache.felix.ipojo.MissingHandlerException: Missing handlers : 
org.apache.felix.ipojo:architecture org.apache.felix.ipojo:callback 
I don't know why these handlers are missing. I tried to add them, but could not 
figure out the right syntax. Any help? Thanks.

Update 2

According to Clement in his answer, my bundle should import: 
org.apache.felix.ipojo and org.apache.felix.ipojo.architecture

I did that, and now I am getting the following error:

java.lang.ClassCastException: org.apache.felix.ipojo.HandlerManagerFactory 
cannot be cast to org.apache.felix.ipojo.HandlerFactory
I am getting the error at this line: type.start();

Please help. Thanks!

-----Original Message-----
From: David Jencks [mailto:[email protected]] 
Sent: Wednesday, January 22, 2014 3:55 AM
To: [email protected]
Subject: Re: PID and symantic versioning

Yes.... to try to be even clearer....

To use targeted pids at all you need a Configuration Admin implementation 
supporting enterprise R5, such as the latest felix config admin.  (I think 
recent equinox CA also supports this, but don't know).  This works with 
ManagedService and ManagedServiceFactory you register somehow (in code, as DS 
components, as blueprint components, etc etc).

If you want to use targeted PIDs to configure DS components, you can use the 
latest felix DS which supports them even though support for them is not 
officially added until the next DS spec revision (assuming support is not 
removed from the draft).

thanks
david jencks

On Jan 21, 2014, at 10:58 AM, David Bosschaert <[email protected]> 
wrote:

> On 21 January 2014 18:42, David Jencks <[email protected]>
>> Although formal support for this in DS is only in the next R6 spec, 
>> currently it works in felix DS.
> 
> Additionally, it works with plain ConfigAdmin implementations that 
> follow the OSGi Enterprise R5 spec too...
> 
> Cheers,
> 
> David
> 
> ---------------------------------------------------------------------
> 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