FELIX-3680 don't recalculate size when not needed, don't set target filter from metadata when config required
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1397887 13f79535-47bb-0310-9956-ffa450edef68
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 12c9197..7329463 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
@@ -1049,11 +1049,14 @@
private void enableDependencyManagers() throws InvalidSyntaxException
{
- Iterator it = getDependencyManagers();
- while ( it.hasNext() )
+ if ( !m_componentMetadata.isConfigurationRequired() )
{
- DependencyManager dm = (DependencyManager) it.next();
- dm.enable();
+ Iterator it = getDependencyManagers();
+ while ( it.hasNext() )
+ {
+ DependencyManager dm = (DependencyManager) it.next();
+ dm.enable();
+ }
}
}
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 b6a8c5a..0b5bd42 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
@@ -79,6 +79,8 @@
private final Collection<ServiceReference> added = new ArrayList<ServiceReference>();
private final Collection<ServiceReference> removed = new ArrayList<ServiceReference>();
+ private boolean registered;
+
/**
* Constructor that receives several parameters.
@@ -649,8 +651,7 @@
*/
void disable()
{
- BundleContext context = m_componentManager.getActivator().getBundleContext();
- context.removeServiceListener( this );
+ unregisterServiceListener();
m_size.set( 0 );
}
@@ -1479,35 +1480,39 @@
{
m_componentManager.log( LogService.LOG_DEBUG, "No change in target property for dependency {0}", new Object[]
{m_dependencyMetadata.getName()}, null );
+ if (registered)
+ {
+ return;
+ }
+ }
+ m_target = target;
+
+ if ( registered )
+ {
+ unregisterServiceListener();
+ }
+ //compute the new target filter while we wait for other threads to complete.
+ if ( target != null )
+ {
+ m_componentManager.log( LogService.LOG_DEBUG, "Setting target property for dependency {0} to {1}", new Object[]
+ {m_dependencyMetadata.getName(), target}, null );
+ try
+ {
+ m_targetFilter = m_componentManager.getActivator().getBundleContext().createFilter( target );
+ }
+ catch ( InvalidSyntaxException ise )
+ {
+ m_componentManager.log( LogService.LOG_ERROR, "Invalid syntax in target property for dependency {0} to {1}", new Object[]
+ {m_dependencyMetadata.getName(), target}, null );
+ // log
+ m_targetFilter = null;
+ }
}
else
{
- m_target = target;
-
- m_componentManager.getActivator().getBundleContext().removeServiceListener( this );
- //compute the new target filter while we wait for other threads to complete.
- if ( target != null )
- {
- m_componentManager.log( LogService.LOG_DEBUG, "Setting target property for dependency {0} to {1}", new Object[]
- {m_dependencyMetadata.getName(), target}, null );
- try
- {
- m_targetFilter = m_componentManager.getActivator().getBundleContext().createFilter( target );
- }
- catch ( InvalidSyntaxException ise )
- {
- m_componentManager.log( LogService.LOG_ERROR, "Invalid syntax in target property for dependency {0} to {1}", new Object[]
- {m_dependencyMetadata.getName(), target}, null );
- // log
- m_targetFilter = null;
- }
- }
- else
- {
- m_componentManager.log( LogService.LOG_DEBUG, "Clearing target property for dependency {0}", new Object[]
- {m_dependencyMetadata.getName()}, null );
- m_targetFilter = null;
- }
+ m_componentManager.log( LogService.LOG_DEBUG, "Clearing target property for dependency {0}", new Object[]
+ {m_dependencyMetadata.getName()}, null );
+ m_targetFilter = null;
}
//wait for events to finish processing
synchronized ( added )
@@ -1553,8 +1558,7 @@
}
boolean active = m_componentManager.getDependencyMap() != null;
// register the service listener
- String filterString = "(" + Constants.OBJECTCLASS + "=" + m_dependencyMetadata.getInterface() + ")";
- m_componentManager.getActivator().getBundleContext().addServiceListener( this, filterString );
+ registerServiceListener();
Collection<ServiceReference> toAdd = new ArrayList<ServiceReference>();
synchronized ( enableLock )
@@ -1601,6 +1605,19 @@
}
+ private void registerServiceListener() throws InvalidSyntaxException
+ {
+ String filterString = "(" + Constants.OBJECTCLASS + "=" + m_dependencyMetadata.getInterface() + ")";
+ m_componentManager.getActivator().getBundleContext().addServiceListener( this, filterString );
+ registered = true;
+ }
+
+ private void unregisterServiceListener()
+ {
+ m_componentManager.getActivator().getBundleContext().removeServiceListener( this );
+ registered = false;
+ }
+
/**
* Returns the target filter of this dependency as a string or