Keyple Service Resource C++ Library - 3.1.1
Component of the Keyple C++ middleware
CardResourceServiceConfiguratorAdapter.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/resource/CardResourceServiceConfiguratorAdapter.hpp"
15
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"
20
21namespace keyple {
22namespace core {
23namespace service {
24namespace resource {
25
26using keyple::core::util::Assert;
27using keyple::core::util::cpp::Arrays;
28using keyple::core::util::cpp::exception::IllegalStateException;
29
30CardResourceServiceConfiguratorAdapter::CardResourceServiceConfiguratorAdapter()
31: mIsBlockingAllocationMode(false)
32{
33}
34
35CardResourceServiceConfigurator&
36CardResourceServiceConfiguratorAdapter::withPlugins(
37 std::shared_ptr<PluginsConfigurator> pluginsConfigurator)
38{
39 Assert::getInstance().notNull(pluginsConfigurator, "pluginsConfigurator");
40
41 /* C++: Java checks against nullity here... */
42 if (!mPlugins.empty()) {
43 throw IllegalStateException("Plugins already configured");
44 }
45
46 mPlugins = pluginsConfigurator->getPlugins();
47 mConfiguredPlugins = pluginsConfigurator->getConfiguredPlugins();
48 mAllocationStrategy = pluginsConfigurator->getAllocationStrategy();
49 mUsageTimeoutMillis = pluginsConfigurator->getUsageTimeoutMillis();
50
51 return *this;
52}
53
54CardResourceServiceConfigurator&
55CardResourceServiceConfiguratorAdapter::withPoolPlugins(
56 std::shared_ptr<PoolPluginsConfigurator> poolPluginsConfigurator)
57{
58 Assert::getInstance().notNull(
59 poolPluginsConfigurator, "poolPluginsConfigurator");
60
61 /* C++: Java checks against nullity here... */
62 if (!mPoolPlugins.empty()) {
63 throw IllegalStateException("Pool plugins already configured");
64 }
65
66 mPoolPlugins = poolPluginsConfigurator->getPoolPlugins();
67 mUsePoolFirst = poolPluginsConfigurator->isUsePoolFirst();
68
69 return *this;
70}
71
72CardResourceServiceConfigurator&
73CardResourceServiceConfiguratorAdapter::withCardResourceProfiles(
74 const std::vector<std::shared_ptr<CardResourceProfileConfigurator>>&
75 cardResourceProfileConfigurators)
76{
77 if (!mCardResourceProfileConfigurators.empty()) {
78 throw IllegalStateException(
79 "Card resource profiles already configured");
80 }
81
82 for (const auto& configurator : cardResourceProfileConfigurators) {
83 Assert::getInstance().notNull(
84 configurator, "cardResourceProfileConfigurator");
85 mCardResourceProfileConfigurators.push_back(configurator);
86 }
87
88 return *this;
89}
90
91CardResourceServiceConfigurator&
92CardResourceServiceConfiguratorAdapter::withBlockingAllocationMode(
93 const int cycleDurationMillis, const int timeoutMillis)
94{
95 Assert::getInstance()
96 .greaterOrEqual(cycleDurationMillis, 1, "cycleDurationMillis")
97 .greaterOrEqual(timeoutMillis, 1, "timeoutMillis");
98
99 if (mIsBlockingAllocationMode) {
100 throw IllegalStateException("Allocation mode already configured");
101 }
102
103 mIsBlockingAllocationMode = true;
104 mCycleDurationMillis = cycleDurationMillis;
105 mTimeoutMillis = timeoutMillis;
106
107 return *this;
108}
109
110void
111CardResourceServiceConfiguratorAdapter::configure()
112{
113 /*
114 * Configure default values
115 *
116 * C++: can't have null vector, this step is not required (?)
117 * FIXME (?)
118 */
119 // if (plugins == null) {
120 // plugins = Collections.emptyList();
121 // }
122 // if (configuredPlugins == null) {
123 // configuredPlugins = Collections.emptyList();
124 // }
125 // if (poolPlugins == null) {
126 // poolPlugins = Collections.emptyList();
127 // }
128
129 /* Check global plugins (regular + pool) */
130 std::vector<std::shared_ptr<Plugin>> allPlugins;
131 Arrays::addAll(allPlugins, mPlugins);
132 Arrays::addAll(allPlugins, mPoolPlugins);
133
134 if (allPlugins.empty()) {
135 throw IllegalStateException("No plugin configured");
136 }
137
138 /* Check card resource profiles */
139 if (mCardResourceProfileConfigurators.empty()) {
140 throw IllegalStateException("No card resource profile configured");
141 }
142
143 /* Check card resource profiles names and plugins */
144 std::vector<std::string> profileNames;
145 for (const auto& profile : mCardResourceProfileConfigurators) {
146 /* Check name */
147 if (std::find(
148 profileNames.begin(),
149 profileNames.end(),
150 profile->getProfileName())
151 != profileNames.end()) {
152 throw IllegalStateException(
153 "Some card resource profiles are configured with the same"
154 " profile name");
155 }
156
157 profileNames.push_back(profile->getProfileName());
158
159 /* Check plugins */
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");
164 }
165 }
166
167 /* Remove plugins not used by at least one card profile */
168 const std::vector<std::shared_ptr<Plugin>> usedPlugins
169 = computeUsedPlugins(allPlugins);
170
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);
175 Arrays::removeAll(
176 mConfiguredPlugins, getConfiguredPlugins(unusedPlugins));
177 Arrays::removeAll(mPoolPlugins, extractPoolPlugins(unusedPlugins));
178 }
179
180 /* Apply the configuration */
181 CardResourceServiceAdapter::getInstance()->configure(shared_from_this());
182}
183
184const std::vector<std::shared_ptr<Plugin>>
185CardResourceServiceConfiguratorAdapter::computeUsedPlugins(
186 const std::vector<std::shared_ptr<Plugin>>& configuredPlugins) const
187{
188 std::vector<std::shared_ptr<Plugin>> usedPlugins;
189
190 for (const auto& profile : mCardResourceProfileConfigurators) {
191 if (profile->getPlugins().empty()) {
192 return configuredPlugins;
193 } else {
194 Arrays::addAll(usedPlugins, profile->getPlugins());
195 }
196 }
197
198 return usedPlugins;
199}
200
201const std::vector<std::shared_ptr<Plugin>>&
202CardResourceServiceConfiguratorAdapter::getPlugins() const
203{
204 return mPlugins;
205}
206
207const std::vector<std::shared_ptr<ConfiguredPlugin>>&
208CardResourceServiceConfiguratorAdapter::getConfiguredPlugins() const
209{
210 return mConfiguredPlugins;
211}
212
214CardResourceServiceConfiguratorAdapter::getAllocationStrategy() const
215{
216 return mAllocationStrategy;
217}
218
219int
220CardResourceServiceConfiguratorAdapter::getUsageTimeoutMillis() const
221{
222 return mUsageTimeoutMillis;
223}
224
225const std::vector<std::shared_ptr<PoolPlugin>>&
226CardResourceServiceConfiguratorAdapter::getPoolPlugins() const
227{
228 return mPoolPlugins;
229}
230
231bool
232CardResourceServiceConfiguratorAdapter::isUsePoolFirst() const
233{
234 return mUsePoolFirst;
235}
236
237const std::vector<std::shared_ptr<CardResourceProfileConfigurator>>&
238CardResourceServiceConfiguratorAdapter::getCardResourceProfileConfigurators()
239 const
240{
241 return mCardResourceProfileConfigurators;
242}
243
244bool
245CardResourceServiceConfiguratorAdapter::isBlockingAllocationMode() const
246{
247 return mIsBlockingAllocationMode;
248}
249
250int
251CardResourceServiceConfiguratorAdapter::getCycleDurationMillis() const
252{
253 return mCycleDurationMillis;
254}
255
256int
257CardResourceServiceConfiguratorAdapter::getTimeoutMillis() const
258{
259 return mTimeoutMillis;
260}
261
262const std::vector<std::shared_ptr<PoolPlugin>>
263CardResourceServiceConfiguratorAdapter::extractPoolPlugins(
264 const std::vector<std::shared_ptr<Plugin>>& plugins)
265{
266 std::vector<std::shared_ptr<PoolPlugin>> results;
267
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);
272 }
273 }
274
275 return results;
276}
277
278const std::vector<std::shared_ptr<ConfiguredPlugin>>
279CardResourceServiceConfiguratorAdapter::getConfiguredPlugins(
280 const std::vector<std::shared_ptr<Plugin>>& plugins) const
281{
282 std::vector<std::shared_ptr<ConfiguredPlugin>> results;
283
284 for (const auto& configuredRegularPlugin : mConfiguredPlugins) {
285 if (Arrays::contains(plugins, configuredRegularPlugin->getPlugin())) {
286 results.push_back(configuredRegularPlugin);
287 }
288 }
289
290 return results;
291}
292
293} /* namespace resource */
294} /* namespace service */
295} /* namespace core */
296} /* namespace keyple */
PluginsConfigurator::AllocationStrategy AllocationStrategy