Keyple Service C++ Library - 3.3.5
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/exception/Exception.hpp"
23
24namespace keyple {
25namespace core {
26namespace service {
27
28using keyple::core::util::cpp::exception::Exception;
29
30/* ABSTRACT OBSERVABLE LOCAL PLUGIN ADAPTER JOB
31 * ------------------------------------------------- */
32
33AbstractObservableLocalPluginAdapter::ObservableLocalPluginAdapterJob ::
34 ObservableLocalPluginAdapterJob(
35 std::shared_ptr<PluginObserverSpi> observer,
36 const std::shared_ptr<PluginEvent> event,
37 AbstractObservableLocalPluginAdapter* parent)
38: Job("AbstractObservableLocalPluginAdapter")
39, mObserver(observer)
40, mEvent(event)
41, mParent(parent)
42{
43}
44
45void
46AbstractObservableLocalPluginAdapter::ObservableLocalPluginAdapterJob::execute()
47{
48 mParent->notifyObserver(mObserver, mEvent);
49}
50
51/* ABSTRACT OBSERVABLE LOCAL PLUGIN ADAPTER
52 * ----------------------------------------------------- */
53
54AbstractObservableLocalPluginAdapter::AbstractObservableLocalPluginAdapter(
55 std::shared_ptr<PluginSpi> pluginSpi)
56: LocalPluginAdapter(pluginSpi)
57, mObservationManager(
58 std::make_shared<ObservationManagerAdapter<
59 PluginObserverSpi,
60 PluginObservationExceptionHandlerSpi>>("", ""))
61{
62}
63
64std::shared_ptr<ObservationManagerAdapter<
65 PluginObserverSpi,
66 PluginObservationExceptionHandlerSpi>>
67AbstractObservableLocalPluginAdapter::getObservationManager() const
68{
69 return mObservationManager;
70}
71
72void
73AbstractObservableLocalPluginAdapter::notifyObservers(
74 const std::shared_ptr<PluginEvent> event)
75{
76 mLogger->debug(
77 "Plugin [%] notifies event [%] to % observer(s)\n",
78 getName(),
79 event->getType(),
80 countObservers());
81
82 for (const auto& observer : mObservationManager->getObservers()) {
83 notifyObserver(observer, event);
84 }
85}
86
87void
88AbstractObservableLocalPluginAdapter::notifyObserver(
89 std::shared_ptr<PluginObserverSpi> observer,
90 const std::shared_ptr<PluginEvent> event)
91{
92 try {
93 observer->onPluginEvent(event);
94
95 } catch (const Exception& e) {
96 auto _e(std::unique_ptr<Exception>(new Exception(e)));
97 try {
98 mObservationManager->getObservationExceptionHandler()
99 ->onPluginObservationError(getName(), std::move(_e));
100
101 } catch (const Exception& e2) {
102 mLogger->error("Event notification error: %\n", e2.getMessage());
103 mLogger->error("Original cause: %\n", e.getMessage());
104 }
105 }
106}
107
108void
109AbstractObservableLocalPluginAdapter::doUnregister()
110{
111 const std::vector<std::string>& unregisteredReaderNames = getReaderNames();
112
113 notifyObservers(
114 std::make_shared<PluginEventAdapter>(
115 getName(),
116 unregisteredReaderNames,
117 PluginEvent::Type::UNAVAILABLE));
118
119 clearObservers();
120 LocalPluginAdapter::doUnregister();
121}
122
123void
124AbstractObservableLocalPluginAdapter::addObserver(
125 const std::shared_ptr<PluginObserverSpi> observer)
126{
127 checkStatus();
128 mObservationManager->addObserver(observer);
129}
130
131void
132AbstractObservableLocalPluginAdapter::removeObserver(
133 const std::shared_ptr<PluginObserverSpi> observer)
134{
135 Assert::getInstance().notNull(observer, "observer");
136
137 const auto& observers = mObservationManager->getObservers();
138 const auto it = std::find(observers.begin(), observers.end(), observer);
139
140 if (it != observers.end()) {
141 mObservationManager->removeObserver(observer);
142 }
143}
144
145void
146AbstractObservableLocalPluginAdapter::clearObservers()
147{
148 mObservationManager->clearObservers();
149}
150
151int
152AbstractObservableLocalPluginAdapter::countObservers() const
153{
154 return mObservationManager->countObservers();
155}
156
157void
158AbstractObservableLocalPluginAdapter::setPluginObservationExceptionHandler(
159 std::shared_ptr<PluginObservationExceptionHandlerSpi> exceptionHandler)
160{
161 checkStatus();
162 mObservationManager->setObservationExceptionHandler(exceptionHandler);
163}
164
165} /* namespace service */
166} /* namespace core */
167} /* namespace keyple */