PageRenderTime 27ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/servers/sip-presence/sip-event/server/subscription/rls-cache/ra/src/main/java/org/mobicents/slee/sipevent/server/rlscache/RLSServicesCacheResourceAdaptor.java

http://mobicents.googlecode.com/
Java | 725 lines | 585 code | 89 blank | 51 comment | 69 complexity | 17d7b2a447ec0376860b592612b0c0c5 MD5 | raw file
Possible License(s): LGPL-3.0, GPL-3.0, LGPL-2.1, GPL-2.0, CC-BY-SA-3.0, CC0-1.0, Apache-2.0, BSD-3-Clause
  1. /*
  2. * JBoss, Home of Professional Open Source
  3. * Copyright 2011, Red Hat, Inc. and individual contributors
  4. * by the @authors tag. See the copyright.txt in the distribution for a
  5. * full listing of individual contributors.
  6. *
  7. * This is free software; you can redistribute it and/or modify it
  8. * under the terms of the GNU Lesser General Public License as
  9. * published by the Free Software Foundation; either version 2.1 of
  10. * the License, or (at your option) any later version.
  11. *
  12. * This software is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  15. * Lesser General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU Lesser General Public
  18. * License along with this software; if not, write to the Free
  19. * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
  20. * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
  21. */
  22. package org.mobicents.slee.sipevent.server.rlscache;
  23. import java.io.StringReader;
  24. import java.util.HashSet;
  25. import java.util.LinkedList;
  26. import java.util.Set;
  27. import java.util.concurrent.ExecutorService;
  28. import java.util.concurrent.Executors;
  29. import javax.slee.Address;
  30. import javax.slee.ServiceID;
  31. import javax.slee.facilities.Tracer;
  32. import javax.slee.resource.ActivityFlags;
  33. import javax.slee.resource.ActivityHandle;
  34. import javax.slee.resource.ActivityIsEndingException;
  35. import javax.slee.resource.ConfigProperties;
  36. import javax.slee.resource.FailureReason;
  37. import javax.slee.resource.FireableEventType;
  38. import javax.slee.resource.InvalidConfigurationException;
  39. import javax.slee.resource.Marshaler;
  40. import javax.slee.resource.ReceivableService;
  41. import javax.slee.resource.ResourceAdaptor;
  42. import javax.slee.resource.ResourceAdaptorContext;
  43. import javax.slee.resource.SleeEndpoint;
  44. import javax.slee.resource.StartActivityException;
  45. import javax.slee.resource.UnrecognizedActivityHandleException;
  46. import javax.xml.bind.JAXBContext;
  47. import javax.xml.bind.JAXBException;
  48. import org.mobicents.slee.sipevent.server.rlscache.events.RLSServicesAddedEvent;
  49. import org.mobicents.slee.sipevent.server.rlscache.events.RLSServicesRemovedEvent;
  50. import org.mobicents.slee.sipevent.server.rlscache.events.RLSServicesUpdatedEvent;
  51. import org.mobicents.slee.sipevent.server.rlscache.events.WatchRLSServicesEvent;
  52. import org.mobicents.slee.sipevent.server.rlscache.events.WatchResourceListsEvent;
  53. import org.mobicents.slee.sipevent.server.subscription.jmx.SubscriptionControlManagement;
  54. import org.openxdm.xcap.client.appusage.resourcelists.jaxb.ResourceLists;
  55. import org.openxdm.xcap.client.appusage.rlsservices.jaxb.RlsServices;
  56. import org.openxdm.xcap.client.appusage.rlsservices.jaxb.ServiceType;
  57. import org.openxdm.xcap.common.uri.DocumentSelector;
  58. import org.openxdm.xcap.common.uri.ElementSelector;
  59. import org.openxdm.xcap.common.uri.ElementSelectorStep;
  60. import org.openxdm.xcap.common.uri.ElementSelectorStepByAttr;
  61. public class RLSServicesCacheResourceAdaptor implements ResourceAdaptor,
  62. RLSServicesCacheSbbInterface {
  63. private RLSServicesCacheDataSource dataSource;
  64. private Tracer tracer;
  65. private FireableEventType watchRLSServicesEvent;
  66. private FireableEventType watchResourceListsEvent;
  67. private FireableEventType rLSServicesAddedEvent;
  68. private FireableEventType rLSServicesRemovedEvent;
  69. private FireableEventType rLSServicesUpdatedEvent;
  70. private final ServiceID serviceID = new ServiceID(
  71. "RLSServicesWatcherService", "org.mobicents", "1.0");
  72. private SleeEndpoint sleeEndpoint;
  73. private static final int ACTIVITY_FLAGS = ActivityFlags
  74. .setRequestSleeActivityGCCallback(ActivityFlags.REQUEST_ENDED_CALLBACK);
  75. // dummy activity for watcher of the rls services docs
  76. private final RLSServiceActivityImpl dummyRLSServicesDocActivity = new RLSServiceActivityImpl(
  77. "", this);
  78. private final RLSServiceActivityHandle dummyRLSServicesDocActivityHandle = new RLSServiceActivityHandle(
  79. dummyRLSServicesDocActivity.getServiceURI());
  80. private final DocumentSelector globalRLSServicesDocumentSelector = new DocumentSelector(
  81. "rls-services/global", "index");
  82. private LinkedList<ElementSelectorStep> rlsServicesBaseElementSelectorSteps = initRlsServicesBaseElementSelectorSteps();
  83. // flags used to control when it's time to init the service which is
  84. // responsible for providing rls services and resource lists
  85. private boolean serviceActive = false;
  86. private boolean raActive = false;
  87. private ListReferenceEndpointAddressParser addressParser;
  88. private ExecutorService executorService;
  89. public static JAXBContext jaxbContext = initJAxbContext();
  90. public RLSServicesCacheDataSource getDataSource() {
  91. return dataSource;
  92. }
  93. private LinkedList<ElementSelectorStep> initRlsServicesBaseElementSelectorSteps() {
  94. LinkedList<ElementSelectorStep> list = new LinkedList<ElementSelectorStep>();
  95. list.add(new ElementSelectorStep("rls-services"));
  96. return list;
  97. }
  98. private static JAXBContext initJAxbContext() {
  99. try {
  100. return JAXBContext
  101. .newInstance("org.openxdm.xcap.client.appusage.rlsservices.jaxb"
  102. + ":org.openxdm.xcap.client.appusage.resourcelists.jaxb");
  103. } catch (JAXBException e) {
  104. throw new RuntimeException(
  105. "unable to create jaxb context for pres rules docs", e);
  106. }
  107. }
  108. @Override
  109. public void activityEnded(ActivityHandle handle) {
  110. if (tracer.isFineEnabled()) {
  111. tracer.fine(handle.toString() + " ended.");
  112. }
  113. dataSource.removeActivity(handle);
  114. }
  115. @Override
  116. public void activityUnreferenced(ActivityHandle handle) {
  117. if (tracer.isFineEnabled()) {
  118. tracer.fine(handle.toString()
  119. + " is now unreferenced, ending activity.");
  120. }
  121. Object activity = getActivity(handle);
  122. if (activity instanceof RLSServiceActivityImpl) {
  123. synchronized (activity) {
  124. // sync due to possible concurrent updates on rls service
  125. ((RLSServiceActivityImpl) activity).ending();
  126. // end activity
  127. try {
  128. sleeEndpoint.endActivity(handle);
  129. } catch (Throwable e) {
  130. tracer.warning(
  131. "failed to end activity after becoming unreferenced: "
  132. + handle, e);
  133. activityEnded(handle);
  134. }
  135. }
  136. }
  137. else {
  138. // end activity
  139. try {
  140. sleeEndpoint.endActivity(handle);
  141. } catch (Throwable e) {
  142. tracer.warning(
  143. "failed to end activity after becoming unreferenced: "
  144. + handle, e);
  145. activityEnded(handle);
  146. }
  147. }
  148. }
  149. @Override
  150. public void administrativeRemove(ActivityHandle handle) {
  151. activityEnded(handle);
  152. }
  153. @Override
  154. public void eventProcessingFailed(ActivityHandle handle,
  155. FireableEventType eventType, Object event, Address address,
  156. ReceivableService service, int flags, FailureReason reason) {
  157. // not used
  158. }
  159. @Override
  160. public void eventProcessingSuccessful(ActivityHandle handle,
  161. FireableEventType eventType, Object event, Address address,
  162. ReceivableService service, int flags) {
  163. // not used
  164. }
  165. @Override
  166. public void eventUnreferenced(ActivityHandle handle,
  167. FireableEventType eventType, Object event, Address address,
  168. ReceivableService service, int flags) {
  169. // not used
  170. }
  171. @Override
  172. public Object getActivity(ActivityHandle handle) {
  173. return dataSource.getActivity(handle);
  174. }
  175. @Override
  176. public ActivityHandle getActivityHandle(Object activity) {
  177. return dataSource.getActivityHandle(activity);
  178. }
  179. @Override
  180. public Marshaler getMarshaler() {
  181. return null;
  182. }
  183. @Override
  184. public Object getResourceAdaptorInterface(String className) {
  185. return this;
  186. }
  187. @Override
  188. public void queryLiveness(ActivityHandle handle) {
  189. if (dataSource.getActivity(handle) == null) {
  190. try {
  191. sleeEndpoint.endActivity(handle);
  192. } catch (Exception e) {
  193. tracer.severe("failed to end idle activity " + handle, e);
  194. }
  195. }
  196. }
  197. @Override
  198. public void raActive() {
  199. dataSource = new RLSServicesCacheDataSource();
  200. executorService = Executors.newSingleThreadExecutor();
  201. raActive = true;
  202. if (SubscriptionControlManagement.getInstance().getEventListSupportOn()
  203. && serviceActive) {
  204. // only init service if service is already activated
  205. initService();
  206. }
  207. }
  208. @Override
  209. public void raConfigurationUpdate(ConfigProperties properties) {
  210. // not used
  211. }
  212. @Override
  213. public void raConfigure(ConfigProperties properties) {
  214. // not used
  215. }
  216. @Override
  217. public void raInactive() {
  218. dataSource = null;
  219. executorService.shutdownNow();
  220. }
  221. @Override
  222. public void raStopping() {
  223. raActive = false;
  224. if (serviceActive) {
  225. endAllActivities();
  226. }
  227. }
  228. @Override
  229. public void raUnconfigure() {
  230. // not used
  231. }
  232. @Override
  233. public void raVerifyConfiguration(ConfigProperties properties)
  234. throws InvalidConfigurationException {
  235. // not used
  236. }
  237. @Override
  238. public void serviceActive(ReceivableService serviceInfo) {
  239. if (serviceInfo.getService().equals(serviceID)) {
  240. serviceActive = true;
  241. if (SubscriptionControlManagement.getInstance()
  242. .getEventListSupportOn() && raActive) {
  243. // only init service if ra already active
  244. initService();
  245. }
  246. }
  247. }
  248. private void initService() {
  249. // init the service
  250. Runnable runnable = new Runnable() {
  251. @Override
  252. public void run() {
  253. // create dummy activity and fire event to init service
  254. try {
  255. sleeEndpoint.startActivity(
  256. dummyRLSServicesDocActivityHandle,
  257. dummyRLSServicesDocActivity);
  258. dataSource.putIfAbsentRLSServiceActivity(
  259. dummyRLSServicesDocActivityHandle,
  260. dummyRLSServicesDocActivity);
  261. sleeEndpoint.fireEvent(dummyRLSServicesDocActivityHandle,
  262. watchRLSServicesEvent, new WatchRLSServicesEvent(),
  263. null, null);
  264. } catch (Throwable e) {
  265. tracer.severe(
  266. "failed to signal service to watch global rls services doc in the xdm",
  267. e);
  268. throw new RuntimeException(e);
  269. }
  270. }
  271. };
  272. new Thread(runnable).start();
  273. }
  274. @Override
  275. public void serviceInactive(ReceivableService serviceInfo) {
  276. // not used
  277. }
  278. @Override
  279. public void serviceStopping(ReceivableService serviceInfo) {
  280. if (serviceInfo.getService().equals(serviceID)) {
  281. serviceActive = false;
  282. if (raActive) {
  283. endAllActivities();
  284. }
  285. }
  286. }
  287. private void endAllActivities() {
  288. if (SubscriptionControlManagement.getInstance().getEventListSupportOn()) {
  289. final Set<ActivityHandle> handles = dataSource.getAllHandles();
  290. Runnable runnable = new Runnable() {
  291. @Override
  292. public void run() {
  293. for (ActivityHandle handle : handles) {
  294. try {
  295. sleeEndpoint.endActivity(handle);
  296. } catch (Throwable e) {
  297. tracer.severe("failed to end activity", e);
  298. }
  299. }
  300. }
  301. };
  302. new Thread(runnable).start();
  303. }
  304. }
  305. @Override
  306. public void setResourceAdaptorContext(ResourceAdaptorContext context) {
  307. tracer = context.getTracer(getClass().getSimpleName());
  308. sleeEndpoint = context.getSleeEndpoint();
  309. try {
  310. watchRLSServicesEvent = context.getEventLookupFacility()
  311. .getFireableEventType(WatchRLSServicesEvent.EVENT_TYPE_ID);
  312. watchResourceListsEvent = context
  313. .getEventLookupFacility()
  314. .getFireableEventType(WatchResourceListsEvent.EVENT_TYPE_ID);
  315. rLSServicesRemovedEvent = context
  316. .getEventLookupFacility()
  317. .getFireableEventType(RLSServicesRemovedEvent.EVENT_TYPE_ID);
  318. rLSServicesUpdatedEvent = context
  319. .getEventLookupFacility()
  320. .getFireableEventType(RLSServicesUpdatedEvent.EVENT_TYPE_ID);
  321. rLSServicesAddedEvent = context.getEventLookupFacility()
  322. .getFireableEventType(RLSServicesAddedEvent.EVENT_TYPE_ID);
  323. } catch (Exception e) {
  324. throw new RuntimeException(
  325. "Unable to retreive the event type for the event fired by this RA, unable to proceed",
  326. e);
  327. }
  328. addressParser = new ListReferenceEndpointAddressParser(context);
  329. }
  330. @Override
  331. public void unsetResourceAdaptorContext() {
  332. tracer = null;
  333. sleeEndpoint = null;
  334. watchRLSServicesEvent = null;
  335. watchResourceListsEvent = null;
  336. rLSServicesRemovedEvent = null;
  337. rLSServicesUpdatedEvent = null;
  338. addressParser = null;
  339. }
  340. // sbb interface
  341. // FROM SBB INTERFACE
  342. @Override
  343. public RLSService getRLSService(String serviceURI) {
  344. return dataSource.getRLSService(serviceURI);
  345. }
  346. @Override
  347. public RLSServiceActivity getRLSServiceActivity(String serviceURI)
  348. throws StartActivityException {
  349. if (tracer.isFineEnabled()) {
  350. tracer.fine("getRLSServiceActivity( uri = " + serviceURI + ")");
  351. }
  352. RLSServiceActivityHandle handle = new RLSServiceActivityHandle(
  353. serviceURI);
  354. RLSServiceActivityImpl activity = new RLSServiceActivityImpl(
  355. serviceURI, this);
  356. RLSServiceActivityImpl existentActivity = dataSource
  357. .putIfAbsentRLSServiceActivity(handle, activity);
  358. if (existentActivity == null) {
  359. sleeEndpoint.startActivitySuspended(handle, activity,
  360. ACTIVITY_FLAGS);
  361. } else {
  362. activity = existentActivity;
  363. }
  364. return activity;
  365. }
  366. @Override
  367. public void rlsServicesUpdated(final DocumentSelector documentSelector,
  368. final String document) {
  369. // op is done async in the executor service
  370. Runnable r = new Runnable() {
  371. @Override
  372. public void run() {
  373. if (tracer.isFineEnabled()) {
  374. tracer.fine("rlsServicesDocUpdated( ds = "
  375. + documentSelector + ")");
  376. }
  377. if (document == null) {
  378. // doc was removed, remove all rls services of the doc
  379. RLSServiceImpl rlsService = null;
  380. for (String existentRLSServiceURI : dataSource
  381. .removeRlsServicesDocs(documentSelector)) {
  382. rlsService = dataSource
  383. .removeRLSService(existentRLSServiceURI);
  384. if (rlsService != null) {
  385. rlsService.setServiceType(null);
  386. }
  387. if (tracer.isInfoEnabled()) {
  388. tracer.info("Removed RLS Service "
  389. + existentRLSServiceURI + " from cache.");
  390. }
  391. }
  392. } else {
  393. // doc was created or updated
  394. RlsServices rlsServices = null;
  395. try {
  396. rlsServices = (RlsServices) jaxbContext
  397. .createUnmarshaller().unmarshal(
  398. new StringReader(document));
  399. } catch (JAXBException e) {
  400. tracer.severe(
  401. "unmarshalling of global rls services failed",
  402. e);
  403. return;
  404. }
  405. Set<String> removedRlsServices = dataSource
  406. .removeRlsServicesDocs(documentSelector);
  407. Set<String> updatedRlsServices = new HashSet<String>();
  408. // create or update the ones provided by the update
  409. RLSServiceImpl rlsService = null;
  410. RLSServiceImpl anotherRlsService = null;
  411. for (ServiceType serviceType : rlsServices.getService()) {
  412. if (removedRlsServices != null) {
  413. removedRlsServices.remove(serviceType.getUri());
  414. }
  415. updatedRlsServices.add(serviceType.getUri());
  416. rlsService = dataSource.getRLSService(serviceType
  417. .getUri());
  418. if (rlsService == null) {
  419. LinkedList<ElementSelectorStep> steps = new LinkedList<ElementSelectorStep>(
  420. rlsServicesBaseElementSelectorSteps);
  421. steps.addLast(new ElementSelectorStepByAttr(
  422. "service", "uri", serviceType.getUri()));
  423. ListReferenceEndpointAddress address = new ListReferenceEndpointAddress(
  424. globalRLSServicesDocumentSelector,
  425. new ElementSelector(steps));
  426. anotherRlsService = new RLSServiceImpl(
  427. serviceType.getUri(), address,
  428. RLSServicesCacheResourceAdaptor.this);
  429. rlsService = dataSource.putRLSServiceIfAbsent(
  430. serviceType.getUri(), anotherRlsService);
  431. if (rlsService == null) {
  432. rlsService = anotherRlsService;
  433. if (tracer.isInfoEnabled()) {
  434. tracer.info("Added RLS Service "
  435. + serviceType.getUri()
  436. + " to cache.");
  437. }
  438. }
  439. }
  440. rlsService.setServiceType(serviceType);
  441. }
  442. dataSource.putRlsServicesDocs(documentSelector,
  443. updatedRlsServices);
  444. // update the ones removed with null service type
  445. if (removedRlsServices != null) {
  446. for (String removedRLSServiceURI : removedRlsServices) {
  447. rlsService = dataSource
  448. .removeRLSService(removedRLSServiceURI);
  449. if (rlsService != null) {
  450. rlsService.setServiceType(null);
  451. }
  452. if (tracer.isInfoEnabled()) {
  453. tracer.info("Removed RLS Service "
  454. + removedRLSServiceURI + " from cache.");
  455. }
  456. }
  457. }
  458. }
  459. }
  460. };
  461. executorService.submit(r);
  462. }
  463. @Override
  464. public void resourceListsUpdated(final DocumentSelector documentSelector,
  465. final String document) {
  466. Runnable r = new Runnable() {
  467. @Override
  468. public void run() {
  469. if (tracer.isFineEnabled()) {
  470. tracer.fine("resourceListsUpdated, document selector is "
  471. + documentSelector);
  472. }
  473. ResourceLists resourceLists = null;
  474. if (document != null) {
  475. try {
  476. resourceLists = (ResourceLists) jaxbContext
  477. .createUnmarshaller().unmarshal(
  478. new StringReader(document));
  479. } catch (JAXBException e) {
  480. tracer.severe("unmarshalling of resource lists failed",
  481. e);
  482. return;
  483. }
  484. }
  485. ReferencedResourceLists referencedResourceLists = dataSource
  486. .getResourceList(documentSelector);
  487. if (referencedResourceLists != null) {
  488. referencedResourceLists.setResourceLists(resourceLists);
  489. }
  490. }
  491. };
  492. executorService.submit(r);
  493. }
  494. // references among resource lists management
  495. public void removeReference(ListReferenceEndpointAddress fromAddress,
  496. ListReferenceEndpointAddress toAddress) {
  497. if (tracer.isFineEnabled()) {
  498. tracer.fine("removeReference from = " + fromAddress + ", to = "
  499. + toAddress);
  500. }
  501. final DocumentSelector documentSelector = toAddress
  502. .getDocumentSelector();
  503. ReferencedResourceLists lists = dataSource
  504. .getResourceList(documentSelector);
  505. if (lists != null) {
  506. lists.removeFromReference(fromAddress, toAddress);
  507. if (!lists.hasFromReferences()) {
  508. if (tracer.isInfoEnabled()) {
  509. tracer.info("Removed Resource List " + documentSelector
  510. + " from cache, no references.");
  511. }
  512. dataSource.removeResourceList(documentSelector);
  513. ResourceListActivityHandle handle = new ResourceListActivityHandle(
  514. documentSelector);
  515. try {
  516. sleeEndpoint.endActivity(handle);
  517. } catch (Throwable e) {
  518. tracer.severe("failed to end resource list activity "
  519. + documentSelector, e);
  520. dataSource.removeResourceListActivity(handle);
  521. }
  522. }
  523. }
  524. }
  525. public ListReferenceTo addReference(ListReferenceFrom from,
  526. ListReferenceEndpointAddress toAddress) {
  527. if (tracer.isFineEnabled()) {
  528. tracer.fine("addReference from = " + from.getAddress() + ", to = "
  529. + toAddress);
  530. }
  531. final DocumentSelector documentSelector = toAddress
  532. .getDocumentSelector();
  533. ReferencedResourceLists lists = dataSource
  534. .getResourceList(documentSelector);
  535. if (lists == null) {
  536. ReferencedResourceLists newLists = new ReferencedResourceLists(
  537. documentSelector, this);
  538. lists = dataSource.putResourceListIfAbsent(documentSelector,
  539. newLists);
  540. if (lists == null) {
  541. lists = newLists;
  542. if (tracer.isInfoEnabled()) {
  543. tracer.info("Added Resource List " + documentSelector
  544. + " to cache.");
  545. }
  546. ResourceListActivityHandle handle = new ResourceListActivityHandle(
  547. documentSelector);
  548. try {
  549. sleeEndpoint.startActivity(handle,
  550. new ResourceListActivityImpl(documentSelector),
  551. ACTIVITY_FLAGS);
  552. sleeEndpoint.fireEvent(handle, watchResourceListsEvent,
  553. new WatchResourceListsEvent(documentSelector),
  554. null, null);
  555. } catch (Throwable e) {
  556. tracer.severe("failed to start resource list activity "
  557. + documentSelector, e);
  558. dataSource.removeResourceListActivity(handle);
  559. dataSource.removeResourceList(documentSelector);
  560. return null;
  561. }
  562. }
  563. }
  564. return lists.addFromReference(from, toAddress);
  565. }
  566. // event fire methods
  567. public void fireRLSServicesAddedEvent(String uri,
  568. RLSServicesAddedEvent event) {
  569. final RLSServiceActivityHandle handle = new RLSServiceActivityHandle(
  570. uri);
  571. try {
  572. RLSServiceActivityImpl activity = dataSource
  573. .getRLSServiceActivity(handle);
  574. if (activity == null) {
  575. // start activity
  576. activity = new RLSServiceActivityImpl(uri, this);
  577. if (dataSource.putIfAbsentRLSServiceActivity(handle, activity) == null) {
  578. // added to datasource, now add to slee
  579. sleeEndpoint
  580. .startActivity(handle, activity, ACTIVITY_FLAGS);
  581. }
  582. }
  583. sleeEndpoint.fireEvent(handle, rLSServicesAddedEvent, event, null,
  584. null);
  585. } catch (Throwable e) {
  586. tracer.severe("failed to fire rls services added event", e);
  587. }
  588. }
  589. public void fireRLSServicesRemovedEvent(String uri,
  590. RLSServicesRemovedEvent event) {
  591. final RLSServiceActivityHandle handle = new RLSServiceActivityHandle(
  592. uri);
  593. final RLSServiceActivityImpl activity = dataSource
  594. .getRLSServiceActivity(handle);
  595. if (activity != null) {
  596. synchronized (activity) {
  597. if (!activity.isEnding()) {
  598. try {
  599. sleeEndpoint.fireEvent(handle, rLSServicesRemovedEvent,
  600. event, null, null);
  601. } catch (Throwable e) {
  602. tracer.severe("failed to fire event", e);
  603. }
  604. }
  605. }
  606. }
  607. }
  608. public void fireRLSServicesUpdatedEvent(String uri,
  609. RLSServicesUpdatedEvent event) {
  610. if (tracer.isInfoEnabled()) {
  611. tracer.info("Updated RLS Service " + uri + ". New entries: "
  612. + event.getNewEntries() + ". Removed entries: "
  613. + event.getRemovedEntries());
  614. }
  615. final RLSServiceActivityHandle handle = new RLSServiceActivityHandle(
  616. uri);
  617. final RLSServiceActivityImpl activity = dataSource
  618. .getRLSServiceActivity(handle);
  619. if (activity != null) {
  620. synchronized (activity) {
  621. if (!activity.isEnding()) {
  622. try {
  623. sleeEndpoint.fireEvent(handle, rLSServicesUpdatedEvent,
  624. event, null, null);
  625. } catch (Throwable e) {
  626. tracer.severe("failed to fire event", e);
  627. }
  628. }
  629. }
  630. }
  631. }
  632. // misc
  633. public ListReferenceEndpointAddressParser getAddressParser() {
  634. return addressParser;
  635. }
  636. }