starting to handle scope bundle
diff --git a/winegrower-core/src/main/java/org/apache/winegrower/deployer/BundleContextImpl.java b/winegrower-core/src/main/java/org/apache/winegrower/deployer/BundleContextImpl.java
index e0ebd9d..c027de5 100644
--- a/winegrower-core/src/main/java/org/apache/winegrower/deployer/BundleContextImpl.java
+++ b/winegrower-core/src/main/java/org/apache/winegrower/deployer/BundleContextImpl.java
@@ -23,6 +23,8 @@
import java.util.Arrays;
import java.util.Collection;
import java.util.Dictionary;
+import java.util.HashMap;
+import java.util.Map;
import java.util.Objects;
import java.util.function.Supplier;
import java.util.jar.Manifest;
@@ -36,6 +38,7 @@
import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleException;
import org.osgi.framework.BundleListener;
+import org.osgi.framework.Constants;
import org.osgi.framework.Filter;
import org.osgi.framework.FrameworkListener;
import org.osgi.framework.FrameworkUtil;
@@ -53,6 +56,7 @@
private final BundleRegistry registry;
private final Collection<BundleListener> bundleListeners = new ArrayList<>();
private final Collection<FrameworkListener> frameworkListeners = new ArrayList<>();
+ private final Map<ServiceReference<?>, Object> serviceInstances = new HashMap<>();
BundleContextImpl(final Manifest manifest, final OSGiServices services, final Supplier<Bundle> bundleSupplier,
final BundleRegistry registry) {
@@ -226,12 +230,20 @@
@Override
public <S> S getService(final ServiceReference<S> reference) {
- return (S) ServiceReferenceImpl.class.cast(reference).getReference();
+ final ServiceReferenceImpl ref = ServiceReferenceImpl.class.cast(reference);
+ if (Constants.SCOPE_BUNDLE.equals(ref.getProperty(Constants.SERVICE_SCOPE))) {
+ return (S) serviceInstances.computeIfAbsent(ref, r -> ref.getReference());
+ }
+ return (S) ref.getReference();
}
@Override
public boolean ungetService(final ServiceReference<?> reference) {
- return ServiceReferenceImpl.class.cast(reference).unget();
+ final ServiceReferenceImpl serviceReference = ServiceReferenceImpl.class.cast(reference);
+ if (Constants.SCOPE_BUNDLE.equals(serviceReference.getProperty(Constants.SERVICE_SCOPE))) {
+ return serviceInstances.remove(serviceReference) != null;
+ }
+ return serviceReference.unget();
}
@Override
diff --git a/winegrower-core/src/main/java/org/apache/winegrower/service/ServiceReferenceImpl.java b/winegrower-core/src/main/java/org/apache/winegrower/service/ServiceReferenceImpl.java
index 22aeddf..21e5953 100644
--- a/winegrower-core/src/main/java/org/apache/winegrower/service/ServiceReferenceImpl.java
+++ b/winegrower-core/src/main/java/org/apache/winegrower/service/ServiceReferenceImpl.java
@@ -32,8 +32,8 @@
ServiceReferenceImpl(final Dictionary<String, ?> properties, final Bundle bundle, final Object reference) {
this.properties = properties;
this.bundle = bundle;
- this.reference = reference;
this.usesFactory = ServiceFactory.class.isInstance(reference);
+ this.reference = reference;
}
public boolean hasFactory() {