11#include "keyple/plugin/stub/StubPoolPluginAdapter.hpp"
15#include "keyple/core/plugin/PluginIOException.hpp"
16#include "keyple/core/util/KeypleAssert.hpp"
17#include "keyple/core/util/cpp/exception/IllegalArgumentException.hpp"
23using keyple::core::plugin::PluginIOException;
24using keyple::core::plugin::spi::PoolReaderSpi;
25using keyple::core::util::Assert;
26using keyple::core::util::cpp::exception::IllegalArgumentException;
28StubPoolPluginAdapter::StubPoolPluginAdapter(
29 const std::string& name,
30 const std::vector<std::shared_ptr<StubPoolReaderConfiguration>>&
32 const int monitoringCycleDuration)
38 std::vector<std::shared_ptr<StubReaderConfiguration>> configurations;
39 for (
const auto& config : readerConfigurations) {
40 configurations.push_back(
41 std::dynamic_pointer_cast<StubReaderConfiguration>(config));
44 mStubPluginAdapter = std::make_shared<StubPluginAdapter>(
45 name, configurations, monitoringCycleDuration);
47 for (
const auto& readerConfiguration : readerConfigurations) {
48 mReaderToGroup.insert(
49 {readerConfiguration->getName(),
50 readerConfiguration->getGroupReference()});
55StubPoolPluginAdapter::getName()
const
57 return mStubPluginAdapter->getName();
60const std::vector<std::shared_ptr<ReaderSpi>>
61StubPoolPluginAdapter::searchAvailableReaders()
63 return mStubPluginAdapter->searchAvailableReaders();
66const std::vector<std::string>
67StubPoolPluginAdapter::getReaderGroupReferences()
const
69 std::vector<std::string> references;
70 for (
const auto& ref : mReaderToGroup) {
71 references.push_back(ref.second);
77std::shared_ptr<PoolReaderSpi>
78StubPoolPluginAdapter::allocateReader(
const std::string& readerGroupReference)
80 std::vector<std::string> candidateReadersName;
82 if (readerGroupReference ==
"") {
84 candidateReadersName = mStubPluginAdapter->searchAvailableReaderNames();
88 candidateReadersName = listReadersByGroup(readerGroupReference);
92 for (
const auto& readerName : candidateReadersName) {
94 const auto it = std::find(
95 mAllocatedReaders.begin(), mAllocatedReaders.end(), readerName);
96 if (it == mAllocatedReaders.end()) {
97 mAllocatedReaders.push_back(readerName);
98 return std::dynamic_pointer_cast<PoolReaderSpi>(
99 mStubPluginAdapter->searchReader(readerName));
103 throw PluginIOException(
104 "No reader is available for the given group reference:"
105 + readerGroupReference);
109StubPoolPluginAdapter::releaseReader(std::shared_ptr<ReaderSpi> readerSpi)
111 Assert::getInstance().notNull(readerSpi,
"reader SPI");
113 const auto stub = std::dynamic_pointer_cast<StubReader>(readerSpi);
115 throw IllegalArgumentException(
116 std::string(
"Cannot cast 'readerSpi' to StubReader. Actual type: ")
117 +
typeid(readerSpi).name());
120 const auto it = std::find(
121 mAllocatedReaders.begin(),
122 mAllocatedReaders.end(),
123 readerSpi->getName());
124 mAllocatedReaders.erase(it);
128StubPoolPluginAdapter::onUnregister()
134StubPoolPluginAdapter::plugPoolReader(
135 const std::string& groupReference,
136 const std::string& readerName,
137 std::shared_ptr<StubSmartCard> card)
140 mStubPluginAdapter->plugReader(readerName,
false, card);
143 mReaderToGroup.insert({readerName, groupReference});
147StubPoolPluginAdapter::unplugPoolReaders(
const std::string& groupReference)
150 const std::vector<std::string> readerNames
151 = listReadersByGroup(groupReference);
152 for (
const auto& readerName : readerNames) {
153 unplugPoolReader(readerName);
158StubPoolPluginAdapter::unplugPoolReader(
const std::string& readerName)
161 mReaderToGroup.erase(mReaderToGroup.find(readerName));
164 const auto it = std::find(
165 mAllocatedReaders.begin(), mAllocatedReaders.end(), readerName);
166 if (it != mAllocatedReaders.end()) {
167 mAllocatedReaders.erase(it);
171 mStubPluginAdapter->unplugReader(readerName);
175StubPoolPluginAdapter::getMonitoringCycleDuration()
const
177 return mStubPluginAdapter->getMonitoringCycleDuration();
180const std::vector<std::string>
181StubPoolPluginAdapter::searchAvailableReaderNames()
183 return mStubPluginAdapter->searchAvailableReaderNames();
186std::shared_ptr<ReaderSpi>
187StubPoolPluginAdapter::searchReader(
const std::string& readerName)
189 return mStubPluginAdapter->searchReader(readerName);
192const std::vector<std::string>
193StubPoolPluginAdapter::listReadersByGroup(
const std::string& aGroupReference)
195 std::vector<std::string> readers;
198 for (
const auto& entry : mReaderToGroup) {
199 const std::string readerName = entry.first;
200 const std::string groupReference = entry.second;
201 if (groupReference == aGroupReference) {
202 readers.push_back(readerName);