You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicemix.apache.org by gn...@apache.org on 2011/06/09 16:22:05 UTC

svn commit: r1133885 - /servicemix/smx4/specs/trunk/locator/src/main/java/org/apache/servicemix/specs/locator/OsgiLocator.java

Author: gnodet
Date: Thu Jun  9 14:22:04 2011
New Revision: 1133885

URL: http://svn.apache.org/viewvc?rev=1133885&view=rev
Log:
[SMX4-860] ServiceMix specs should wait for an implementation for a certain amount of time when in OSGi

Modified:
    servicemix/smx4/specs/trunk/locator/src/main/java/org/apache/servicemix/specs/locator/OsgiLocator.java

Modified: servicemix/smx4/specs/trunk/locator/src/main/java/org/apache/servicemix/specs/locator/OsgiLocator.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/specs/trunk/locator/src/main/java/org/apache/servicemix/specs/locator/OsgiLocator.java?rev=1133885&r1=1133884&r2=1133885&view=diff
==============================================================================
--- servicemix/smx4/specs/trunk/locator/src/main/java/org/apache/servicemix/specs/locator/OsgiLocator.java (original)
+++ servicemix/smx4/specs/trunk/locator/src/main/java/org/apache/servicemix/specs/locator/OsgiLocator.java Thu Jun  9 14:22:04 2011
@@ -59,6 +59,9 @@ public class OsgiLocator {
                 factories.put(id, l);
             }
             l.add(0, factory);
+            synchronized (lock) {
+                lock.notifyAll();
+            }
         } finally {
             lock.writeLock().unlock();
         }
@@ -70,6 +73,30 @@ public class OsgiLocator {
     }
 
     public static <T> Class<? extends T> locate(Class<T> factoryClass, String factoryId) {
+        long timeout = 5000;
+        long t0 = -1;
+        long t1 = t0;
+        while (t1 - t0 < timeout) {
+            Class<? extends T> impl = doLocate(factoryClass, factoryId);
+            if (impl != null) {
+                return impl;
+            }
+            if (t0 == -1) {
+                t0 = t1 = System.currentTimeMillis();
+            }
+            synchronized (lock) {
+                try {
+                    lock.wait(timeout - (t1 - t0));
+                } catch (InterruptedException e) {
+                    return null;
+                }
+            }
+            t1 = System.currentTimeMillis();
+        }
+        return null;
+    }
+
+    private static <T> Class<? extends T> doLocate(Class<T> factoryClass, String factoryId) {
         lock.readLock().lock();
         try {
             if (factories != null) {