Hi,

The issue comes form the asynchronous start of iPOJO. When you create your 
instance, not everything is available.

I’ve several question: Why are you using the iPOJO API to declare your type and 
instance ? Can’t you just use the annotations ? In that case it will just 
create everything smoothly.

If you really need / want to use the API, don’t create the instance like you 
do, but expose an instance declaration: 
http://felix.apache.org/documentation/subprojects/apache-felix-ipojo/apache-felix-ipojo-userguide/ipojo-advanced-topics/ipojo-factory-service.html#deleting-instances.
 The declaration waits until the factory is valid to create the instance.

Regards,

Clement


On 21 janv. 2014, at 19:47, Zaid Jamal Saeed Al Mahmoud 
<[email protected]> wrote:

> 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<http://felix.apache.org/site/apache-felix-ipojo-api.html> 
> 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
> 
> 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.
> 
> 
> Zaid
> 

Reply via email to