Applied patch (FELIX-482) to use logger instead of System.err.


git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@681469 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/bundlerepository/pom.xml b/bundlerepository/pom.xml
index d71410e..0ed8cb7 100644
--- a/bundlerepository/pom.xml
+++ b/bundlerepository/pom.xml
@@ -45,6 +45,12 @@
       <artifactId>kxml2</artifactId>
       <version>2.2.2</version>
     </dependency>
+    <dependency>
+        <groupId>${pom.groupId}</groupId>
+        <artifactId>org.osgi.compendium</artifactId>
+        <version>1.1.0-SNAPSHOT</version>
+        <optional>true</optional>
+    </dependency>
   </dependencies>
   <build>
     <plugins>
@@ -57,7 +63,7 @@
           <instructions>
             <Export-Package>org.osgi.service.obr</Export-Package>
             <Private-Package>org.kxml2.*,org.xmlpull.*;-split-package:=merge-first,org.apache.felix.bundlerepository.*</Private-Package>
-            <Import-Package>!javax.xml.parsers,!org.xml.sax,*</Import-Package>
+            <Import-Package>!javax.xml.parsers,!org.xml.sax,org.osgi.service.log; version="1.3.0"; resolution:=optional,*</Import-Package>
             <DynamicImport-Package>org.apache.felix.shell</DynamicImport-Package>
             <Bundle-Activator>${pom.artifactId}.Activator</Bundle-Activator>
             <Bundle-DocURL>http://oscar-osgi.sf.net/obr2/${pom.artifactId}/</Bundle-DocURL>
diff --git a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/Activator.java b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/Activator.java
index 086f4f1..befe74a 100644
--- a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/Activator.java
+++ b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/Activator.java
@@ -32,7 +32,7 @@
         m_context = context;
 
         // Register bundle repository service.
-        m_repoAdmin = new RepositoryAdminImpl(m_context);
+        m_repoAdmin = new RepositoryAdminImpl(m_context, new Logger(m_context));
         context.registerService(
             RepositoryAdmin.class.getName(),
             m_repoAdmin, null);
diff --git a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/LocalRepositoryImpl.java b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/LocalRepositoryImpl.java
index 3dc348b..914af73 100644
--- a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/LocalRepositoryImpl.java
+++ b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/LocalRepositoryImpl.java
@@ -28,14 +28,16 @@
 public class LocalRepositoryImpl implements Repository
 {
     private BundleContext m_context = null;
+    private final Logger m_logger;
     private long m_currentTimeStamp = 0;
     private long m_snapshotTimeStamp = 0;
     private List m_localResourceList = new ArrayList();
     private BundleListener m_bundleListener = null;
 
-    public LocalRepositoryImpl(BundleContext context)
+    public LocalRepositoryImpl(BundleContext context, Logger logger)
     {
         m_context = context;
+        m_logger = logger;
         initialize();
     }
 
@@ -100,13 +102,13 @@
         {
             try
             {
-                m_localResourceList.add(new LocalResourceImpl(bundles[i]));
+                m_localResourceList.add(new LocalResourceImpl(bundles[i], m_logger));
             }
             catch (InvalidSyntaxException ex)
             {
                 // This should never happen since we are generating filters,
                 // but ignore the resource if it does occur.
-                System.err.println(ex);
+                m_logger.log(Logger.LOG_WARNING, ex.getMessage(), ex);
             }
         }
     }
@@ -115,12 +117,12 @@
     {
         private Bundle m_bundle = null;
 
-        LocalResourceImpl(Bundle bundle) throws InvalidSyntaxException
+        LocalResourceImpl(Bundle bundle, Logger logger) throws InvalidSyntaxException
         {
-            this(null, bundle);
+            this(null, bundle, logger);
         }
 
-        LocalResourceImpl(ResourceImpl resource, Bundle bundle)
+        LocalResourceImpl(ResourceImpl resource, Bundle bundle, Logger logger)
             throws InvalidSyntaxException
         {
             super(resource);
diff --git a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/Logger.java b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/Logger.java
new file mode 100644
index 0000000..b40630d
--- /dev/null
+++ b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/Logger.java
@@ -0,0 +1,147 @@
+/*
+ * 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.bundlerepository;
+
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.log.LogService;
+
+import java.io.PrintStream;
+
+/**
+ * Internal logger to be used in order to avoid a manatory dependency on OSGi LogService.
+ * It first tries to log to a log service implementation if there is one available and then fallback to System out/err
+ * in case there is no log service available.
+ * <p/>
+ * As OBR implementation (this bundle) logs only errors the strategy is to lookup the log service on each log call.
+ * This can prove as not efficient on a more intensive ussage as for example debug logging, case when a
+ * ServiceListener or ServiceTracker can be used.
+ */
+public class Logger
+{
+    public static final int LOG_ERROR = 1;
+    public static final int LOG_WARNING = 2;
+    public static final int LOG_INFO = 3;
+    public static final int LOG_DEBUG = 4;
+
+    /**
+     * Bundle context.
+     */
+    private final BundleContext m_context;
+    private boolean m_isLogClassPresent;
+
+    /**
+     * Constructor.
+     *
+     * @param bundleContext bundle context
+     */
+    Logger(BundleContext context)
+    {
+        m_context = context;
+        try
+        {
+            org.osgi.service.log.LogService.class.getName();
+            m_isLogClassPresent = true;
+        }
+        catch (NoClassDefFoundError ex)
+        {
+            m_isLogClassPresent = false;
+        }
+    }
+
+    /**
+     * @see LogService#log(int, String)
+     */
+    public void log(int level, String message)
+    {
+        log(level, message, null);
+    }
+
+    /**
+     * @see LogService#log(int, String, Throwable)
+     */
+    public void log(int level, String message, Throwable exception)
+    {
+        if (!m_isLogClassPresent || !_log(level, message, exception))
+        {
+            final PrintStream stream = getStream(level);
+            stream.println(message);
+            if (exception != null)
+            {
+                exception.printStackTrace(stream);
+            }
+
+        }
+    }
+
+    /**
+     * Lookup the OSGi LogService and if available use it.
+     */
+    private boolean _log(int level, String message, Throwable exception)
+    {
+        try
+        {
+            ServiceReference reference = null;
+            reference = m_context.getServiceReference(LogService.class.getName());
+            if (reference != null)
+            {
+                final LogService logService = (LogService) m_context.getService(reference);
+                if (logService != null)
+                {
+                    logService.log(level, message, exception);
+                    m_context.ungetService(reference);
+                    return true;
+                }
+            }
+        }
+        catch (NoClassDefFoundError e)
+        {
+            //ignore
+        }
+        return false;
+    }
+
+    /**
+     * Return the standard print streams to use depending on log level.
+     *
+     * @param level log level
+     * @return print stream corresponding to log level
+     */
+    private PrintStream getStream(int level)
+    {
+        switch (level)
+        {
+            case LOG_ERROR:
+                System.err.print("ERROR: ");
+                return System.err;
+            case LOG_WARNING:
+                System.err.print("WARNING: ");
+                return System.err;
+            case LOG_INFO:
+                System.out.print("INFO: ");
+                return System.out;
+            case LOG_DEBUG:
+                System.out.print("DEBUG: ");
+                return System.out;
+            default:
+                System.out.print("UNKNOWN: ");
+                return System.out;
+        }
+    }
+}
\ No newline at end of file
diff --git a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/RepositoryAdminImpl.java b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/RepositoryAdminImpl.java
index 9d8151c..f2afd67 100644
--- a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/RepositoryAdminImpl.java
+++ b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/RepositoryAdminImpl.java
@@ -39,6 +39,7 @@
 public class RepositoryAdminImpl implements RepositoryAdmin
 {
     static BundleContext m_context = null;
+    private final Logger m_logger;
     private List m_urlList = new ArrayList();
     private Map m_repoMap = new HashMap();
     private boolean m_initialized = false;
@@ -50,9 +51,10 @@
     public static final String REPOSITORY_URL_PROP = "obr.repository.url";
     public static final String EXTERN_REPOSITORY_TAG = "extern-repositories";
 
-    public RepositoryAdminImpl(BundleContext context)
+    public RepositoryAdminImpl(BundleContext context, Logger logger)
     {
         m_context = context;
+        m_logger = logger;
     }
 
     public Repository addRepository(URL url) throws Exception
@@ -70,7 +72,7 @@
         // If the repository URL is a duplicate, then we will just
         // replace the existing repository object with a new one,
         // which is effectively the same as refreshing the repository.
-        Repository repo = new RepositoryImpl(this, url, hopCount);
+        Repository repo = new RepositoryImpl(this, url, hopCount, m_logger);
         m_repoMap.put(url, repo);
         return repo;
     }
@@ -103,7 +105,7 @@
             initialize();
         }
 
-        return new ResolverImpl(m_context, this);
+        return new ResolverImpl(m_context, this, m_logger);
     }
 
     public synchronized Resource[] discoverResources(String filterExpr)
@@ -120,7 +122,10 @@
         }
         catch (InvalidSyntaxException ex)
         {
-            System.err.println(ex);
+            m_logger.log(
+                Logger.LOG_WARNING,
+                "Error while discovering resources for " + filterExpr,
+                ex);
             return new Resource[0];
         }
 
@@ -163,13 +168,17 @@
                 {
                     while (st.hasMoreTokens())
                     {
+                        final String token = st.nextToken();
                         try
                         {
-                            m_urlList.add(new URL(st.nextToken()));
+                            m_urlList.add(new URL(token));
                         }
                         catch (MalformedURLException ex)
                         {
-                            System.err.println("RepositoryAdminImpl: " + ex);
+                            m_logger.log(
+                                Logger.LOG_WARNING,
+                                "Repository url " + token + " cannot be used. Skipped.",
+                                ex);
                         }
                     }
                 }
@@ -184,7 +193,10 @@
                 }
                 catch (MalformedURLException ex)
                 {
-                    System.err.println("RepositoryAdminImpl: " + ex);
+                    m_logger.log(
+                        Logger.LOG_WARNING,
+                        "Default repository url " + DEFAULT_REPOSITORY_URL + " cannot be used. Skipped.",
+                        ex);
                 }
             }
         }
@@ -196,7 +208,7 @@
             URL url = (URL) m_urlList.get(i);
             try
             {
-                Repository repo = new RepositoryImpl(this, url);
+                Repository repo = new RepositoryImpl(this, url, m_logger);
                 if (repo != null)
                 {
                     m_repoMap.put(url, repo);
@@ -204,8 +216,11 @@
             }
             catch (Exception ex)
             {
-                System.err.println("RepositoryAdminImpl: Exception creating repository - " + ex);
-                System.err.println("RepositoryAdminImpl: Ignoring repository " + url);
+                m_logger.log(
+                    Logger.LOG_WARNING,
+                    "RepositoryAdminImpl: Exception creating repository " + url.toExternalForm()
+                        + ". Repository is skipped.",
+                    ex);
             }
         }
     }
diff --git a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/RepositoryImpl.java b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/RepositoryImpl.java
index 1c01ef7..0e36537 100644
--- a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/RepositoryImpl.java
+++ b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/RepositoryImpl.java
@@ -46,6 +46,7 @@
     private String m_name = null;
     private long m_lastmodified = 0;
     private URL m_url = null;
+    private final Logger m_logger;
     private Resource[] m_resources = null;
     private Referral[] m_referrals = null;
     private RepositoryAdminImpl m_repoAdmin = null;
@@ -53,15 +54,18 @@
     // Reusable comparator for sorting resources by name.
     private ResourceComparator m_nameComparator = new ResourceComparator();
 
-    public RepositoryImpl(RepositoryAdminImpl repoAdmin, URL url) throws Exception
+    public RepositoryImpl(RepositoryAdminImpl repoAdmin, URL url, Logger logger)
+        throws Exception
     {
-        this(repoAdmin, url, Integer.MAX_VALUE);
+        this(repoAdmin, url, Integer.MAX_VALUE, logger);
     }
 
-    public RepositoryImpl(RepositoryAdminImpl repoAdmin, URL url, final int hopCount) throws Exception
+    public RepositoryImpl(RepositoryAdminImpl repoAdmin, URL url, final int hopCount, Logger logger)
+        throws Exception
     {
         m_repoAdmin = repoAdmin;
         m_url = url;
+        m_logger = logger;
         try
         {
             AccessController.doPrivileged(new PrivilegedExceptionAction()
@@ -219,7 +223,7 @@
             if (is != null)
             {
                 // Create the parser Kxml
-                XmlCommonHandler handler = new XmlCommonHandler();
+                XmlCommonHandler handler = new XmlCommonHandler(m_logger);
                 Object factory = new Object()
                 {
                     public RepositoryImpl newInstance()
diff --git a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/ResolverImpl.java b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/ResolverImpl.java
index 5f30718..972c146 100644
--- a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/ResolverImpl.java
+++ b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/ResolverImpl.java
@@ -29,6 +29,7 @@
 {
     private BundleContext m_context = null;
     private RepositoryAdmin m_admin = null;
+    private final Logger m_logger;
     private LocalRepositoryImpl m_local = null;
     private Set m_addedSet = new HashSet();
     private Set m_resolveSet = new HashSet();
@@ -38,10 +39,11 @@
     private Map m_unsatisfiedMap = new HashMap();
     private boolean m_resolved = false;
 
-    public ResolverImpl(BundleContext context, RepositoryAdmin admin)
+    public ResolverImpl(BundleContext context, RepositoryAdmin admin, Logger logger)
     {
         m_context = context;
         m_admin = admin;
+        m_logger = logger;
     }
 
     public synchronized void add(Resource resource)
@@ -116,7 +118,7 @@
         {
             m_local.dispose();
         }
-        m_local = new LocalRepositoryImpl(m_context);
+        m_local = new LocalRepositoryImpl(m_context, m_logger);
 
         // Reset instance values.
         m_resolveSet.clear();
@@ -423,8 +425,7 @@
         // Must resolve if not already resolved.
         if (!m_resolved && !resolve())
         {
-            // TODO: OBR - Use logger if possible.
-            System.err.println("Resolver: Cannot resolve target resources.");
+            m_logger.log(Logger.LOG_ERROR, "Resolver: Cannot resolve target resources.");
             return;
         }
 
@@ -495,9 +496,10 @@
                     }
                     catch (Exception ex)
                     {
-                        // TODO: OBR - Use logger if possible.
-                        System.err.println("Resolver: Update error - " + Util.getBundleName(localResource.getBundle()));
-                        ex.printStackTrace(System.err);
+                        m_logger.log(
+                            Logger.LOG_ERROR,
+                            "Resolver: Update error - " + Util.getBundleName(localResource.getBundle()),
+                            ex);
                         return;
                     }
                 }
@@ -530,10 +532,10 @@
                 }
                 catch (Exception ex)
                 {
-                    // TODO: OBR - Use logger if possible.
-                    System.err.println("Resolver: Install error - "
-                        + deployResources[i].getSymbolicName());
-                    ex.printStackTrace(System.err);
+                    m_logger.log(
+                        Logger.LOG_ERROR,
+                        "Resolver: Install error - " + deployResources[i].getSymbolicName(), 
+                        ex);
                     return;
                 }
             }
@@ -547,8 +549,10 @@
             }
             catch (BundleException ex)
             {
-                // TODO: OBR - Use logger if possible.
-                System.err.println("Resolver: Start error - " + ex);
+                m_logger.log(
+                    Logger.LOG_ERROR,
+                    "Resolver: Start error - " + ((Bundle) startList.get(i)).getSymbolicName(),
+                    ex);
             }
         }
     }
@@ -685,9 +689,8 @@
                     }
                 }
             }
-            return (Requirement[])
-                reqList.toArray(new Requirement[reqList.size()]);
+            return (Requirement[]) reqList.toArray(new Requirement[reqList.size()]);
         }
         return null;
     }
-}
+}
\ No newline at end of file
diff --git a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/metadataparser/KXml2MetadataHandler.java b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/metadataparser/KXml2MetadataHandler.java
index e250550..b6e55eb 100644
--- a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/metadataparser/KXml2MetadataHandler.java
+++ b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/metadataparser/KXml2MetadataHandler.java
@@ -21,6 +21,7 @@
 import java.io.*;
 
 import org.apache.felix.bundlerepository.metadataparser.kxmlsax.KXml2SAXParser;
+import org.apache.felix.bundlerepository.Logger;
 
 /**
  * handles the metadata in XML format
@@ -28,7 +29,9 @@
  */
 public class KXml2MetadataHandler extends MetadataHandler {
 
-	public KXml2MetadataHandler() {}
+	public KXml2MetadataHandler(Logger logger) {
+        super(logger);
+    }
 
 	/**
 	* Called to parse the InputStream and set bundle list and package hash map
@@ -39,4 +42,4 @@
 		parser = new KXml2SAXParser(br);
 		parser.parseXML(handler);
 	}
-}
+}
\ No newline at end of file
diff --git a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/metadataparser/MetadataHandler.java b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/metadataparser/MetadataHandler.java
index afe7c34..b0ea621 100644
--- a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/metadataparser/MetadataHandler.java
+++ b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/metadataparser/MetadataHandler.java
@@ -18,6 +18,8 @@
  */
 package org.apache.felix.bundlerepository.metadataparser;
 
+import org.apache.felix.bundlerepository.Logger;
+
 import java.io.InputStream;
 import java.lang.reflect.Method;
 
@@ -29,8 +31,8 @@
 	 * constructor 
 	 *
 	 */
-	public MetadataHandler() {
-		handler = new XmlCommonHandler();
+	public MetadataHandler(Logger logger) {
+		handler = new XmlCommonHandler(logger);
 	}
 
 	/**
@@ -133,4 +135,4 @@
 	public final void setTrace(boolean trace) {
 		handler.setTrace(trace);
 	}
-}
+}
\ No newline at end of file
diff --git a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/metadataparser/XmlCommonHandler.java b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/metadataparser/XmlCommonHandler.java
index 393dbce..5257ee7 100644
--- a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/metadataparser/XmlCommonHandler.java
+++ b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/metadataparser/XmlCommonHandler.java
@@ -23,6 +23,7 @@
 import java.util.*;
 
 import org.apache.felix.bundlerepository.metadataparser.kxmlsax.KXml2SAXHandler;
+import org.apache.felix.bundlerepository.Logger;
 import org.xml.sax.SAXException;
 
 
@@ -64,8 +65,9 @@
 	private StringBuffer currentText;
 
 	private Map context;
+    private final Logger m_logger;
 
-	private class XmlStackElement {
+    private class XmlStackElement {
 		
 		public final String qname;
 		public Object object;
@@ -151,8 +153,9 @@
 		}
 	}
 	
-	public XmlCommonHandler() {
-		elementStack = new Stack();
+	public XmlCommonHandler(Logger logger) {
+        m_logger = logger;
+        elementStack = new Stack();
 		pis = new HashMap();
 		missingPIExceptionFlag = false;
 		types = new HashMap();
@@ -269,7 +272,7 @@
 			try {
 				method.invoke(object, new Object[] { context });
 			} catch (InvocationTargetException e) {
-				e.getTargetException().printStackTrace(System.err);
+                m_logger.log(Logger.LOG_ERROR, "Error parsing repository metadata", e.getTargetException());
 				throw e;
 			}
 		}
@@ -293,7 +296,7 @@
 			try {
 				method.invoke(object, null);
 			} catch (InvocationTargetException e) {
-				// e.getTargetException().printStackTrace(System.err);
+				// m_logger.log(Logger.LOG_ERROR, "Error parsing repository metadata", e.getTargetException());
 				throw e.getTargetException();
 			}
 
@@ -319,7 +322,7 @@
 			try {
 				method.invoke(object, new Object[] { parent });
 			} catch (InvocationTargetException e) {
-				e.getTargetException().printStackTrace(System.err);
+				m_logger.log(Logger.LOG_ERROR, "Error parsing repository metadata", e.getTargetException());
 				throw e;
 			}
 		}
@@ -352,9 +355,9 @@
 			try {
 				// enables to access to "unmuttable" method
 				type.newInstanceMethod.setAccessible(true);
-				obj = type.newInstanceMethod.invoke(type.instanceFactory, null);
-			} catch (Exception e) {
-				// do nothing
+                obj = type.newInstanceMethod.invoke(type.instanceFactory, null);
+			} catch (InvocationTargetException e) {
+				m_logger.log(Logger.LOG_ERROR, "Error parsing repository metadata", e.getTargetException());
 			}
 
 			// set parent
@@ -409,7 +412,7 @@
 					try {
 						method.invoke(obj, new String[] { value });
 					} catch (InvocationTargetException e) {
-						e.getTargetException().printStackTrace(System.err);
+						m_logger.log(Logger.LOG_ERROR, "Error parsing repository metadata", e.getTargetException());
 						throw e;
 					}
 				} else {
@@ -513,7 +516,7 @@
 				try {
 					method.invoke(element.object, new String[] { currentStr });
 				} catch (InvocationTargetException e) {
-					e.getTargetException().printStackTrace(System.err);
+					m_logger.log(Logger.LOG_ERROR, "Error parsing repository metadata", e.getTargetException());
 					throw e;
 				}
 			} else {
@@ -593,7 +596,7 @@
                     method.setAccessible(true);
 					method.invoke(parent.object, new Object[] { element.object });
 				} catch (InvocationTargetException e) {
-					e.getTargetException().printStackTrace(System.err);
+					m_logger.log(Logger.LOG_ERROR, "Error parsing repository metadata", e.getTargetException());
 					throw e;
 				}
 			} else {
@@ -628,7 +631,7 @@
 		try {
 			invokeProcess(element);
 		} catch (Throwable e) {
-			e.printStackTrace();
+			m_logger.log(Logger.LOG_ERROR, "Error parsing repository metadata", e);
 			throw new Exception(e);
 		}
 
@@ -643,7 +646,7 @@
 
 	private void trace(String msg) {
 		if (traceFlag)
-			System.err.println(msg);
+			m_logger.log(Logger.LOG_DEBUG, msg);
 	}
 
 	/**
@@ -746,7 +749,7 @@
 				try {
 					method.invoke(object, new String[] { value });
 				} catch (InvocationTargetException e) {
-					e.getTargetException().printStackTrace(System.err);
+					m_logger.log(Logger.LOG_ERROR, "Error parsing repository metadata", e.getTargetException());
 					throw e;
 				}
 			}
@@ -757,7 +760,7 @@
 		try {
 			invokeProcess(object);
 		} catch (Throwable e) {
-			e.printStackTrace();
+			m_logger.log(Logger.LOG_ERROR, "Error parsing repository metadata", e);
 			throw new Exception(e);
 		}
 */	}
diff --git a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/metadataparser/XmlMetadataHandler.java b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/metadataparser/XmlMetadataHandler.java
index 7045003..6cc5531 100644
--- a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/metadataparser/XmlMetadataHandler.java
+++ b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/metadataparser/XmlMetadataHandler.java
@@ -24,14 +24,16 @@
 import javax.xml.parsers.*;
 
 import org.xml.sax.*;
+import org.apache.felix.bundlerepository.Logger;
 
 /**
  * handles the metadata in XML format
  */
 public class XmlMetadataHandler extends MetadataHandler {
 
-	public XmlMetadataHandler() {
-	}
+	public XmlMetadataHandler(Logger logger) {
+        super(logger);
+    }
 	
 	/**
 	* Called to parse the InputStream and set bundle list and package hash map
diff --git a/bundlerepository/src/test/java/org/apache/felix/bundlerepository/RepositoryImplTest.java b/bundlerepository/src/test/java/org/apache/felix/bundlerepository/RepositoryImplTest.java
index 367ff68..b4cf628 100644
--- a/bundlerepository/src/test/java/org/apache/felix/bundlerepository/RepositoryImplTest.java
+++ b/bundlerepository/src/test/java/org/apache/felix/bundlerepository/RepositoryImplTest.java
@@ -38,10 +38,8 @@
 
 public class RepositoryImplTest extends TestCase
 {
-
     public void testReferral1() throws Exception
     {
-
         URL url = getClass().getResource("/referral1_repository.xml");
 
         RepositoryAdminImpl repoAdmin = createRepositoryAdmin();
@@ -71,7 +69,6 @@
 
     public void testReferral2() throws Exception
     {
-
         URL url = getClass().getResource("/referral1_repository.xml");
 
         RepositoryAdminImpl repoAdmin = createRepositoryAdmin();
@@ -97,7 +94,8 @@
 
     private RepositoryAdminImpl createRepositoryAdmin()
     {
-        RepositoryAdminImpl repoAdmin = new RepositoryAdminImpl(new MockBundleContext());
+        final MockBundleContext bundleContext = new MockBundleContext();
+        RepositoryAdminImpl repoAdmin = new RepositoryAdminImpl(bundleContext, new Logger(bundleContext));
 
         // force initialization && remove all initial repositories
         Repository[] repos = repoAdmin.listRepositories();
@@ -111,7 +109,6 @@
 
     private static class MockBundleContext implements BundleContext
     {
-
         public void addBundleListener(BundleListener arg0)
         {
         }
@@ -241,4 +238,4 @@
             return false;
         }
     }
-}
+}
\ No newline at end of file