ensure injection uses OSGi lookup (ServiceTracker) and go through hooks instead of bypassing them
diff --git a/winegrower-core/src/main/java/org/apache/winegrower/service/OSGiServices.java b/winegrower-core/src/main/java/org/apache/winegrower/service/OSGiServices.java
index da9e824..3d1ad0b 100644
--- a/winegrower-core/src/main/java/org/apache/winegrower/service/OSGiServices.java
+++ b/winegrower-core/src/main/java/org/apache/winegrower/service/OSGiServices.java
@@ -13,7 +13,6 @@
*/
package org.apache.winegrower.service;
-import static java.util.Arrays.asList;
import static java.util.Collections.list;
import static java.util.Optional.ofNullable;
import static java.util.stream.Collectors.groupingBy;
@@ -53,6 +52,7 @@
import org.osgi.service.cm.ManagedService;
import org.osgi.service.event.EventConstants;
import org.osgi.service.event.EventHandler;
+import org.osgi.util.tracker.ServiceTracker;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -125,10 +125,15 @@
}
public <T> Optional<T> findService(final Class<T> type) {
- return services.stream()
- .filter(it -> asList(it.getClasses()).contains(type.getName()))
- .findFirst()
- .map(reg -> (T) ServiceReferenceImpl.class.cast(reg.getReference()).getReference());
+ final Bundle bundle = framework.getRegistry().getBundles().get(0L).getBundle();
+ final ServiceTracker<T, T> tracker = new ServiceTracker<>(bundle.getBundleContext(), type, null);
+ tracker.open();
+ try {
+ return ofNullable(tracker.waitForService(0L));
+ } catch (final InterruptedException e) {
+ Thread.currentThread().interrupt();
+ throw new IllegalStateException(e);
+ }
}
public synchronized void addListener(final ServiceListener listener, final Filter filter,
diff --git a/winegrower-core/src/test/java/org/apache/winegrower/service/HookTest.java b/winegrower-core/src/test/java/org/apache/winegrower/service/HookTest.java
index e823d5d..c2e4dfa 100644
--- a/winegrower-core/src/test/java/org/apache/winegrower/service/HookTest.java
+++ b/winegrower-core/src/test/java/org/apache/winegrower/service/HookTest.java
@@ -24,9 +24,7 @@
import org.apache.winegrower.test.hook.SimpleService;
import org.junit.jupiter.api.Test;
import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceReference;
import org.osgi.util.tracker.ServiceTracker;
-import org.osgi.util.tracker.ServiceTrackerCustomizer;
class HookTest {
@Test
@@ -39,23 +37,7 @@
.map(BundleImpl::getBundleContext)
.orElseThrow(IllegalStateException::new);
final ServiceTracker<SimpleService, SimpleService> tracker = new ServiceTracker<>(
- bundleContext, SimpleService.class,
- new ServiceTrackerCustomizer<SimpleService, SimpleService>() {
- @Override
- public SimpleService addingService(final ServiceReference<SimpleService> serviceReference) {
- return serviceReference.getBundle().getBundleContext().getService(serviceReference);
- }
-
- @Override
- public void modifiedService(final ServiceReference<SimpleService> serviceReference, final SimpleService simpleService) {
- // no-op
- }
-
- @Override
- public void removedService(final ServiceReference<SimpleService> serviceReference, final SimpleService simpleService) {
- // no-op
- }
- });
+ bundleContext, SimpleService.class, null);
tracker.open();
tracker.waitForService(5000L);
assertEquals("I am the replacement", tracker.getService().get());