Applied patch (FELIX-140) to remove generic activator and use bundle
inspection instead.


git-svn-id: https://svn.apache.org/repos/asf/incubator/felix/trunk@449050 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/scr/pom.xml b/scr/pom.xml
index 67b40b6..4a17946 100644
--- a/scr/pom.xml
+++ b/scr/pom.xml
@@ -45,10 +45,10 @@
             </bundleActivator>

             <bundleSymbolicName>org.apache.felix.scr</bundleSymbolicName>

             <exportPackage>

-			  org.apache.felix.scr

-			</exportPackage>

-			<importPackage>

-              org.osgi.service.component, org.osgi.framework

+              org.apache.felix.scr

+            </exportPackage>

+            <importPackage>

+              org.osgi.service.log, org.osgi.service.component, org.osgi.framework

             </importPackage>			

           </osgiManifest>

         </configuration>

diff --git a/scr/src/main/java/org/apache/felix/scr/Activator.java b/scr/src/main/java/org/apache/felix/scr/Activator.java
index 71b6181..f371c1b 100644
--- a/scr/src/main/java/org/apache/felix/scr/Activator.java
+++ b/scr/src/main/java/org/apache/felix/scr/Activator.java
@@ -1,231 +1,377 @@
-/*

- *   Copyright 2006 The Apache Software Foundation

- *

- *   Licensed 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.scr;

-

-import java.lang.reflect.Method;

-import java.util.*;

-

-import org.osgi.framework.*;

-

-/**

- * This activator is used to cover requirement described in section 112.8.1 @@ -27,14

- * 37,202 @@ in active bundles.

- * 

- */

-public class Activator implements BundleActivator, SynchronousBundleListener

-{

-

-    // map of GenericActivator instances per Bundle indexed by Bundle symbolic

-    // name

-    private Map m_componentBundles;

-

-    /**

-     * Registers this instance as a (synchronous) bundle listener and loads the

-     * components of already registered bundles.

-     * 

-     * @param context The <code>BundleContext</code> of the SCR implementation

-     *      bundle.

-     */

-    public void start(BundleContext context) throws Exception

-    {

-        m_componentBundles = new HashMap();

-

-        // register for bundle updates

-        context.addBundleListener(this);

-

-        // 112.8.2 load all components of active bundles

-        loadAllComponents(context);

-    }

-

-    /**

-     * Unregisters this instance as a bundle listener and unloads all components

-     * which have been registered during the active life time of the SCR

-     * implementation bundle.

-     * 

-     * @param context The <code>BundleContext</code> of the SCR implementation

-     *      bundle.

-     */

-    public void stop(BundleContext context) throws Exception

-    {

-        // unregister as bundle listener

-        context.removeBundleListener(this);

-

-        // 112.8.2 dispose off all active components

-        disposeAllComponents();

-    }

-

-    // ---------- BundleListener Interface -------------------------------------

-

-    /**

-     * Loads and unloads any components provided by the bundle whose state

-     * changed. If the bundle has been started, the components are loaded. If

-     * the bundle is about to stop, the components are unloaded.

-     * 

-     * @param event The <code>BundleEvent</code> representing the bundle state

-     *      change.

-     */

-    public void bundleChanged(BundleEvent event)

-    {

-        if (event.getType() == BundleEvent.STARTED)

-        {

-            loadComponents(event.getBundle());

-        }

-        else if (event.getType() == BundleEvent.STOPPING)

-        {

-            disposeComponents(event.getBundle());

-        }

-    }

-

-    // ---------- Component Management -----------------------------------------

-

-    // Loads the components of all bundles currently active.

-    private void loadAllComponents(BundleContext context)

-    {

-        Bundle[] bundles = context.getBundles();

-        for (int i = 0; i < bundles.length; i++)

-        {

-            Bundle bundle = bundles[i];

-            if (bundle.getState() == Bundle.ACTIVE)

-            {

-                loadComponents(bundle);

-            }

-        }

-    }

-

-    /**

-     * Loads the components of the given bundle. If the bundle has no

-     * <i>Service-Component</i> header, this method has no effect. The

-     * fragments of a bundle are not checked for the header (112.4.1).

-     * <p>

-     * This method calls the {@link #getBundleContext(Bundle)} method to find

-     * the <code>BundleContext</code> of the bundle. If the context cannot be

-     * found, this method does not load components for the bundle.

-     */

-    private void loadComponents(Bundle bundle)

-    {

-        if (bundle.getHeaders().get("Service-Component") == null)

-        {

-            // no components in the bundle, abandon

-            return;

-        }

-

-        // there should be components, load them with a bundle context

-        BundleContext context = getBundleContext(bundle);

-        if (context == null)

-        {

-            GenericActivator.error("Cannot get BundleContext of bundle "

-                + bundle.getSymbolicName());

-            return;

-        }

-

-        GenericActivator ga = new GenericActivator();

-        try

-        {

-            ga.start(context);

-            m_componentBundles.put(bundle.getSymbolicName(), ga);

-        }

-        catch (Exception e)

-        {

-            GenericActivator.exception("Error while loading components "

-                + "of bundle " + bundle.getSymbolicName(), null, e);

-        }

-    }

-

-    /**

-     * Unloads components of the given bundle. If no components have been loaded

-     * for the bundle, this method has no effect.

-     */

-    private void disposeComponents(Bundle bundle)

-    {

-        String name = bundle.getSymbolicName();

-        GenericActivator ga = (GenericActivator) m_componentBundles.remove(name);

-        if (ga != null)

-        {

-            try

-            {

-                ga.dispose();

-            }

-            catch (Exception e)

-            {

-                GenericActivator.exception("Error while disposing components "

-                    + "of bundle " + name, null, e);

-            }

-        }

-    }

-

-    // Unloads all components registered with the SCR

-    private void disposeAllComponents()

-    {

-        for (Iterator it = m_componentBundles.values().iterator(); it.hasNext();)

-        {

-            GenericActivator ga = (GenericActivator) it.next();

-            try

-            {

-                ga.dispose();

-            }

-            catch (Exception e)

-            {

-                GenericActivator.exception(

-                    "Error while disposing components of bundle "

-                        + ga.getBundleContext().getBundle().getSymbolicName(),

-                    null, e);

-            }

-            it.remove();

-        }

-    }

-

-    /**

-     * Returns the <code>BundleContext</code> of the bundle.

-     * <p>

-     * This method assumes a <code>getContext</code> method returning a

-     * <code>BundleContext</code> instance to be present in the class of the

-     * bundle or any of its parent classes.

-     * 

-     * @param bundle The <code>Bundle</code> whose context is to be returned.

-     * 

-     * @return The <code>BundleContext</code> of the bundle or

-     *         <code>null</code> if no <code>getContext</code> method

-     *         returning a <code>BundleContext</code> can be found.

-     */

-    private BundleContext getBundleContext(Bundle bundle)

-    {

-        for (Class clazz = bundle.getClass(); clazz != null; clazz = clazz.getSuperclass())

-        {

-            try

-            {

-                Method m = clazz.getDeclaredMethod("getContext", null);

-                if (m.getReturnType().equals(BundleContext.class))

-                {

-                    m.setAccessible(true);

-                    return (BundleContext) m.invoke(bundle, null);

-                }

-            }

-            catch (NoSuchMethodException nsme)

-            {

-                // don't actually care, just try super class

-            }

-            catch (Throwable t)

-            {

-                GenericActivator.exception("Cannot get BundleContext for "

-                    + bundle.getSymbolicName(), null, t);

-            }

-        }

-

-        // fall back to nothing

-        return null;

-    }

+/*
+ *   Copyright 2006 The Apache Software Foundation
+ *
+ *   Licensed 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.scr;
+
+import java.lang.reflect.Method;
+import java.util.*;
+
+import org.osgi.framework.*;
+import org.osgi.service.log.LogService;
+
+/**
+ * This activator is used to cover requirement described in section 112.8.1 @@ -27,14
+ * 37,202 @@ in active bundles.
+ * 
+ */
+public class Activator implements BundleActivator, SynchronousBundleListener, ServiceListener
+{
+    // name of the LogService class
+    private static final String LOGSERVICE_CLASS = LogService.class.getName();
+    
+    // Flag that sets tracing messages
+    private static boolean m_trace = true;
+    
+    // Flag that sets error messages
+    private static boolean m_error = true;
+
+    // A string containing the version number
+    private static String m_version = "1.0.0 (12012006)";
+
+    // this bundle's context
+    private BundleContext m_context;
+    
+    // the log service to log messages to
+    private static /* TODO: not very good, is it ? */ LogService m_logService;
+    
+    // map of BundleComponentActivator instances per Bundle indexed by Bundle symbolic
+    // name
+    private Map m_componentBundles;
+
+    // Static initializations based on system properties
+    static {
+        // Get system properties to see if traces or errors need to be displayed
+        String result = System.getProperty("ds.showtrace");
+        if(result != null && result.equals("true"))
+        {
+            m_trace = true;
+        }
+        result = System.getProperty("ds.showerrors");
+        if(result != null && result.equals("false"))
+        {
+            m_error = false;
+        }
+        result = System.getProperty("ds.showversion");
+        if(result != null && result.equals("true"))
+        {
+            System.out.println("[ Version = "+m_version+" ]\n");
+        }        
+    }
+
+    /**
+     * Registers this instance as a (synchronous) bundle listener and loads the
+     * components of already registered bundles.
+     * 
+     * @param context The <code>BundleContext</code> of the SCR implementation
+     *      bundle.
+     */
+    public void start(BundleContext context) throws Exception
+    {
+        m_context = context;
+        m_componentBundles = new HashMap();
+
+        // require the log service
+        ServiceReference logRef = context.getServiceReference(LOGSERVICE_CLASS);
+        if (logRef != null) {
+            m_logService = (LogService) context.getService(logRef);
+        }
+        context.addServiceListener(this,
+            "(" + Constants.OBJECTCLASS + "=" + LOGSERVICE_CLASS + ")");
+        
+        // register for bundle updates
+        context.addBundleListener(this);
+
+        // 112.8.2 load all components of active bundles
+        loadAllComponents(context);
+    }
+
+    /**
+     * Unregisters this instance as a bundle listener and unloads all components
+     * which have been registered during the active life time of the SCR
+     * implementation bundle.
+     * 
+     * @param context The <code>BundleContext</code> of the SCR implementation
+     *      bundle.
+     */
+    public void stop(BundleContext context) throws Exception
+    {
+        // unregister as bundle listener
+        context.removeBundleListener(this);
+
+        // 112.8.2 dispose off all active components
+        disposeAllComponents();
+    }
+
+    // ---------- BundleListener Interface -------------------------------------
+
+    /**
+     * Loads and unloads any components provided by the bundle whose state
+     * changed. If the bundle has been started, the components are loaded. If
+     * the bundle is about to stop, the components are unloaded.
+     * 
+     * @param event The <code>BundleEvent</code> representing the bundle state
+     *      change.
+     */
+    public void bundleChanged(BundleEvent event)
+    {
+        if (event.getType() == BundleEvent.STARTED)
+        {
+            loadComponents(event.getBundle());
+        }
+        else if (event.getType() == BundleEvent.STOPPING)
+        {
+            disposeComponents(event.getBundle());
+        }
+    }
+
+    //---------- ServiceListener ----------------------------------------------
+
+    // TODO:
+    public void serviceChanged(ServiceEvent event)
+    {
+        if (event.getType() == ServiceEvent.REGISTERED)
+        {
+            m_logService = (LogService) m_context.getService(event.getServiceReference());
+        }
+        else if (event.getType() == ServiceEvent.UNREGISTERING)
+        {
+            m_logService = null;
+            m_context.ungetService(event.getServiceReference());
+        }
+    }
+    
+    // ---------- Component Management -----------------------------------------
+
+    // Loads the components of all bundles currently active.
+    private void loadAllComponents(BundleContext context)
+    {
+        Bundle[] bundles = context.getBundles();
+        for (int i = 0; i < bundles.length; i++)
+        {
+            Bundle bundle = bundles[i];
+            if (bundle.getState() == Bundle.ACTIVE)
+            {
+                loadComponents(bundle);
+            }
+        }
+    }
+
+    /**
+     * Loads the components of the given bundle. If the bundle has no
+     * <i>Service-Component</i> header, this method has no effect. The
+     * fragments of a bundle are not checked for the header (112.4.1).
+     * <p>
+     * This method calls the {@link #getBundleContext(Bundle)} method to find
+     * the <code>BundleContext</code> of the bundle. If the context cannot be
+     * found, this method does not load components for the bundle.
+     */
+    private void loadComponents(Bundle bundle)
+    {
+        if (bundle.getHeaders().get("Service-Component") == null)
+        {
+            // no components in the bundle, abandon
+            return;
+        }
+
+        // there should be components, load them with a bundle context
+        BundleContext context = getBundleContext(bundle);
+        if (context == null)
+        {
+            error("Cannot get BundleContext of bundle "
+                + bundle.getSymbolicName());
+            return;
+        }
+
+        try
+        {
+            BundleComponentActivator ga = new BundleComponentActivator(context);
+            m_componentBundles.put(bundle.getSymbolicName(), ga);
+        }
+        catch (Exception e)
+        {
+            exception("Error while loading components "
+                + "of bundle " + bundle.getSymbolicName(), null, e);
+        }
+    }
+
+    /**
+     * Unloads components of the given bundle. If no components have been loaded
+     * for the bundle, this method has no effect.
+     */
+    private void disposeComponents(Bundle bundle)
+    {
+        String name = bundle.getSymbolicName();
+        BundleComponentActivator ga = (BundleComponentActivator) m_componentBundles.remove(name);
+        if (ga != null)
+        {
+            try
+            {
+                ga.dispose();
+            }
+            catch (Exception e)
+            {
+                exception("Error while disposing components "
+                    + "of bundle " + name, null, e);
+            }
+        }
+    }
+
+    // Unloads all components registered with the SCR
+    private void disposeAllComponents()
+    {
+        for (Iterator it = m_componentBundles.values().iterator(); it.hasNext();)
+        {
+            BundleComponentActivator ga = (BundleComponentActivator) it.next();
+            try
+            {
+                ga.dispose();
+            }
+            catch (Exception e)
+            {
+                exception(
+                    "Error while disposing components of bundle "
+                        + ga.getBundleContext().getBundle().getSymbolicName(),
+                    null, e);
+            }
+            it.remove();
+        }
+    }
+
+    /**
+     * Returns the <code>BundleContext</code> of the bundle.
+     * <p>
+     * This method assumes a <code>getContext</code> method returning a
+     * <code>BundleContext</code> instance to be present in the class of the
+     * bundle or any of its parent classes.
+     * 
+     * @param bundle The <code>Bundle</code> whose context is to be returned.
+     * 
+     * @return The <code>BundleContext</code> of the bundle or
+     *         <code>null</code> if no <code>getContext</code> method
+     *         returning a <code>BundleContext</code> can be found.
+     */
+    private BundleContext getBundleContext(Bundle bundle)
+    {
+        for (Class clazz = bundle.getClass(); clazz != null; clazz = clazz.getSuperclass())
+        {
+            try
+            {
+                Method m = clazz.getDeclaredMethod("getContext", null);
+                if (m.getReturnType().equals(BundleContext.class))
+                {
+                    m.setAccessible(true);
+                    return (BundleContext) m.invoke(bundle, null);
+                }
+            }
+            catch (NoSuchMethodException nsme)
+            {
+                // don't actually care, just try super class
+            }
+            catch (Throwable t)
+            {
+                exception("Cannot get BundleContext for "
+                    + bundle.getSymbolicName(), null, t);
+            }
+        }
+
+        // fall back to nothing
+        return null;
+    }
+    
+    
+    /**
+     * Method to display traces
+     *
+     * @param message a string to be displayed
+     * @param metadata ComponentMetadata associated to the message (can be null)
+    **/
+    static void trace(String message, ComponentMetadata metadata)
+    {
+        if(m_trace)
+        {
+            StringBuffer msg = new StringBuffer("--- ");
+            if(metadata != null) {
+                msg.append("[").append(metadata.getName()).append("] ");
+            }
+            msg.append(message);
+
+            LogService log = m_logService;
+            if (log == null)
+            {
+                System.out.println(msg);
+            }
+            else
+            {
+                log.log(LogService.LOG_DEBUG, msg.toString());
+            }
+        }
+    }
+
+    /**
+     * Method to display errors
+     *
+     * @param message a string to be displayed
+     **/
+    static void error(String message)
+    {
+        if(m_error)
+        {
+            StringBuffer msg = new StringBuffer("### ").append(message);
+
+            LogService log = m_logService;
+            if (log == null)
+            {
+                System.err.println(msg);
+            }
+            else
+            {
+                log.log(LogService.LOG_ERROR, msg.toString());
+            }
+        }
+    }
+
+    /**
+     * Method to display exceptions
+     *
+     * @param ex an exception
+     **/   
+    static void exception(String message, ComponentMetadata metadata, Throwable ex)
+    {
+         if(m_error)
+         {
+             StringBuffer msg = new StringBuffer("--- ");
+             if(metadata != null) {
+                 msg.append("[").append(metadata.getName()).append("] ");
+             }
+             msg.append("Exception with component : ");
+             msg.append(message).append(" ---");
+             
+             LogService log = m_logService;
+             if (log == null)
+             {
+                 System.err.println(msg);
+                 if (ex != null)
+                 {
+                     ex.printStackTrace(System.err);
+                 }
+             }
+             else
+             {
+                 log.log(LogService.LOG_ERROR, msg.toString(), ex);
+             }
+         }      
+    }
 }
\ No newline at end of file
diff --git a/scr/src/main/java/org/apache/felix/scr/GenericActivator.java b/scr/src/main/java/org/apache/felix/scr/BundleComponentActivator.java
similarity index 63%
rename from scr/src/main/java/org/apache/felix/scr/GenericActivator.java
rename to scr/src/main/java/org/apache/felix/scr/BundleComponentActivator.java
index c1f7e3b..ffc338c 100644
--- a/scr/src/main/java/org/apache/felix/scr/GenericActivator.java
+++ b/scr/src/main/java/org/apache/felix/scr/BundleComponentActivator.java
@@ -1,433 +1,371 @@
-/*

- *   Copyright 2006 The Apache Software Foundation

- *

- *   Licensed 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.scr;

-

-import java.util.ArrayList;

-import java.util.HashSet;

-import java.util.Iterator;

-import java.util.List;

-import java.util.Set;

-import java.util.StringTokenizer;

-

-import java.io.InputStream;

-

-import org.apache.felix.scr.parser.KXml2SAXParser;

-import org.apache.felix.scr.parser.ParseException;

-import org.osgi.framework.BundleActivator;

-import org.osgi.framework.BundleContext;

-import org.osgi.service.component.ComponentException;

-

-import java.io.BufferedReader;

-import java.io.FileNotFoundException;

-import java.io.IOException;

-import java.io.InputStreamReader;

-

-/**

- * The GenericActivator is the main startup class. It will read information from the metadata.xml file

- * descriptors and create the corresponding managers.

- *

- */

-public class GenericActivator implements BundleActivator

-{	

-	// The bundle context

-    private BundleContext m_context = null;

-    

-    // This is a list of component instance managers that belong to a particular bundle

-    private List m_managers = new ArrayList();

-

-    // Flag that sets tracing messages

-    private static boolean m_trace = true;

-    

-    // Flag that sets error messages

-    private static boolean m_error = true;

-

-    // A string containing the version number

-    private static String m_version = "1.0.0 (12012006)";

-

-    // Registry of component names

-    static Set m_componentNames = new HashSet();

-

-    // Static initializations based on system properties

-    static {

-        // Get system properties to see if traces or errors need to be displayed

-        String result = System.getProperty("ds.showtrace");

-        if(result != null && result.equals("true"))

-        {

-            m_trace = true;

-        }

-        result = System.getProperty("ds.showerrors");

-        if(result != null && result.equals("false"))

-        {

-            m_error = false;

-        }

-        result = System.getProperty("ds.showversion");

-        if(result != null && result.equals("true"))

-        {

-            System.out.println("[ Version = "+m_version+" ]\n");

-        }        

-    }

-

-    /**

-    * Called upon starting of the bundle. This method invokes initialize() which

-    * parses the metadata and creates the instance managers

-    *

-    * @param   context  The bundle context passed by the framework

-    * @exception   Exception any exception thrown from initialize

-    */

-    public void start(BundleContext context) throws Exception

-    {

-    	// Stores the context

-        m_context = context;

-        

-        try

-        {

-            initialize();

-        }

-        catch (Exception e)

-        {

-            GenericActivator.error("GenericActivator : in bundle ["

-                + context.getBundle().getBundleId() + "] : " + e);

-            e.printStackTrace();

-            throw e;

-        }

-    }

-

-    /**

-    * Gets the MetaData location, parses the meta data and requests the processing

-    * of binder instances

-    *

-    * @throws FileNotFoundException if the metadata file is not found

-    * @throws ParseException if the metadata file is not found

-    */

-    private void initialize() throws ParseException {

-        // Get the Metadata-Location value from the manifest

-        String descriptorLocations = (String) m_context.getBundle().getHeaders().get("Service-Component");

-

-        if (descriptorLocations == null)

-        {

-            throw new ComponentException("Service-Component entry not found in the manifest");

-        }

-

-        // 112.4.1: The value of the the header is a comma separated list of XML entries within the Bundle 

-		StringTokenizer st = new StringTokenizer(descriptorLocations, ", ");

-        

-		while (st.hasMoreTokens()) {

-			String descriptorLocation = st.nextToken();

-			

-			try {

-				InputStream stream = m_context.getBundle().getResource(descriptorLocation).openStream();

-

-				BufferedReader in = new BufferedReader(new InputStreamReader(stream)); 

-	            XmlHandler handler = new XmlHandler(); 

-	            KXml2SAXParser parser;

-

-	            parser = new KXml2SAXParser(in); 

-

-		        parser.parseXML(handler);

-

-		        // 112.4.2 Component descriptors may contain a single, root component element

-		        // or one or more component elements embedded in a larger document

-		        Iterator i = handler.getComponentMetadataList().iterator();

-		        while (i.hasNext()) {

-                	try {

-    		            ComponentMetadata metadata = (ComponentMetadata) i.next();

-    		            

-    		            validate(metadata);

-    		        	

-    	                // Request creation of the component manager

-    	                ComponentManager manager = ManagerFactory.createManager(this,metadata);

-                		

-                		if(metadata.isFactory()) {

-                			// 112.2.4 SCR must register a Component Factory service on behalf ot the component

-                			// as soon as the component factory is satisfied

-                		}

-                		else if(metadata.isEnabled()) {

-		                	// enable the component

-		                	manager.enable();

-		                }

-

-                		// register the manager

-                		m_managers.add(manager);

-	                } catch (Exception e) {

-						// There is a problem with this particular component, we'll log the error

-	                	// and proceed to the next one

-	                	// TODO: log the error

-						e.printStackTrace();

-					} 

-		        }

-		        

-		        stream.close();

-

-			}

-			catch ( IOException ex ) {

-				// 112.4.1 If an XML document specified by the header cannot be located in the bundle and its attached

-				// fragments, SCR must log an error message with the Log Service, if present, and continue.

-				

-				error("Component descriptor entry '" + descriptorLocation	+ "' not found");

-			}

-			catch (Exception ex) {

-				ex.printStackTrace();

-			}

-		}

-    }

-

-    /**

-    * Stop method that destroys all the instance managers

-    *

-    * @param   context The Bundle Context passed by the framework

-    * @exception Exception any exception thrown during destruction of the instance managers

-    */

-    public void stop(BundleContext context) throws java.lang.Exception

-    {

-        //GenericActivator.trace("GenericActivator : Bundle ["+context.getBundle().getBundleId()+"] will destroy "+m_managers.size()+" instances");

-

-        while (m_managers.size() !=0 )

-        {

-            ComponentManager manager = (ComponentManager)m_managers.get(0);

-            try {

-                manager.dispose();

-                m_managers.remove(manager);

-            }

-            catch(Exception e) {

-                GenericActivator.error("GenericActivator : Exception during invalidate : "+e);

-                e.printStackTrace();

-            }

-            finally {

-            	m_componentNames.remove(manager.getComponentMetadata().getName());

-            }

-            

-        }

-

-        m_context = null;

-

-        //GenericActivator.trace("GenericActivator : Bundle ["+context.getBundle().getBundleId()+"] STOPPED");

-    }

-

-    void dispose() throws Exception {

-        if (m_context != null) {

-            stop(m_context);

-        }

-    }

-

-   /**

-    * Returns the list of instance references currently associated to this activator

-    *

-    * @return the list of instance references

-    */

-    protected List getInstanceReferences()

-    {

-        return m_managers;

-    }

-

-    /**

-    * Returns the BundleContext

-    *

-    * @return the BundleContext

-    */

-    protected BundleContext getBundleContext()

-    {

-        return m_context;

-    }

-

-    /**

-     * Implements the <code>ComponentContext.enableComponent(String)</code>

-     * method by first finding the component(s) for the <code>name</code> and

-     * then starting a thread to actually enable all components found.

-     * <p>

-     * If no component matching the given name is found the thread is not

-     * started and the method does nothing. 

-     * 

-     * @param name The name of the component to enable or <code>null</code> to

-     *      enable all components.

-     */

-    void enableComponent(String name)

-    {

-        final ComponentManager[] cm = getSelectedComponents(name);

-        if (cm == null)

-        {

-            return;

-        }

-        

-        Thread enabler = new Thread("Component Enabling") 

-        {

-            public void run()

-            {

-                for (int i=0; i < cm.length; i++)

-                {

-                    try

-                    {

-                        cm[i].enable();

-                    }

-                    catch (Throwable t) 

-                    {

-                        exception("Cannot enable component",

-                            cm[i].getComponentMetadata(), t);

-                    }

-                }

-            }

-        };

-        enabler.start();

-    }

-    

-    /**

-     * Implements the <code>ComponentContext.disableComponent(String)</code>

-     * method by first finding the component(s) for the <code>name</code> and

-     * then starting a thread to actually disable all components found.

-     * <p>

-     * If no component matching the given name is found the thread is not

-     * started and the method does nothing. 

-     * 

-     * @param name The name of the component to disable or <code>null</code> to

-     *      disable all components.

-     */

-    void disableComponent(String name)

-    {

-        final ComponentManager[] cm = getSelectedComponents(name);

-        if (cm == null)

-        {

-            return;

-        }

-        

-        Thread disabler = new Thread("Component Disabling")

-        {

-            public void run()

-            {

-                for (int i=0; i < cm.length; i++)

-                {

-                    try

-                    {

-                        cm[i].dispose();

-                    }

-                    catch (Throwable t)

-                    {

-                        exception("Cannot disable component",

-                            cm[i].getComponentMetadata(), t);

-                    }

-                }

-            }

-        };

-        disabler.start();

-    }

-    

-    /**

-     * Returns an array of {@link ComponentManager} instances which match the

-     * <code>name</code>. If the <code>name</code> is <code>null</code> an

-     * array of all currently known component managers is returned. Otherwise

-     * an array containing a single component manager matching the name is

-     * returned if one is registered. Finally, if no component manager with the

-     * given name is registered, <code>null</code> is returned.

-     *  

-     * @param name The name of the component manager to return or

-     *      <code>null</code> to return an array of all component managers.

-     *      

-     * @return An array containing one or more component managers according

-     *      to the <code>name</code> parameter or <code>null</code> if no

-     *      component manager with the given name is currently registered.

-     */

-    private ComponentManager[] getSelectedComponents(String name) {

-        // if all components are selected

-        if (name == null)

-        {

-            return (ComponentManager[]) m_managers.toArray(new ComponentManager[m_managers.size()]);

-        }

-        

-        if (m_componentNames.contains(name))

-        {

-            // otherwise just find it

-            Iterator it = m_managers.iterator();

-            while (it.hasNext())

-            {

-                ComponentManager cm = (ComponentManager) it.next();

-                if (name.equals(cm.getComponentMetadata().getName())) {

-                    return new ComponentManager[]{ cm  };

-                }

-            }

-        }

-        

-        // if the component is not known

-        return null;

-    }

-        

-    /**

-     * Method to display traces

-     *

-     * @param message a string to be displayed

-     * @param metadata ComponentMetadata associated to the message (can be null)

-    **/

-    static void trace(String message, ComponentMetadata metadata)

-    {

-        if(m_trace)

-        {

-            System.out.print("--- ");

-            if(metadata != null) {

-            	System.out.print("[");

-            	System.out.print(metadata.getName());

-            	System.out.print("] ");

-            	System.out.println(message);

-            }

-        }

-    }

-

-    /**

-     * Method to display errors

-     *

-     * @param s a string to be displayed

-    **/

-    static void error(String s) {

-        if(m_error) {

-            System.err.println("### "+s);

-        }

-    }

-

-    /**

-     * Method to display exceptions

-     *

-     * @param ex an exception

-    **/   

-    static void exception(String message, ComponentMetadata metadata, Throwable ex) {

-    	 if(m_error) {

-    		 System.out.println("--- Exception in component "+metadata.getName()+" : "+message+" ---");

-             ex.printStackTrace();

-         }   	

-    }

-

-    /**

-     * This method is used to validate that the component. This method verifies multiple things:

-     * 

-     * 1.- That the name attribute is set and is globally unique

-     * 2.- That an implementation class name has been set 

-     * 3.- That a delayed component provides a service and is not specified to be a factory

-     * - That the serviceFactory attribute for the provided service is not true if the component is a factory or immediate

-     * 

-     * If the component is valid, its name is registered

-     * 

-     * @throws A ComponentException if something is not right

-     */

-    void validate(ComponentMetadata component) throws ComponentException {

-

-    	if(m_componentNames.contains(component.getName()))

-    	{

-    		throw new ComponentException("The component name '"+component.getName()+"' has already been registered.");

-    	}

-    	

-    	m_componentNames.add(component.getName());

-    

-    	component.validate();

-    	

-    	trace("Validated and registered component",component);

-    }

-}

+/*
+ *   Copyright 2006 The Apache Software Foundation
+ *
+ *   Licensed 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.scr;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.StringTokenizer;
+
+import org.apache.felix.scr.parser.KXml2SAXParser;
+import org.osgi.framework.BundleContext;
+import org.osgi.service.component.ComponentException;
+
+/**
+ * The BundleComponentActivator is helper class to load and unload Components of
+ * a single bundle. It will read information from the metadata.xml file
+ * descriptors and create the corresponding managers.
+ */
+class BundleComponentActivator
+{	
+	// The bundle context
+    private BundleContext m_context = null;
+    
+    // This is a list of component instance managers that belong to a particular bundle
+    private List m_managers = new ArrayList();
+
+    // Global Registry of component names
+    private static Set m_componentNames = new HashSet();
+
+    /**
+     * Called upon starting of the bundle. This method invokes initialize() which
+     * parses the metadata and creates the instance managers
+     *
+     * @param   context  The bundle context passed by the framework
+     * @exception   Exception any exception thrown from initialize
+     */
+    BundleComponentActivator(BundleContext context) throws ComponentException
+    {
+    	// Stores the context
+        m_context = context;
+        
+        // Get the Metadata-Location value from the manifest
+        String descriptorLocations =
+            (String) m_context.getBundle().getHeaders().get("Service-Component");
+        if (descriptorLocations == null)
+        {
+            throw new ComponentException("Service-Component entry not found in the manifest");
+        }
+
+        initialize(descriptorLocations);
+    }
+
+    /**
+     * Gets the MetaData location, parses the meta data and requests the processing
+     * of binder instances
+     * 
+     * @param descriptorLocations A comma separated list of locations of
+     *      component descriptors. This must not be <code>null</code>.
+     *      
+     * @throws IllegalStateException If the bundle has already been uninstalled.
+     */
+    private void initialize(String descriptorLocations) {
+
+        // 112.4.1: The value of the the header is a comma separated list of XML entries within the Bundle 
+		StringTokenizer st = new StringTokenizer(descriptorLocations, ", ");
+        
+		while (st.hasMoreTokens()) {
+			String descriptorLocation = st.nextToken();
+			
+            URL descriptorURL = m_context.getBundle().getResource(descriptorLocation);
+            if (descriptorURL == null)
+            {
+                // 112.4.1 If an XML document specified by the header cannot be located in the bundle and its attached
+                // fragments, SCR must log an error message with the Log Service, if present, and continue.
+                Activator.error("Component descriptor entry '" + descriptorLocation + "' not found");
+                continue;
+            }
+
+			try {
+				InputStream stream = descriptorURL.openStream();
+
+				BufferedReader in = new BufferedReader(new InputStreamReader(stream)); 
+	            XmlHandler handler = new XmlHandler(); 
+	            KXml2SAXParser parser;
+
+	            parser = new KXml2SAXParser(in); 
+
+		        parser.parseXML(handler);
+
+		        // 112.4.2 Component descriptors may contain a single, root component element
+		        // or one or more component elements embedded in a larger document
+		        Iterator i = handler.getComponentMetadataList().iterator();
+		        while (i.hasNext()) {
+                    ComponentMetadata metadata = (ComponentMetadata) i.next();
+                	try
+                    {
+                        // validate the component metadata
+    		            validate(metadata);
+    		        	
+    	                // Request creation of the component manager
+    	                ComponentManager manager = ManagerFactory.createManager(this,metadata);
+                		
+                		if(metadata.isFactory())
+                        {
+                			// 112.2.4 SCR must register a Component Factory service on behalf ot the component
+                			// as soon as the component factory is satisfied
+                		}
+                		else if(metadata.isEnabled())
+                        {
+		                	// enable the component
+		                	manager.enable();
+		                }
+
+                		// register the manager
+                		m_managers.add(manager);
+                    }
+                    catch (Exception e)
+                    {
+						// There is a problem with this particular component, we'll log the error
+	                	// and proceed to the next one
+                        Activator.exception("Cannot register Component", metadata, e);
+					} 
+		        }
+		        
+		        stream.close();
+
+			}
+			catch ( IOException ex )
+            {
+				// 112.4.1 If an XML document specified by the header cannot be located in the bundle and its attached
+				// fragments, SCR must log an error message with the Log Service, if present, and continue.
+				
+				Activator.exception("Problem reading descriptor entry '"
+                    + descriptorLocation + "'", null, ex);
+			}
+			catch (Exception ex)
+            {
+                Activator.exception("General problem with descriptor entry '"
+                    + descriptorLocation + "'", null, ex);
+			}
+		}
+    }
+
+    /**
+    * Dispose of this component activator instance and all the component
+    * managers.
+    */
+    void dispose()
+    {
+        if (m_context == null) {
+            return;
+        }
+
+        Activator.trace("BundleComponentActivator : Bundle ["
+            + m_context.getBundle().getBundleId() + "] will destroy "
+            + m_managers.size() + " instances", null);
+
+        while (m_managers.size() !=0 )
+        {
+            ComponentManager manager = (ComponentManager) m_managers.get(0);
+            try
+            {
+                m_managers.remove(manager);
+                manager.dispose();
+            }
+            catch(Exception e)
+            {
+                Activator.exception("BundleComponentActivator : Exception invalidating",
+                    manager.getComponentMetadata(), e);
+            }
+            finally
+            {
+            	m_componentNames.remove(manager.getComponentMetadata().getName());
+            }
+            
+        }
+
+        Activator.trace("BundleComponentActivator : Bundle ["
+            + m_context.getBundle().getBundleId() + "] STOPPED", null);
+
+        m_context = null;
+    }
+
+   /**
+    * Returns the list of instance references currently associated to this activator
+    *
+    * @return the list of instance references
+    */
+    protected List getInstanceReferences()
+    {
+        return m_managers;
+    }
+
+    /**
+    * Returns the BundleContext
+    *
+    * @return the BundleContext
+    */
+    protected BundleContext getBundleContext()
+    {
+        return m_context;
+    }
+
+    /**
+     * Implements the <code>ComponentContext.enableComponent(String)</code>
+     * method by first finding the component(s) for the <code>name</code> and
+     * then starting a thread to actually enable all components found.
+     * <p>
+     * If no component matching the given name is found the thread is not
+     * started and the method does nothing. 
+     * 
+     * @param name The name of the component to enable or <code>null</code> to
+     *      enable all components.
+     */
+    void enableComponent(String name)
+    {
+        final ComponentManager[] cm = getSelectedComponents(name);
+        if (cm == null)
+        {
+            return;
+        }
+        
+        Thread enabler = new Thread("Component Enabling") 
+        {
+            public void run()
+            {
+                for (int i=0; i < cm.length; i++)
+                {
+                    try
+                    {
+                        cm[i].enable();
+                    }
+                    catch (Throwable t) 
+                    {
+                        Activator.exception("Cannot enable component",
+                            cm[i].getComponentMetadata(), t);
+                    }
+                }
+            }
+        };
+        enabler.start();
+    }
+    
+    /**
+     * Implements the <code>ComponentContext.disableComponent(String)</code>
+     * method by first finding the component(s) for the <code>name</code> and
+     * then starting a thread to actually disable all components found.
+     * <p>
+     * If no component matching the given name is found the thread is not
+     * started and the method does nothing. 
+     * 
+     * @param name The name of the component to disable or <code>null</code> to
+     *      disable all components.
+     */
+    void disableComponent(String name)
+    {
+        final ComponentManager[] cm = getSelectedComponents(name);
+        if (cm == null)
+        {
+            return;
+        }
+        
+        Thread disabler = new Thread("Component Disabling")
+        {
+            public void run()
+            {
+                for (int i=0; i < cm.length; i++)
+                {
+                    try
+                    {
+                        cm[i].dispose();
+                    }
+                    catch (Throwable t)
+                    {
+                        Activator.exception("Cannot disable component",
+                            cm[i].getComponentMetadata(), t);
+                    }
+                }
+            }
+        };
+        disabler.start();
+    }
+    
+    /**
+     * Returns an array of {@link ComponentManager} instances which match the
+     * <code>name</code>. If the <code>name</code> is <code>null</code> an
+     * array of all currently known component managers is returned. Otherwise
+     * an array containing a single component manager matching the name is
+     * returned if one is registered. Finally, if no component manager with the
+     * given name is registered, <code>null</code> is returned.
+     *  
+     * @param name The name of the component manager to return or
+     *      <code>null</code> to return an array of all component managers.
+     *      
+     * @return An array containing one or more component managers according
+     *      to the <code>name</code> parameter or <code>null</code> if no
+     *      component manager with the given name is currently registered.
+     */
+    private ComponentManager[] getSelectedComponents(String name) {
+        // if all components are selected
+        if (name == null)
+        {
+            return (ComponentManager[]) m_managers.toArray(new ComponentManager[m_managers.size()]);
+        }
+        
+        if (m_componentNames.contains(name))
+        {
+            // otherwise just find it
+            Iterator it = m_managers.iterator();
+            while (it.hasNext())
+            {
+                ComponentManager cm = (ComponentManager) it.next();
+                if (name.equals(cm.getComponentMetadata().getName())) {
+                    return new ComponentManager[]{ cm  };
+                }
+            }
+        }
+        
+        // if the component is not known
+        return null;
+    }
+
+    /**
+     * This method is used to validate that the component. This method verifies multiple things:
+     * 
+     * 1.- That the name attribute is set and is globally unique
+     * 2.- That an implementation class name has been set 
+     * 3.- That a delayed component provides a service and is not specified to be a factory
+     * - That the serviceFactory attribute for the provided service is not true if the component is a factory or immediate
+     * 
+     * If the component is valid, its name is registered
+     * 
+     * @throws A ComponentException if something is not right
+     */
+    void validate(ComponentMetadata component) throws ComponentException
+    {
+
+    	if(m_componentNames.contains(component.getName()))
+    	{
+    		throw new ComponentException("The component name '"+component.getName()+"' has already been registered.");
+    	}
+    	
+        component.validate();
+
+        // register the component after validation
+        m_componentNames.add(component.getName());
+    	
+        Activator.trace("Validated and registered component",component);
+    }
+}
diff --git a/scr/src/main/java/org/apache/felix/scr/ComponentManagerImpl.java b/scr/src/main/java/org/apache/felix/scr/ComponentManagerImpl.java
index c43b1e2..69deb74 100644
--- a/scr/src/main/java/org/apache/felix/scr/ComponentManagerImpl.java
+++ b/scr/src/main/java/org/apache/felix/scr/ComponentManagerImpl.java
@@ -29,7 +29,7 @@
  * implementation object's lifecycle.  
  *
  */
-public class ComponentManagerImpl implements ComponentManager, ComponentInstance
+class ComponentManagerImpl implements ComponentManager, ComponentInstance
 {
 	// States of the instance manager
 	static final int INSTANCE_CREATING = 0;
@@ -63,8 +63,8 @@
     // The ServiceRegistration
     private ServiceRegistration m_serviceRegistration = null;
 
-    // A reference to the GenericActivator
-    private GenericActivator m_activator = null;
+    // A reference to the BundleComponentActivator
+    private BundleComponentActivator m_activator = null;
 
     // The context that will be passed to the implementationObject
     private ComponentContext m_componentContext = null;
@@ -78,7 +78,7 @@
      * @param activator
      * @param metadata
      */
-    ComponentManagerImpl(GenericActivator activator,ComponentMetadata metadata)
+    ComponentManagerImpl(BundleComponentActivator activator, ComponentMetadata metadata)
     {
     	// Store the activator reference
         m_activator = activator;
@@ -94,7 +94,7 @@
      */
     public boolean enable() {
     	
-    	GenericActivator.trace("Enabling component", m_componentMetadata);
+        Activator.trace("Enabling component", m_componentMetadata);
     	
     	try
     	{
@@ -182,7 +182,7 @@
         // If the component is not immediate, this is not done at this moment
         if( m_componentMetadata.isImmediate() == true )
         {
-        	//GenericActivator.trace("Loading implementation class and creating instance for component '"+m_componentMetadata.getName()+"'");
+            //Activator.trace("Loading implementation class and creating instance for component '"+m_componentMetadata.getName()+"'");
         	try
 	        {
 	        	// 112.4.4 The class is retrieved with the loadClass method of the component's bundle
@@ -196,7 +196,7 @@
 	        catch (Exception ex)
 	        {
 	            // TODO: manage this exception when implementation object cannot be created
-	            GenericActivator.exception("Error during instantiation", m_componentMetadata, ex);
+	            Activator.exception("Error during instantiation", m_componentMetadata, ex);
 	            deactivate();
 	            //invalidate();
 	            return;
@@ -208,7 +208,7 @@
         // 3. Bind the target services
         it = m_dependencyManagers.iterator();
 
-        //GenericActivator.trace("Binding target services for component '"+m_componentMetadata.getName()+"'");
+        //Activator.trace("Binding target services for component '"+m_componentMetadata.getName()+"'");
         
         while (it.hasNext())
         {
@@ -222,7 +222,7 @@
             }
         }
         
-        //GenericActivator.trace("Calling activate for component '"+m_componentMetadata.getName()+"'");
+        //Activator.trace("Calling activate for component '"+m_componentMetadata.getName()+"'");
         
         // 4. Call the activate method, if present
 	        // We need to check if we are still validating because it is possible that when we
@@ -238,17 +238,17 @@
         		activateMethod.invoke(m_implementationObject, new Object[]{m_componentContext});
         	}
         	catch(NoSuchMethodException ex) {        		
-        		// We can safely ignore this one
-        		GenericActivator.trace("activate() method not implemented", m_componentMetadata);
+        	    // We can safely ignore this one
+        	    Activator.trace("activate() method not implemented", m_componentMetadata);
         	}
         	catch(IllegalAccessException ex) {
-        		// TODO: Log this exception?
-        		GenericActivator.trace("activate() method cannot be called", m_componentMetadata);
+        	    // TODO: Log this exception?
+        	    Activator.trace("activate() method cannot be called", m_componentMetadata);
         	}
         	catch(InvocationTargetException ex) {
-        		// TODO: 112.5.8 If the activate method throws an exception, SCR must log an error message
-        		// containing the exception with the Log Service
-        		GenericActivator.exception("The activate method has thrown an exception", m_componentMetadata, ex.getTargetException());
+        	    // TODO: 112.5.8 If the activate method throws an exception, SCR must log an error message
+        	    // containing the exception with the Log Service
+        	    Activator.exception("The activate method has thrown an exception", m_componentMetadata, ex.getTargetException());
         	}
         }
         
@@ -259,7 +259,7 @@
         // 5. Register provided services
         if(m_componentMetadata.getServiceMetadata() != null)
         {
-            GenericActivator.trace("registering services", m_componentMetadata);
+            Activator.trace("registering services", m_componentMetadata);
 
         	if( m_componentMetadata.isImmediate() == true ) {
 	        	// In the case the component is immediate, the implementation object is registered
@@ -298,7 +298,7 @@
 	        m_serviceRegistration.unregister();
 	        m_serviceRegistration = null;
 
-	        GenericActivator.trace("unregistering the services", m_componentMetadata);
+	        Activator.trace("unregistering the services", m_componentMetadata);
 	    }
 
         // 1.- Call the deactivate method, if present	    
@@ -313,17 +313,17 @@
 			}
 		}
 		catch(NoSuchMethodException ex) {
-			// We can safely ignore this one
-			GenericActivator.trace("deactivate() method is not implemented", m_componentMetadata);
+            // We can safely ignore this one
+			Activator.trace("deactivate() method is not implemented", m_componentMetadata);
 		}
 		catch(IllegalAccessException ex) {
 			// Ignored, but should it be logged?
-			GenericActivator.trace("deactivate() method cannot be called", m_componentMetadata);
+			Activator.trace("deactivate() method cannot be called", m_componentMetadata);
 		}
 		catch(InvocationTargetException ex) {
 			// TODO: 112.5.12 If the deactivate method throws an exception, SCR must log an error message
 			// containing the exception with the Log Service
-			GenericActivator.exception("The deactivate method has thrown and exception", m_componentMetadata, ex);
+			Activator.exception("The deactivate method has thrown and exception", m_componentMetadata, ex);
 		}
 
         // 2. Unbind any bound services
@@ -340,7 +340,7 @@
         m_componentContext = null;
         m_delayedComponentServiceFactory = null;
 
-        //GenericActivator.trace("InstanceManager from bundle ["+ m_activator.getBundleContext().getBundle().getBundleId() + "] was invalidated.");
+        //Activator.trace("InstanceManager from bundle ["+ m_activator.getBundleContext().getBundle().getBundleId() + "] was invalidated.");
 
         if (m_state != INSTANCE_DESTROYING)
         {
@@ -353,7 +353,7 @@
      */
     public synchronized void dispose()
     {
-        // CONCURRENCY NOTE: This method is only called from the GenericActivator or by application logic
+        // CONCURRENCY NOTE: This method is only called from the BundleComponentActivator or by application logic
     	// but not by the dependency managers
 
         // Theoretically this should never be in any state other than VALID or INVALID,
@@ -411,7 +411,7 @@
      * sets the state of the manager
     **/
     private synchronized void setState(int newState) {
-    	GenericActivator.trace("State transition : "+m_states[m_state]+" -> "+m_states[newState], m_componentMetadata);
+        Activator.trace("State transition : "+m_states[m_state]+" -> "+m_states[newState], m_componentMetadata);
     	
         m_state = newState;
         
@@ -497,7 +497,7 @@
                     if(retval == false && (max == 1))
                     {
                         // There was an exception when calling the bind method
-                        GenericActivator.error("Dependency Manager: Possible exception in the bind method during initialize()");
+                        Activator.error("Dependency Manager: Possible exception in the bind method during initialize()");
                         m_isValid = false;
                         //setStateDependency(DependencyChangeEvent.DEPENDENCY_INVALID);
                         return m_isValid;
@@ -563,7 +563,7 @@
             }
             catch (Exception e)
             {
-                GenericActivator.error("DependencyManager: exception while getting references :"+e);
+                Activator.error("DependencyManager: exception while getting references :"+e);
                 return null;
             }
         }
@@ -649,9 +649,8 @@
                     }
             	} 
             	catch(ClassNotFoundException ex2) {
-            		GenericActivator.exception("Cannot load class used as parameter "+parameterClassName,m_componentMetadata,ex2);
+            		Activator.exception("Cannot load class used as parameter "+parameterClassName,m_componentMetadata,ex2);
             	}
-
             }
                         
             return method;
@@ -678,7 +677,7 @@
 		            	// 112.3.1 If the method is not found , SCR must log an error
 		            	// message with the log service, if present, and ignore the method
 		            	// TODO: log error message
-		            	GenericActivator.trace("bind() method not found", m_componentMetadata);
+		                Activator.trace("bind() method not found", m_componentMetadata);
 		            	return false;
 		            }
 		            
@@ -709,7 +708,7 @@
 		        }
 		        catch(InvocationTargetException ex)
 		        {
-		        	GenericActivator.exception("DependencyManager : exception while invoking "+m_dependencyMetadata.getBind()+"()", m_componentMetadata, ex);
+		        	Activator.exception("DependencyManager : exception while invoking "+m_dependencyMetadata.getBind()+"()", m_componentMetadata, ex);
 		            return false;
 		        }
         	} else if( m_implementationObject == null && m_componentMetadata.isImmediate() == false) {
@@ -739,7 +738,7 @@
 	            try
 	            {
 	            	// TODO: me quede aqui por que el unbind method no funciona
-	            	GenericActivator.trace("getting unbind: "+m_dependencyMetadata.getUnbind(), m_componentMetadata);
+	                Activator.trace("getting unbind: "+m_dependencyMetadata.getUnbind(), m_componentMetadata);
 	            	Method unbindMethod = getBindingMethod(m_dependencyMetadata.getUnbind(), getInstance().getClass(), m_dependencyMetadata.getInterface());
 	            	
 		        	// Recover the object that is bound from the map.
@@ -756,7 +755,7 @@
 	                	// 112.3.1 If the method is not found , SCR must log an error
 	                	// message with the log service, if present, and ignore the method
 	                	// TODO: log error message
-	                	GenericActivator.trace("unbind() method not found", m_componentMetadata);
+	            	    Activator.trace("unbind() method not found", m_componentMetadata);
 	                	return false;
 	                }
 	
@@ -775,7 +774,7 @@
 	            	return false;
 	            }
 	            catch (InvocationTargetException ex) {
-	            	GenericActivator.exception("DependencyManager : exception while invoking "+m_dependencyMetadata.getUnbind()+"()", m_componentMetadata, ex);
+	                Activator.exception("DependencyManager : exception while invoking "+m_dependencyMetadata.getUnbind()+"()", m_componentMetadata, ex);
 	            	return false;
 	            }
 	            
@@ -829,14 +828,14 @@
                             //setStateDependency(DependencyChangeEvent.DEPENDENCY_INVALID);
                             try
                             {
-                                GenericActivator.trace("Dependency Manager: Static dependency is broken", m_componentMetadata);
+                                Activator.trace("Dependency Manager: Static dependency is broken", m_componentMetadata);
                                 deactivate();
-                                GenericActivator.trace("Dependency Manager: RECREATING", m_componentMetadata);
+                                Activator.trace("Dependency Manager: RECREATING", m_componentMetadata);
                                 activate();
                             }
                             catch(Exception ex)
                             {
-                            	GenericActivator.exception("Exception while recreating dependency ",m_componentMetadata, ex);
+                                Activator.exception("Exception while recreating dependency ",m_componentMetadata, ex);
                             }
                         }
                         // dynamic dependency
@@ -859,9 +858,9 @@
                                 {
                                     if (!m_dependencyMetadata.isOptional())
                                     {
-                                        GenericActivator.trace("Dependency Manager: Mandatory dependency not fullfilled and no replacements available... unregistering service...", m_componentMetadata);
+                                        Activator.trace("Dependency Manager: Mandatory dependency not fullfilled and no replacements available... unregistering service...", m_componentMetadata);
                                         deactivate();
-                                        GenericActivator.trace("Dependency Manager: Recreating", m_componentMetadata);
+                                        Activator.trace("Dependency Manager: Recreating", m_componentMetadata);
                                         activate();
                                     }
                                 }
@@ -875,7 +874,7 @@
                     if (m_boundServicesRefs.contains(evt.getServiceReference()) == true)
                     {
                         // This is a duplicate
-                        GenericActivator.trace("DependencyManager : ignoring REGISTERED ServiceEvent (already bound)", m_componentMetadata);
+                        Activator.trace("DependencyManager : ignoring REGISTERED ServiceEvent (already bound)", m_componentMetadata);
                     }
                     else
                     {
@@ -1037,14 +1036,12 @@
     		return ComponentManagerImpl.this;
     	}
 
-    	public void enableComponent(String arg0) {
-    		// TODO implement this method
-    		
+    	public void enableComponent(String name) {
+    	    m_activator.enableComponent(name);
     	}
 
-    	public void disableComponent(String arg0) {
-    		// TODO implement this method
-    		
+    	public void disableComponent(String name) {
+    	    m_activator.disableComponent(name);
     	}
 
     	public ServiceReference getServiceReference() {
@@ -1065,7 +1062,7 @@
     	
     	public Object getService(Bundle arg0, ServiceRegistration arg1) {
     		
-    		GenericActivator.trace("DelayedComponentServiceFactory.getService()", m_componentMetadata);
+    	    Activator.trace("DelayedComponentServiceFactory.getService()", m_componentMetadata);
     		// When the getServiceMethod is called, the implementation object must be created
     		
             // 1. Load the component implementation class
@@ -1084,7 +1081,7 @@
 	        catch (Exception ex)
 	        {
 	            // TODO: manage this exception when implementation object cannot be created
-	            GenericActivator.exception("Error during instantiation of the implementation object",m_componentMetadata,ex);
+	            Activator.exception("Error during instantiation of the implementation object",m_componentMetadata,ex);
 	            deactivate();
 	            //invalidate();
 	            return null;
@@ -1112,16 +1109,16 @@
         	}
         	catch(NoSuchMethodException ex) {
                 // We can safely ignore this one
-                GenericActivator.trace("activate() method is not implemented", m_componentMetadata);
+                Activator.trace("activate() method is not implemented", m_componentMetadata);
             }
             catch(IllegalAccessException ex) {
                 // Ignored, but should it be logged?
-                GenericActivator.trace("activate() method cannot be called", m_componentMetadata);
+                Activator.trace("activate() method cannot be called", m_componentMetadata);
             }
             catch(InvocationTargetException ex) {
                 // TODO: 112.5.8 If the activate method throws an exception, SCR must log an error message
                 // containing the exception with the Log Service
-                GenericActivator.exception("The activate method has thrown and exception", m_componentMetadata, ex);
+                Activator.exception("The activate method has thrown and exception", m_componentMetadata, ex);
             }
     		
     		return m_implementationObject;
@@ -1129,7 +1126,6 @@
 
     	public void ungetService(Bundle arg0, ServiceRegistration arg1, Object arg2) {
     		// TODO Auto-generated method stub
-
     	}
     }
 
diff --git a/scr/src/main/java/org/apache/felix/scr/ManagerFactory.java b/scr/src/main/java/org/apache/felix/scr/ManagerFactory.java
index 6ca71b6..fb899c5 100644
--- a/scr/src/main/java/org/apache/felix/scr/ManagerFactory.java
+++ b/scr/src/main/java/org/apache/felix/scr/ManagerFactory.java
@@ -23,8 +23,8 @@
  */

 public class ManagerFactory {

 	

-	static ComponentManager createManager(GenericActivator activator, ComponentMetadata metadata) {

-		GenericActivator.trace("ManagerFactory.createManager", metadata);

-		return new ComponentManagerImpl(activator,metadata);

+	static ComponentManager createManager(BundleComponentActivator activator, ComponentMetadata metadata) {

+	    Activator.trace("ManagerFactory.createManager", metadata);

+	    return new ComponentManagerImpl(activator,metadata);

 	}

-}

+}
\ No newline at end of file