felix-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Zaid Jamal Saeed Al Mahmoud <zaid.almahm...@kustar.ac.ae>
Subject RE: PID and symantic versioning
Date Wed, 22 Jan 2014 05:42:25 GMT
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:david_jencks@yahoo.com] 
Sent: Wednesday, January 22, 2014 3:55 AM
To: users@felix.apache.org
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 <david.bosschaert@gmail.com> wrote:

> On 21 January 2014 18:42, David Jencks <david_jencks@yahoo.com>
>> 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: users-unsubscribe@felix.apache.org
> For additional commands, e-mail: users-help@felix.apache.org
> 


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@felix.apache.org
For additional commands, e-mail: users-help@felix.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@felix.apache.org
For additional commands, e-mail: users-help@felix.apache.org


Mime
View raw message