felix-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Clement Escoffier <clement.escoff...@gmail.com>
Subject Re: Felix iPOJO - The factory associated with the component type is invalid (not started or missing handlers)
Date Wed, 22 Jan 2014 08:53:09 GMT
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 <zaid.almahmoud@kustar.ac.ae>
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
> 


Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message