You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by dj...@apache.org on 2013/08/20 01:10:50 UTC

svn commit: r1515660 - in /felix/trunk/scr/src: main/java/org/apache/felix/scr/impl/ main/java/org/apache/felix/scr/impl/config/ main/java/org/apache/felix/scr/impl/manager/ test/java/org/apache/felix/scr/integration/ test/resources/

Author: djencks
Date: Mon Aug 19 23:10:49 2013
New Revision: 1515660

URL: http://svn.apache.org/r1515660
Log:
FELIX-3651 Location tests for LOCATION_CHANGED event and region locations

Added:
    felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/LocationTest.java   (with props)
    felix/trunk/scr/src/test/resources/integration_test_simple_components_location.xml   (with props)
Modified:
    felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/Activator.java
    felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/ComponentActorThread.java
    felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/ComponentRegistry.java
    felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/ComponentRegistryKey.java
    felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/config/ConfigurationSupport.java
    felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/config/ImmediateComponentHolder.java
    felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java
    felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/ComponentTestBase.java

Modified: felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/Activator.java
URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/Activator.java?rev=1515660&r1=1515659&r2=1515660&view=diff
==============================================================================
--- felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/Activator.java (original)
+++ felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/Activator.java Mon Aug 19 23:10:49 2013
@@ -20,10 +20,12 @@ package org.apache.felix.scr.impl;
 
 
 import java.io.PrintStream;
+import java.text.MessageFormat;
 import java.util.HashMap;
 import java.util.Map;
 
 import org.apache.felix.scr.impl.config.ScrConfiguration;
+import org.apache.felix.scr.impl.metadata.ComponentMetadata;
 import org.apache.felix.utils.extender.AbstractExtender;
 import org.apache.felix.utils.extender.Extension;
 import org.osgi.framework.Bundle;
@@ -98,8 +100,8 @@ public class Activator extends AbstractE
         m_configuration.start( m_context );
 
         // log SCR startup
-        log( LogService.LOG_INFO, m_context.getBundle(), " Version = "
-            + m_context.getBundle().getHeaders().get( Constants.BUNDLE_VERSION ), null );
+        log( LogService.LOG_INFO, m_context.getBundle(), " Version = {0}",
+            new Object[] {m_context.getBundle().getHeaders().get( Constants.BUNDLE_VERSION )}, null );
 
         // create and start the component actor
         m_componentActor = new ComponentActorThread();
@@ -195,8 +197,8 @@ public class Activator extends AbstractE
         BundleContext context = bundle.getBundleContext();
         if ( context == null )
         {
-            log( LogService.LOG_ERROR, m_context.getBundle(), "Cannot get BundleContext of bundle "
-                + bundle.getSymbolicName() + "/" + bundle.getBundleId(), null );
+            log( LogService.LOG_ERROR, m_context.getBundle(), "Cannot get BundleContext of bundle {0}/{1}",
+                new Object[] {bundle.getSymbolicName(), bundle.getBundleId()}, null );
             return;
         }
 
@@ -223,8 +225,8 @@ public class Activator extends AbstractE
         // terminate if already loaded (or currently being loaded)
         if ( loaded )
         {
-            log( LogService.LOG_DEBUG, m_context.getBundle(), "Components for bundle  " + bundle.getSymbolicName()
-                + "/" + bundle.getBundleId() + " already loaded. Nothing to do.", null );
+            log( LogService.LOG_DEBUG, m_context.getBundle(), "Components for bundle {0}/{1} already loaded. Nothing to do.",
+                new Object[] {bundle.getSymbolicName(), bundle.getBundleId()}, null );
             return;
         }
 
@@ -253,17 +255,14 @@ public class Activator extends AbstractE
                 log(
                     LogService.LOG_DEBUG,
                     m_context.getBundle(),
-                    "Bundle "
-                        + bundle.getSymbolicName()
-                        + "/"
-                        + bundle.getBundleId()
-                        + " has been stopped while trying to activate its components. Trying again when the bundles gets startet again.",
+                    "Bundle {0}/{1} has been stopped while trying to activate its components. Trying again when the bundles gets started again.",
+                new Object[] {bundle.getSymbolicName(), bundle.getBundleId()},
                     e );
             }
             else
             {
-                log( LogService.LOG_ERROR, m_context.getBundle(), "Error while loading components of bundle "
-                    + bundle.getSymbolicName() + "/" + bundle.getBundleId(), e );
+                log( LogService.LOG_ERROR, m_context.getBundle(), "Error while loading components of bundle {0}/{1}",
+                new Object[] {bundle.getSymbolicName(), bundle.getBundleId()}, e );
             }
         }
     }
@@ -292,8 +291,8 @@ public class Activator extends AbstractE
             }
             catch ( Exception e )
             {
-                log( LogService.LOG_ERROR, m_context.getBundle(), "Error while disposing components of bundle "
-                    + bundle.getSymbolicName() + "/" + bundle.getBundleId(), e );
+                log( LogService.LOG_ERROR, m_context.getBundle(), "Error while disposing components of bundle {0}/{1}",
+                    new Object[] {bundle.getSymbolicName(), bundle.getBundleId()}, e );
             }
         }
     }
@@ -313,6 +312,23 @@ public class Activator extends AbstractE
         log( LogService.LOG_DEBUG, m_context.getBundle(), msg, t );
     }
 
+    public static void log( int level, Bundle bundle, String pattern, Object[] arguments, Throwable ex )
+    {
+        if ( isLogEnabled( level ) )
+        {
+            final String message = MessageFormat.format( pattern, arguments );
+            log( level, bundle, message, ex );
+        }
+    }
+
+    /**
+     * Returns <code>true</code> if logging for the given level is enabled.
+     */
+    public static boolean isLogEnabled( int level )
+    {
+        return m_configuration.getLogLevel() >= level;
+    }
+
     /**
      * Method to actually emit the log message. If the LogService is available,
      * the message will be logged through the LogService. Otherwise the message
@@ -325,7 +341,7 @@ public class Activator extends AbstractE
      */
     public static void log( int level, Bundle bundle, String message, Throwable ex )
     {
-        if ( m_configuration.getLogLevel() >= level )
+        if ( isLogEnabled( level ) )
         {
             ServiceTracker t = m_logService;
             Object logger = ( t != null ) ? t.getService() : null;

Modified: felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/ComponentActorThread.java
URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/ComponentActorThread.java?rev=1515660&r1=1515659&r2=1515660&view=diff
==============================================================================
--- felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/ComponentActorThread.java (original)
+++ felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/ComponentActorThread.java Mon Aug 19 23:10:49 2013
@@ -144,8 +144,8 @@ class ComponentActorThread implements Ru
             // append to the task queue
             tasks.add( task );
 
-            Activator.log( LogService.LOG_DEBUG, null, "Adding task [" + task + "] as #" + tasks.size()
-                + " in the queue", null );
+            Activator.log( LogService.LOG_DEBUG, null, "Adding task [{0}] as #{1} in the queue" 
+                    , new Object[] {task, tasks.size()}, null );
 
             // notify the waiting thread
             tasks.notifyAll();

Modified: felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/ComponentRegistry.java
URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/ComponentRegistry.java?rev=1515660&r1=1515659&r2=1515660&view=diff
==============================================================================
--- felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/ComponentRegistry.java (original)
+++ felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/ComponentRegistry.java Mon Aug 19 23:10:49 2013
@@ -51,6 +51,7 @@ import org.osgi.framework.ServiceReferen
 import org.osgi.framework.ServiceRegistration;
 import org.osgi.service.component.ComponentConstants;
 import org.osgi.service.component.ComponentException;
+import org.osgi.service.log.LogService;
 
 
 /**
@@ -386,13 +387,17 @@ public class ComponentRegistry implement
      */
     final void registerComponentHolder( final ComponentRegistryKey key, ComponentHolder componentHolder )
     {
+        Activator.log(LogService.LOG_DEBUG, null, 
+                "Registering component with pid {0} for bundle {1}",
+                new Object[] {componentHolder.getComponentMetadata().getConfigurationPid(),key.getBundleId()},
+                null);
         synchronized ( m_componentHoldersByName )
         {
             // only register the component if there is a m_registration for it !
             if ( m_componentHoldersByName.get( key ) != null )
             {
                 // this is not expected if all works ok
-                throw new ComponentException( "The component name '" + componentHolder.getComponentMetadata().getName()
+                throw new ComponentException( "The component name '{0}" + componentHolder.getComponentMetadata().getName()
                     + "' has already been registered." );
             }
 
@@ -505,6 +510,9 @@ public class ComponentRegistry implement
         }
 
         if (component != null) {
+            Activator.log(LogService.LOG_DEBUG, null, 
+                    "Unregistering component with pid {0} for bundle {1}",
+                    new Object[] {component.getComponentMetadata().getConfigurationPid(), key.getBundleId()}, null);
             synchronized (m_componentHoldersByPid)
             {
                 String configurationPid = component.getComponentMetadata().getConfigurationPid();

Modified: felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/ComponentRegistryKey.java
URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/ComponentRegistryKey.java?rev=1515660&r1=1515659&r2=1515660&view=diff
==============================================================================
--- felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/ComponentRegistryKey.java (original)
+++ felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/ComponentRegistryKey.java Mon Aug 19 23:10:49 2013
@@ -66,4 +66,18 @@ final class ComponentRegistryKey
 
         return false;
     }
+
+
+    public long getBundleId()
+    {
+        return bundleId;
+    }
+
+
+    public String getComponentName()
+    {
+        return componentName;
+    }
+    
+    
 }

Modified: felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/config/ConfigurationSupport.java
URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/config/ConfigurationSupport.java?rev=1515660&r1=1515659&r2=1515660&view=diff
==============================================================================
--- felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/config/ConfigurationSupport.java (original)
+++ felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/config/ConfigurationSupport.java Mon Aug 19 23:10:49 2013
@@ -21,6 +21,7 @@ package org.apache.felix.scr.impl.config
 import java.io.IOException;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
+import java.text.MessageFormat;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Dictionary;
@@ -155,8 +156,8 @@ public class ConfigurationSupport implem
                         }
                         else
                         {
-                            Activator.log( LogService.LOG_WARNING, null, "Cannot configure component "
-                                + holder.getComponentMetadata().getName(), null );
+                            Activator.log( LogService.LOG_WARNING, null, "Cannot configure component {0}",
+                                 new Object[] {holder.getComponentMetadata().getName()}, null );
                             Activator.log( LogService.LOG_WARNING, null,
                                 "Component Bundle's Configuration Admin is not compatible with "
                                     + "ours. This happens if multiple Configuration Admin API versions "
@@ -235,9 +236,9 @@ public class ConfigurationSupport implem
             holders = this.m_registry.getComponentHoldersByPid(factoryPid);
         }
 
-        Activator.log(LogService.LOG_DEBUG, null, "configurationEvent: Handling "
-                + ((event.getType() == ConfigurationEvent.CM_DELETED) ? "DELETE" : "UPDATE")
-                + " of Configuration PID=" + pid, null);
+        Activator.log(LogService.LOG_DEBUG, null, "configurationEvent: Handling {0}  of Configuration PID={1} for component holders {2}",
+                new Object[] {getEventType(event), pid, holders},
+                null);
 
         for  ( ComponentHolder componentHolder: holders )
         {
@@ -384,13 +385,29 @@ public class ConfigurationSupport implem
                     break;
                 }
                 default:
-                    Activator.log(LogService.LOG_WARNING, null, "Unknown ConfigurationEvent type " + event.getType(),
+                    Activator.log(LogService.LOG_WARNING, null, "Unknown ConfigurationEvent type {0}", new Object[] {event.getType()},
                         null);
                 }
             }
         }
     }
     
+    private String getEventType(ConfigurationEvent event)
+    {
+        switch (event.getType())
+        {
+        case ConfigurationEvent.CM_UPDATED:
+            return "UPDATED";
+        case ConfigurationEvent.CM_DELETED:
+            return "DELETED";
+        case ConfigurationEvent.CM_LOCATION_CHANGED:
+            return "LOCATION CHANGED";
+        default:
+            return "Unkown event type: " + event.getType();
+        }
+
+    }
+
     private static class ConfigurationInfo
     {
         private final Configuration configuration;
@@ -438,8 +455,8 @@ public class ConfigurationSupport implem
                         }
                         else
                         {
-                            Activator.log( LogService.LOG_WARNING, null, "Cannot reconfigure component "
-                                + componentHolder.getComponentMetadata().getName(), null );
+                            Activator.log( LogService.LOG_WARNING, null, "Cannot reconfigure component {0}",
+                                new Object[] {componentHolder.getComponentMetadata().getName()}, null );
                             Activator.log( LogService.LOG_WARNING, null,
                                 "Component Bundle's Configuration Admin is not compatible with " +
                                 "ours. This happens if multiple Configuration Admin API versions " +
@@ -474,7 +491,7 @@ public class ConfigurationSupport implem
         }
         catch (IOException ioe)
         {
-            Activator.log(LogService.LOG_WARNING, null, "Failed reading configuration for pid=" + pid, ioe);
+            Activator.log(LogService.LOG_WARNING, null, "Failed reading configuration for pid={0}", new Object[] {pid}, ioe);
         }
 
         return null;
@@ -583,11 +600,11 @@ public class ConfigurationSupport implem
         }
         catch (IOException ioe)
         {
-            Activator.log(LogService.LOG_WARNING, null, "Problem listing configurations for filter=" + filter, ioe);
+            Activator.log(LogService.LOG_WARNING, null, "Problem listing configurations for filter={0}", new Object[] {filter}, ioe);
         }
         catch (InvalidSyntaxException ise)
         {
-            Activator.log(LogService.LOG_ERROR, null, "Invalid Configuration selection filter " + filter, ise);
+            Activator.log(LogService.LOG_ERROR, null, "Invalid Configuration selection filter {0}", new Object[] {filter}, ise);
         }
 
         // no factories in case of problems

Modified: felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/config/ImmediateComponentHolder.java
URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/config/ImmediateComponentHolder.java?rev=1515660&r1=1515659&r2=1515660&view=diff
==============================================================================
--- felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/config/ImmediateComponentHolder.java (original)
+++ felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/config/ImmediateComponentHolder.java Mon Aug 19 23:10:49 2013
@@ -25,6 +25,7 @@ import java.util.Iterator;
 import java.util.Map;
 
 import org.apache.felix.scr.Component;
+import org.apache.felix.scr.impl.Activator;
 import org.apache.felix.scr.impl.BundleComponentActivator;
 import org.apache.felix.scr.impl.TargetedPID;
 import org.apache.felix.scr.impl.helper.ComponentMethods;
@@ -488,7 +489,7 @@ public class ImmediateComponentHolder<S>
      * <p>
      * A ImmediateComponentHolder is considered to be <b>equal to </b> another 
      * ImmediateComponentHolder if the component names are equal(using 
-     * {@code String.equals}).
+     * {@code String.equals}) and they have the same bundle activator
      * 
      * @param object The {@code ImmediateComponentHolder} object to be compared.
      * @return {@code true} if {@code object} is a
@@ -503,7 +504,8 @@ public class ImmediateComponentHolder<S>
         }
 
         ImmediateComponentHolder other = (ImmediateComponentHolder) object;
-        return getComponentMetadata().getName().equals(other.getComponentMetadata().getName());
+        return m_activator == other.m_activator
+                && getComponentMetadata().getName().equals(other.getComponentMetadata().getName());
     }
     
    /**
@@ -543,14 +545,7 @@ public class ImmediateComponentHolder<S>
 
     public boolean isLogEnabled( int level )
     {
-        BundleComponentActivator activator = getActivator();
-        if ( activator != null )
-        {
-            return activator.isLogEnabled( level );
-        }
-
-        // bundle activator has already been removed, so no logging
-        return false;
+        return Activator.isLogEnabled( level );
     }
 
     public void log( int level, String message, Throwable ex )

Modified: felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java
URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java?rev=1515660&r1=1515659&r2=1515660&view=diff
==============================================================================
--- felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java (original)
+++ felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java Mon Aug 19 23:10:49 2013
@@ -40,6 +40,7 @@ import java.util.concurrent.locks.Reentr
 
 import org.apache.felix.scr.Component;
 import org.apache.felix.scr.Reference;
+import org.apache.felix.scr.impl.Activator;
 import org.apache.felix.scr.impl.BundleComponentActivator;
 import org.apache.felix.scr.impl.config.ScrConfiguration;
 import org.apache.felix.scr.impl.helper.ComponentMethods;
@@ -1091,14 +1092,7 @@ public abstract class AbstractComponentM
      */
     public boolean isLogEnabled( int level )
     {
-        BundleComponentActivator activator = getActivator();
-        if ( activator != null )
-        {
-            return activator.isLogEnabled( level );
-        }
-
-        // bundle activator has already been removed, so no logging
-        return false;
+        return Activator.isLogEnabled( level );
     }
 
 

Modified: felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/ComponentTestBase.java
URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/ComponentTestBase.java?rev=1515660&r1=1515659&r2=1515660&view=diff
==============================================================================
--- felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/ComponentTestBase.java (original)
+++ felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/ComponentTestBase.java Mon Aug 19 23:10:49 2013
@@ -269,19 +269,30 @@ public abstract class ComponentTestBase
         return ca;
     }
 
+    protected org.osgi.service.cm.Configuration configure( String pid )
+    {
+        return configure( pid, null );
+        
+    }
 
-    protected void configure( String pid )
+    protected org.osgi.service.cm.Configuration configure( String pid, String bundleLocation )
     {
         ConfigurationAdmin ca = getConfigurationAdmin();
         try
         {
             org.osgi.service.cm.Configuration config = ca.getConfiguration( pid, null );
+            if (bundleLocation != null)
+            {
+                config.setBundleLocation( bundleLocation );
+            }
             config.update( theConfig );
+            return config;
         }
         catch ( IOException ioe )
         {
             TestCase.fail( "Failed updating configuration " + pid + ": " + ioe.toString() );
         }
+        return null;
     }
 
 
@@ -403,14 +414,19 @@ public abstract class ComponentTestBase
 
     protected Bundle installBundle( final String descriptorFile, String componentPackage ) throws BundleException
     {
+        return installBundle(descriptorFile, componentPackage, "simplecomponent", "0.0.11");
+    }
+    
+    protected Bundle installBundle( final String descriptorFile, String componentPackage, String symbolicName, String version ) throws BundleException
+    {
         final InputStream bundleStream = bundle()
-            .add("OSGI-INF/components.xml", getClass().getResource(descriptorFile))
+                .add("OSGI-INF/components.xml", getClass().getResource(descriptorFile))
 
-                .set(Constants.BUNDLE_SYMBOLICNAME, "simplecomponent")
-                .set(Constants.BUNDLE_VERSION, "0.0.11")
+                .set(Constants.BUNDLE_SYMBOLICNAME, symbolicName)
+                .set(Constants.BUNDLE_VERSION, version)
                 .set(Constants.IMPORT_PACKAGE, componentPackage)
                 .set("Service-Component", "OSGI-INF/components.xml")
-            .build(withBnd());
+                .build(withBnd());
 
         try
         {

Added: felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/LocationTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/LocationTest.java?rev=1515660&view=auto
==============================================================================
--- felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/LocationTest.java (added)
+++ felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/LocationTest.java Mon Aug 19 23:10:49 2013
@@ -0,0 +1,238 @@
+/*
+ * 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.scr.integration;
+
+import junit.framework.TestCase;
+
+import org.apache.felix.scr.Component;
+import org.apache.felix.scr.integration.components.SimpleComponent;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.ops4j.pax.exam.junit.JUnit4TestRunner;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationEvent;
+import org.osgi.service.cm.ConfigurationListener;
+import org.osgi.service.cm.ConfigurationPermission;
+
+@RunWith(JUnit4TestRunner.class)
+public class LocationTest extends ComponentTestBase
+{
+    
+    private static final String COMPONENT_NAME = "SimpleComponent.configuration.require";
+    private static final String REGION = "?foo";
+    private boolean eventReceived;
+
+    static
+    {
+        descriptorFile = "/integration_test_simple_components_location.xml";
+        // uncomment to enable debugging of this test class
+//         paxRunnerVmOption = DEBUG_VM_OPTION;
+    }
+
+
+    @Test
+    public void testLocationBinding() throws Exception
+    {
+        final String pid = COMPONENT_NAME;
+        final Component component = findComponentByName( pid );
+
+        deleteConfig( pid );
+        delay();
+
+        TestCase.assertNotNull( component );
+        TestCase.assertFalse( component.isDefaultEnabled() );
+
+        TestCase.assertEquals( Component.STATE_DISABLED, component.getState() );
+        TestCase.assertNull( SimpleComponent.INSTANCE );
+
+        component.enable();
+        delay();
+
+        TestCase.assertEquals( Component.STATE_UNSATISFIED, component.getState() );
+        TestCase.assertNull( SimpleComponent.INSTANCE );
+
+        Configuration config = configure( pid );
+        delay();
+
+        TestCase.assertEquals( Component.STATE_ACTIVE, component.getState() );
+        TestCase.assertNotNull( SimpleComponent.INSTANCE );
+        TestCase.assertEquals( PROP_NAME, SimpleComponent.INSTANCE.getProperty( PROP_NAME ) );
+        
+        
+        Bundle b2 = installBundle( descriptorFile, COMPONENT_PACKAGE, "simplecomponent2", "0.0.11" );
+        b2.start();
+        Component[] components = findComponentsByName( pid );
+        TestCase.assertEquals( 2, components.length );
+        Component c2 = components[0] == component? components[1]: components[0];
+        
+        c2.enable();
+        delay();
+        TestCase.assertEquals( Component.STATE_UNSATISFIED, c2.getState() );
+        
+        bundle.stop();
+        delay();
+        
+        TestCase.assertEquals( Component.STATE_UNSATISFIED, c2.getState() );
+
+        ConfigurationListener listener = new ConfigurationListener() {
+
+            public void configurationEvent(ConfigurationEvent event)
+            {
+                if (event.getType() == ConfigurationEvent.CM_LOCATION_CHANGED)
+                {
+                    eventReceived = true;
+                }
+            }
+            
+        };
+        ServiceRegistration<ConfigurationListener> sr = bundleContext.registerService( ConfigurationListener.class, listener, null );
+        config.setBundleLocation( null );
+        delay();
+        
+        if ( eventReceived )
+        {
+            TestCase.assertEquals( Component.STATE_ACTIVE, c2.getState() );
+        }
+        
+        sr.unregister();
+        
+        
+    }
+
+    @Test
+    public void testLocationChangeToRegionBinding() throws Exception
+    {
+        final String pid = COMPONENT_NAME;
+        final Component component = findComponentByName( pid );
+
+        deleteConfig( pid );
+        delay();
+
+        TestCase.assertNotNull( component );
+        TestCase.assertFalse( component.isDefaultEnabled() );
+
+        TestCase.assertEquals( Component.STATE_DISABLED, component.getState() );
+        TestCase.assertNull( SimpleComponent.INSTANCE );
+
+        component.enable();
+        delay();
+
+        TestCase.assertEquals( Component.STATE_UNSATISFIED, component.getState() );
+        TestCase.assertNull( SimpleComponent.INSTANCE );
+
+        Configuration config = configure( pid );
+        delay();
+
+        TestCase.assertEquals( Component.STATE_ACTIVE, component.getState() );
+        TestCase.assertNotNull( SimpleComponent.INSTANCE );
+        TestCase.assertEquals( PROP_NAME, SimpleComponent.INSTANCE.getProperty( PROP_NAME ) );
+        
+        
+        Bundle b2 = installBundle( descriptorFile, COMPONENT_PACKAGE, "simplecomponent2", "0.0.11" );
+        b2.start();
+        Component[] components = findComponentsByName( pid );
+        TestCase.assertEquals( 2, components.length );
+        Component c2 = components[0] == component? components[1]: components[0];
+        
+        c2.enable();
+        delay();
+        TestCase.assertEquals( Component.STATE_UNSATISFIED, c2.getState() );
+        
+        bundle.stop();
+        delay();
+        
+        TestCase.assertEquals( Component.STATE_UNSATISFIED, c2.getState() );
+
+        ConfigurationListener listener = new ConfigurationListener() {
+
+            public void configurationEvent(ConfigurationEvent event)
+            {
+                if (event.getType() == ConfigurationEvent.CM_LOCATION_CHANGED)
+                {
+                    eventReceived = true;
+                }
+            }
+            
+        };
+        ServiceRegistration<ConfigurationListener> sr = bundleContext.registerService( ConfigurationListener.class, listener, null );
+        config.setBundleLocation( REGION );
+        delay();
+        
+        if ( eventReceived )
+        {
+            TestCase.assertEquals( Component.STATE_ACTIVE, c2.getState() );
+        }
+        
+        sr.unregister();
+        
+        
+    }
+    
+    @Test
+    public void testRegionBinding() throws Exception
+    {
+        try
+        {
+            new ConfigurationPermission(REGION, ConfigurationPermission.TARGET);
+        }
+        catch (IllegalArgumentException e)
+        {
+            return;//not an R5 CA
+        }
+        
+        final String pid = COMPONENT_NAME;
+        final Component component = findComponentByName( pid );
+
+        deleteConfig( pid );
+        delay();
+
+        TestCase.assertNotNull( component );
+        TestCase.assertFalse( component.isDefaultEnabled() );
+
+        TestCase.assertEquals( Component.STATE_DISABLED, component.getState() );
+        TestCase.assertNull( SimpleComponent.INSTANCE );
+
+        component.enable();
+        delay();
+
+        TestCase.assertEquals( Component.STATE_UNSATISFIED, component.getState() );
+        TestCase.assertNull( SimpleComponent.INSTANCE );
+
+        Configuration config = configure( pid, REGION );
+        delay();
+
+        TestCase.assertEquals( Component.STATE_ACTIVE, component.getState() );
+        TestCase.assertNotNull( SimpleComponent.INSTANCE );
+        TestCase.assertEquals( PROP_NAME, SimpleComponent.INSTANCE.getProperty( PROP_NAME ) );
+        
+        
+        Bundle b2 = installBundle( descriptorFile, COMPONENT_PACKAGE, "simplecomponent2", "0.0.11" );
+        b2.start();
+        Component[] components = findComponentsByName( pid );
+        TestCase.assertEquals( 2, components.length );
+        Component c2 = components[0] == component? components[1]: components[0];
+        
+        c2.enable();
+        delay();
+        TestCase.assertEquals( Component.STATE_ACTIVE, c2.getState() );
+    }
+
+}

Propchange: felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/LocationTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/LocationTest.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/LocationTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: felix/trunk/scr/src/test/resources/integration_test_simple_components_location.xml
URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/test/resources/integration_test_simple_components_location.xml?rev=1515660&view=auto
==============================================================================
--- felix/trunk/scr/src/test/resources/integration_test_simple_components_location.xml (added)
+++ felix/trunk/scr/src/test/resources/integration_test_simple_components_location.xml Mon Aug 19 23:10:49 2013
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    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.
+-->
+<components xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0">
+
+    <!-- component requires configuration -->
+    <scr:component name="SimpleComponent.configuration.require"
+        enabled="false"
+        configuration-policy="require" >
+        <implementation class="org.apache.felix.scr.integration.components.SimpleComponent" />
+        <property name="service.pid" value="SimpleComponent.configuration.require" />
+    </scr:component>
+
+</components>

Propchange: felix/trunk/scr/src/test/resources/integration_test_simple_components_location.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: felix/trunk/scr/src/test/resources/integration_test_simple_components_location.xml
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: felix/trunk/scr/src/test/resources/integration_test_simple_components_location.xml
------------------------------------------------------------------------------
    svn:mime-type = text/xml