14#include "keyple/core/service/resource/CardResourceServiceConfiguratorAdapter.hpp"
16#include "keyple/core/service/resource/CardResourceServiceAdapter.hpp"
17#include "keyple/core/util/KeypleAssert.hpp"
18#include "keyple/core/util/cpp/Arrays.hpp"
19#include "keyple/core/util/cpp/exception/IllegalStateException.hpp"
26using keyple::core::util::Assert;
27using keyple::core::util::cpp::Arrays;
28using keyple::core::util::cpp::exception::IllegalStateException;
30CardResourceServiceConfiguratorAdapter::CardResourceServiceConfiguratorAdapter()
31: mIsBlockingAllocationMode(false)
35CardResourceServiceConfigurator&
36CardResourceServiceConfiguratorAdapter::withPlugins(
37 std::shared_ptr<PluginsConfigurator> pluginsConfigurator)
39 Assert::getInstance().notNull(pluginsConfigurator,
"pluginsConfigurator");
42 if (!mPlugins.empty()) {
43 throw IllegalStateException(
"Plugins already configured");
46 mPlugins = pluginsConfigurator->getPlugins();
47 mConfiguredPlugins = pluginsConfigurator->getConfiguredPlugins();
48 mAllocationStrategy = pluginsConfigurator->getAllocationStrategy();
49 mUsageTimeoutMillis = pluginsConfigurator->getUsageTimeoutMillis();
54CardResourceServiceConfigurator&
55CardResourceServiceConfiguratorAdapter::withPoolPlugins(
56 std::shared_ptr<PoolPluginsConfigurator> poolPluginsConfigurator)
58 Assert::getInstance().notNull(
59 poolPluginsConfigurator,
"poolPluginsConfigurator");
62 if (!mPoolPlugins.empty()) {
63 throw IllegalStateException(
"Pool plugins already configured");
66 mPoolPlugins = poolPluginsConfigurator->getPoolPlugins();
67 mUsePoolFirst = poolPluginsConfigurator->isUsePoolFirst();
72CardResourceServiceConfigurator&
73CardResourceServiceConfiguratorAdapter::withCardResourceProfiles(
74 const std::vector<std::shared_ptr<CardResourceProfileConfigurator>>&
75 cardResourceProfileConfigurators)
77 if (!mCardResourceProfileConfigurators.empty()) {
78 throw IllegalStateException(
79 "Card resource profiles already configured");
82 for (
const auto& configurator : cardResourceProfileConfigurators) {
83 Assert::getInstance().notNull(
84 configurator,
"cardResourceProfileConfigurator");
85 mCardResourceProfileConfigurators.push_back(configurator);
91CardResourceServiceConfigurator&
92CardResourceServiceConfiguratorAdapter::withBlockingAllocationMode(
93 const int cycleDurationMillis,
const int timeoutMillis)
96 .greaterOrEqual(cycleDurationMillis, 1,
"cycleDurationMillis")
97 .greaterOrEqual(timeoutMillis, 1,
"timeoutMillis");
99 if (mIsBlockingAllocationMode) {
100 throw IllegalStateException(
"Allocation mode already configured");
103 mIsBlockingAllocationMode =
true;
104 mCycleDurationMillis = cycleDurationMillis;
105 mTimeoutMillis = timeoutMillis;
111CardResourceServiceConfiguratorAdapter::configure()
130 std::vector<std::shared_ptr<Plugin>> allPlugins;
131 Arrays::addAll(allPlugins, mPlugins);
132 Arrays::addAll(allPlugins, mPoolPlugins);
134 if (allPlugins.empty()) {
135 throw IllegalStateException(
"No plugin configured");
139 if (mCardResourceProfileConfigurators.empty()) {
140 throw IllegalStateException(
"No card resource profile configured");
144 std::vector<std::string> profileNames;
145 for (
const auto& profile : mCardResourceProfileConfigurators) {
148 profileNames.begin(),
150 profile->getProfileName())
151 != profileNames.end()) {
152 throw IllegalStateException(
153 "Some card resource profiles are configured with the same"
157 profileNames.push_back(profile->getProfileName());
160 if (!Arrays::containsAll(allPlugins, profile->getPlugins())) {
161 throw IllegalStateException(
162 "Some card resource profiles specify plugins which are "
163 "not configured in the global list");
168 const std::vector<std::shared_ptr<Plugin>> usedPlugins
169 = computeUsedPlugins(allPlugins);
171 if (usedPlugins.size() != allPlugins.size()) {
172 std::vector<std::shared_ptr<Plugin>> unusedPlugins = allPlugins;
173 Arrays::removeAll(unusedPlugins, usedPlugins);
174 Arrays::removeAll(mPlugins, unusedPlugins);
176 mConfiguredPlugins, getConfiguredPlugins(unusedPlugins));
177 Arrays::removeAll(mPoolPlugins, extractPoolPlugins(unusedPlugins));
181 CardResourceServiceAdapter::getInstance()->configure(shared_from_this());
184const std::vector<std::shared_ptr<Plugin>>
185CardResourceServiceConfiguratorAdapter::computeUsedPlugins(
186 const std::vector<std::shared_ptr<Plugin>>& configuredPlugins)
const
188 std::vector<std::shared_ptr<Plugin>> usedPlugins;
190 for (
const auto& profile : mCardResourceProfileConfigurators) {
191 if (profile->getPlugins().empty()) {
192 return configuredPlugins;
194 Arrays::addAll(usedPlugins, profile->getPlugins());
201const std::vector<std::shared_ptr<Plugin>>&
202CardResourceServiceConfiguratorAdapter::getPlugins()
const
207const std::vector<std::shared_ptr<ConfiguredPlugin>>&
208CardResourceServiceConfiguratorAdapter::getConfiguredPlugins()
const
210 return mConfiguredPlugins;
214CardResourceServiceConfiguratorAdapter::getAllocationStrategy()
const
216 return mAllocationStrategy;
220CardResourceServiceConfiguratorAdapter::getUsageTimeoutMillis()
const
222 return mUsageTimeoutMillis;
225const std::vector<std::shared_ptr<PoolPlugin>>&
226CardResourceServiceConfiguratorAdapter::getPoolPlugins()
const
232CardResourceServiceConfiguratorAdapter::isUsePoolFirst()
const
234 return mUsePoolFirst;
237const std::vector<std::shared_ptr<CardResourceProfileConfigurator>>&
238CardResourceServiceConfiguratorAdapter::getCardResourceProfileConfigurators()
241 return mCardResourceProfileConfigurators;
245CardResourceServiceConfiguratorAdapter::isBlockingAllocationMode()
const
247 return mIsBlockingAllocationMode;
251CardResourceServiceConfiguratorAdapter::getCycleDurationMillis()
const
253 return mCycleDurationMillis;
257CardResourceServiceConfiguratorAdapter::getTimeoutMillis()
const
259 return mTimeoutMillis;
262const std::vector<std::shared_ptr<PoolPlugin>>
263CardResourceServiceConfiguratorAdapter::extractPoolPlugins(
264 const std::vector<std::shared_ptr<Plugin>>& plugins)
266 std::vector<std::shared_ptr<PoolPlugin>> results;
268 for (
const auto& plugin : plugins) {
269 const auto pool = std::dynamic_pointer_cast<PoolPlugin>(plugin);
270 if (pool !=
nullptr) {
271 results.push_back(pool);
278const std::vector<std::shared_ptr<ConfiguredPlugin>>
279CardResourceServiceConfiguratorAdapter::getConfiguredPlugins(
280 const std::vector<std::shared_ptr<Plugin>>& plugins)
const
282 std::vector<std::shared_ptr<ConfiguredPlugin>> results;
284 for (
const auto& configuredRegularPlugin : mConfiguredPlugins) {
285 if (Arrays::contains(plugins, configuredRegularPlugin->getPlugin())) {
286 results.push_back(configuredRegularPlugin);
PluginsConfigurator::AllocationStrategy AllocationStrategy