Keyple Service C++ Library - 3.4.1
Component of the Keyple C++ middleware
AbstractObservableLocalPluginAdapter.cpp
Go to the documentation of this file.
1/******************************************************************************
2 * Copyright (c) 2025 Calypso Networks Association https://calypsonet.org/ *
3 * *
4 * See the NOTICE file(s) distributed with this work for additional *
5 * information regarding copyright ownership. *
6 * *
7 * This program and the accompanying materials are made available under the *
8 * terms of the Eclipse Public License 2.0 which is available at *
9 * http://www.eclipse.org/legal/epl-2.0 *
10 * *
11 * SPDX-License-Identifier: EPL-2.0 *
12 ******************************************************************************/
13
14#include "keyple/core/service/AbstractObservableLocalPluginAdapter.hpp"
15
16#include <memory>
17#include <string>
18#include <utility>
19#include <vector>
20
21#include "keyple/core/service/PluginEventAdapter.hpp"
22#include "keyple/core/util/cpp/KeypleStd.hpp"
23#include "keyple/core/util/cpp/exception/Exception.hpp"
24
25namespace keyple {
26namespace core {
27namespace service {
28
29using keyple::core::util::cpp::exception::Exception;
30
31/* ABSTRACT OBSERVABLE LOCAL PLUGIN ADAPTER JOB
32 * ------------------------------------------------- */
33
34AbstractObservableLocalPluginAdapter::ObservableLocalPluginAdapterJob ::
35 ObservableLocalPluginAdapterJob(
36 std::shared_ptr<PluginObserverSpi> observer,
37 const std::shared_ptr<PluginEvent> event,
38 AbstractObservableLocalPluginAdapter* parent)
39: Job("AbstractObservableLocalPluginAdapter")
40, mObserver(observer)
41, mEvent(event)
42, mParent(parent)
43{
44}
45
46void
47AbstractObservableLocalPluginAdapter::ObservableLocalPluginAdapterJob::execute()
48{
49 mParent->notifyObserver(mObserver, mEvent);
50}
51
52/* ABSTRACT OBSERVABLE LOCAL PLUGIN ADAPTER
53 * ----------------------------------------------------- */
54
55AbstractObservableLocalPluginAdapter::AbstractObservableLocalPluginAdapter(
56 std::shared_ptr<PluginSpi> pluginSpi)
57: LocalPluginAdapter(pluginSpi)
58, mObservationManager(
59 std::make_shared<ObservationManagerAdapter<
60 PluginObserverSpi,
61 PluginObservationExceptionHandlerSpi>>("", ""))
62{
63}
64
65std::shared_ptr<ObservationManagerAdapter<
66 PluginObserverSpi,
67 PluginObservationExceptionHandlerSpi>>
68AbstractObservableLocalPluginAdapter::getObservationManager() const
69{
70 return mObservationManager;
71}
72
73void
74AbstractObservableLocalPluginAdapter::notifyObservers(
75 const std::shared_ptr<PluginEvent> event)
76{
77 mLogger->debug(
78 "[plugin=%] Notifying observers [eventType=%, readerNames=%, "
79 "observeCount=%]\n",
80 getName(),
81 event->getType(),
82 event->getReaderNames(),
83 countObservers());
84
85 for (const auto& observer : mObservationManager->getObservers()) {
86 notifyObserver(observer, event);
87 }
88
89 mLogger->debug("[plugin=%] Observers notified\n", getName());
90}
91
92void
93AbstractObservableLocalPluginAdapter::notifyObserver(
94 std::shared_ptr<PluginObserverSpi> observer,
95 const std::shared_ptr<PluginEvent> event)
96{
97 try {
98 observer->onPluginEvent(event);
99
100 } catch (const Exception& e) {
101 auto _e(std::unique_ptr<Exception>(new Exception(e)));
102 try {
103 mObservationManager->getObservationExceptionHandler()
104 ->onPluginObservationError(getName(), std::move(_e));
105
106 } catch (const Exception& e2) {
107 mLogger->error(
108 "[plugin=%] Failed to notify observer [reason=%]\n",
109 getName(),
110 e.getMessage());
111 mLogger->error(
112 "[plugin=%] Failed to notify observation exception handler "
113 "[reason=%]\n",
114 getName(),
115 e2.getMessage());
116 }
117 }
118}
119
120void
121AbstractObservableLocalPluginAdapter::doUnregister()
122{
123 const std::vector<std::string>& unregisteredReaderNames = getReaderNames();
124
125 notifyObservers(
126 std::make_shared<PluginEventAdapter>(
127 getName(),
128 unregisteredReaderNames,
129 PluginEvent::Type::UNAVAILABLE));
130
131 clearObservers();
132 LocalPluginAdapter::doUnregister();
133}
134
135void
136AbstractObservableLocalPluginAdapter::addObserver(
137 const std::shared_ptr<PluginObserverSpi> observer)
138{
139 checkStatus();
140 mObservationManager->addObserver(observer);
141}
142
143void
144AbstractObservableLocalPluginAdapter::removeObserver(
145 const std::shared_ptr<PluginObserverSpi> observer)
146{
147 Assert::getInstance().notNull(observer, "observer");
148
149 const auto& observers = mObservationManager->getObservers();
150 const auto it = std::find(observers.begin(), observers.end(), observer);
151
152 if (it != observers.end()) {
153 mObservationManager->removeObserver(observer);
154 }
155}
156
157void
158AbstractObservableLocalPluginAdapter::clearObservers()
159{
160 mObservationManager->clearObservers();
161}
162
163int
164AbstractObservableLocalPluginAdapter::countObservers() const
165{
166 return mObservationManager->countObservers();
167}
168
169void
170AbstractObservableLocalPluginAdapter::setPluginObservationExceptionHandler(
171 std::shared_ptr<PluginObservationExceptionHandlerSpi> exceptionHandler)
172{
173 checkStatus();
174 mObservationManager->setObservationExceptionHandler(exceptionHandler);
175}
176
177} /* namespace service */
178} /* namespace core */
179} /* namespace keyple */