FELIX-1186 Refactor log messages to use the new deferred log message
construction wherever parametrized logging is used

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@830907 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/BundleComponentActivator.java b/scr/src/main/java/org/apache/felix/scr/impl/BundleComponentActivator.java
index f5f60e1..f10f65a 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/BundleComponentActivator.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/BundleComponentActivator.java
@@ -135,8 +135,8 @@
             {
                 // 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.
-                log( LogService.LOG_ERROR, "Component descriptor entry '" + descriptorLocation + "' not found", null,
-                    null );
+                log( LogService.LOG_ERROR, "Component descriptor entry ''{0}'' not found", new Object[]
+                    { descriptorLocation }, null, null );
                 continue;
             }
 
@@ -268,11 +268,13 @@
             // 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.
 
-            log( LogService.LOG_ERROR, "Problem reading descriptor entry '" + descriptorLocation + "'", null, ex );
+            log( LogService.LOG_ERROR, "Problem reading descriptor entry ''{0}''", new Object[]
+                { descriptorLocation }, null, ex );
         }
         catch ( Exception ex )
         {
-            log( LogService.LOG_ERROR, "General problem with descriptor entry '" + descriptorLocation + "'", null, ex );
+            log( LogService.LOG_ERROR, "General problem with descriptor entry ''{0}''", new Object[]
+                { descriptorLocation }, null, ex );
         }
         finally
         {
@@ -304,8 +306,8 @@
         // mark instance inactive (no more component activations)
         m_active = false;
 
-        log( LogService.LOG_DEBUG, "BundleComponentActivator : Bundle [" + m_context.getBundle().getBundleId()
-            + "] will destroy " + m_managers.size() + " instances", null, null );
+        log( LogService.LOG_DEBUG, "BundleComponentActivator : Bundle [{0}] will destroy {1} instances", new Object[]
+            { new Long( m_context.getBundle().getBundleId() ), new Integer( m_managers.size() ) }, null, null );
 
         while ( m_managers.size() != 0 )
         {
@@ -327,8 +329,8 @@
 
         }
 
-        log( LogService.LOG_DEBUG, "BundleComponentActivator : Bundle [" + m_context.getBundle().getBundleId()
-            + "] STOPPED", null, null );
+        log( LogService.LOG_DEBUG, "BundleComponentActivator : Bundle [{0}] STOPPED", new Object[]
+            { new Long( m_context.getBundle().getBundleId() ) }, null, null );
 
         m_context = null;
     }
@@ -513,7 +515,8 @@
         }
         else
         {
-            log( LogService.LOG_INFO, "BundleComponentActivator is not active; not scheduling " + task, null, null );
+            log( LogService.LOG_INFO, "BundleComponentActivator is not active; not scheduling {0}", new Object[]
+                { task }, null, null );
         }
     }
 
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/helper/BaseMethod.java b/scr/src/main/java/org/apache/felix/scr/impl/helper/BaseMethod.java
index 0c5c508..fcf2d39 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/helper/BaseMethod.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/helper/BaseMethod.java
@@ -121,8 +121,8 @@
         else
         {
             // optional method not found, log as DEBUG and ignore
-            getComponentManager().log( LogService.LOG_DEBUG,
-                getMethodNamePrefix() + " method [" + getMethodName() + "] not found, ignoring", null );
+            getComponentManager().log( LogService.LOG_DEBUG, "{0} method [{1}] not found, ignoring", new Object[]
+                { getMethodNamePrefix(), getMethodName() }, null );
             m_state = NotApplicable.INSTANCE;
         }
     }
@@ -174,8 +174,8 @@
             {
                 // log and return null
                 getComponentManager().log( LogService.LOG_ERROR,
-                    "DependencyManager : Suitable but non-accessible method found in class " + targetClass.getName(),
-                    null );
+                    "DependencyManager : Suitable but non-accessible method found in class {0}", new Object[]
+                        { targetClass.getName() }, null );
                 break;
             }
 
@@ -222,21 +222,22 @@
             // 112.3.1 If the method is not is not declared protected or
             // public, SCR must log an error message with the log service,
             // if present, and ignore the method
-            getComponentManager().log( LogService.LOG_DEBUG, "Method " + getMethodName() + " cannot be called", ex );
+            getComponentManager().log( LogService.LOG_DEBUG, "Method {0} cannot be called", new Object[]
+                { getMethodName() }, ex );
         }
         catch ( InvocationTargetException ex )
         {
             // 112.5.7 If a bind method throws an exception, SCR must log an
             // error message containing the exception [...]
-            getComponentManager().log( LogService.LOG_ERROR,
-                "The " + getMethodName() + " method has thrown an exception", ex.getCause() );
+            getComponentManager().log( LogService.LOG_ERROR, "The {0} method has thrown an exception", new Object[]
+                { getMethodName() }, ex.getCause() );
             return false;
         }
         catch ( Throwable t )
         {
             // anything else went wrong, log the message and fail the invocation
-            getComponentManager().log( LogService.LOG_ERROR, "The " + getMethodName() + " method could not be called",
-                t );
+            getComponentManager().log( LogService.LOG_ERROR, "The {0} method could not be called", new Object[]
+                { getMethodName() }, t );
 
             // method invocation threw, so it was a failure
             return false;
@@ -316,19 +317,21 @@
             // may be thrown if a method would be found but the signature
             // contains throws declaration for an exception which cannot
             // be loaded
-            // FELIX... TODO
-            StringBuffer buf = new StringBuffer();
-            buf.append( "Failure loooking up method " ).append( name ).append( '(' );
-            for ( int i = 0; parameterTypes != null && i < parameterTypes.length; i++ )
+            if ( getComponentManager().isLogEnabled( LogService.LOG_WARNING ) )
             {
-                buf.append( parameterTypes[i].getName() );
-                if ( i > 0 )
+                StringBuffer buf = new StringBuffer();
+                buf.append( "Failure loooking up method " ).append( name ).append( '(' );
+                for ( int i = 0; parameterTypes != null && i < parameterTypes.length; i++ )
                 {
-                    buf.append( ", " );
+                    buf.append( parameterTypes[i].getName() );
+                    if ( i > 0 )
+                    {
+                        buf.append( ", " );
+                    }
                 }
+                buf.append( ") in class class " ).append( clazz.getName() ).append( ". Assuming no such method." );
+                getComponentManager().log( LogService.LOG_WARNING, buf.toString(), cdfe );
             }
-            buf.append( ") in class class " ).append( clazz.getName() ).append( ". Assuming no such method." );
-            getComponentManager().log( LogService.LOG_WARNING, buf.toString(), cdfe );
         }
         catch ( Throwable throwable )
         {
@@ -471,8 +474,8 @@
 
         private void resolve( final BaseMethod baseMethod )
         {
-            baseMethod.getComponentManager().log( LogService.LOG_DEBUG,
-                "getting " + baseMethod.getMethodNamePrefix() + ": " + baseMethod.getMethodName(), null );
+            baseMethod.getComponentManager().log( LogService.LOG_DEBUG, "getting {0}: {1}", new Object[]
+                { baseMethod.getMethodNamePrefix(), baseMethod.getMethodName() }, null );
 
             // resolve the method
             Method method;
@@ -483,8 +486,8 @@
             catch ( InvocationTargetException ex )
             {
                 method = null;
-                baseMethod.getComponentManager().log( LogService.LOG_WARNING,
-                    baseMethod.getMethodName() + " cannot be found", ex.getTargetException() );
+                baseMethod.getComponentManager().log( LogService.LOG_WARNING, "{0} cannot be found", new Object[]
+                    { baseMethod.getMethodName() }, ex.getTargetException() );
             }
 
             baseMethod.setMethod( method );
@@ -515,8 +518,8 @@
             // 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
-            baseMethod.getComponentManager().log( LogService.LOG_ERROR,
-                baseMethod.getMethodNamePrefix() + " method [" + baseMethod.getMethodName() + "] not found", null );
+            baseMethod.getComponentManager().log( LogService.LOG_ERROR, "{0} method [{1}] not found", new Object[]
+                { baseMethod.getMethodNamePrefix(), baseMethod.getMethodName() }, null );
             return false;
         }
 
@@ -534,8 +537,8 @@
 
         public boolean invoke( final BaseMethod baseMethod, final Object componentInstance, final Object rawParameter )
         {
-            baseMethod.getComponentManager().log( LogService.LOG_DEBUG,
-                "invoking " + baseMethod.getMethodNamePrefix() + ": " + baseMethod.getMethodName(), null );
+            baseMethod.getComponentManager().log( LogService.LOG_DEBUG, "invoking {0}: {1}", new Object[]
+                { baseMethod.getMethodNamePrefix(), baseMethod.getMethodName() }, null );
             return baseMethod.invokeMethod( componentInstance, rawParameter );
         }
 
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/helper/BindMethod.java b/scr/src/main/java/org/apache/felix/scr/impl/helper/BindMethod.java
index a931eb7..8a6a749 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/helper/BindMethod.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/helper/BindMethod.java
@@ -165,7 +165,8 @@
         if ( suitableMethodNotAccessible )
         {
             getComponentManager().log( LogService.LOG_ERROR,
-                "DependencyManager : Suitable but non-accessible method found in class " + targetClass.getName(), null );
+                "DependencyManager : Suitable but non-accessible method found in class {0}", new Object[]
+                    { targetClass.getName() }, null );
             throw new SuitableMethodNotAccessibleException();
         }
 
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/helper/Logger.java b/scr/src/main/java/org/apache/felix/scr/impl/helper/Logger.java
index 51a9435..51cea8c 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/helper/Logger.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/helper/Logger.java
@@ -18,6 +18,7 @@
  */
 package org.apache.felix.scr.impl.helper;
 
+
 import org.apache.felix.scr.impl.metadata.ComponentMetadata;
 
 
@@ -30,6 +31,28 @@
 {
 
     /**
+     * Returns <code>true</code> if logging for the given level is enabled.
+     */
+    boolean isLogEnabled( int level );
+
+
+    /**
+     * Method to actually emit the log message. If the LogService is available,
+     * the message will be logged through the LogService. Otherwise the message
+     * is logged to stdout (or stderr in case of LOG_ERROR level messages),
+     *
+     * @param level The log level to log the message at
+     * @param pattern The <code>java.text.MessageFormat</code> message format
+     *      string for preparing the message
+     * @param arguments The format arguments for the <code>pattern</code>
+     *      string.
+     * @param ex An optional <code>Throwable</code> whose stack trace is written,
+     *      or <code>null</code> to not log a stack trace.
+     */
+    void log( int level, String pattern, Object[] arguments, ComponentMetadata metadata, Throwable ex );
+
+
+    /**
      * Writes a messages for the given <code>ComponentMetadata</code>.
      *
      * @param level The log level of the messages. This corresponds to the log
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java b/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java
index 51ba11c..4f0c4d0 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java
@@ -572,7 +572,8 @@
             if ( !dm.isSatisfied() )
             {
                 // at least one dependency is not satisfied
-                log( LogService.LOG_INFO, "Dependency not satisfied: " + dm.getName(), null );
+                log( LogService.LOG_INFO, "Dependency not satisfied: {0}", new Object[]
+                    { dm.getName() }, null );
                 satisfied = false;
             }
         }
@@ -711,7 +712,8 @@
      */
     void changeState( State newState )
     {
-        log( LogService.LOG_DEBUG, "State transition : " + m_state + " -> " + newState, null );
+        log( LogService.LOG_DEBUG, "State transition : {0} -> {1}", new Object[]
+            { m_state, newState }, null );
         m_state = newState;
     }
 
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/manager/ComponentFactoryImpl.java b/scr/src/main/java/org/apache/felix/scr/impl/manager/ComponentFactoryImpl.java
index fc6e419..06010aa 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/manager/ComponentFactoryImpl.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/manager/ComponentFactoryImpl.java
@@ -281,8 +281,7 @@
         else
         {
             // 112.7 Factory Configuration not allowed for factory component
-            getActivator().log( LogService.LOG_ERROR,
-                "Component Factory cannot be configured by factory configuration", getComponentMetadata(), null );
+            log( LogService.LOG_ERROR, "Component Factory cannot be configured by factory configuration", null );
         }
     }
 
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java b/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java
index e0ccf7e..a5f4f99 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java
@@ -147,8 +147,8 @@
         switch ( event.getType() )
         {
             case ServiceEvent.REGISTERED:
-                m_componentManager.log( LogService.LOG_DEBUG, "Dependency Manager: Adding " + serviceString,
-                    null );
+                m_componentManager.log( LogService.LOG_DEBUG, "Dependency Manager: Adding {0}", new Object[]
+                    { serviceString }, null );
 
                 // consider the service if the filter matches
                 if ( targetFilterMatch( ref ) )
@@ -158,15 +158,16 @@
                 }
                 else
                 {
-                    m_componentManager.log( LogService.LOG_DEBUG, "Dependency Manager: Ignoring added Service for "
-                        + m_dependencyMetadata.getName() + " : does not match target filter " + getTarget(),
-                        null );
+                    m_componentManager.log( LogService.LOG_DEBUG,
+                        "Dependency Manager: Ignoring added Service for {0} : does not match target filter {1}",
+                        new Object[]
+                            { m_dependencyMetadata.getName(), getTarget() }, null );
                 }
                 break;
 
             case ServiceEvent.MODIFIED:
-                m_componentManager.log( LogService.LOG_DEBUG, "Dependency Manager: Updating " + serviceString,
-                    null );
+                m_componentManager.log( LogService.LOG_DEBUG, "Dependency Manager: Updating {0}", new Object[]
+                    { serviceString }, null );
 
                 // remove the service first
                 // only continue with further event handling if the service
@@ -190,8 +191,8 @@
                 break;
 
             case ServiceEvent.UNREGISTERING:
-                m_componentManager.log( LogService.LOG_DEBUG, "Dependency Manager: Removing " + serviceString,
-                    null );
+                m_componentManager.log( LogService.LOG_DEBUG, "Dependency Manager: Removing {0}", new Object[]
+                    { serviceString }, null );
 
                 // manage the service counter if the filter matchs
                 if ( targetFilterMatch( ref ) )
@@ -200,9 +201,13 @@
                 }
                 else
                 {
-                    m_componentManager.log( LogService.LOG_DEBUG, "Dependency Manager: Not counting Service for "
-                        + m_dependencyMetadata.getName() + " : Service " + ref.getProperty( Constants.SERVICE_ID )
-                        + " does not match target filter " + getTarget(), null );
+                    m_componentManager
+                        .log(
+                            LogService.LOG_DEBUG,
+                            "Dependency Manager: Not counting Service for {0} : Service {1} does not match target filter {2}",
+                            new Object[]
+                                { m_dependencyMetadata.getName(), ref.getProperty( Constants.SERVICE_ID ), getTarget() },
+                            null );
                 }
 
                 // remove the service ignoring the filter match because if the
@@ -232,8 +237,9 @@
         // if the component is pending deactivation)
         if ( m_componentManager.getState() == AbstractComponentManager.STATE_UNSATISFIED )
         {
-            m_componentManager.log( LogService.LOG_INFO, "Dependency Manager: Service "
-                + m_dependencyMetadata.getName() + " registered, activate component", null );
+            m_componentManager.log( LogService.LOG_INFO,
+                "Dependency Manager: Service {0} registered, activate component", new Object[]
+                    { m_dependencyMetadata.getName() }, null );
 
             m_componentManager.activate();
         }
@@ -247,8 +253,9 @@
             // the component is reactivated for other reasons.
             if ( m_dependencyMetadata.isStatic() )
             {
-                m_componentManager.log( LogService.LOG_DEBUG, "Dependency Manager: Added service "
-                    + m_dependencyMetadata.getName() + " is ignored for static reference", null );
+                m_componentManager.log( LogService.LOG_DEBUG,
+                    "Dependency Manager: Added service {0} is ignored for static reference", new Object[]
+                        { m_dependencyMetadata.getName() }, null );
             }
 
             // otherwise bind if we have a bind method and the service needs
@@ -267,9 +274,8 @@
         else
         {
             m_componentManager.log( LogService.LOG_DEBUG,
-					"Dependency Manager: Ignoring service addition, wrong state "
-					+ m_componentManager.state(),
-					null );
+                "Dependency Manager: Ignoring service addition, wrong state {0}", new Object[]
+                    { m_componentManager.state() }, null );
         }
     }
 
@@ -297,9 +303,9 @@
         // check whether we are bound to that service, do nothing if not
         if ( getBoundService( reference ) == null )
         {
-            m_componentManager.log( LogService.LOG_DEBUG, "Dependency Manager: Ignoring removed Service for "
-                + m_dependencyMetadata.getName() + " : Service " + reference.getProperty( Constants.SERVICE_ID )
-                + " not bound", null );
+            m_componentManager.log( LogService.LOG_DEBUG,
+                "Dependency Manager: Ignoring removed Service for {0} : Service {1} not bound", new Object[]
+                    { m_dependencyMetadata.getName(), reference.getProperty( Constants.SERVICE_ID ) }, null );
 
             // service was not bound, we can continue without interruption
             return true;
@@ -313,12 +319,10 @@
             // deactivate the component
             if ( !isSatisfied() )
             {
-                m_componentManager.getActivator()
-                    .log(
-                        LogService.LOG_DEBUG,
-                        "Dependency Manager: Deactivating component due to mandatory dependency on "
-                            + m_dependencyMetadata.getName() + "/" + m_dependencyMetadata.getInterface()
-                            + " not satisfied", m_componentManager.getComponentMetadata(), null );
+                m_componentManager.log( LogService.LOG_DEBUG,
+                    "Dependency Manager: Deactivating component due to mandatory dependency on {0}/{1} not satisfied",
+                    new Object[]
+                        { m_dependencyMetadata.getName(), m_dependencyMetadata.getInterface() }, null );
 
                 // deactivate the component now
                 m_componentManager.deactivateInternal( ComponentConstants.DEACTIVATION_REASON_REFERENCE );
@@ -333,16 +337,15 @@
             {
                 try
                 {
-                    m_componentManager.log( LogService.LOG_DEBUG, "Dependency Manager: Static dependency on "
-                        + m_dependencyMetadata.getName() + "/" + m_dependencyMetadata.getInterface() + " is broken",
-                        null );
+                    m_componentManager.log( LogService.LOG_DEBUG,
+                        "Dependency Manager: Static dependency on {0}/{1} is broken", new Object[]
+                            { m_dependencyMetadata.getName(), m_dependencyMetadata.getInterface() }, null );
                     m_componentManager.deactivateInternal( ComponentConstants.DEACTIVATION_REASON_REFERENCE );
                     m_componentManager.activate();
                 }
                 catch ( Exception ex )
                 {
-                    m_componentManager.log( LogService.LOG_ERROR, "Exception while recreating dependency ",
-                        ex );
+                    m_componentManager.log( LogService.LOG_ERROR, "Exception while recreating dependency ", ex );
                 }
 
                 // static reference removal causes reactivation, nothing more to do
@@ -361,10 +364,12 @@
                     // available, bind returns false and we deactivate
                     if ( !bind() )
                     {
-                        m_componentManager.log( LogService.LOG_DEBUG,
-                            "Dependency Manager: Deactivating component due to mandatory dependency on "
-                                + m_dependencyMetadata.getName() + "/" + m_dependencyMetadata.getInterface()
-                                + " not satisfied", null );
+                        m_componentManager
+                            .log(
+                                LogService.LOG_DEBUG,
+                                "Dependency Manager: Deactivating component due to mandatory dependency on {0}/{1} not satisfied",
+                                new Object[]
+                                    { m_dependencyMetadata.getName(), m_dependencyMetadata.getInterface() }, null );
                         m_componentManager.deactivateInternal( ComponentConstants.DEACTIVATION_REASON_REFERENCE );
 
                         // required service could not be replaced, component
@@ -387,9 +392,8 @@
         else
         {
             m_componentManager.log( LogService.LOG_DEBUG,
-					"Dependency Manager: Ignoring service removal, wrong state "
-					+ m_componentManager.state(),
-					null );
+                "Dependency Manager: Ignoring service removal, wrong state {0}", new Object[]
+                    { m_componentManager.state() }, null );
         }
 
         // everything is fine, the component is still active and we continue
@@ -464,8 +468,9 @@
         String filterString = "(" + Constants.OBJECTCLASS + "=" + m_dependencyMetadata.getInterface() + ")";
         m_componentManager.getActivator().getBundleContext().addServiceListener( this, filterString );
 
-        m_componentManager.log( LogService.LOG_DEBUG, "Registered for service events, currently " + m_size
-            + " service(s) match the filter", null );
+        m_componentManager.log( LogService.LOG_DEBUG,
+            "Registered for service events, currently {0} service(s) match the filter", new Object[]
+                { new Integer( m_size ) }, null );
     }
 
     /**
@@ -538,8 +543,8 @@
         }
         catch ( InvalidSyntaxException ise )
         {
-            m_componentManager.log( LogService.LOG_ERROR, "Unexpected problem with filter '" + targetFilter + "'",
-                ise );
+            m_componentManager.log( LogService.LOG_ERROR, "Unexpected problem with filter ''{0}''", new Object[]
+                { targetFilter }, ise );
             return null;
         }
     }
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/manager/ImmediateComponentManager.java b/scr/src/main/java/org/apache/felix/scr/impl/manager/ImmediateComponentManager.java
index 037e735..976f9a4 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/manager/ImmediateComponentManager.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/manager/ImmediateComponentManager.java
@@ -184,8 +184,7 @@
         catch ( Exception ex )
         {
             // failed to instantiate, return null
-            log( LogService.LOG_ERROR, "Error during instantiation of the implementation object",
-                ex );
+            log( LogService.LOG_ERROR, "Error during instantiation of the implementation object", ex );
             return null;
         }
 
@@ -199,8 +198,9 @@
             DependencyManager dm = ( DependencyManager ) it.next();
             if ( !dm.open( implementationObject ) )
             {
-                log( LogService.LOG_ERROR, "Cannot create component instance due to failure to bind reference "
-                    + dm.getName(), null );
+                log( LogService.LOG_ERROR, "Cannot create component instance due to failure to bind reference {0}",
+                    new Object[]
+                        { dm.getName() }, null );
 
                 // make sure, we keep no bindings
                 it = getDependencyManagers();
@@ -400,8 +400,7 @@
         }
         else if ( !modify() )
         {
-            log( LogService.LOG_DEBUG, "Deactivating and Activating to reconfigure from configuration",
-                null );
+            log( LogService.LOG_DEBUG, "Deactivating and Activating to reconfigure from configuration", null );
             int reason = ( configuration == null ) ? ComponentConstants.DEACTIVATION_REASON_CONFIGURATION_DELETED
                 : ComponentConstants.DEACTIVATION_REASON_CONFIGURATION_MODIFIED;
             reactivate( reason );
@@ -433,8 +432,9 @@
             if ( !dm.canUpdateDynamically( props ) )
             {
                 log( LogService.LOG_INFO,
-                    "Cannot dynamically update the configuration due to dependency changes induced on dependency "
-                        + dm.getName(), null );
+                    "Cannot dynamically update the configuration due to dependency changes induced on dependency {0}",
+                    new Object[]
+                        { dm.getName() }, null );
                 return false;
             }
         }
@@ -444,8 +444,9 @@
         if ( !m_modifyMethod.invoke( getInstance(), new ActivateMethod.ActivatorParameter( m_componentContext, -1 ) ) )
         {
             // log an error if the declared method cannot be found
-            log( LogService.LOG_ERROR, "Declared modify method '" + getComponentMetadata().getModified()
-                + "' cannot be found, configuring by reactivation", null );
+            log( LogService.LOG_ERROR, "Declared modify method '{0}' cannot be found, configuring by reactivation",
+                new Object[]
+                    { getComponentMetadata().getModified() }, null );
             return false;
         }
 
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/metadata/ComponentMetadata.java b/scr/src/main/java/org/apache/felix/scr/impl/metadata/ComponentMetadata.java
index d6356a5..d55bcf3 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/metadata/ComponentMetadata.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/metadata/ComponentMetadata.java
@@ -712,8 +712,8 @@
             // flag duplicates
             if ( !refs.add( refMeta.getName() ) )
             {
-                logger.log( LogService.LOG_WARNING, "Detected duplicate reference name: \"" + refMeta.getName() + "\"",
-                    this, null );
+                logger.log( LogService.LOG_WARNING, "Detected duplicate reference name: ''{0}''", new Object[]
+                    { refMeta.getName() }, this, null );
             }
         }
 
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/metadata/XmlHandler.java b/scr/src/main/java/org/apache/felix/scr/impl/metadata/XmlHandler.java
index 02953e4..3100c7f 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/metadata/XmlHandler.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/metadata/XmlHandler.java
@@ -311,11 +311,12 @@
                     m_currentComponent.addDependency( ref );
                 }
 
-                // unexpected element
-                else
+                // unexpected element (except the root element "components"
+                // used by the Maven SCR Plugin, which is just silently ignored)
+                else if ( !localName.equals( "components" ) )
                 {
-                    m_logger.log( LogService.LOG_INFO, "Ignoring unsupported element " + localName + " (bundle "
-                        + m_bundle.getLocation() + ")", null, null );
+                    m_logger.log( LogService.LOG_DEBUG, "Ignoring unsupported element {0} (bundle {1})", new Object[]
+                        { localName, m_bundle.getLocation() }, null, null );
                 }
             }
             catch ( Exception ex )
@@ -325,11 +326,12 @@
             }
         }
 
-        // unexpected namespace
-        else
+        // unexpected namespace (except the root element "components"
+        // used by the Maven SCR Plugin, which is just silently ignored)
+        else if ( !localName.equals( "components" ) )
         {
-            m_logger.log( LogService.LOG_INFO, "Ignoring unsupported element {" + uri + "}" + localName + " (bundle "
-                + m_bundle.getLocation() + ")", null, null );
+            m_logger.log( LogService.LOG_DEBUG, "Ignoring unsupported element '{'{0}'}'{1} (bundle {2})", new Object[]
+                { uri, localName, m_bundle.getLocation() }, null, null );
         }
     }
 
diff --git a/scr/src/test/java/org/apache/felix/scr/impl/MockLogger.java b/scr/src/test/java/org/apache/felix/scr/impl/MockLogger.java
index 3a7d8a5..31087ca 100644
--- a/scr/src/test/java/org/apache/felix/scr/impl/MockLogger.java
+++ b/scr/src/test/java/org/apache/felix/scr/impl/MockLogger.java
@@ -18,6 +18,9 @@
  */
 package org.apache.felix.scr.impl;
 
+
+import java.text.MessageFormat;
+
 import org.apache.felix.scr.impl.helper.Logger;
 import org.apache.felix.scr.impl.metadata.ComponentMetadata;
 
@@ -27,6 +30,21 @@
     String lastMessage;
 
 
+    public boolean isLogEnabled( int level )
+    {
+        return true;
+    }
+
+
+    public void log( int level, String pattern, Object[] arguments, ComponentMetadata metadata, Throwable ex )
+    {
+        if ( isLogEnabled( level ) )
+        {
+            log( level, MessageFormat.format( pattern, arguments ), metadata, ex );
+        }
+    }
+
+
     public void log( int level, String message, ComponentMetadata metadata, Throwable ex )
     {
         lastMessage = message;