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 Thu, 23 Jan 2014 07:00:45 GMT
Hi,

On 22 janv. 2014, at 11:24, Zaid Jamal Saeed Al Mahmoud <zaid.almahmoud@kustar.ac.ae>
wrote:

> Many thanks.
> 
> Finally, do I have a full access to my bundle services, references, properties using
the declaration instance? Can I manipulate those dynamically using that instance?

Not directly. But if you name your instances then you can retrieve and use the ‘Architecture’
service exposed by the created instances. From there, you can do whatever you want.

Regards,

Clement

> 
> 
> 
> Zaid
> 
> -----Original Message-----
> From: Clement Escoffier [mailto:clement.escoffier@gmail.com] 
> Sent: Wednesday, January 22, 2014 2:23 PM
> To: Apache Felix - Users Mailing List
> Subject: Re: Felix iPOJO - The factory associated with the component type is invalid
(not started or missing handlers)
> 
> Hi,
> 
> On 22 janv. 2014, at 10:48, Zaid Jamal Saeed Al Mahmoud <zaid.almahmoud@kustar.ac.ae>
wrote:
> 
>> Thanks. My number 1 goal is to be able to create, start, and stop the components
dynamically. I don't think this is possible with annotations, is it?
> 
> You can create instances dynamically using either the Factory service, or the ManagedServiceFactory
configurations (configuration admin), or creating instance declarations (the way I proposed
in the previous mail).
> 
> 
> 
>> 
>> Following your advice,  I tried this:
>> 
>> InstanceDeclaration declaration = new 
>> DefaultInstanceDeclaration(b.getBundleContext(), "my-factory");
> 
> DefaultInstanceDeclaration declaration = new DefaultInstanceDeclaration(b.getBundleContext(),
"my-factory"); declaration.start();
> 
> Regards,
> 
> Clement
> 
>> 
>> It shows no errors, but the author of the link you posted says that you can start
and stop the declaration instance. Though, I did not find a start or stop method (declaration.start()
showed a syntax error). What's going on?
>> 
>> 
>> 
>> Zaid
>> 
>> -----Original Message-----
>> From: Clement Escoffier [mailto:clement.escoffier@gmail.com]
>> Sent: Wednesday, January 22, 2014 12:53 PM
>> To: Apache Felix - Users Mailing List
>> Subject: Re: Felix iPOJO - The factory associated with the component 
>> type is invalid (not started or missing handlers)
>> 
>> 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(Componen
>>> tType.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
>>> 
>> 
>> 
>> ---------------------------------------------------------------------
>> 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
> 


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


Mime
View raw message