PageRenderTime 28ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 1ms

/modules/core/osgi-service-tracker-collections-test/src/testIntegration/java/com/liferay/osgi/service/tracker/collections/map/test/ListServiceTrackerMapTest.java

http://github.com/liferay/liferay-portal
Java | 673 lines | 451 code | 200 blank | 22 comment | 3 complexity | e48a1c4f2c6d0d03a8e0c2e4aed8d362 MD5 | raw file
Possible License(s): LGPL-2.0
  1. /**
  2. * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
  3. *
  4. * This library is free software; you can redistribute it and/or modify it under
  5. * the terms of the GNU Lesser General Public License as published by the Free
  6. * Software Foundation; either version 2.1 of the License, or (at your option)
  7. * any later version.
  8. *
  9. * This library is distributed in the hope that it will be useful, but WITHOUT
  10. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  11. * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
  12. * details.
  13. */
  14. package com.liferay.osgi.service.tracker.collections.map.test;
  15. import com.liferay.arquillian.extension.junit.bridge.junit.Arquillian;
  16. import com.liferay.osgi.service.tracker.collections.map.PropertyServiceReferenceMapper;
  17. import com.liferay.osgi.service.tracker.collections.map.ServiceTrackerMap;
  18. import com.liferay.osgi.service.tracker.collections.map.ServiceTrackerMapFactory;
  19. import com.liferay.osgi.service.tracker.collections.map.ServiceTrackerMapListener;
  20. import com.liferay.portal.kernel.test.rule.AggregateTestRule;
  21. import com.liferay.portal.test.rule.LiferayIntegrationTestRule;
  22. import java.util.ArrayList;
  23. import java.util.Arrays;
  24. import java.util.Collection;
  25. import java.util.Comparator;
  26. import java.util.Dictionary;
  27. import java.util.Hashtable;
  28. import java.util.Iterator;
  29. import java.util.List;
  30. import java.util.Map;
  31. import java.util.concurrent.atomic.AtomicInteger;
  32. import org.junit.After;
  33. import org.junit.Assert;
  34. import org.junit.Before;
  35. import org.junit.ClassRule;
  36. import org.junit.Rule;
  37. import org.junit.Test;
  38. import org.junit.runner.RunWith;
  39. import org.osgi.framework.Bundle;
  40. import org.osgi.framework.BundleContext;
  41. import org.osgi.framework.FrameworkUtil;
  42. import org.osgi.framework.ServiceReference;
  43. import org.osgi.framework.ServiceRegistration;
  44. /**
  45. * @author Carlos Sierra Andrés
  46. */
  47. @RunWith(Arquillian.class)
  48. public class ListServiceTrackerMapTest {
  49. @ClassRule
  50. @Rule
  51. public static final AggregateTestRule aggregateTestRule =
  52. new LiferayIntegrationTestRule();
  53. @Before
  54. public void setUp() {
  55. Bundle bundle = FrameworkUtil.getBundle(
  56. ListServiceTrackerMapTest.class);
  57. _bundleContext = bundle.getBundleContext();
  58. }
  59. @After
  60. public void tearDown() {
  61. _serviceTrackerMap.close();
  62. for (ServiceRegistration<?> serviceRegistration :
  63. _serviceRegistrations) {
  64. serviceRegistration.unregister();
  65. }
  66. _serviceRegistrations.clear();
  67. }
  68. @Test
  69. public void testGestServiceWithDifferentRanking() {
  70. _serviceTrackerMap = createServiceTrackerMap(_bundleContext);
  71. TrackedOne trackedOne1 = new TrackedOne();
  72. _serviceRegistrations.add(registerService(trackedOne1, 1));
  73. TrackedOne trackedOne3 = new TrackedOne();
  74. _serviceRegistrations.add(registerService(trackedOne3, 3));
  75. TrackedOne trackedOne2 = new TrackedOne();
  76. _serviceRegistrations.add(registerService(trackedOne2, 2));
  77. List<TrackedOne> trackedOnes = _serviceTrackerMap.getService("aTarget");
  78. Assert.assertEquals(trackedOnes.toString(), 3, trackedOnes.size());
  79. Iterator<? extends TrackedOne> iterator = trackedOnes.iterator();
  80. Assert.assertEquals(trackedOne3, iterator.next());
  81. Assert.assertEquals(trackedOne2, iterator.next());
  82. Assert.assertEquals(trackedOne1, iterator.next());
  83. }
  84. @Test
  85. public void testGestServiceWithUnregistering() {
  86. _serviceTrackerMap = createServiceTrackerMap(_bundleContext);
  87. TrackedOne trackedOne1 = new TrackedOne();
  88. _serviceRegistrations.add(registerService(trackedOne1, 1));
  89. TrackedOne trackedOne3 = new TrackedOne();
  90. _serviceRegistrations.add(registerService(trackedOne3, 3));
  91. TrackedOne trackedOne2 = new TrackedOne();
  92. ServiceRegistration<TrackedOne> serviceRegistration2 = registerService(
  93. trackedOne2, 2);
  94. List<TrackedOne> trackedOnes = _serviceTrackerMap.getService("aTarget");
  95. Assert.assertEquals(trackedOnes.toString(), 3, trackedOnes.size());
  96. Iterator<? extends TrackedOne> iterator = trackedOnes.iterator();
  97. serviceRegistration2.unregister();
  98. // Deregistering a service should not affect an already existing
  99. // collection or iterator
  100. Assert.assertEquals(trackedOne3, iterator.next());
  101. Assert.assertEquals(trackedOne2, iterator.next());
  102. Assert.assertEquals(trackedOne1, iterator.next());
  103. trackedOnes = _serviceTrackerMap.getService("aTarget");
  104. // Getting the list of services should return a list with the affected
  105. // changes
  106. Assert.assertEquals(trackedOnes.toString(), 2, trackedOnes.size());
  107. iterator = trackedOnes.iterator();
  108. Assert.assertEquals(trackedOne3, iterator.next());
  109. Assert.assertEquals(trackedOne1, iterator.next());
  110. }
  111. @Test
  112. public void testGestServiceWithUnregisteringAndCustomComparator() {
  113. _serviceTrackerMap = createServiceTrackerMap(
  114. _bundleContext, (serviceReference1, serviceReference2) -> 0);
  115. TrackedOne trackedOne1 = new TrackedOne();
  116. ServiceRegistration<TrackedOne> serviceRegistration1 = registerService(
  117. trackedOne1);
  118. ServiceRegistration<TrackedOne> serviceRegistration2 = registerService(
  119. new TrackedOne());
  120. TrackedOne trackedOne3 = new TrackedOne();
  121. ServiceRegistration<TrackedOne> serviceRegistration3 = registerService(
  122. trackedOne3);
  123. serviceRegistration2.unregister();
  124. List<TrackedOne> trackedOnes = _serviceTrackerMap.getService("aTarget");
  125. // Getting the list of services should return a list with the affected
  126. // changes
  127. Assert.assertEquals(trackedOnes.toString(), 2, trackedOnes.size());
  128. Assert.assertTrue(
  129. trackedOnes.toString(), trackedOnes.contains(trackedOne1));
  130. Assert.assertTrue(
  131. trackedOnes.toString(), trackedOnes.contains(trackedOne3));
  132. serviceRegistration3.unregister();
  133. trackedOnes = _serviceTrackerMap.getService("aTarget");
  134. Assert.assertEquals(trackedOnes.toString(), 1, trackedOnes.size());
  135. Assert.assertTrue(
  136. trackedOnes.toString(), trackedOnes.contains(trackedOne1));
  137. serviceRegistration1.unregister();
  138. }
  139. @Test
  140. public void testGetServicesIsNullAfterDeregistration() {
  141. _serviceTrackerMap = createServiceTrackerMap(_bundleContext);
  142. ServiceRegistration<TrackedOne> serviceRegistration1 = registerService(
  143. new TrackedOne());
  144. ServiceRegistration<TrackedOne> serviceRegistration2 = registerService(
  145. new TrackedOne());
  146. Assert.assertNotNull(_serviceTrackerMap.getService("aTarget"));
  147. serviceRegistration1.unregister();
  148. serviceRegistration2.unregister();
  149. Assert.assertNull(_serviceTrackerMap.getService("aTarget"));
  150. }
  151. @Test
  152. public void testGetServicesWithDifferentKeys() {
  153. _serviceTrackerMap = createServiceTrackerMap(_bundleContext);
  154. _serviceRegistrations.add(registerService(new TrackedOne(), "aTarget"));
  155. _serviceRegistrations.add(
  156. registerService(new TrackedOne(), "anotherTarget"));
  157. _serviceRegistrations.add(registerService(new TrackedOne(), "aTarget"));
  158. _serviceRegistrations.add(
  159. registerService(new TrackedOne(), "anotherTarget"));
  160. _serviceRegistrations.add(
  161. registerService(new TrackedOne(), "anotherTarget"));
  162. List<TrackedOne> aTargetList = _serviceTrackerMap.getService("aTarget");
  163. Assert.assertNotNull(aTargetList);
  164. Assert.assertEquals(aTargetList.toString(), 2, aTargetList.size());
  165. List<TrackedOne> anotherTargetList = _serviceTrackerMap.getService(
  166. "anotherTarget");
  167. Assert.assertNotNull(anotherTargetList);
  168. Assert.assertEquals(
  169. anotherTargetList.toString(), 3, anotherTargetList.size());
  170. }
  171. @Test
  172. public void testGetServiceWithChangingServiceRanking() {
  173. _serviceTrackerMap = createServiceTrackerMap(_bundleContext);
  174. TrackedOne trackedOne1 = new TrackedOne();
  175. ServiceRegistration<TrackedOne> serviceRegistration1 = registerService(
  176. trackedOne1, -1);
  177. TrackedOne trackedOne2 = new TrackedOne();
  178. ServiceRegistration<TrackedOne> serviceRegistration2 = registerService(
  179. trackedOne2, 0);
  180. TrackedOne trackedOne3 = new TrackedOne();
  181. ServiceRegistration<TrackedOne> serviceRegistration3 = registerService(
  182. trackedOne3, 1);
  183. List<TrackedOne> trackedOnes = _serviceTrackerMap.getService("aTarget");
  184. Assert.assertEquals(trackedOnes.toString(), 3, trackedOnes.size());
  185. Iterator<? extends TrackedOne> iterator = trackedOnes.iterator();
  186. Assert.assertEquals(trackedOne3, iterator.next());
  187. Assert.assertEquals(trackedOne2, iterator.next());
  188. Assert.assertEquals(trackedOne1, iterator.next());
  189. Hashtable<String, Object> properties = new Hashtable<>();
  190. properties.put("service.ranking", -2);
  191. properties.put("target", "aTarget");
  192. serviceRegistration3.setProperties(properties);
  193. trackedOnes = _serviceTrackerMap.getService("aTarget");
  194. Assert.assertEquals(trackedOnes.toString(), 3, trackedOnes.size());
  195. iterator = trackedOnes.iterator();
  196. Assert.assertEquals(trackedOne2, iterator.next());
  197. Assert.assertEquals(trackedOne1, iterator.next());
  198. Assert.assertEquals(trackedOne3, iterator.next());
  199. properties = new Hashtable<>();
  200. properties.put("service.ranking", 1);
  201. properties.put("target", "aTarget");
  202. serviceRegistration3.setProperties(properties);
  203. trackedOnes = _serviceTrackerMap.getService("aTarget");
  204. Assert.assertEquals(trackedOnes.toString(), 3, trackedOnes.size());
  205. iterator = trackedOnes.iterator();
  206. Assert.assertEquals(trackedOne3, iterator.next());
  207. Assert.assertEquals(trackedOne2, iterator.next());
  208. Assert.assertEquals(trackedOne1, iterator.next());
  209. properties = new Hashtable<>();
  210. properties.put("target", "aTarget");
  211. serviceRegistration2.setProperties(properties);
  212. serviceRegistration3.setProperties(properties);
  213. trackedOnes = _serviceTrackerMap.getService("aTarget");
  214. Assert.assertEquals(trackedOnes.toString(), 3, trackedOnes.size());
  215. iterator = trackedOnes.iterator();
  216. Assert.assertEquals(trackedOne2, iterator.next());
  217. Assert.assertEquals(trackedOne3, iterator.next());
  218. Assert.assertEquals(trackedOne1, iterator.next());
  219. serviceRegistration1.unregister();
  220. serviceRegistration2.unregister();
  221. serviceRegistration3.unregister();
  222. }
  223. @Test
  224. public void testGetServiceWithCustomComparatorReturningZero() {
  225. _serviceTrackerMap = ServiceTrackerMapFactory.openMultiValueMap(
  226. _bundleContext, TrackedOne.class, null,
  227. new PropertyServiceReferenceMapper<>("target"),
  228. (serviceReference1, serviceReference2) -> 0);
  229. _serviceRegistrations.add(registerService(new TrackedOne()));
  230. _serviceRegistrations.add(registerService(new TrackedOne()));
  231. List<TrackedOne> trackedOnes = _serviceTrackerMap.getService("aTarget");
  232. Assert.assertEquals(trackedOnes.toString(), 2, trackedOnes.size());
  233. }
  234. @Test
  235. public void testGetServiceWithRegisteredServiceRanking() {
  236. _serviceTrackerMap = createServiceTrackerMap(_bundleContext);
  237. TrackedOne trackedOne1 = new TrackedOne();
  238. ServiceRegistration<TrackedOne> serviceRegistration1 = registerService(
  239. trackedOne1);
  240. TrackedOne trackedOne2 = new TrackedOne();
  241. ServiceRegistration<TrackedOne> serviceRegistration2 = registerService(
  242. trackedOne2, 0);
  243. List<TrackedOne> trackedOnes = _serviceTrackerMap.getService("aTarget");
  244. Assert.assertEquals(trackedOnes.toString(), 2, trackedOnes.size());
  245. Iterator<TrackedOne> iterator = trackedOnes.iterator();
  246. Assert.assertEquals(trackedOne1, iterator.next());
  247. Assert.assertEquals(trackedOne2, iterator.next());
  248. serviceRegistration1.unregister();
  249. serviceRegistration1 = registerService(trackedOne1);
  250. TrackedOne trackedOne3 = new TrackedOne();
  251. ServiceRegistration<TrackedOne> serviceRegistration3 = registerService(
  252. trackedOne3, 1);
  253. trackedOnes = _serviceTrackerMap.getService("aTarget");
  254. Assert.assertEquals(trackedOnes.toString(), 3, trackedOnes.size());
  255. iterator = trackedOnes.iterator();
  256. Assert.assertEquals(trackedOne3, iterator.next());
  257. Assert.assertEquals(trackedOne2, iterator.next());
  258. Assert.assertEquals(trackedOne1, iterator.next());
  259. serviceRegistration1.unregister();
  260. serviceRegistration2.unregister();
  261. serviceRegistration3.unregister();
  262. }
  263. @Test
  264. public void testGetServiceWithSimpleRegistration() {
  265. _serviceTrackerMap = createServiceTrackerMap(_bundleContext);
  266. _serviceRegistrations.add(registerService(new TrackedOne()));
  267. List<TrackedOne> trackedOnes = _serviceTrackerMap.getService("aTarget");
  268. Assert.assertEquals(trackedOnes.toString(), 1, trackedOnes.size());
  269. }
  270. @Test
  271. public void testGetServiceWithSimpleRegistrationTwice() {
  272. _serviceTrackerMap = createServiceTrackerMap(_bundleContext);
  273. _serviceRegistrations.add(registerService(new TrackedOne()));
  274. _serviceRegistrations.add(registerService(new TrackedOne()));
  275. List<TrackedOne> trackedOnes = _serviceTrackerMap.getService("aTarget");
  276. Assert.assertEquals(trackedOnes.toString(), 2, trackedOnes.size());
  277. }
  278. @Test
  279. public void testOperationBalancesOutGetServiceAndUngetService() {
  280. BundleContextWrapper bundleContextWrapper = wrapContext();
  281. _serviceTrackerMap = createServiceTrackerMap(bundleContextWrapper);
  282. ServiceRegistration<TrackedOne> serviceRegistration1 = registerService(
  283. new TrackedOne());
  284. ServiceRegistration<TrackedOne> serviceRegistration2 = registerService(
  285. new TrackedOne());
  286. serviceRegistration2.unregister();
  287. serviceRegistration2 = registerService(new TrackedOne());
  288. serviceRegistration2.unregister();
  289. serviceRegistration1.unregister();
  290. Map<ServiceReference<?>, AtomicInteger> serviceReferenceCountsMap =
  291. bundleContextWrapper.getServiceReferenceCountsMap();
  292. Collection<AtomicInteger> serviceReferenceCounts =
  293. serviceReferenceCountsMap.values();
  294. Assert.assertEquals(
  295. serviceReferenceCounts.toString(), 3,
  296. serviceReferenceCounts.size());
  297. for (AtomicInteger serviceReferenceCount : serviceReferenceCounts) {
  298. Assert.assertEquals(0, serviceReferenceCount.get());
  299. }
  300. }
  301. @Test
  302. public void testServiceRegistrationInvokesServiceTrackerMapListener() {
  303. final Collection<TrackedOne> trackedOnes = new ArrayList<>();
  304. ServiceTrackerMapListener<String, TrackedOne, List<TrackedOne>>
  305. serviceTrackerMapListener =
  306. new ServiceTrackerMapListener
  307. <String, TrackedOne, List<TrackedOne>>() {
  308. @Override
  309. public void keyEmitted(
  310. ServiceTrackerMap<String, List<TrackedOne>>
  311. serviceTrackerMap,
  312. String key, TrackedOne serviceTrackedOne,
  313. List<TrackedOne> contentTrackedOnes) {
  314. trackedOnes.add(serviceTrackedOne);
  315. }
  316. @Override
  317. public void keyRemoved(
  318. ServiceTrackerMap<String, List<TrackedOne>>
  319. serviceTrackerMap,
  320. String key, TrackedOne serviceTrackedOne,
  321. List<TrackedOne> contentTrackedOnes) {
  322. }
  323. };
  324. _serviceTrackerMap = createServiceTrackerMap(serviceTrackerMapListener);
  325. _serviceRegistrations.add(registerService(new TrackedOne()));
  326. Assert.assertEquals(trackedOnes.toString(), 1, trackedOnes.size());
  327. }
  328. @Test
  329. public void testServiceTrackerMapListenerCannotModifyContent() {
  330. ServiceTrackerMapListener<String, TrackedOne, List<TrackedOne>>
  331. serviceTrackerMapListener =
  332. new ServiceTrackerMapListener
  333. <String, TrackedOne, List<TrackedOne>>() {
  334. @Override
  335. public void keyEmitted(
  336. ServiceTrackerMap<String, List<TrackedOne>>
  337. serviceTrackerMap,
  338. String key, TrackedOne serviceTrackedOne,
  339. List<TrackedOne> contentTrackedOnes) {
  340. try {
  341. contentTrackedOnes.add(new TrackedOne("spurious"));
  342. }
  343. catch (Exception exception) {
  344. }
  345. }
  346. @Override
  347. public void keyRemoved(
  348. ServiceTrackerMap<String, List<TrackedOne>>
  349. serviceTrackerMap,
  350. String key, TrackedOne serviceTrackedOne,
  351. List<TrackedOne> contentTrackedOnes) {
  352. }
  353. };
  354. _serviceTrackerMap = createServiceTrackerMap(serviceTrackerMapListener);
  355. _serviceRegistrations.add(registerService(new TrackedOne(), "aTarget"));
  356. List<TrackedOne> trackedOnes = _serviceTrackerMap.getService("aTarget");
  357. Assert.assertEquals(trackedOnes.toString(), 1, trackedOnes.size());
  358. }
  359. @Test
  360. public void testServiceTrackerMapListenerKeyEmitted() throws Throwable {
  361. final TrackedOne trackedOne = new TrackedOne();
  362. final Collection<Throwable> throwables = new ArrayList<>();
  363. ServiceTrackerMapListener<String, TrackedOne, List<TrackedOne>>
  364. serviceTrackerMapListener =
  365. new ServiceTrackerMapListener
  366. <String, TrackedOne, List<TrackedOne>>() {
  367. @Override
  368. public void keyEmitted(
  369. ServiceTrackerMap<String, List<TrackedOne>>
  370. serviceTrackerMap,
  371. String key, TrackedOne serviceTrackedOne,
  372. List<TrackedOne> contentTrackedOnes) {
  373. try {
  374. Assert.assertEquals("aTarget", key);
  375. Assert.assertEquals(trackedOne, serviceTrackedOne);
  376. Assert.assertEquals(
  377. contentTrackedOnes, Arrays.asList(trackedOne));
  378. }
  379. catch (Throwable throwable) {
  380. throwables.add(throwable);
  381. }
  382. }
  383. @Override
  384. public void keyRemoved(
  385. ServiceTrackerMap<String, List<TrackedOne>>
  386. serviceTrackerMap,
  387. String key, TrackedOne serviceTrackedOne,
  388. List<TrackedOne> contentTrackedOnes) {
  389. }
  390. };
  391. _serviceTrackerMap = createServiceTrackerMap(serviceTrackerMapListener);
  392. _serviceRegistrations.add(registerService(trackedOne, "aTarget"));
  393. for (Throwable throwable : throwables) {
  394. throw throwable;
  395. }
  396. }
  397. @Test
  398. public void testUnkeyedServiceReferencesBalanceReferenceCount() {
  399. BundleContextWrapper bundleContextWrapper = wrapContext();
  400. _serviceTrackerMap = ServiceTrackerMapFactory.openMultiValueMap(
  401. bundleContextWrapper, TrackedOne.class, null,
  402. (serviceReference, emitter) -> {
  403. });
  404. ServiceRegistration<TrackedOne> serviceRegistration1 = registerService(
  405. new TrackedOne());
  406. ServiceRegistration<TrackedOne> serviceRegistration2 = registerService(
  407. new TrackedOne());
  408. Map<ServiceReference<?>, AtomicInteger> serviceReferenceCountsMap =
  409. bundleContextWrapper.getServiceReferenceCountsMap();
  410. Collection<AtomicInteger> serviceReferenceCounts =
  411. serviceReferenceCountsMap.values();
  412. Assert.assertEquals(
  413. serviceReferenceCounts.toString(), 0,
  414. serviceReferenceCounts.size());
  415. serviceRegistration1.unregister();
  416. serviceRegistration2.unregister();
  417. Assert.assertEquals(
  418. serviceReferenceCounts.toString(), 0,
  419. serviceReferenceCounts.size());
  420. }
  421. protected ServiceTrackerMap<String, List<TrackedOne>>
  422. createServiceTrackerMap(BundleContext bundleContext) {
  423. return ServiceTrackerMapFactory.openMultiValueMap(
  424. bundleContext, TrackedOne.class, "target");
  425. }
  426. protected ServiceTrackerMap<String, List<TrackedOne>>
  427. createServiceTrackerMap(
  428. BundleContext bundleContext,
  429. Comparator<ServiceReference<TrackedOne>> comparator) {
  430. return ServiceTrackerMapFactory.openMultiValueMap(
  431. bundleContext, TrackedOne.class, null,
  432. new PropertyServiceReferenceMapper<>("target"), comparator);
  433. }
  434. protected ServiceTrackerMap<String, List<TrackedOne>>
  435. createServiceTrackerMap(
  436. ServiceTrackerMapListener<String, TrackedOne, List<TrackedOne>>
  437. serviceTrackerMapListener) {
  438. return ServiceTrackerMapFactory.openMultiValueMap(
  439. _bundleContext, TrackedOne.class, null,
  440. new PropertyServiceReferenceMapper<>("target"),
  441. serviceTrackerMapListener);
  442. }
  443. protected ServiceRegistration<TrackedOne> registerService(
  444. TrackedOne trackedOne) {
  445. return registerService(trackedOne, "aTarget");
  446. }
  447. protected ServiceRegistration<TrackedOne> registerService(
  448. TrackedOne trackedOne, int ranking) {
  449. return registerService(trackedOne, ranking, "aTarget");
  450. }
  451. protected ServiceRegistration<TrackedOne> registerService(
  452. TrackedOne trackedOne, int ranking, String target) {
  453. Dictionary<String, Object> properties = new Hashtable<>();
  454. properties.put("service.ranking", ranking);
  455. properties.put("target", target);
  456. return _bundleContext.registerService(
  457. TrackedOne.class, trackedOne, properties);
  458. }
  459. protected ServiceRegistration<TrackedOne> registerService(
  460. TrackedOne trackedOne, String target) {
  461. Dictionary<String, Object> properties = new Hashtable<>();
  462. properties.put("target", target);
  463. return _bundleContext.registerService(
  464. TrackedOne.class, trackedOne, properties);
  465. }
  466. protected BundleContextWrapper wrapContext() {
  467. return new BundleContextWrapper(_bundleContext);
  468. }
  469. private BundleContext _bundleContext;
  470. private final List<ServiceRegistration<?>> _serviceRegistrations =
  471. new ArrayList<>();
  472. private ServiceTrackerMap<String, List<TrackedOne>> _serviceTrackerMap;
  473. }