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) {