You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by ri...@apache.org on 2007/03/06 15:04:27 UTC

svn commit: r515124 - in /incubator/felix/trunk/ipojo: ./ src/main/java/org/apache/felix/ipojo/ src/main/java/org/apache/felix/ipojo/architecture/ src/main/java/org/apache/felix/ipojo/handlers/architecture/ src/main/java/org/apache/felix/ipojo/handlers...

Author: rickhall
Date: Tue Mar  6 06:04:26 2007
New Revision: 515124

URL: http://svn.apache.org/viewvc?view=rev&rev=515124
Log:
Applied patch (FELIX-244) to allow external handlers to participate in 
the architecture service and to migrate immediate component management 
code from the instance manager to the lifecycle callback handler.

Added:
    incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyDescription.java   (with props)
    incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyHandlerDescription.java   (with props)
    incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceDescription.java   (with props)
    incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandlerDescription.java   (with props)
Removed:
    incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/architecture/DependencyDescription.java
    incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/architecture/DependencyHandlerDescription.java
    incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/architecture/ProvidedServiceDescription.java
    incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/architecture/ProvidedServiceHandlerDescription.java
Modified:
    incubator/felix/trunk/ipojo/pom.xml
    incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/ComponentInstance.java
    incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/Handler.java
    incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/InstanceManager.java
    incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/handlers/architecture/ArchitectureHandler.java
    incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyHandler.java
    incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/handlers/lifecycle/callback/LifecycleCallbackHandler.java
    incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/handlers/providedservice/Property.java
    incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandler.java

Modified: incubator/felix/trunk/ipojo/pom.xml
URL: http://svn.apache.org/viewvc/incubator/felix/trunk/ipojo/pom.xml?view=diff&rev=515124&r1=515123&r2=515124
==============================================================================
--- incubator/felix/trunk/ipojo/pom.xml (original)
+++ incubator/felix/trunk/ipojo/pom.xml Tue Mar  6 06:04:26 2007
@@ -49,7 +49,9 @@
               org.apache.felix.ipojo.metadata, 
               org.apache.felix.ipojo.architecture, 
               org.apache.felix.ipojo.parser,
-              org.apache.felix.ipojo.util, 
+              org.apache.felix.ipojo.util,
+              org.apache.felix.ipojo.handlers.dependency,
+              org.apache.felix.ipojo.handlers.providedservice, 
               org.osgi.service.cm; specification-version="1.2",
               org.osgi.service.log; specification-version="1.3"
             </exportPackage>

Modified: incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/ComponentInstance.java
URL: http://svn.apache.org/viewvc/incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/ComponentInstance.java?view=diff&rev=515124&r1=515123&r2=515124
==============================================================================
--- incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/ComponentInstance.java (original)
+++ incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/ComponentInstance.java Tue Mar  6 06:04:26 2007
@@ -82,7 +82,7 @@
     String getInstanceName();
     
     /**
-     * @return true if getState return 1 or 2.
+     * @return true if getState returns INVALID or VALID.
      */
     boolean isStarted();
 

Modified: incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/Handler.java
URL: http://svn.apache.org/viewvc/incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/Handler.java?view=diff&rev=515124&r1=515123&r2=515124
==============================================================================
--- incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/Handler.java (original)
+++ incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/Handler.java Tue Mar  6 06:04:26 2007
@@ -20,6 +20,7 @@
 
 import java.util.Dictionary;
 
+import org.apache.felix.ipojo.architecture.HandlerDescription;
 import org.apache.felix.ipojo.metadata.Element;
 
 /**
@@ -78,4 +79,9 @@
      * @param instance : the created instance
      */
     public void createInstance(Object instance) { }
+    
+    /**
+     * @return the description of the handler..
+     */
+    public HandlerDescription getDescription() { return new HandlerDescription(this.getClass().getName(), isValid()); }
 }

Modified: incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/InstanceManager.java
URL: http://svn.apache.org/viewvc/incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/InstanceManager.java?view=diff&rev=515124&r1=515123&r2=515124
==============================================================================
--- incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/InstanceManager.java (original)
+++ incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/InstanceManager.java Tue Mar  6 06:04:26 2007
@@ -24,6 +24,7 @@
 import java.util.HashMap;
 
 import org.apache.felix.ipojo.architecture.ComponentDescription;
+import org.apache.felix.ipojo.architecture.InstanceDescription;
 import org.apache.felix.ipojo.metadata.Element;
 import org.apache.felix.ipojo.util.Logger;
 import org.osgi.framework.BundleContext;
@@ -51,11 +52,6 @@
     private String m_className;
 
     /**
-     * Is the component an immediate component ?
-     */
-    private boolean m_isImmediate = false;
-
-    /**
      * The context of the component.
      */
     private BundleContext m_context;
@@ -118,7 +114,6 @@
         if (m_className == null) {
             m_factory.getLogger().log(Logger.ERROR, "The class name of the component cannot be setted, it does not exist in the metadata");
         }
-        if (cm.containsAttribute("immediate") && cm.getAttribute("immediate").equalsIgnoreCase("true")) { m_isImmediate = true; }
 
         // ComponentInfo initialization
         m_componentDesc = new ComponentDescription();
@@ -134,9 +129,9 @@
                 Handler h = (Handler) IPojoConfiguration.INTERNAL_HANDLERS[i].newInstance();
                 h.configure(this, cm, configuration);
             } catch (InstantiationException e) {
-                m_factory.getLogger().log(Logger.ERROR, "[" + m_className + "] Cannot instantiate the handler " + IPojoConfiguration.INTERNAL_HANDLERS[i] + " : " + e.getMessage());
+                m_factory.getLogger().log(Logger.ERROR, "[" + m_name + "] Cannot instantiate the handler " + IPojoConfiguration.INTERNAL_HANDLERS[i] + " : " + e.getMessage());
             } catch (IllegalAccessException e) {
-                m_factory.getLogger().log(Logger.ERROR, "[" + m_className + "] Cannot instantiate the handler " + IPojoConfiguration.INTERNAL_HANDLERS[i] + " : " + e.getMessage());
+                m_factory.getLogger().log(Logger.ERROR, "[" + m_name + "] Cannot instantiate the handler " + IPojoConfiguration.INTERNAL_HANDLERS[i] + " : " + e.getMessage());
             }
         }
 
@@ -149,11 +144,11 @@
                     Handler h = (Handler) c.newInstance();
                     h.configure(this, cm, configuration);
                 } catch (ClassNotFoundException e) {
-                    m_factory.getLogger().log(Logger.ERROR, "[" + m_className + "] Cannot instantiate the handler " + cm.getNamespaces()[i] + " : " + e.getMessage());
+                    m_factory.getLogger().log(Logger.ERROR, "[" + m_name + "] Cannot instantiate the handler " + cm.getNamespaces()[i] + " : " + e.getMessage());
                 } catch (InstantiationException e) {
-                    m_factory.getLogger().log(Logger.ERROR, "[" + m_className + "] Cannot instantiate the handler " + cm.getNamespaces()[i] + " : " + e.getMessage());
+                    m_factory.getLogger().log(Logger.ERROR, "[" + m_name + "] Cannot instantiate the handler " + cm.getNamespaces()[i] + " : " + e.getMessage());
                 } catch (IllegalAccessException e) {
-                    m_factory.getLogger().log(Logger.ERROR, "[" + m_className + "] Cannot instantiate the handler " + cm.getNamespaces()[i] + " : " + e.getMessage());
+                    m_factory.getLogger().log(Logger.ERROR, "[" + m_name + "] Cannot instantiate the handler " + cm.getNamespaces()[i] + " : " + e.getMessage());
                 }
 
             }
@@ -165,6 +160,23 @@
      * @return the component type information.
      */
     public ComponentDescription getComponentDescription() { return m_componentDesc; }
+    
+    public InstanceDescription getInstanceDescription() {
+    	int componentState = getState();
+        InstanceDescription instanceDescription = new InstanceDescription(m_name, m_className, componentState, getContext().getBundle().getBundleId());
+
+        String[] objects = new String[getPojoObjects().length];
+        for (int i = 0; i < getPojoObjects().length; i++) {
+        	objects[i] = getPojoObjects()[i].toString();
+        }
+        instanceDescription.setCreatedObjects(objects);
+
+        Handler[] handlers = getRegistredHandlers();
+        for (int i = 0; i < handlers.length; i++) {
+        	instanceDescription.addHandler(handlers[i].getDescription());
+        }
+        return instanceDescription;
+    }
 
     /**
      * @return the list of the registred handlers.
@@ -199,7 +211,7 @@
     	if(m_state != STOPPED) { return; } // Instance already started
     	
         // Start all the handlers
-        m_factory.getLogger().log(Logger.INFO, "[" + m_className + "] Start the instance manager with " + m_handlers.length + " handlers");
+        m_factory.getLogger().log(Logger.INFO, "[" + m_name + "] Start the instance manager with " + m_handlers.length + " handlers");
 
         // The new state of the component is UNRESOLVED
         m_state = INVALID;
@@ -236,8 +248,8 @@
         if (m_state != state) {
 
             // Log the state change
-            if (state == INVALID) { m_factory.getLogger().log(Logger.INFO, "[" + m_className + "]  State -> INVALID"); }
-            if (state == VALID) { m_factory.getLogger().log(Logger.INFO, "[" + m_className + "] State -> VALID"); }
+            if (state == INVALID) { m_factory.getLogger().log(Logger.INFO, "[" + m_name + "]  State -> INVALID"); }
+            if (state == VALID) { m_factory.getLogger().log(Logger.INFO, "[" + m_name + "] State -> VALID"); }
 
             // The state changed call the handler stateChange method
             m_state = state;
@@ -273,7 +285,7 @@
         try {
             m_clazz = m_factory.loadClass(m_className);
         } catch (ClassNotFoundException  e) {
-            m_factory.getLogger().log(Logger.ERROR, "[" + m_className + "] Class not found during the loading phase : " + e.getMessage());
+            m_factory.getLogger().log(Logger.ERROR, "[" + m_name + "] Class not found during the loading phase : " + e.getMessage());
             return;
         }
     }
@@ -348,7 +360,6 @@
         if (!isLoaded()) { load(); }
         Object instance = null;
         try {
-            m_factory.getLogger().log(Logger.INFO, "[" + m_className + "] createInstance -> Try to find the constructor");
 
             // Try to find if there is a constructor with a bundle context as parameter :
             try {
@@ -366,23 +377,23 @@
             }
 
         } catch (InstantiationException e) {
-            m_factory.getLogger().log(Logger.ERROR, "[" + m_className + "] createInstance -> The Component Instance cannot be instancied : " + e.getMessage());
+            m_factory.getLogger().log(Logger.ERROR, "[" + m_name + "] createInstance -> The Component Instance cannot be instancied : " + e.getMessage());
             e.printStackTrace();
         } catch (IllegalAccessException e) {
-            m_factory.getLogger().log(Logger.ERROR, "[" + m_className + "] createInstance -> The Component Instance is not accessible : " + e.getMessage());
+            m_factory.getLogger().log(Logger.ERROR, "[" + m_name + "] createInstance -> The Component Instance is not accessible : " + e.getMessage());
             e.printStackTrace();
         } catch (SecurityException e) {
-            m_factory.getLogger().log(Logger.ERROR, "[" + m_className + "] createInstance -> The Component Instance is not accessible (security reason) : " + e.getMessage());
+            m_factory.getLogger().log(Logger.ERROR, "[" + m_name + "] createInstance -> The Component Instance is not accessible (security reason) : " + e.getMessage());
             e.printStackTrace();
         } catch (InvocationTargetException e) {
-            m_factory.getLogger().log(Logger.ERROR, "[" + m_className + "] createInstance -> Cannot invoke the constructor method (illegal target) : " + e.getMessage());
+            m_factory.getLogger().log(Logger.ERROR, "[" + m_name + "] createInstance -> Cannot invoke the constructor method (illegal target) : " + e.getMessage());
             e.printStackTrace();
         } catch (NoSuchMethodException e) {
-            m_factory.getLogger().log(Logger.ERROR, "[" + m_className + "] createInstance -> Cannot invoke the constructor (method not found) : " + e.getMessage());
+            m_factory.getLogger().log(Logger.ERROR, "[" + m_name + "] createInstance -> Cannot invoke the constructor (method not found) : " + e.getMessage());
             e.printStackTrace();
         }
 
-        m_factory.getLogger().log(Logger.INFO, "[" + m_className + "] createInstance -> Return the instance " + instance);
+        m_factory.getLogger().log(Logger.INFO, "[" + m_name + "] createInstance -> Return the instance " + instance);
 
         // Register the new instance
         addInstance(instance);
@@ -567,7 +578,7 @@
      * Check the state of all handlers.
      */
     public void checkInstanceState() {
-        m_factory.getLogger().log(Logger.INFO, "[" + m_className + "] Check the component state");
+        m_factory.getLogger().log(Logger.INFO, "[" + m_name + "] Check the instance state");
         boolean isValid = true;
         for (int i = 0; i < m_handlers.length; i++) {
             boolean b = m_handlers[i].isValid();
@@ -581,12 +592,7 @@
             m_pojoObjects = new Object[0];
             return;
         }
-        if (isValid && m_state == INVALID) {
-            setState(VALID);
-            if (m_isImmediate && m_pojoObjects.length == 0) { createPojoObject(); }
-        }
-
-        m_factory.getLogger().log(Logger.INFO, "[" + m_className + "] Component Manager : " + m_state);
+        if (isValid && m_state == INVALID) { setState(VALID); }
     }
 
 	public String getInstanceName() { return m_name; }

Modified: incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/handlers/architecture/ArchitectureHandler.java
URL: http://svn.apache.org/viewvc/incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/handlers/architecture/ArchitectureHandler.java?view=diff&rev=515124&r1=515123&r2=515124
==============================================================================
--- incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/handlers/architecture/ArchitectureHandler.java (original)
+++ incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/handlers/architecture/ArchitectureHandler.java Tue Mar  6 06:04:26 2007
@@ -24,17 +24,7 @@
 import org.apache.felix.ipojo.Handler;
 import org.apache.felix.ipojo.InstanceManager;
 import org.apache.felix.ipojo.architecture.Architecture;
-import org.apache.felix.ipojo.architecture.DependencyDescription;
-import org.apache.felix.ipojo.architecture.DependencyHandlerDescription;
-import org.apache.felix.ipojo.architecture.HandlerDescription;
 import org.apache.felix.ipojo.architecture.InstanceDescription;
-import org.apache.felix.ipojo.architecture.ProvidedServiceDescription;
-import org.apache.felix.ipojo.architecture.ProvidedServiceHandlerDescription;
-import org.apache.felix.ipojo.handlers.dependency.Dependency;
-import org.apache.felix.ipojo.handlers.dependency.DependencyHandler;
-import org.apache.felix.ipojo.handlers.providedservice.Property;
-import org.apache.felix.ipojo.handlers.providedservice.ProvidedService;
-import org.apache.felix.ipojo.handlers.providedservice.ProvidedServiceHandler;
 import org.apache.felix.ipojo.metadata.Element;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
@@ -62,11 +52,6 @@
     private String m_name;
 
     /**
-     * Component Type.
-     */
-    private String m_className;
-
-    /**
      * @see org.apache.felix.ipojo.Handler#configure(org.apache.felix.ipojo.InstanceManager, org.apache.felix.ipojo.metadata.Element)
      */
     public void configure(InstanceManager im, Element metadata, Dictionary configuration) {
@@ -75,8 +60,6 @@
             if (isArchitectureEnabled.equalsIgnoreCase("true")) { im.register(this); }
         }
 
-        m_className = metadata.getAttribute("className");
-
         m_name = (String) configuration.get("name");
 
         m_manager = im;
@@ -112,55 +95,7 @@
      * @see org.apache.felix.ipojo.architecture.Architecture#getComponentDescription()
      */
     public InstanceDescription getInstanceDescription() {
-        int componentState = m_manager.getState();
-        InstanceDescription instanceDescription = new InstanceDescription(m_name, m_className, componentState, m_manager.getContext().getBundle().getBundleId());
-
-        String[] objects = new String[m_manager.getPojoObjects().length];
-        for (int i = 0; i < m_manager.getPojoObjects().length; i++) {
-        	objects[i] = m_manager.getPojoObjects()[i].toString();
-        }
-        instanceDescription.setCreatedObjects(objects);
-
-        Handler[] handlers = m_manager.getRegistredHandlers();
-        for (int i = 0; i < handlers.length; i++) {
-            if (handlers[i] instanceof DependencyHandler) {
-                DependencyHandler dh = (DependencyHandler) handlers[i];
-                DependencyHandlerDescription dhd = new DependencyHandlerDescription(dh.isValid());
-                for (int j = 0; j < dh.getDependencies().length; j++) {
-                    Dependency dep = dh.getDependencies()[j];
-                    // Create & add the dependency description
-                    DependencyDescription dd = new DependencyDescription(dep.getSpecification(), dep.isMultiple(), dep.isOptional(), dep.getFilter(), dep.getState(), instanceDescription);
-                    dd.setServiceReferences(dep.getServiceReferences());
-                    dd.setUsedServices(dep.getUsedServices());
-                    dhd.addDependency(dd);
-                }
-                instanceDescription.addHandler(dhd);
-            } else { 
-            	if (handlers[i] instanceof ProvidedServiceHandler) {
-            		ProvidedServiceHandler psh = (ProvidedServiceHandler) handlers[i];
-            		ProvidedServiceHandlerDescription pshd = new ProvidedServiceHandlerDescription(psh.isValid());
-
-            		for (int j = 0; j < psh.getProvidedService().length; j++) {
-            			ProvidedService ps = psh.getProvidedService()[j];
-            			ProvidedServiceDescription psd = new ProvidedServiceDescription(ps.getServiceSpecification(), ps.getState(), ps.getServiceReference(), instanceDescription);
-
-            			Properties props = new Properties();
-            			for (int k = 0; k < ps.getProperties().length; k++) {
-            				Property prop = ps.getProperties()[k];
-            				if (prop.getValue() != null) { props.put(prop.getName(), prop.getValue().toString()); }
-            			}
-            			psd.setProperty(props);
-            			pshd.addProvidedService(psd);
-            		}
-            		instanceDescription.addHandler(pshd);
-            	}
-            	else { 
-            		// Else add a generic handler to the description
-            		instanceDescription.addHandler(new HandlerDescription(handlers[i].getClass().getName(), handlers[i].isValid()));
-            	}
-            }
-        }
-        return instanceDescription;
+        return m_manager.getInstanceDescription();
     }
 
 }

Added: incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyDescription.java
URL: http://svn.apache.org/viewvc/incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyDescription.java?view=auto&rev=515124
==============================================================================
--- incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyDescription.java (added)
+++ incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyDescription.java Tue Mar  6 06:04:26 2007
@@ -0,0 +1,140 @@
+/* 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.ipojo.handlers.dependency;
+
+import java.util.HashMap;
+
+import org.osgi.framework.ServiceReference;
+
+/**
+ * Dependency Description.
+ * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
+ */
+public class DependencyDescription {
+
+    /**
+     * Needed Service Interface.
+     */
+    private String m_interface;
+
+    /**
+     * Multiple ?
+     */
+    private boolean m_multiple;
+
+    /**
+     * Optional ?
+     */
+    private boolean m_optional;
+
+    /**
+     * State (VALID | INVALID).
+     */
+    private int m_state;
+
+    /**
+     * Filter.
+     */
+    private String m_filter;
+
+    /**
+     * Hashmap [Instance reference, service reference] of the used service.
+     */
+    private HashMap m_usedServices = new HashMap();
+
+    /**
+     * The list of service reference.
+     */
+    private ServiceReference[] m_serviceReferences;
+
+    /**
+     * @return true if the dependency is a multiple dependency.
+     */
+    public boolean isMultiple() { return m_multiple; }
+
+    /**
+     * @return true if the dependency is an optional dependency.
+     */
+    public boolean isOptional() { return m_optional; }
+
+    /**
+     * @return the filter.
+     */
+    public String getFilter() { return m_filter; }
+
+    /**
+     * @return the needed interface.
+     */
+    public String getInterface() { return m_interface; }
+
+    /**
+     * @return the state of the dependency.
+     */
+    public int getState() { return m_state; }
+
+    /**
+     * Constructor.
+     * @param itf : the needed itf
+     * @param multiple : is the dependency a multiple dependency ?
+     * @param optional : is the depdendency optional ?
+     * @param filter : the filter
+     * @param state : the state
+     */
+    public DependencyDescription(String itf, boolean multiple, boolean optional, String filter, int state) {
+        super();
+        m_interface = itf;
+        m_multiple = multiple;
+        m_optional = optional;
+        m_filter = filter;
+        m_state = state;
+        m_serviceReferences = new ServiceReference[0];
+    }
+
+    /**
+     * @return the array of service reference (only if the cardinality could be n).
+     */
+    public ServiceReference[] getServiceReferences() { return m_serviceReferences; }
+
+    /**
+     * @return the ServiceReference (only if the cardinality could be 1).
+     */
+    public ServiceReference getServiceReference() { return m_serviceReferences[0]; }
+
+    /**
+     * Set the service reference array.
+     * @param sr : the array of service reference
+     */
+    public void setServiceReferences(ServiceReference[] sr) { m_serviceReferences = sr; }
+
+    /**
+     * @return the hashmap [object reference, service reference] containing the used services
+     */
+    public HashMap getUsedServices() { return m_usedServices; }
+
+    /**
+     * Set the usedServices.
+     * @param hm : the new usedService
+     */
+    public void setUsedServices(HashMap hm) {
+        m_usedServices = hm;
+    }
+
+
+
+}

Propchange: incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyDescription.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyHandler.java
URL: http://svn.apache.org/viewvc/incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyHandler.java?view=diff&rev=515124&r1=515123&r2=515124
==============================================================================
--- incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyHandler.java (original)
+++ incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyHandler.java Tue Mar  6 06:04:26 2007
@@ -23,6 +23,7 @@
 
 import org.apache.felix.ipojo.Handler;
 import org.apache.felix.ipojo.InstanceManager;
+import org.apache.felix.ipojo.architecture.HandlerDescription;
 import org.apache.felix.ipojo.handlers.dependency.nullable.NullableObjectWriter;
 import org.apache.felix.ipojo.metadata.Element;
 import org.apache.felix.ipojo.util.Logger;
@@ -354,6 +355,19 @@
         }
         m_manager.getFactory().getLogger().log(Logger.INFO, "[DependencyHandler on " + m_manager.getClassName() + "] Component Dependencies are valid");
         return valide;
+    }
+    
+    public HandlerDescription getDescription() {
+        DependencyHandlerDescription dhd = new DependencyHandlerDescription(isValid());
+        for (int j = 0; j < getDependencies().length; j++) {
+            Dependency dep = getDependencies()[j];
+            // Create & add the dependency description
+            DependencyDescription dd = new DependencyDescription(dep.getSpecification(), dep.isMultiple(), dep.isOptional(), dep.getFilter(), dep.getState());
+            dd.setServiceReferences(dep.getServiceReferences());
+            dd.setUsedServices(dep.getUsedServices());
+            dhd.addDependency(dd);
+        }
+        return dhd;
     }
 
 }

Added: incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyHandlerDescription.java
URL: http://svn.apache.org/viewvc/incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyHandlerDescription.java?view=auto&rev=515124
==============================================================================
--- incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyHandlerDescription.java (added)
+++ incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyHandlerDescription.java Tue Mar  6 06:04:26 2007
@@ -0,0 +1,86 @@
+/* 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.ipojo.handlers.dependency;
+
+import java.util.Iterator;
+
+import org.apache.felix.ipojo.architecture.HandlerDescription;
+
+/**
+ * Dependency Handler Description.
+ * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
+ */
+public class DependencyHandlerDescription extends HandlerDescription {
+
+
+    /**
+     * Dependencies managed by the dependency handler.
+     */
+    private DependencyDescription[] m_dependencies = new DependencyDescription[0];
+
+    /**
+     * Constructor.
+     * @param isValid : the validity of the dependency handler.
+     */
+    public DependencyHandlerDescription(boolean isValid) {
+        super(DependencyHandler.class.getName(), isValid);
+    }
+
+    /**
+     * @return the dependencies list.
+     */
+    public DependencyDescription[] getDependencies() { return m_dependencies; }
+
+    /**
+     * Add a dependency.
+     * @param dep : the dependency to add
+     */
+    public void addDependency(DependencyDescription dep) {
+        // Verify that the dependency description is not already in the array.
+        for (int i = 0; (i < m_dependencies.length); i++) {
+            if (m_dependencies[i] == dep) {
+                return; //NOTHING TO DO, the description is already in the array
+            }
+        }
+        // The component Description is not in the array, add it
+        DependencyDescription[] newDep = new DependencyDescription[m_dependencies.length + 1];
+        System.arraycopy(m_dependencies, 0, newDep, 0, m_dependencies.length);
+        newDep[m_dependencies.length] = dep;
+        m_dependencies = newDep;
+    }
+
+    /**
+     * @see org.apache.felix.ipojo.architecture.HandlerDescription#getHandlerInfo()
+     */
+    public String getHandlerInfo() {
+        String info = "";
+        for (int i = 0; i < m_dependencies.length; i++) {
+            String state = "resolved";
+            if (m_dependencies[i].getState() == 2) { state = "unresolved"; }
+            info += "\t Dependency on " + m_dependencies[i].getInterface() + "[" + m_dependencies[i].getFilter() + "] is " + state;
+            Iterator it = m_dependencies[i].getUsedServices().keySet().iterator();
+            while (it.hasNext()) {
+                info += "\n \t\t Uses : " + it.next();
+            }
+            info += "\n";
+        }
+        return info;
+    }
+
+}

Propchange: incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyHandlerDescription.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/handlers/lifecycle/callback/LifecycleCallbackHandler.java
URL: http://svn.apache.org/viewvc/incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/handlers/lifecycle/callback/LifecycleCallbackHandler.java?view=diff&rev=515124&r1=515123&r2=515124
==============================================================================
--- incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/handlers/lifecycle/callback/LifecycleCallbackHandler.java (original)
+++ incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/handlers/lifecycle/callback/LifecycleCallbackHandler.java Tue Mar  6 06:04:26 2007
@@ -21,6 +21,7 @@
 import java.lang.reflect.InvocationTargetException;
 import java.util.Dictionary;
 
+import org.apache.felix.ipojo.ComponentInstance;
 import org.apache.felix.ipojo.Handler;
 import org.apache.felix.ipojo.InstanceManager;
 import org.apache.felix.ipojo.metadata.Element;
@@ -47,6 +48,11 @@
      */
     private InstanceManager m_manager;
 
+	/**
+	 * Does a POJO object be created at starting
+	 */
+	private boolean m_immediate = false;
+
     /**
      * Add the given callback to the callback list.
      * @param hk : the element to add
@@ -74,6 +80,8 @@
     public void configure(InstanceManager cm, Element metadata, Dictionary configuration) {
         m_manager = cm;
         m_callbacks = new LifecycleCallback[0];
+        
+        if (metadata.containsAttribute("immediate") && metadata.getAttribute("immediate").equalsIgnoreCase("true")) { m_immediate = true; }
 
         Element[] hooksMetadata = metadata.getElements("callback");
         for (int i = 0; i < hooksMetadata.length; i++) {
@@ -87,7 +95,7 @@
             LifecycleCallback hk = new LifecycleCallback(this, initialState, finalState, method, isStatic);
             addCallback(hk);
         }
-        if (m_callbacks.length > 0) { m_manager.register(this); }
+        if (m_callbacks.length > 0 || m_immediate) { m_manager.register(this); }
     }
 
     /**
@@ -112,6 +120,11 @@
      * @see org.apache.felix.ipojo.Handler#stateChanged(int)
      */
     public void stateChanged(int state) {
+    	// Manage immediate component
+    	if(m_state == ComponentInstance.INVALID && state == ComponentInstance.VALID && m_manager.getPojoObjects().length == 0) {
+    		m_manager.createPojoObject();
+    	}
+    	
         for (int i = 0; i < m_callbacks.length; i++) {
             if (m_callbacks[i].getInitialState() == m_state && m_callbacks[i].getFinalState() == state) {
                 try {

Modified: incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/handlers/providedservice/Property.java
URL: http://svn.apache.org/viewvc/incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/handlers/providedservice/Property.java?view=diff&rev=515124&r1=515123&r2=515124
==============================================================================
--- incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/handlers/providedservice/Property.java (original)
+++ incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/handlers/providedservice/Property.java Tue Mar  6 06:04:26 2007
@@ -26,8 +26,6 @@
 import org.apache.felix.ipojo.parser.ParseUtils;
 import org.apache.felix.ipojo.util.Logger;
 
-import sun.net.www.ParseUtil;
-
 /**
  * Represent a property i.e. a set : [name, type, value].
  * A property can be attached to a field.

Added: incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceDescription.java
URL: http://svn.apache.org/viewvc/incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceDescription.java?view=auto&rev=515124
==============================================================================
--- incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceDescription.java (added)
+++ incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceDescription.java Tue Mar  6 06:04:26 2007
@@ -0,0 +1,139 @@
+/* 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.ipojo.handlers.providedservice;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.handlers.dependency.DependencyDescription;
+import org.osgi.framework.ServiceReference;
+
+/**
+ * Provided Service Description.
+ * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
+ */
+public class ProvidedServiceDescription {
+	
+	/**
+	 * State : the service is unregistered 
+	 */
+	public static final int UNREGISTERED = 0;
+	
+	/**
+	 * State : the service is registered
+	 */
+	public static final int REGISTERED = 1;
+
+    /**
+     * Provided Service Specification.
+     */
+    private String[] m_serviceSpecification;
+
+    /**
+     * Dependency of the service.
+     */
+    private DependencyDescription[] m_dependencies = new DependencyDescription[0];
+
+    /**
+     * State.
+     */
+    private int m_state;
+
+    /**
+     * The service reference.
+     */
+    private ServiceReference m_serviceReference;
+
+//    /**
+//     * Handler on the component description who contains this description.
+//     */
+//    private InstanceDescription m_parent;
+
+    /**
+     * Properties of the provided service.
+     */
+    private Properties m_properties = new Properties();
+
+
+    /**
+     * Constructor.
+     * @param serviceSpecification : the provided contract
+     * @param state : state (UNREGITRED | REGISTRED)
+     * @param sr : Service Registration (to obtain the reference), or null if state is UNREGISTRED
+     * @param parent : the component description declaring this proided service
+     */
+    public ProvidedServiceDescription(String[] serviceSpecification, int state, ServiceReference sr/*, InstanceDescription parent*/) {
+        m_serviceSpecification = serviceSpecification;
+        m_state = state;
+        m_serviceReference = sr;
+       // m_parent = parent;
+    }
+
+    /**
+     * @return the provided contract name.
+     */
+    public String[] getServiceSpecification() {
+        return m_serviceSpecification;
+    }
+
+    /**
+     * Add a property to the current provided service description.
+     * @param key : the key of the property
+     * @param value : the value of the property
+     */
+    public void addProperty(String key, String value) {
+        m_properties.put(key, value);
+    }
+
+    /**
+     * Set the set of properties. This function create a clone of the argument.
+     * @param props : the properties
+     */
+    public void setProperty(Properties props) {
+        m_properties = props;
+    }
+
+    /**
+     * @return the dependeny description list.
+     */
+    public DependencyDescription[] getDependencies() {
+        return m_dependencies;
+    }
+
+    /**
+     * @return the properties.
+     */
+    public Properties getProperties() {
+        return m_properties;
+    }
+
+    /**
+     * @return the state of the provided service (UNREGISTRED | REGISTRED).
+     */
+    public int getState() {
+        return m_state;
+    }
+
+    /**
+     * @return the service reference (null if the service is unregistred).
+     */
+    public ServiceReference getServiceReference() {
+        return m_serviceReference;
+    }
+
+}

Propchange: incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceDescription.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandler.java
URL: http://svn.apache.org/viewvc/incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandler.java?view=diff&rev=515124&r1=515123&r2=515124
==============================================================================
--- incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandler.java (original)
+++ incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandler.java Tue Mar  6 06:04:26 2007
@@ -19,10 +19,12 @@
 package org.apache.felix.ipojo.handlers.providedservice;
 
 import java.util.Dictionary;
+import java.util.Properties;
 
 import org.apache.felix.ipojo.Handler;
 import org.apache.felix.ipojo.InstanceManager;
 import org.apache.felix.ipojo.architecture.ComponentDescription;
+import org.apache.felix.ipojo.architecture.HandlerDescription;
 import org.apache.felix.ipojo.architecture.PropertyDescription;
 import org.apache.felix.ipojo.metadata.Element;
 import org.apache.felix.ipojo.parser.ParseUtils;
@@ -320,5 +322,27 @@
             m_providedServices[i].deleteProperties(dict);
         }
     }
+	
+	/**
+	 * @see org.apache.felix.ipojo.Handler#getDescription()
+	 */
+	public HandlerDescription getDescription() {
+		ProvidedServiceHandlerDescription pshd = new ProvidedServiceHandlerDescription(this.isValid());
+
+		for (int j = 0; j < getProvidedService().length; j++) {
+			ProvidedService ps = getProvidedService()[j];
+			ProvidedServiceDescription psd = new ProvidedServiceDescription(ps.getServiceSpecification(), ps.getState(), ps.getServiceReference());
+
+			Properties props = new Properties();
+			for (int k = 0; k < ps.getProperties().length; k++) {
+				Property prop = ps.getProperties()[k];
+				if (prop.getValue() != null) { props.put(prop.getName(), prop.getValue().toString()); }
+			}
+			psd.setProperty(props);
+			pshd.addProvidedService(psd);
+		}
+		
+		return pshd;
+	}
 
 }

Added: incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandlerDescription.java
URL: http://svn.apache.org/viewvc/incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandlerDescription.java?view=auto&rev=515124
==============================================================================
--- incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandlerDescription.java (added)
+++ incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandlerDescription.java Tue Mar  6 06:04:26 2007
@@ -0,0 +1,92 @@
+/* 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.ipojo.handlers.providedservice;
+
+import java.util.Iterator;
+
+import org.apache.felix.ipojo.architecture.HandlerDescription;
+
+/**
+ * Provided Service Handler Description.
+ * @author <a href="mailto:felix-dev@incubator.apache.org">Felix Project Team</a>
+ */
+public class ProvidedServiceHandlerDescription extends HandlerDescription {
+
+    /**
+     * Provided Service Description list.
+     */
+    private ProvidedServiceDescription[] m_providedServices = new ProvidedServiceDescription[0];
+
+
+    /**
+     * Constructor.
+     * @param isValid : the validity of the provided service handler.
+     */
+    public ProvidedServiceHandlerDescription(boolean isValid) {
+        super(ProvidedServiceHandler.class.getName(), isValid);
+    }
+
+    /**
+     * @return the provided service description list.
+     */
+    public ProvidedServiceDescription[] getProvidedServices() { return m_providedServices; }
+
+    /**
+     * Add a provided service.
+     * @param pds : the provided service to add
+     */
+    public void addProvidedService(ProvidedServiceDescription pds) {
+        //Verify that the provided service description is not already in the array.
+        for (int i = 0; (i < m_providedServices.length); i++) {
+            if (m_providedServices[i] == pds) {
+                return; //NOTHING DO DO, the description is already in the array
+            }
+        }
+        // The component Description is not in the array, add it
+        ProvidedServiceDescription[] newPSD = new ProvidedServiceDescription[m_providedServices.length + 1];
+        System.arraycopy(m_providedServices, 0, newPSD, 0, m_providedServices.length);
+        newPSD[m_providedServices.length] = pds;
+        m_providedServices = newPSD;
+    }
+
+    /**
+     * @see org.apache.felix.ipojo.architecture.HandlerDescription#getHandlerInfo()
+     */
+    public String getHandlerInfo() {
+        String info = "";
+        for (int i = 0; i < m_providedServices.length; i++) {
+            String state = "unregistered";
+            if (m_providedServices[i].getState() == ProvidedService.REGISTERED) { state = "registered"; }
+            String spec = "";
+            for (int j = 0; j < m_providedServices[i].getServiceSpecification().length; j++) {
+                spec += m_providedServices[i].getServiceSpecification()[j] + " ";
+            }
+            info += "\t Provided Service [" + spec + "] is " + state;
+            Iterator it = m_providedServices[i].getProperties().keySet().iterator();
+            while (it.hasNext()) {
+                String k = (String) it.next();
+                info += "\n\t\t Service Property : " + k + " = " + m_providedServices[i].getProperties().getProperty(k);
+            }
+        }
+        return info;
+    }
+
+
+
+}

Propchange: incubator/felix/trunk/ipojo/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandlerDescription.java
------------------------------------------------------------------------------
    svn:eol-style = native