FELIX-3729 register the dependency manager service listeners during activate
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1424316 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/config/ImmediateComponentHolder.java b/scr/src/main/java/org/apache/felix/scr/impl/config/ImmediateComponentHolder.java
index 63220f8..c46c9a1 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/config/ImmediateComponentHolder.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/config/ImmediateComponentHolder.java
@@ -297,12 +297,26 @@
}
// configure the component
+ log( LogService.LOG_DEBUG, "ImmediateComponentHolder About to actually configure the dependency managers for component for pid {0} ",
+ new Object[] {pid}, null );
newIcm.reconfigure( props );
+ log( LogService.LOG_DEBUG, "ImmediateComponentHolder Finished configuring the dependency managers for component for pid {0} ",
+ new Object[] {pid}, null );
// enable the component if it is initially enabled
if ( m_enabled && getComponentMetadata().isEnabled() )
{
+ log( LogService.LOG_DEBUG, "ImmediateComponentHolder About to enable component for pid {0} ",
+ new Object[] {pid}, null );
newIcm.enable( false );
+ log( LogService.LOG_DEBUG, "ImmediateComponentHolder Finished enabling component for pid {0} ",
+ new Object[] {pid}, null );
+ }
+ else
+ {
+ log( LogService.LOG_DEBUG, "ImmediateComponentHolder Will not enable component for pid {0}: holder enabled state: {1}, metadata enabled: {2} ",
+ new Object[] {pid, m_enabled, getComponentMetadata().isEnabled()}, null );
+
}
// store the component in the map
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 719fee7..07ad20f 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
@@ -97,6 +97,8 @@
protected volatile boolean enabled;
protected volatile CountDownLatch enabledLatch;
private final Object enabledLatchLock = new Object();
+
+ protected volatile boolean m_internalEnabled;
/**
* synchronizing while creating the service registration is safe as long as the bundle is not stopped
* during some service registrations. So, avoid synchronizing during unregister service if the component is being
@@ -587,6 +589,7 @@
final void enableInternal()
{
m_state.enable( this );
+ m_internalEnabled = true;
}
final boolean activateInternal( int trackingCount )
@@ -601,6 +604,7 @@
final void disableInternal()
{
+ m_internalEnabled = false;
m_state.disable( this );
}
@@ -966,20 +970,20 @@
private void enableDependencyManagers() throws InvalidSyntaxException
{
- if ( !m_componentMetadata.isConfigurationRequired() )
+ if ( !m_componentMetadata.isConfigurationRequired() || hasConfiguration() )
{
- for ( DependencyManager dm: getDependencyManagers() )
- {
- dm.enable();
- }
+ updateTargets( getProperties() );
}
}
protected void updateTargets(Dictionary properties)
{
- for ( DependencyManager dm: getDependencyManagers() )
+ if ( m_internalEnabled )
{
- dm.setTargetFilter( properties );
+ for ( DependencyManager dm: getDependencyManagers() )
+ {
+ dm.setTargetFilter( properties );
+ }
}
}
@@ -1358,20 +1362,8 @@
}
acm.registerComponentId();
- try
- {
- acm.enableDependencyManagers();
- acm.changeState( Unsatisfied.getInstance() );
- acm.log( LogService.LOG_DEBUG, "Component enabled", null );
- }
- catch ( InvalidSyntaxException ise )
- {
- // one of the reference target filters is invalid, fail
- acm.log( LogService.LOG_ERROR, "Failed enabling Component", ise );
- acm.disableDependencyManagers();
- acm.unregisterComponentId();
- acm.changeState( Disabled.getInstance() );
- }
+ acm.changeState( Unsatisfied.getInstance() );
+ acm.log( LogService.LOG_DEBUG, "Component enabled", null );
}
void deactivate( AbstractComponentManager acm, int reason, boolean disable )
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 e5af9f9..babf500 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
@@ -879,6 +879,58 @@
}
}
+ private class NoPermissionsCustomizer implements Customizer<T>
+ {
+
+ public boolean open()
+ {
+ return false;
+ }
+
+ public void close()
+ {
+ }
+
+ public Collection<RefPair<T>> getRefs( AtomicInteger trackingCount )
+ {
+ return null;
+ }
+
+ public boolean isSatisfied()
+ {
+ return isOptional();
+ }
+
+ public void setTracker( ServiceTracker<T, RefPair<T>> tRefPairServiceTracker )
+ {
+ }
+
+ public void setTrackerOpened()
+ {
+ }
+
+ public void setPreviousRefMap( Map<ServiceReference<T>, RefPair<T>> previousRefMap )
+ {
+ }
+
+ public RefPair<T> addingService( ServiceReference<T> tServiceReference )
+ {
+ return null;
+ }
+
+ public void addedService( ServiceReference<T> tServiceReference, RefPair<T> service, int trackingCount )
+ {
+ }
+
+ public void modifiedService( ServiceReference<T> tServiceReference, RefPair<T> service, int trackingCount )
+ {
+ }
+
+ public void removedService( ServiceReference<T> tServiceReference, RefPair<T> service, int trackingCount )
+ {
+ }
+ }
+
//---------- Reference interface ------------------------------------------
public String getServiceName()
@@ -928,31 +980,6 @@
//---------- Service tracking support -------------------------------------
- /**
- * Enables this dependency manager by starting to listen for service
- * events.
- * @throws InvalidSyntaxException if the target filter is invalid
- */
- void enable() throws InvalidSyntaxException
- {
- if ( hasGetPermission() )
- {
- // setup the target filter from component descriptor
- setTargetFilter( m_dependencyMetadata.getTarget() );
-
- m_componentManager.log( LogService.LOG_DEBUG,
- "Registered for service events, currently {0} service(s) match the filter", new Object[]
- {new Integer( size() )}, null );
- }
- else
- {
- // no services available
- m_componentManager.log( LogService.LOG_DEBUG,
- "Not registered for service events since the bundle has no permission to get service {0}", new Object[]
- {m_dependencyMetadata.getInterface()}, null );
- }
- }
-
void deactivate()
{
@@ -1684,8 +1711,20 @@
* @param target The new target filter to be set. This may be
* <code>null</code> if no target filtering is to be used.
*/
- private void setTargetFilter( String target ) throws InvalidSyntaxException
+ 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)
+ {
+ target = m_dependencyMetadata.getTarget();
+ }
// do nothing if target filter does not change
if ( ( m_target == null && target == null ) || ( m_target != null && m_target.equals( target ) ) )
{