13
13
package org .eclipse .osgi .technology .webservices .registrar ;
14
14
15
15
import java .lang .annotation .Annotation ;
16
+ import java .util .Dictionary ;
16
17
import java .util .Map ;
17
18
import java .util .Objects ;
18
19
import java .util .WeakHashMap ;
19
20
import java .util .concurrent .ConcurrentHashMap ;
21
+ import java .util .concurrent .atomic .AtomicLong ;
20
22
21
23
import org .eclipse .osgi .technology .webservices .spi .EndpointPublisher ;
22
24
import org .osgi .annotation .bundle .Capability ;
23
25
import org .osgi .framework .Bundle ;
24
26
import org .osgi .framework .Constants ;
27
+ import org .osgi .framework .FrameworkUtil ;
25
28
import org .osgi .framework .ServiceReference ;
29
+ import org .osgi .framework .ServiceRegistration ;
26
30
import org .osgi .framework .dto .ServiceReferenceDTO ;
27
31
import org .osgi .namespace .implementation .ImplementationNamespace ;
32
+ import org .osgi .namespace .service .ServiceNamespace ;
28
33
import org .osgi .service .component .AnyService ;
29
34
import org .osgi .service .component .ComponentContext ;
30
35
import org .osgi .service .component .annotations .Activate ;
50
55
/**
51
56
* Endpoint registrar implementation
52
57
*/
53
- @ Component (immediate = true , service = { WebserviceServiceRuntime . class })
58
+ @ Component (immediate = true , service = {})
54
59
@ Capability (namespace = ImplementationNamespace .IMPLEMENTATION_NAMESPACE , //
55
60
name = WebserviceWhiteboardConstants .WEBSERVICE , //
56
61
version = WebserviceWhiteboardConstants .WEBSERVICE_SPECIFICATION_VERSION )
62
+ @ Capability (namespace = ServiceNamespace .SERVICE_NAMESPACE , attribute = {ServiceNamespace .CAPABILITY_OBJECTCLASS_ATTRIBUTE
63
+ + ":List<String>=\" org.osgi.service.webservice.runtime.WebserviceServiceRuntime\" ;uses:=\" org.osgi.service.webservice.runtime\" " })
57
64
public class EndpointRegistrar implements WebserviceServiceRuntime {
58
65
59
66
private Logger logger ;
@@ -63,6 +70,9 @@ public class EndpointRegistrar implements WebserviceServiceRuntime {
63
70
private Map <ServiceReference <?>, EndpointRegistration > endpointRegistrations = new ConcurrentHashMap <>();
64
71
private Map <EndpointPublisher , ServiceRanking > endpointPublisherMap = new ConcurrentHashMap <>();
65
72
private ComponentContext context ;
73
+ private final AtomicLong changeCount = new AtomicLong ();
74
+
75
+ private ServiceRegistration <WebserviceServiceRuntime > registerService ;
66
76
67
77
/**
68
78
* contructor
@@ -74,6 +84,14 @@ public class EndpointRegistrar implements WebserviceServiceRuntime {
74
84
public EndpointRegistrar (@ Reference (service = LoggerFactory .class ) Logger logger , ComponentContext context ) {
75
85
this .logger = logger ;
76
86
this .context = context ;
87
+ // WORKAROUND for https://github.com/osgi/osgi/issues/809
88
+ registerService = context .getBundleContext ().registerService (WebserviceServiceRuntime .class , this ,
89
+ getProperties ());
90
+
91
+ }
92
+
93
+ private Dictionary <String , Long > getProperties () {
94
+ return FrameworkUtil .asDictionary (Map .of (Constants .SERVICE_CHANGECOUNT , changeCount .getAndIncrement ()));
77
95
}
78
96
79
97
/**
@@ -103,6 +121,7 @@ public int value() {
103
121
logger .debug ("BINDING publisher={} with ranking={}" , publisher , ranking );
104
122
endpointPublisherMap .put (publisher , ranking );
105
123
updateAll ();
124
+ registerService .setProperties (getProperties ());
106
125
}
107
126
108
127
/**
@@ -114,6 +133,7 @@ public void removeEndpointPublisher(EndpointPublisher publisher) {
114
133
ServiceRanking ranking = endpointPublisherMap .remove (publisher );
115
134
logger .debug ("UNBINDING publisher={} with ranking={}" , publisher , ranking );
116
135
updateAll ();
136
+ registerService .setProperties (getProperties ());
117
137
}
118
138
119
139
/**
@@ -131,6 +151,7 @@ public void bindEndpointImplementor(ServiceReference<?> endpointImplementorRefer
131
151
replaced .dispose ();
132
152
}
133
153
registration .refresh ();
154
+ registerService .setProperties (getProperties ());
134
155
}
135
156
136
157
/**
@@ -143,6 +164,7 @@ public void unbindEndpointImplementor(ServiceReference<?> endpointImplementorRef
143
164
EndpointRegistration registration = endpointRegistrations .remove (endpointImplementorReference );
144
165
if (registration != null ) {
145
166
registration .dispose ();
167
+ registerService .setProperties (getProperties ());
146
168
}
147
169
}
148
170
@@ -159,6 +181,7 @@ public void addHandler(ServiceReference<Handler<? extends MessageContext>> handl
159
181
info .dispose ();
160
182
}
161
183
updateAll ();
184
+ registerService .setProperties (getProperties ());
162
185
}
163
186
164
187
/**
@@ -173,6 +196,7 @@ public void updateHandler(ServiceReference<Handler<? extends MessageContext>> ha
173
196
info .dispose ();
174
197
}
175
198
updateAll ();
199
+ registerService .setProperties (getProperties ());
176
200
}
177
201
178
202
/**
@@ -186,6 +210,7 @@ public void removeHandler(ServiceReference<Handler<? extends MessageContext>> ha
186
210
if (info != null ) {
187
211
info .dispose ();
188
212
updateAll ();
213
+ registerService .setProperties (getProperties ());
189
214
}
190
215
}
191
216
0 commit comments