PageRenderTime 26ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

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

http://github.com/liferay/liferay-portal
Java | 918 lines | 642 code | 260 blank | 16 comment | 4 complexity | e47b21b485bc766e3bac940cfb27e6e6 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.ServiceTrackerMapBuilder;
  17. import com.liferay.osgi.service.tracker.collections.map.PropertyServiceReferenceMapper;
  18. import com.liferay.osgi.service.tracker.collections.map.ServiceReferenceMapper;
  19. import com.liferay.osgi.service.tracker.collections.map.ServiceTrackerCustomizerFactory;
  20. import com.liferay.osgi.service.tracker.collections.map.ServiceTrackerCustomizerFactory.ServiceWrapper;
  21. import com.liferay.osgi.service.tracker.collections.map.ServiceTrackerMap;
  22. import com.liferay.osgi.service.tracker.collections.map.ServiceTrackerMapFactory;
  23. import com.liferay.portal.kernel.test.rule.AggregateTestRule;
  24. import com.liferay.portal.test.rule.LiferayIntegrationTestRule;
  25. import java.util.ArrayList;
  26. import java.util.Arrays;
  27. import java.util.Collection;
  28. import java.util.Comparator;
  29. import java.util.Dictionary;
  30. import java.util.Hashtable;
  31. import java.util.List;
  32. import java.util.Map;
  33. import java.util.concurrent.atomic.AtomicInteger;
  34. import org.junit.After;
  35. import org.junit.Assert;
  36. import org.junit.Before;
  37. import org.junit.ClassRule;
  38. import org.junit.Rule;
  39. import org.junit.Test;
  40. import org.junit.runner.RunWith;
  41. import org.osgi.framework.Bundle;
  42. import org.osgi.framework.BundleContext;
  43. import org.osgi.framework.FrameworkUtil;
  44. import org.osgi.framework.ServiceReference;
  45. import org.osgi.framework.ServiceRegistration;
  46. import org.osgi.util.tracker.ServiceTrackerCustomizer;
  47. /**
  48. * @author Carlos Sierra Andrés
  49. */
  50. @RunWith(Arquillian.class)
  51. public class ObjectServiceTrackerMapTest {
  52. @ClassRule
  53. @Rule
  54. public static final AggregateTestRule aggregateTestRule =
  55. new LiferayIntegrationTestRule();
  56. @Before
  57. public void setUp() {
  58. Bundle bundle = FrameworkUtil.getBundle(
  59. ObjectServiceTrackerMapTest.class);
  60. _bundleContext = bundle.getBundleContext();
  61. }
  62. @After
  63. public void tearDown() {
  64. if (_serviceTrackerMap != null) {
  65. _serviceTrackerMap.close();
  66. _serviceTrackerMap = null;
  67. }
  68. for (ServiceRegistration<?> serviceRegistration :
  69. _serviceRegistrations) {
  70. serviceRegistration.unregister();
  71. }
  72. _serviceRegistrations.clear();
  73. }
  74. @Test
  75. public void testGetServiceAfterRemoval() {
  76. ServiceTrackerMap<String, TrackedOne> serviceTrackerMap =
  77. createServiceTrackerMap(_bundleContext);
  78. ServiceRegistration<TrackedOne> serviceRegistration = registerService(
  79. new TrackedOne());
  80. Assert.assertNotNull(serviceTrackerMap.getService("aTarget"));
  81. serviceRegistration.unregister();
  82. Assert.assertNull(serviceTrackerMap.getService("aTarget"));
  83. }
  84. @Test
  85. public void testGetServiceGetsReplacedAfterRemoval() {
  86. ServiceTrackerMap<String, TrackedOne> serviceTrackerMap =
  87. createServiceTrackerMap(_bundleContext);
  88. TrackedOne trackedOne1 = new TrackedOne();
  89. ServiceRegistration<TrackedOne> serviceRegistration1 = registerService(
  90. trackedOne1, 2);
  91. TrackedOne trackedOne2 = new TrackedOne();
  92. ServiceRegistration<TrackedOne> serviceRegistration2 = registerService(
  93. trackedOne2, 1);
  94. Assert.assertEquals(
  95. trackedOne1, serviceTrackerMap.getService("aTarget"));
  96. serviceRegistration1.unregister();
  97. Assert.assertEquals(
  98. trackedOne2, serviceTrackerMap.getService("aTarget"));
  99. serviceRegistration2.unregister();
  100. }
  101. @Test
  102. public void testGetServiceGetsReplacedAfterRemovalInverseOrder() {
  103. ServiceTrackerMap<String, TrackedOne> serviceTrackerMap =
  104. createServiceTrackerMap(_bundleContext);
  105. TrackedOne trackedOne2 = new TrackedOne();
  106. ServiceRegistration<TrackedOne> serviceRegistration1 = registerService(
  107. trackedOne2, 1);
  108. TrackedOne trackedOne1 = new TrackedOne();
  109. ServiceRegistration<TrackedOne> serviceRegistration2 = registerService(
  110. trackedOne1, 2);
  111. Assert.assertEquals(
  112. trackedOne1, serviceTrackerMap.getService("aTarget"));
  113. serviceRegistration2.unregister();
  114. Assert.assertEquals(
  115. trackedOne2, serviceTrackerMap.getService("aTarget"));
  116. serviceRegistration1.unregister();
  117. }
  118. @Test
  119. public void testGetServiceInvokesCustomizerOnlyOnce() {
  120. final AtomicInteger atomicInteger = new AtomicInteger(0);
  121. _serviceTrackerMap = ServiceTrackerMapFactory.openSingleValueMap(
  122. _bundleContext, TrackedOne.class, "(target=*)",
  123. (serviceReference, emitter) -> {
  124. emitter.emit("one");
  125. emitter.emit("two");
  126. },
  127. new ServiceTrackerCustomizer<TrackedOne, TrackedOne>() {
  128. @Override
  129. public TrackedOne addingService(
  130. ServiceReference<TrackedOne> serviceReference) {
  131. atomicInteger.incrementAndGet();
  132. return _bundleContext.getService(serviceReference);
  133. }
  134. @Override
  135. public void modifiedService(
  136. ServiceReference<TrackedOne> serviceReference,
  137. TrackedOne trackedTwo) {
  138. }
  139. @Override
  140. public void removedService(
  141. ServiceReference<TrackedOne> serviceReference,
  142. TrackedOne trackedTwo) {
  143. _bundleContext.ungetService(serviceReference);
  144. }
  145. });
  146. TrackedOne trackedOne = new TrackedOne("1");
  147. ServiceRegistration<TrackedOne> serviceRegistration = registerService(
  148. trackedOne, "one");
  149. Assert.assertEquals(_serviceTrackerMap.getService("one"), trackedOne);
  150. Assert.assertEquals(_serviceTrackerMap.getService("two"), trackedOne);
  151. Assert.assertEquals(1, atomicInteger.get());
  152. serviceRegistration.unregister();
  153. }
  154. @Test
  155. public void testGetServiceIsNullAfterDeregistration() {
  156. ServiceTrackerMap<String, TrackedOne> serviceTrackerMap =
  157. createServiceTrackerMap(_bundleContext);
  158. ServiceRegistration<TrackedOne> serviceRegistration1 = registerService(
  159. new TrackedOne());
  160. ServiceRegistration<TrackedOne> serviceRegistration2 = registerService(
  161. new TrackedOne());
  162. ServiceRegistration<TrackedOne> serviceRegistration3 = registerService(
  163. new TrackedOne());
  164. Assert.assertNotNull(serviceTrackerMap.getService("aTarget"));
  165. serviceRegistration1.unregister();
  166. serviceRegistration2.unregister();
  167. serviceRegistration3.unregister();
  168. Assert.assertNull(serviceTrackerMap.getService("aTarget"));
  169. }
  170. @Test
  171. public void testGetServiceWithChangingServiceRanking() {
  172. ServiceTrackerMap<String, TrackedOne> serviceTrackerMap =
  173. createServiceTrackerMap(_bundleContext);
  174. TrackedOne trackedOne1 = new TrackedOne();
  175. ServiceRegistration<TrackedOne> serviceRegistration1 = registerService(
  176. trackedOne1, 3);
  177. TrackedOne trackedOne2 = new TrackedOne();
  178. ServiceRegistration<TrackedOne> serviceRegistration2 = registerService(
  179. trackedOne2, 2);
  180. TrackedOne trackedOne3 = new TrackedOne();
  181. ServiceRegistration<TrackedOne> serviceRegistration3 = registerService(
  182. trackedOne3, 1);
  183. Assert.assertEquals(
  184. trackedOne1, serviceTrackerMap.getService("aTarget"));
  185. Dictionary<String, Object> properties = new Hashtable<>();
  186. properties.put("service.ranking", 0);
  187. properties.put("target", "aTarget");
  188. serviceRegistration1.setProperties(properties);
  189. Assert.assertEquals(
  190. trackedOne2, serviceTrackerMap.getService("aTarget"));
  191. serviceRegistration2.unregister();
  192. Assert.assertEquals(
  193. trackedOne3, serviceTrackerMap.getService("aTarget"));
  194. serviceRegistration3.unregister();
  195. Assert.assertEquals(
  196. trackedOne1, serviceTrackerMap.getService("aTarget"));
  197. serviceRegistration1.unregister();
  198. }
  199. @Test
  200. public void testGetServiceWithCustomComparator() {
  201. ServiceReferenceMapper<String, TrackedOne>
  202. propertyServiceReferenceMapper =
  203. new PropertyServiceReferenceMapper<>("target");
  204. _serviceTrackerMap = ServiceTrackerMapFactory.openSingleValueMap(
  205. _bundleContext, TrackedOne.class, "(target=*)",
  206. propertyServiceReferenceMapper, (sr1, sr2) -> sr1.compareTo(sr2));
  207. TrackedOne trackedOne1 = new TrackedOne();
  208. ServiceRegistration<TrackedOne> serviceRegistration1 = registerService(
  209. trackedOne1);
  210. TrackedOne trackedOne2 = new TrackedOne();
  211. ServiceRegistration<TrackedOne> serviceRegistration2 = registerService(
  212. trackedOne2);
  213. Assert.assertEquals(
  214. trackedOne2, _serviceTrackerMap.getService("aTarget"));
  215. serviceRegistration1.unregister();
  216. serviceRegistration2.unregister();
  217. _serviceRegistrations.add(registerService(trackedOne2));
  218. _serviceRegistrations.add(registerService(trackedOne1));
  219. Assert.assertEquals(
  220. trackedOne1, _serviceTrackerMap.getService("aTarget"));
  221. }
  222. @Test
  223. public void testGetServiceWithCustomComparatorWithBuilder() {
  224. ServiceTrackerMapBuilder.Selector<TrackedOne, TrackedOne> selector =
  225. ServiceTrackerMapBuilder.SelectorFactory.newSelector(
  226. _bundleContext, TrackedOne.class);
  227. ServiceTrackerMapBuilder.Mapper
  228. <String, TrackedOne, TrackedOne, TrackedOne> mapper = selector.map(
  229. "target");
  230. ServiceTrackerMapBuilder.Collector
  231. <String, TrackedOne, TrackedOne, TrackedOne> collector =
  232. mapper.collectSingleValue(Comparator.naturalOrder());
  233. _serviceTrackerMap = collector.build();
  234. TrackedOne trackedOne1 = new TrackedOne();
  235. ServiceRegistration<TrackedOne> serviceRegistration1 = registerService(
  236. trackedOne1);
  237. TrackedOne trackedOne2 = new TrackedOne();
  238. ServiceRegistration<TrackedOne> serviceRegistration2 = registerService(
  239. trackedOne2);
  240. Assert.assertEquals(
  241. trackedOne2, _serviceTrackerMap.getService("aTarget"));
  242. serviceRegistration1.unregister();
  243. serviceRegistration2.unregister();
  244. _serviceRegistrations.add(registerService(trackedOne2));
  245. _serviceRegistrations.add(registerService(trackedOne1));
  246. Assert.assertEquals(
  247. trackedOne1, _serviceTrackerMap.getService("aTarget"));
  248. }
  249. @Test
  250. public void testGetServiceWithCustomServiceReferenceMapper() {
  251. _serviceTrackerMap = ServiceTrackerMapFactory.openSingleValueMap(
  252. _bundleContext, TrackedOne.class, "(&(other=*)(target=*))",
  253. (serviceReference, keys) -> keys.emit(
  254. serviceReference.getProperty("other") + " - " +
  255. serviceReference.getProperty("target")));
  256. Dictionary<String, String> properties = new Hashtable<>();
  257. properties.put("other", "aProperty");
  258. properties.put("target", "aTarget");
  259. _serviceRegistrations.add(
  260. _bundleContext.registerService(
  261. TrackedOne.class, new TrackedOne(), properties));
  262. Assert.assertNotNull(
  263. _serviceTrackerMap.getService("aProperty - aTarget"));
  264. }
  265. @Test
  266. public void testGetServiceWithCustomServiceReferenceMapperAndBuilder() {
  267. ServiceTrackerMapBuilder.Selector<TrackedOne, TrackedOne> selector =
  268. ServiceTrackerMapBuilder.SelectorFactory.newSelector(
  269. _bundleContext, TrackedOne.class
  270. ).newSelector(
  271. "(&(other=*)(target=*)(!(forbidden=*)))"
  272. );
  273. ServiceTrackerMapBuilder.Mapper<String, TrackedOne, TrackedOne, ?>
  274. mapper = selector.map(
  275. (sr, keys) -> keys.emit(
  276. sr.getProperty("other") + " - " +
  277. sr.getProperty("target")));
  278. ServiceTrackerMapBuilder.Collector
  279. <String, TrackedOne, TrackedOne, TrackedOne> collector =
  280. mapper.collectSingleValue();
  281. _serviceTrackerMap = collector.build();
  282. Dictionary<String, String> properties = new Hashtable<>();
  283. properties.put("other", "aProperty");
  284. properties.put("target", "aTarget");
  285. _serviceRegistrations.add(
  286. _bundleContext.registerService(
  287. TrackedOne.class, new TrackedOne(), properties));
  288. Assert.assertNotNull(
  289. _serviceTrackerMap.getService("aProperty - aTarget"));
  290. properties = new Hashtable<>();
  291. properties.put("forbidden", "true");
  292. properties.put("other", "aProperty2");
  293. properties.put("target", "aTarget2");
  294. _serviceRegistrations.add(
  295. _bundleContext.registerService(
  296. TrackedOne.class, new TrackedOne(), properties));
  297. Assert.assertNull(
  298. _serviceTrackerMap.getService("aProperty2 - aTarget2"));
  299. }
  300. @Test
  301. public void testGetServiceWithIncorrectKey() {
  302. ServiceTrackerMap<String, TrackedOne> serviceTrackerMap =
  303. createServiceTrackerMap(_bundleContext);
  304. _serviceRegistrations.add(
  305. registerService(new TrackedOne(), "anotherTarget"));
  306. Assert.assertNull(serviceTrackerMap.getService("aTarget"));
  307. }
  308. @Test
  309. public void testGetServiceWithListProperty() {
  310. _serviceTrackerMap = ServiceTrackerMapFactory.openSingleValueMap(
  311. _bundleContext, null, "target");
  312. _serviceRegistrations.add(
  313. registerService(
  314. new TrackedOne(), Arrays.asList("target1", "target2")));
  315. Assert.assertNotNull(_serviceTrackerMap.getService("target1"));
  316. Assert.assertNotNull(_serviceTrackerMap.getService("target2"));
  317. }
  318. @Test
  319. public void testGetServiceWithModifiedService() {
  320. _serviceTrackerMap = createServiceTrackerMap(_bundleContext);
  321. Hashtable<String, Object> properties = new Hashtable<>();
  322. properties.put("target", new String[] {"one", "two"});
  323. ServiceRegistration<TrackedOne> serviceRegistration =
  324. _bundleContext.registerService(
  325. TrackedOne.class, new TrackedOne(), properties);
  326. Assert.assertTrue(_serviceTrackerMap.containsKey("one"));
  327. Assert.assertTrue(_serviceTrackerMap.containsKey("two"));
  328. properties.put("target", new String[] {"two", "three"});
  329. serviceRegistration.setProperties(properties);
  330. Assert.assertTrue(_serviceTrackerMap.containsKey("two"));
  331. Assert.assertTrue(_serviceTrackerMap.containsKey("three"));
  332. Assert.assertFalse(_serviceTrackerMap.containsKey("one"));
  333. serviceRegistration.unregister();
  334. }
  335. @Test
  336. public void testGetServiceWithMultiPropertyRegistration() {
  337. _serviceTrackerMap = createServiceTrackerMap(_bundleContext);
  338. Dictionary<String, Object> properties = new Hashtable<>();
  339. properties.put("service.ranking", 1);
  340. properties.put("target", new String[] {"aTarget1", "aTarget2"});
  341. ServiceRegistration<TrackedOne> serviceRegistration =
  342. _bundleContext.registerService(
  343. TrackedOne.class, new TrackedOne(), properties);
  344. Assert.assertNotNull(_serviceTrackerMap.getService("aTarget1"));
  345. Assert.assertNotNull(_serviceTrackerMap.getService("aTarget2"));
  346. serviceRegistration.unregister();
  347. }
  348. @Test
  349. public void testGetServiceWithNullClassAndFilter() {
  350. _serviceTrackerMap = ServiceTrackerMapFactory.openSingleValueMap(
  351. _bundleContext, null, "target");
  352. _serviceRegistrations.add(registerService(new TrackedOne()));
  353. Assert.assertNotNull(_serviceTrackerMap.getService("aTarget"));
  354. }
  355. @Test(expected = IllegalArgumentException.class)
  356. public void testGetServiceWithNullClassAndNullFilter() {
  357. ServiceTrackerMapFactory.openSingleValueMap(
  358. _bundleContext, null, null,
  359. (ServiceReferenceMapper<? extends Object, ? super Object>)null);
  360. }
  361. @Test
  362. public void testGetServiceWithRegisteredServiceRanking() {
  363. _serviceTrackerMap = createServiceTrackerMap(_bundleContext);
  364. TrackedOne trackedOne1 = new TrackedOne();
  365. ServiceRegistration<TrackedOne> serviceRegistration1 = registerService(
  366. trackedOne1);
  367. TrackedOne trackedOne2 = new TrackedOne();
  368. ServiceRegistration<TrackedOne> serviceRegistration2 = registerService(
  369. trackedOne2, 0);
  370. Assert.assertEquals(
  371. trackedOne1, _serviceTrackerMap.getService("aTarget"));
  372. serviceRegistration1.unregister();
  373. serviceRegistration1 = registerService(trackedOne1);
  374. TrackedOne trackedOne3 = new TrackedOne();
  375. ServiceRegistration<TrackedOne> serviceRegistration3 = registerService(
  376. trackedOne3, 1);
  377. Assert.assertEquals(
  378. trackedOne3, _serviceTrackerMap.getService("aTarget"));
  379. serviceRegistration3.unregister();
  380. Assert.assertEquals(
  381. trackedOne2, _serviceTrackerMap.getService("aTarget"));
  382. serviceRegistration2.unregister();
  383. Assert.assertEquals(
  384. trackedOne1, _serviceTrackerMap.getService("aTarget"));
  385. serviceRegistration1.unregister();
  386. }
  387. @Test
  388. public void testGetServiceWithServiceTrackerCustomizer() {
  389. try (ServiceTrackerMap<String, TrackedTwo> serviceTrackerMap =
  390. ServiceTrackerMapFactory.openSingleValueMap(
  391. _bundleContext, TrackedOne.class, "target",
  392. new ServiceTrackerCustomizer<TrackedOne, TrackedTwo>() {
  393. @Override
  394. public TrackedTwo addingService(
  395. ServiceReference<TrackedOne> serviceReference) {
  396. return new TrackedTwo(
  397. _bundleContext.getService(serviceReference));
  398. }
  399. @Override
  400. public void modifiedService(
  401. ServiceReference<TrackedOne> serviceReference,
  402. TrackedTwo service) {
  403. removedService(serviceReference, service);
  404. }
  405. @Override
  406. public void removedService(
  407. ServiceReference<TrackedOne> serviceReference,
  408. TrackedTwo service) {
  409. _bundleContext.ungetService(serviceReference);
  410. }
  411. })) {
  412. TrackedOne trackedOne1 = new TrackedOne();
  413. _serviceRegistrations.add(registerService(trackedOne1, "one"));
  414. TrackedOne trackedOne2 = new TrackedOne();
  415. _serviceRegistrations.add(registerService(trackedOne2, "two"));
  416. TrackedTwo trackedTwo1 = serviceTrackerMap.getService("one");
  417. Assert.assertEquals(trackedOne1, trackedTwo1.getTrackedOne());
  418. TrackedTwo trackedTwo2 = serviceTrackerMap.getService("two");
  419. Assert.assertEquals(trackedOne2, trackedTwo2.getTrackedOne());
  420. }
  421. }
  422. @Test
  423. public void testGetServiceWithServiceTrackerCustomizerAndServiceReferenceMapper() {
  424. try (ServiceTrackerMap<String, TrackedTwo> serviceTrackerMap =
  425. ServiceTrackerMapFactory.openSingleValueMap(
  426. _bundleContext, TrackedOne.class, "(target=*)",
  427. (serviceReference, emitter) -> {
  428. TrackedOne trackedOne = _bundleContext.getService(
  429. serviceReference);
  430. emitter.emit(
  431. serviceReference.getProperty("target") + "-" +
  432. trackedOne.getKey());
  433. _bundleContext.ungetService(serviceReference);
  434. },
  435. new ServiceTrackerCustomizer<TrackedOne, TrackedTwo>() {
  436. @Override
  437. public TrackedTwo addingService(
  438. ServiceReference<TrackedOne> serviceReference) {
  439. return new TrackedTwo(
  440. _bundleContext.getService(serviceReference));
  441. }
  442. @Override
  443. public void modifiedService(
  444. ServiceReference<TrackedOne> serviceReference,
  445. TrackedTwo trackedTwo) {
  446. removedService(serviceReference, trackedTwo);
  447. }
  448. @Override
  449. public void removedService(
  450. ServiceReference<TrackedOne> serviceReference,
  451. TrackedTwo trackedTwo) {
  452. _bundleContext.ungetService(serviceReference);
  453. }
  454. })) {
  455. TrackedOne trackedOne1 = new TrackedOne("1");
  456. _serviceRegistrations.add(registerService(trackedOne1, "one"));
  457. TrackedOne trackedOne2 = new TrackedOne("2");
  458. _serviceRegistrations.add(registerService(trackedOne2, "two"));
  459. TrackedTwo trackedTwo1 = serviceTrackerMap.getService("one-1");
  460. Assert.assertEquals(trackedOne1, trackedTwo1.getTrackedOne());
  461. TrackedTwo trackedTwo2 = serviceTrackerMap.getService("two-2");
  462. Assert.assertEquals(trackedOne2, trackedTwo2.getTrackedOne());
  463. }
  464. }
  465. @Test
  466. public void testGetServiceWithServiceTrackerCustomizerReturningNull() {
  467. try (ServiceTrackerMap<String, TrackedTwo> serviceTrackerMap =
  468. ServiceTrackerMapFactory.openSingleValueMap(
  469. _bundleContext, TrackedOne.class, "(target=*)",
  470. (serviceReference, emitter) -> {
  471. emitter.emit(
  472. (String)serviceReference.getProperty("target"));
  473. emitter.emit(
  474. (String)serviceReference.getProperty("target"));
  475. },
  476. new ServiceTrackerCustomizer<TrackedOne, TrackedTwo>() {
  477. @Override
  478. public TrackedTwo addingService(
  479. ServiceReference<TrackedOne> serviceReference) {
  480. return null;
  481. }
  482. @Override
  483. public void modifiedService(
  484. ServiceReference<TrackedOne> serviceReference,
  485. TrackedTwo trackedTwo) {
  486. }
  487. @Override
  488. public void removedService(
  489. ServiceReference<TrackedOne> serviceReference,
  490. TrackedTwo trackedTwo) {
  491. }
  492. })) {
  493. TrackedOne trackedOne = new TrackedOne("1");
  494. _serviceRegistrations.add(registerService(trackedOne, "one"));
  495. Assert.assertFalse(serviceTrackerMap.containsKey("one"));
  496. }
  497. }
  498. @Test
  499. public void testGetServiceWithSimpleRegistration() {
  500. ServiceTrackerMap<String, TrackedOne> serviceTrackerMap =
  501. createServiceTrackerMap(_bundleContext);
  502. _serviceRegistrations.add(registerService(new TrackedOne()));
  503. Assert.assertNotNull(serviceTrackerMap.getService("aTarget"));
  504. }
  505. @Test
  506. public void testOperationBalancesOutGetServiceAndUngetService() {
  507. BundleContextWrapper bundleContextWrapper = wrapContext();
  508. createServiceTrackerMap(bundleContextWrapper);
  509. ServiceRegistration<TrackedOne> serviceRegistration1 = registerService(
  510. new TrackedOne());
  511. ServiceRegistration<TrackedOne> serviceRegistration2 = registerService(
  512. new TrackedOne());
  513. serviceRegistration2.unregister();
  514. serviceRegistration2 = registerService(new TrackedOne());
  515. serviceRegistration2.unregister();
  516. serviceRegistration1.unregister();
  517. Map<ServiceReference<?>, AtomicInteger> serviceReferenceCountsMap =
  518. bundleContextWrapper.getServiceReferenceCountsMap();
  519. Collection<AtomicInteger> serviceReferenceCounts =
  520. serviceReferenceCountsMap.values();
  521. Assert.assertEquals(
  522. serviceReferenceCounts.toString(), 3,
  523. serviceReferenceCounts.size());
  524. for (AtomicInteger serviceReferenceCount : serviceReferenceCounts) {
  525. Assert.assertEquals(0, serviceReferenceCount.get());
  526. }
  527. }
  528. @Test
  529. public void testServiceWrapperServiceTrackerCustomizer() {
  530. try (ServiceTrackerMap<String, ServiceWrapper<TrackedOne>>
  531. serviceTrackerMap = ServiceTrackerMapFactory.openSingleValueMap(
  532. _bundleContext, TrackedOne.class, "target",
  533. ServiceTrackerCustomizerFactory.<TrackedOne>serviceWrapper(
  534. _bundleContext))) {
  535. Dictionary<String, Object> properties = new Hashtable<>();
  536. properties.put("property", "aProperty");
  537. properties.put("target", "aTarget");
  538. TrackedOne trackedOne = new TrackedOne();
  539. ServiceRegistration<TrackedOne> serviceRegistration =
  540. _bundleContext.registerService(
  541. TrackedOne.class, trackedOne, properties);
  542. ServiceWrapper<TrackedOne> serviceWrapper =
  543. serviceTrackerMap.getService("aTarget");
  544. Assert.assertEquals(trackedOne, serviceWrapper.getService());
  545. Map<String, Object> serviceWrapperProperties =
  546. serviceWrapper.getProperties();
  547. Assert.assertTrue(serviceWrapperProperties.containsKey("property"));
  548. Assert.assertTrue(serviceWrapperProperties.containsKey("target"));
  549. Assert.assertEquals(
  550. "aProperty", serviceWrapperProperties.get("property"));
  551. Assert.assertEquals(
  552. "aTarget", serviceWrapperProperties.get("target"));
  553. serviceRegistration.unregister();
  554. }
  555. }
  556. @Test
  557. public void testServiceWrapperServiceTrackerCustomizerWithBuilder() {
  558. ServiceTrackerMapBuilder.Selector
  559. <TrackedOne, ServiceWrapper<TrackedOne>> selector =
  560. ServiceTrackerMapBuilder.SelectorFactory.newSelector(
  561. _bundleContext, TrackedOne.class
  562. ).newSelector(
  563. ServiceTrackerCustomizerFactory.serviceWrapper(
  564. _bundleContext)
  565. );
  566. ServiceTrackerMapBuilder.Mapper
  567. <String, TrackedOne, ServiceWrapper<TrackedOne>,
  568. ServiceWrapper<TrackedOne>> mapper = selector.map("target");
  569. ServiceTrackerMapBuilder.Collector
  570. <String, TrackedOne, ServiceWrapper<TrackedOne>,
  571. ServiceWrapper<TrackedOne>> collector =
  572. mapper.collectSingleValue();
  573. try (ServiceTrackerMap<String, ServiceWrapper<TrackedOne>>
  574. serviceTrackerMap = collector.build()) {
  575. Dictionary<String, Object> properties = new Hashtable<>();
  576. properties.put("property", "aProperty");
  577. properties.put("target", "aTarget");
  578. TrackedOne trackedOne = new TrackedOne();
  579. ServiceRegistration<TrackedOne> serviceRegistration =
  580. _bundleContext.registerService(
  581. TrackedOne.class, trackedOne, properties);
  582. ServiceWrapper<TrackedOne> serviceWrapper =
  583. serviceTrackerMap.getService("aTarget");
  584. Assert.assertEquals(trackedOne, serviceWrapper.getService());
  585. Map<String, Object> serviceWrapperProperties =
  586. serviceWrapper.getProperties();
  587. Assert.assertTrue(serviceWrapperProperties.containsKey("property"));
  588. Assert.assertTrue(serviceWrapperProperties.containsKey("target"));
  589. Assert.assertEquals(
  590. "aProperty", serviceWrapperProperties.get("property"));
  591. Assert.assertEquals(
  592. "aTarget", serviceWrapperProperties.get("target"));
  593. serviceRegistration.unregister();
  594. }
  595. }
  596. @Test
  597. public void testUnkeyedServiceReferencesBalanceReferenceCount() {
  598. BundleContextWrapper wrappedBundleContext = wrapContext();
  599. try (ServiceTrackerMap<TrackedOne, TrackedOne> serviceTrackerMap =
  600. ServiceTrackerMapFactory.openSingleValueMap(
  601. wrappedBundleContext, TrackedOne.class, null,
  602. (serviceReference, emitter) -> {
  603. })) {
  604. ServiceRegistration<TrackedOne> serviceRegistration1 =
  605. registerService(new TrackedOne());
  606. ServiceRegistration<TrackedOne> serviceRegistration2 =
  607. registerService(new TrackedOne());
  608. Map<ServiceReference<?>, AtomicInteger> serviceReferenceCountsMap =
  609. wrappedBundleContext.getServiceReferenceCountsMap();
  610. Collection<AtomicInteger> serviceReferenceCounts =
  611. serviceReferenceCountsMap.values();
  612. Assert.assertEquals(
  613. serviceReferenceCounts.toString(), 0,
  614. serviceReferenceCounts.size());
  615. serviceRegistration1.unregister();
  616. serviceRegistration2.unregister();
  617. Assert.assertEquals(
  618. serviceReferenceCounts.toString(), 0,
  619. serviceReferenceCounts.size());
  620. }
  621. }
  622. protected ServiceTrackerMap<String, TrackedOne> createServiceTrackerMap(
  623. BundleContext bundleContext) {
  624. _serviceTrackerMap = ServiceTrackerMapFactory.openSingleValueMap(
  625. bundleContext, TrackedOne.class, "target");
  626. return _serviceTrackerMap;
  627. }
  628. protected ServiceRegistration<TrackedOne> registerService(
  629. TrackedOne trackedOne) {
  630. return registerService(trackedOne, "aTarget");
  631. }
  632. protected ServiceRegistration<TrackedOne> registerService(
  633. TrackedOne trackedOne, int ranking) {
  634. return registerService(trackedOne, ranking, "aTarget");
  635. }
  636. protected ServiceRegistration<TrackedOne> registerService(
  637. TrackedOne trackedOne, int ranking, Object target) {
  638. Dictionary<String, Object> properties = new Hashtable<>();
  639. properties.put("service.ranking", ranking);
  640. properties.put("target", target);
  641. return _bundleContext.registerService(
  642. TrackedOne.class, trackedOne, properties);
  643. }
  644. protected ServiceRegistration<TrackedOne> registerService(
  645. TrackedOne trackedOne, Object target) {
  646. Dictionary<String, Object> properties = new Hashtable<>();
  647. properties.put("target", target);
  648. return _bundleContext.registerService(
  649. TrackedOne.class, trackedOne, properties);
  650. }
  651. protected BundleContextWrapper wrapContext() {
  652. return new BundleContextWrapper(_bundleContext);
  653. }
  654. private BundleContext _bundleContext;
  655. private final List<ServiceRegistration<?>> _serviceRegistrations =
  656. new ArrayList<>();
  657. private ServiceTrackerMap<String, TrackedOne> _serviceTrackerMap;
  658. }