You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by ma...@apache.org on 2012/09/27 23:30:59 UTC

svn commit: r1391225 - in /felix/trunk/deviceaccess/src/main/java/org/apache/felix/das: Activator.java DeviceManager.java util/DriverMatcher.java

Author: marrs
Date: Thu Sep 27 21:30:58 2012
New Revision: 1391225

URL: http://svn.apache.org/viewvc?rev=1391225&view=rev
Log:
FELIX-3660 Applied the supplied patch.

Modified:
    felix/trunk/deviceaccess/src/main/java/org/apache/felix/das/Activator.java
    felix/trunk/deviceaccess/src/main/java/org/apache/felix/das/DeviceManager.java
    felix/trunk/deviceaccess/src/main/java/org/apache/felix/das/util/DriverMatcher.java

Modified: felix/trunk/deviceaccess/src/main/java/org/apache/felix/das/Activator.java
URL: http://svn.apache.org/viewvc/felix/trunk/deviceaccess/src/main/java/org/apache/felix/das/Activator.java?rev=1391225&r1=1391224&r2=1391225&view=diff
==============================================================================
--- felix/trunk/deviceaccess/src/main/java/org/apache/felix/das/Activator.java (original)
+++ felix/trunk/deviceaccess/src/main/java/org/apache/felix/das/Activator.java Thu Sep 27 21:30:58 2012
@@ -41,10 +41,10 @@ public class Activator extends Dependenc
 {
 
     /** the bundle context */
-    private BundleContext m_context;
+    private volatile BundleContext m_context;
 
     /** the dependency manager */
-    private DependencyManager m_manager;
+    private volatile DependencyManager m_manager;
 
     /** the device manager */
     private DeviceManager m_deviceManager;
@@ -96,7 +96,7 @@ public class Activator extends Dependenc
             .setCallbacks( "locatorAdded", "locatorRemoved" ) );
         
         svc.add( createServiceDependency().setService( Driver.class, driverFilter ).setRequired( false )
-    		.setCallbacks( "driverAdded", "driverRemoved" ) );
+    		.setCallbacks( "driverAdded", "driverModified", "driverRemoved" ) );
         
         svc.add( createServiceDependency().setService( deviceFilter ).setRequired( false )
     		.setCallbacks( "deviceAdded", "deviceModified", "deviceRemoved" ) );

Modified: felix/trunk/deviceaccess/src/main/java/org/apache/felix/das/DeviceManager.java
URL: http://svn.apache.org/viewvc/felix/trunk/deviceaccess/src/main/java/org/apache/felix/das/DeviceManager.java?rev=1391225&r1=1391224&r2=1391225&view=diff
==============================================================================
--- felix/trunk/deviceaccess/src/main/java/org/apache/felix/das/DeviceManager.java (original)
+++ felix/trunk/deviceaccess/src/main/java/org/apache/felix/das/DeviceManager.java Thu Sep 27 21:30:58 2012
@@ -211,15 +211,26 @@ public class DeviceManager implements Lo
         debug( "driver appeared: " + Util.showDriver( ref ) );
         
         //immediately check for idle devices
-//        submit( new CheckForIdleDevices() );
+        submit( new CheckForIdleDevices() );
     }
 
+    public void driverModified( ServiceReference ref, Object obj )
+    {
+        final Driver driver = Driver.class.cast( obj );
+        
+        debug( "driver modified: " + Util.showDriver( ref ) );
+        m_drivers.remove( ref );
+        m_drivers.put( ref , new DriverAttributes( ref, driver ) );
+
+        // check if devices have become idle
+        // after some time
+        schedule( new CheckForIdleDevices() );
+    }
 
     public void driverRemoved( ServiceReference ref )
     {
-        String driverId = String.class.cast( ref.getProperty( Constants.DRIVER_ID ) );
         debug( "driver lost: " + Util.showDriver( ref ) );
-        m_drivers.remove( driverId );
+        m_drivers.remove( ref );
 
         // check if devices have become idle
         // after some time
@@ -464,6 +475,11 @@ public class DeviceManager implements Lo
     private boolean isDriverBundle( Bundle bundle )
     {
         ServiceReference[] refs = bundle.getRegisteredServices();
+        
+        if (refs == null) {
+            return false;
+        }
+        
         for ( ServiceReference ref : refs )
         {
             if ( m_driverImplFilter.match( ref ) )
@@ -491,7 +507,14 @@ public class DeviceManager implements Lo
             {
                 // just call the tryUninstall; the da itself
                 // will know if it should really uninstall the driver.
-                da.tryUninstall();
+                try 
+                { 
+                	da.tryUninstall(); 
+                }
+                catch (Exception e) 
+                {
+                	debug(da.getDriverId() + " uninstall failed");
+                }
             }
 
             return null;
@@ -557,7 +580,7 @@ public class DeviceManager implements Lo
 
             // first find matching driver bundles
             // if there are no driver locators
-            // we'll have to do with the drivers that where
+            // we'll have to do with the drivers that were
             // added 'manually'
             Set<String> driverIds = m_driverLoader.findDrivers( m_locators, dict );
 
@@ -673,8 +696,7 @@ public class DeviceManager implements Lo
                 // its a referral
                 info( "attach led to a referral to: " + newDriverId );
                 m_excluded.add( m_finalDriver );
-                return driverAttachment( dict, new String[]
-                    { newDriverId } );
+                return driverAttachment( dict, new String[]{ newDriverId } );
             }
             catch ( Throwable t )
             {

Modified: felix/trunk/deviceaccess/src/main/java/org/apache/felix/das/util/DriverMatcher.java
URL: http://svn.apache.org/viewvc/felix/trunk/deviceaccess/src/main/java/org/apache/felix/das/util/DriverMatcher.java?rev=1391225&r1=1391224&r2=1391225&view=diff
==============================================================================
--- felix/trunk/deviceaccess/src/main/java/org/apache/felix/das/util/DriverMatcher.java (original)
+++ felix/trunk/deviceaccess/src/main/java/org/apache/felix/das/util/DriverMatcher.java Thu Sep 27 21:30:58 2012
@@ -27,6 +27,7 @@ import java.util.TreeMap;
 
 import org.apache.felix.das.DriverAttributes;
 import org.apache.felix.das.Log;
+import org.osgi.framework.Bundle;
 import org.osgi.framework.ServiceReference;
 import org.osgi.service.device.Constants;
 import org.osgi.service.device.DriverSelector;
@@ -109,9 +110,20 @@ public class DriverMatcher
 
     public Match selectBestMatch( ServiceReference deviceRef, DriverSelector selector )
     {
-        Match[] matches = m_matches.toArray( new Match[0] );
+//        Match[] matches = m_matches.toArray( new Match[0] );
+        
+        //(re)check bundle status
+        List<Match> activeMatches = new ArrayList<Match>();
+        for (Match match : m_matches) {
+            if (match.getDriver().getBundle().getState() == Bundle.ACTIVE) {
+                activeMatches.add(match);
+            } else {
+                m_log.debug("skipping: " + match + ", it's bundle is: " + match.getDriver().getBundle().getState());
+            }
+        }
         try
         {
+          Match[] matches = activeMatches.toArray( new Match[0] );
             int index = selector.select( deviceRef, matches );
             if ( index != DriverSelector.SELECT_NONE && index >= 0 && index < matches.length )
             {