Hi, On 22 janv. 2014, at 11:24, Zaid Jamal Saeed Al Mahmoud <[email protected]> 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:[email protected]] > 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 > <[email protected]> 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:[email protected]] >> 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 >> <[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(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: [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] > --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]

