FELIX-3971 keep the same customizer since it is difficult to transfer state when configuration changes.

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1457985 13f79535-47bb-0310-9956-ffa450edef68
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 0b04d41..1651472 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
@@ -68,7 +68,7 @@
 
     private final AtomicReference<ServiceTracker<T, RefPair<T>>> trackerRef = new AtomicReference<ServiceTracker<T, RefPair<T>>>();
 
-    private final AtomicReference<Customizer<T>> customizerRef = new AtomicReference<Customizer<T>>();
+    private final Customizer customizer;
 
     private BindMethods m_bindMethods;
 
@@ -124,6 +124,7 @@
     {
         m_componentManager = componentManager;
         m_dependencyMetadata = dependency;
+        customizer = newCustomizer();
 
         // dump the reference information if DEBUG is enabled
         if ( m_componentManager.isLogEnabled( LogService.LOG_DEBUG ) )
@@ -176,6 +177,7 @@
         public void setTracker( ServiceTracker<T, RefPair<T>> tracker )
         {
             this.tracker = tracker;
+            trackerOpened = false;
         }
 
         public boolean isSatisfied()
@@ -709,7 +711,7 @@
                                 //TODO error???
                             }
                         }
-                        if ( !refPair.isFailed() )
+                        if ( !nextRefPair.isFailed() )
                         {
                             m_componentManager.invokeBindMethod( DependencyManager.this, nextRefPair, trackingCount );
                         }
@@ -734,6 +736,7 @@
                 }
                 else
                 {
+                    this.refPair = null;
                     this.trackingCount = trackingCount;
                     tracked( trackingCount );
                 }
@@ -990,7 +993,7 @@
 
     void deactivate()
     {
-        customizerRef.get().close();
+        customizer.close();
     }
 
 
@@ -1065,7 +1068,6 @@
      */
     private RefPair<T> getBestRefPair()
     {
-        Customizer customizer = customizerRef.get( );
         if (customizer == null )
         {
             return null;
@@ -1101,11 +1103,6 @@
      */
     T[] getServices()
     {
-        Customizer customizer = customizerRef.get( );
-        if (customizer == null )
-        {
-            return null;
-        }
         Collection<RefPair<T>> refs = customizer.getRefs(  new AtomicInteger( ) );
         List<T> services = new ArrayList<T>( refs.size() );
         for ( RefPair<T> ref: refs)
@@ -1129,11 +1126,6 @@
      */
     public ServiceReference<T>[] getServiceReferences()
     {
-        Customizer<T> customizer = customizerRef.get();
-        if (customizer == null)
-        {
-            return null;
-        }
         Collection<RefPair<T>> bound = customizer.getRefs(  new AtomicInteger( ) );
         if ( bound.isEmpty() )
         {
@@ -1250,8 +1242,7 @@
      */
     public boolean isSatisfied()
     {
-        Customizer<T> customizer = customizerRef.get();
-        return customizer != null && customizer.isSatisfied();
+        return customizer.isSatisfied();
     }
 
 
@@ -1273,7 +1264,7 @@
 
     boolean prebind()
     {
-        return customizerRef.get().open();
+        return customizer.open();
     }
 
     /**
@@ -1311,7 +1302,7 @@
         Collection<RefPair<T>> refs;
         synchronized ( trackerRef.get().tracked() )
         {
-            refs = customizerRef.get().getRefs( trackingCount );
+            refs = customizer.getRefs( trackingCount );
             EdgeInfo info = getEdgeInfo( componentInstance );
             info.setOpen( trackingCount.get() );
         }
@@ -1361,7 +1352,7 @@
         CountDownLatch latch = new CountDownLatch( 1 );
         synchronized ( trackerRef.get().tracked() )
         {
-            refPairs = customizerRef.get().getRefs( trackingCount );
+            refPairs = customizer.getRefs( trackingCount );
             EdgeInfo info = getEdgeInfo( componentInstance );
             info.setClose( trackingCount.get() );
             info.setLatch( latch );
@@ -1400,7 +1391,7 @@
         }
         if ( !isMultiple() )
         {
-            Collection<RefPair<T>> refs = customizerRef.get().getRefs( new AtomicInteger( ) );
+            Collection<RefPair<T>> refs = customizer.getRefs( new AtomicInteger( ) );
             if (refs.isEmpty())
             {
                 return;
@@ -1728,13 +1719,6 @@
      */
     private void setTargetFilter( String target) throws InvalidSyntaxException
     {
-        if (!hasGetPermission())
-        {
-            customizerRef.set( new NoPermissionsCustomizer() );
-            m_componentManager.log( LogService.LOG_INFO, "No permission to get services for {0}", new Object[]
-                    {m_dependencyMetadata.getName()}, null );
-            return;
-        }
         // if configuration does not set filter, use the value from metadata
         if (target == null)
         {
@@ -1786,13 +1770,11 @@
     private void registerServiceListener( SortedMap<ServiceReference<T>, RefPair<T>> refMap ) throws InvalidSyntaxException
     {
         final ServiceTracker<T, RefPair<T>> oldTracker = trackerRef.get();
-        Customizer<T> customizer = newCustomizer();
         customizer.setPreviousRefMap( refMap );
         boolean initialActive = oldTracker != null && oldTracker.isActive();
         ServiceTracker<T, RefPair<T>> tracker = new ServiceTracker<T, RefPair<T>>( m_componentManager.getActivator().getBundleContext(), m_targetFilter, customizer, initialActive );
         customizer.setTracker( tracker );
         trackerRef.set( tracker );
-        customizerRef.set( customizer );
         registered = true;
         tracker.open( m_componentManager.getTrackingCount() );
         customizer.setTrackerOpened();
@@ -1807,7 +1789,13 @@
     private Customizer<T> newCustomizer()
     {
         Customizer<T> customizer;
-        if (m_componentManager.isFactory())
+        if (!hasGetPermission())
+        {
+            customizer = new NoPermissionsCustomizer();
+            m_componentManager.log( LogService.LOG_INFO, "No permission to get services for {0}", new Object[]
+                    {m_dependencyMetadata.getName()}, null );
+        }
+        else if (m_componentManager.isFactory())
         {
             customizer = new FactoryCustomizer();
         }