Skip to content

Commit 7cc4ad8

Browse files
author
Локтионов Артем
committed
PAXCDI-196: fix NPE in ServiceEventBridge, enabled BundleEventBridge and fire events to observers
1 parent 19db58c commit 7cc4ad8

File tree

3 files changed

+38
-17
lines changed

3 files changed

+38
-17
lines changed

pax-cdi-extension/src/main/java/org/ops4j/pax/cdi/extension/impl/BeanBundleImpl.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,17 @@ public class BeanBundleImpl {
5151
@Inject
5252
private ServiceEventBridge serviceEventBridge;
5353

54+
@Inject
55+
private BundleEventBridge bundleEventBridge;
56+
5457
/**
5558
* Register OSGi services when the bean is initialized
5659
*/
5760
public void onInitialized(@Observes ContainerInitialized event) {
5861
log.debug("onInitialized {}", bundleContext.getBundle());
5962
serviceEventBridge.start();
6063
componentLifecycleManager.start();
64+
bundleEventBridge.start();
6165
}
6266

6367
/**
@@ -68,5 +72,6 @@ public void onDestroy() {
6872
log.debug("onDestroy {}", bundleContext.getBundle());
6973
componentLifecycleManager.stop();
7074
serviceEventBridge.stop();
75+
bundleEventBridge.stop();
7176
}
7277
}

pax-cdi-extension/src/main/java/org/ops4j/pax/cdi/extension/impl/BundleEventBridge.java

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ public Void addingBundle(Bundle bundle, BundleEvent bundleEvent) {
7575
return null;
7676
}
7777
log.debug("adding bundle {} {}", bundle);
78-
Event<BundleCdiEvent> childEvent = select(bundleEvent);
78+
Event<BundleCdiEvent> childEvent = select(bundle, bundleEvent);
7979
childEvent.fire(new BundleCdiEvent(bundle, bundleEvent));
8080
return null;
8181
}
@@ -85,14 +85,16 @@ public Void addingBundle(Bundle bundle, BundleEvent bundleEvent) {
8585
* @return
8686
*/
8787
@SuppressWarnings("serial")
88-
private Event<BundleCdiEvent> select(BundleEvent bundleEvent) {
88+
private Event<BundleCdiEvent> select(Bundle bundle, BundleEvent bundleEvent) {
8989
if (bundleEvent != null) {
9090
switch (bundleEvent.getType()) {
91-
case BundleEvent.STARTED:
91+
case BundleEvent.STARTING:
92+
// case BundleEvent.STARTED:
9293
return event.select(new AnnotationLiteral<BundleStarted>() {
9394
});
9495

95-
case BundleEvent.STOPPED:
96+
// case BundleEvent.STOPPED:
97+
case BundleEvent.STOPPING:
9698
return event.select(new AnnotationLiteral<BundleStopped>() {
9799
});
98100

@@ -101,19 +103,31 @@ private Event<BundleCdiEvent> select(BundleEvent bundleEvent) {
101103
}
102104
}
103105
else {
104-
return event;
106+
switch (bundle.getState()) {
107+
case Bundle.ACTIVE:
108+
return event.select(new AnnotationLiteral<BundleStarted>() {
109+
});
110+
111+
case Bundle.RESOLVED:
112+
return event.select(new AnnotationLiteral<BundleStopped>() {
113+
});
114+
115+
default:
116+
return event;
117+
}
118+
105119
}
106120
}
107121

108122
@Override
109123
public void modifiedBundle(Bundle bundle, BundleEvent bundleEvent, Void object) {
110-
Event<BundleCdiEvent> childEvent = select(bundleEvent);
124+
Event<BundleCdiEvent> childEvent = select(bundle, bundleEvent);
111125
childEvent.fire(new BundleCdiEvent(bundle, bundleEvent));
112126
}
113127

114128
@Override
115129
public void removedBundle(Bundle bundle, BundleEvent bundleEvent, Void object) {
116-
Event<BundleCdiEvent> childEvent = select(bundleEvent);
130+
Event<BundleCdiEvent> childEvent = select(bundle, bundleEvent);
117131
childEvent.fire(new BundleCdiEvent(bundle, bundleEvent));
118132
}
119133
}

pax-cdi-extension/src/main/java/org/ops4j/pax/cdi/extension/impl/ServiceEventBridge.java

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -63,16 +63,18 @@ public void serviceChanged(ServiceEvent serviceEvent) {
6363
createServiceObjectsWrapper(bundleContext, serviceReference);
6464
Object service = serviceObjects.getService();
6565

66-
try {
67-
Class klass = service.getClass();
68-
event.select(klass, qualifier).fire(service);
69-
70-
TypeLiteral literal = new ParameterizedTypeLiteral(ServiceCdiEvent.class, klass);
71-
ServiceCdiEvent cdiEvent = new ServiceCdiEvent(serviceReference, service);
72-
event.select(literal, qualifier).fire(cdiEvent);
73-
}
74-
finally {
75-
serviceObjects.ungetService(service);
66+
if (service != null) {
67+
try {
68+
Class klass = service.getClass();
69+
event.select(klass, qualifier).fire(service);
70+
71+
TypeLiteral literal = new ParameterizedTypeLiteral(ServiceCdiEvent.class, klass);
72+
ServiceCdiEvent cdiEvent = new ServiceCdiEvent(serviceReference, service);
73+
event.select(literal, qualifier).fire(cdiEvent);
74+
}
75+
finally {
76+
serviceObjects.ungetService(service);
77+
}
7678
}
7779
}
7880

0 commit comments

Comments
 (0)