From 9ad5811fa424b61dc486db6c27a38336054afd35 Mon Sep 17 00:00:00 2001 From: Andrei Cristea Date: Tue, 10 Feb 2026 16:26:10 +0100 Subject: [PATCH 1/3] refactor: normalize logging --- CHANGELOG.md | 8 +++ build.gradle.kts | 13 ++-- gradle.properties | 2 +- .../AbstractObservableLocalPluginAdapter.java | 17 ++++-- .../core/service/AbstractPluginAdapter.java | 6 +- .../core/service/AbstractReaderAdapter.java | 40 ++++++------ .../core/service/ApduResponseAdapter.java | 15 +++-- ...utonomousObservableLocalPluginAdapter.java | 9 +-- .../service/BasicCardSelectorAdapter.java | 14 +++-- ...rdInsertionActiveMonitoringJobAdapter.java | 14 +++-- ...dInsertionPassiveMonitoringJobAdapter.java | 22 +++++-- ...CardRemovalActiveMonitoringJobAdapter.java | 13 +++- ...ardRemovalPassiveMonitoringJobAdapter.java | 17 ++++-- .../core/service/CardResponseAdapter.java | 12 ++-- .../service/CardSelectionManagerAdapter.java | 4 +- .../service/CardSelectionResponseAdapter.java | 17 ++++-- .../service/CardSelectionScenarioAdapter.java | 16 +++-- .../DistributedLocalServiceAdapter.java | 16 +++-- .../core/service/DistributedUtilAdapter.java | 8 +-- .../keyple/core/service/InternalDto.java | 33 +++++++--- .../core/service/InternalLegacyDto.java | 58 ++++++++++++++++-- .../core/service/IsoCardSelectorAdapter.java | 21 +++++-- .../core/service/LocalPluginAdapter.java | 5 +- .../core/service/LocalPoolPluginAdapter.java | 7 ++- .../core/service/LocalReaderAdapter.java | 36 ++++++----- .../service/ObservableLocalPluginAdapter.java | 36 +++++------ .../service/ObservableLocalReaderAdapter.java | 49 +++++++++------ .../ObservableReaderStateServiceAdapter.java | 61 +++++++++---------- .../ObservableRemotePluginAdapter.java | 32 +++++++--- .../ObservableRemoteReaderAdapter.java | 28 ++++++--- .../service/ObservationManagerAdapter.java | 10 +-- .../core/service/RemotePluginAdapter.java | 17 ++++-- .../core/service/RemotePoolPluginAdapter.java | 18 ++++-- .../core/service/SmartCardServiceAdapter.java | 19 +++--- .../WaitForCardInsertionStateAdapter.java | 23 +++++-- .../WaitForCardProcessingStateAdapter.java | 18 ++++-- .../WaitForCardRemovalStateAdapter.java | 18 ++++-- .../WaitForStartDetectStateAdapter.java | 18 ++++-- src/main/uml/adapter_class_diagram.puml | 1 - src/main/uml/adapter_class_diagram.svg | 2 +- 40 files changed, 524 insertions(+), 249 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3be8c8ba..95a94609 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,14 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +### Changed +- Normalized logging using Keyple coding standards. +### Upgraded +- `keyple-plugin-java-api` from `2.3.1` to `2.3.2` (code source not impacted) +- `keyple-distributed-remote-java-api` from `3.1.0` to `3.1.1` (code source not impacted) +- `keyple-distributed-local-java-api` from `2.2.0` to `2.2.1` (code source not impacted) +- `keyple-util-java-lib` from `2.4.0` to `2.4.1` (code source not impacted) +- `slf4j-api` from `1.7.32` to `1.7.36` (`compileOnly`) ## [3.4.0] - 2025-11-21 ### Upgraded diff --git a/build.gradle.kts b/build.gradle.kts index 2237a427..7447182f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -17,13 +17,14 @@ dependencies { implementation("org.eclipse.keypop:keypop-reader-java-api:2.1.0") implementation("org.eclipse.keypop:keypop-card-java-api:2.0.1") implementation("org.eclipse.keyple:keyple-common-java-api:2.0.2") - implementation("org.eclipse.keyple:keyple-plugin-java-api:2.3.1") - implementation("org.eclipse.keyple:keyple-distributed-remote-java-api:3.1.0") - implementation("org.eclipse.keyple:keyple-distributed-local-java-api:2.2.0") - implementation("org.eclipse.keyple:keyple-util-java-lib:2.4.0") + implementation("org.eclipse.keyple:keyple-plugin-java-api:2.3.2") + implementation("org.eclipse.keyple:keyple-distributed-remote-java-api:3.1.1") + implementation("org.eclipse.keyple:keyple-distributed-local-java-api:2.2.1") + implementation("org.eclipse.keyple:keyple-util-java-lib:2.4.1") implementation("com.google.code.gson:gson:2.10.1") - implementation("org.slf4j:slf4j-api:1.7.32") - testImplementation("org.slf4j:slf4j-simple:1.7.32") + compileOnly("org.slf4j:slf4j-api:1.7.36") + + testImplementation("org.slf4j:slf4j-simple:1.7.36") testImplementation(platform("org.junit:junit-bom:5.10.2")) testImplementation("org.junit.jupiter:junit-jupiter") testImplementation("org.junit.vintage:junit-vintage-engine") diff --git a/gradle.properties b/gradle.properties index 4878ab89..3005cf48 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ group = org.eclipse.keyple title = Keyple Service Java Lib description = Keyple core components -version = 3.4.0-SNAPSHOT +version = 3.4.1-SNAPSHOT # Java Configuration javaSourceLevel = 1.8 diff --git a/src/main/java/org/eclipse/keyple/core/service/AbstractObservableLocalPluginAdapter.java b/src/main/java/org/eclipse/keyple/core/service/AbstractObservableLocalPluginAdapter.java index b4199fe4..48ab8324 100644 --- a/src/main/java/org/eclipse/keyple/core/service/AbstractObservableLocalPluginAdapter.java +++ b/src/main/java/org/eclipse/keyple/core/service/AbstractObservableLocalPluginAdapter.java @@ -66,18 +66,20 @@ abstract class AbstractObservableLocalPluginAdapter extends LocalPluginAdapter * @since 2.0.0 */ final void notifyObservers(final PluginEvent event) { - if (logger.isDebugEnabled()) { logger.debug( - "Plugin [{}] notifies event [{}] to {} observer(s)", + "[plugin={}] Notifying observers [eventType={}, readerNames={}, observerCount={}]", getName(), event.getType().name(), + event.getReaderNames(), countObservers()); } - for (PluginObserverSpi observer : observationManager.getObservers()) { notifyObserver(observer, event); } + if (logger.isDebugEnabled()) { + logger.debug("[plugin={}] Observers notified", getName()); + } } /** @@ -93,8 +95,13 @@ private void notifyObserver(PluginObserverSpi observer, PluginEvent event) { try { observationManager.getObservationExceptionHandler().onPluginObservationError(getName(), e); } catch (Exception e2) { - logger.error("Event notification error: {}", e2.getMessage(), e2); - logger.error("Original cause: {}", e.getMessage(), e); + logger.error( + "[plugin={}] Failed to notify observer [reason={}]", getName(), e.getMessage(), e); + logger.error( + "[plugin={}] Failed to notify observation exception handler [reason={}]", + getName(), + e2.getMessage(), + e2); } } } diff --git a/src/main/java/org/eclipse/keyple/core/service/AbstractPluginAdapter.java b/src/main/java/org/eclipse/keyple/core/service/AbstractPluginAdapter.java index 9893a6cf..ef11cc69 100644 --- a/src/main/java/org/eclipse/keyple/core/service/AbstractPluginAdapter.java +++ b/src/main/java/org/eclipse/keyple/core/service/AbstractPluginAdapter.java @@ -110,7 +110,11 @@ void unregister() { try { ((AbstractReaderAdapter) reader).unregister(); } catch (Exception e) { - logger.warn("Error unregistering reader [{}]: {}", reader.getName(), e.getMessage()); + logger.warn( + "[plugin={}] Failed to unregister reader [name={}, reason={}]", + pluginName, + reader.getName(), + e.getMessage()); } } readers.clear(); diff --git a/src/main/java/org/eclipse/keyple/core/service/AbstractReaderAdapter.java b/src/main/java/org/eclipse/keyple/core/service/AbstractReaderAdapter.java index eabb56a7..b7b9ecbe 100644 --- a/src/main/java/org/eclipse/keyple/core/service/AbstractReaderAdapter.java +++ b/src/main/java/org/eclipse/keyple/core/service/AbstractReaderAdapter.java @@ -111,14 +111,14 @@ final List transmitCardSelectionRequests( List cardSelectionResponses = null; - if (logger.isTraceEnabled()) { + if (logger.isDebugEnabled()) { long timeStamp = System.nanoTime(); long elapsed10ms = (timeStamp - before) / 100000; this.before = timeStamp; - logger.trace( - "Reader [{}] --> cardSelectionRequests: {}, elapsed {} ms", - this.getName(), - cardSelectionRequests, + logger.debug( + "[reader={}] Send [type=CardSelectionRequests, cardSelectionRequestCount={}, elapsedMs={}]", + getName(), + cardSelectionRequests.size(), elapsed10ms / 10.0); } @@ -130,14 +130,14 @@ final List transmitCardSelectionRequests( throw new CardBrokenCommunicationException( e.getCardResponse(), false, "An unexpected status word was received", e); } finally { - if (logger.isTraceEnabled()) { + if (logger.isDebugEnabled()) { long timeStamp = System.nanoTime(); long elapsed10ms = (timeStamp - before) / 100000; this.before = timeStamp; - logger.trace( - "Reader [{}] <-- cardSelectionResponses: {}, elapsed {} ms", - this.getName(), - cardSelectionResponses, + logger.debug( + "[reader={}] Receive [type=CardSelectionResponses, cardSelectionResponseCount={}, elapsedMs={}]", + getName(), + cardSelectionResponses != null ? cardSelectionResponses.size() : 0, elapsed10ms / 10.0); } } @@ -250,28 +250,28 @@ public final CardResponseApi transmitCardRequest( CardResponseApi cardResponse = null; - if (logger.isTraceEnabled()) { + if (logger.isDebugEnabled()) { long timeStamp = System.nanoTime(); long elapsed10ms = (timeStamp - before) / 100000; this.before = timeStamp; - logger.trace( - "Reader [{}] --> cardRequest: {}, elapsed {} ms", - this.getName(), - cardRequest, + logger.debug( + "[reader={}] Send [type=CardRequest, apduRequestCount={}, elapsedMs={}]", + getName(), + cardRequest.getApduRequests().size(), elapsed10ms / 10.0); } try { cardResponse = processCardRequest(cardRequest, channelControl); } finally { - if (logger.isTraceEnabled()) { + if (logger.isDebugEnabled()) { long timeStamp = System.nanoTime(); long elapsed10ms = (timeStamp - before) / 100000; this.before = timeStamp; - logger.trace( - "Reader [{}] <-- cardResponse: {}, elapsed {} ms", - this.getName(), - cardResponse, + logger.debug( + "[reader={}] Receive [type=CardResponse, apduResponseCount={}, elapsedMs={}]", + getName(), + cardResponse != null ? cardResponse.getApduResponses().size() : 0, elapsed10ms / 10.0); } } diff --git a/src/main/java/org/eclipse/keyple/core/service/ApduResponseAdapter.java b/src/main/java/org/eclipse/keyple/core/service/ApduResponseAdapter.java index 16a8b128..ef840d3f 100644 --- a/src/main/java/org/eclipse/keyple/core/service/ApduResponseAdapter.java +++ b/src/main/java/org/eclipse/keyple/core/service/ApduResponseAdapter.java @@ -12,7 +12,7 @@ package org.eclipse.keyple.core.service; import java.util.Arrays; -import org.eclipse.keyple.core.util.json.JsonUtil; +import org.eclipse.keyple.core.util.HexUtil; import org.eclipse.keypop.card.ApduResponseApi; /** @@ -67,13 +67,20 @@ public int getStatusWord() { } /** - * Converts the APDU response into a string where the data is encoded in a json format. + * Returns a string representation of the object. * - * @return A not empty String + * @return A string that represents the current state of the object. * @since 2.0.0 */ @Override public String toString() { - return "APDU_RESPONSE = " + JsonUtil.toJson(this); + return "ApduResponseAdapter{" + + "apdu='" + + HexUtil.toHex(apdu) + + '\'' + + ", statusWord='" + + HexUtil.toHex(statusWord) + + '\'' + + '}'; } } diff --git a/src/main/java/org/eclipse/keyple/core/service/AutonomousObservableLocalPluginAdapter.java b/src/main/java/org/eclipse/keyple/core/service/AutonomousObservableLocalPluginAdapter.java index d7816d5c..6c390d4d 100644 --- a/src/main/java/org/eclipse/keyple/core/service/AutonomousObservableLocalPluginAdapter.java +++ b/src/main/java/org/eclipse/keyple/core/service/AutonomousObservableLocalPluginAdapter.java @@ -45,7 +45,8 @@ final class AutonomousObservableLocalPluginAdapter extends AbstractObservableLoc autonomousObservablePluginSpi.setCallback(this); } catch (Exception e) { if (logger.isTraceEnabled()) { - logger.trace("Method 'setCallback(...)' unavailable for legacy plugin: {}", e.getMessage()); + logger.trace( + "[plugin={}] Method 'setCallback(...)' unavailable for legacy plugin", getName()); } autonomousObservablePluginSpi.connect(this); } @@ -84,13 +85,13 @@ public void onReaderDisconnected(Set readerNames) { for (String readerName : readerNames) { CardReader reader = this.getReader(readerName); if (reader == null) { - logger.warn("Plugin [{}] unable to remove unknown reader [{}]", this.getName(), readerName); + logger.warn("[plugin={}] Unable to remove unknown reader [name={}]", getName(), readerName); } else { // unregister and remove reader ((LocalReaderAdapter) reader).unregister(); getReadersMap().remove(reader.getName()); logger.info( - "Plugin [{}] removes reader [{}] from readers list", this.getName(), reader.getName()); + "[plugin={}] Reader removed from readers list [name={}]", getName(), reader.getName()); notifyReaders.add(readerName); } } @@ -109,6 +110,6 @@ private void addReader(ReaderSpi readerSpi) { reader.register(); getReadersMap().put(reader.getName(), reader); logger.info( - "Plugin [{}] adds reader [{}] to readers list", this.getName(), readerSpi.getName()); + "[plugin={}] Reader added to readers list [name={}]", getName(), readerSpi.getName()); } } diff --git a/src/main/java/org/eclipse/keyple/core/service/BasicCardSelectorAdapter.java b/src/main/java/org/eclipse/keyple/core/service/BasicCardSelectorAdapter.java index 1581189a..bbad60b7 100644 --- a/src/main/java/org/eclipse/keyple/core/service/BasicCardSelectorAdapter.java +++ b/src/main/java/org/eclipse/keyple/core/service/BasicCardSelectorAdapter.java @@ -11,7 +11,6 @@ ************************************************************************************** */ package org.eclipse.keyple.core.service; -import org.eclipse.keyple.core.util.json.JsonUtil; import org.eclipse.keypop.reader.selection.BasicCardSelector; /** @@ -66,13 +65,20 @@ public BasicCardSelector filterByPowerOnData(String powerOnDataRegex) { } /** - * Converts the current instance into a string where the data is encoded in a json format. + * Returns a string representation of the object. * - * @return A not empty String + * @return A string that represents the current state of the object. * @since 3.0.0 */ @Override public String toString() { - return "BASIC_CARD_SELECTOR = " + JsonUtil.toJson(this); + return "BasicCardSelectorAdapter{" + + "logicalProtocolName='" + + logicalProtocolName + + '\'' + + ", powerOnDataRegex='" + + powerOnDataRegex + + '\'' + + '}'; } } diff --git a/src/main/java/org/eclipse/keyple/core/service/CardInsertionActiveMonitoringJobAdapter.java b/src/main/java/org/eclipse/keyple/core/service/CardInsertionActiveMonitoringJobAdapter.java index 5797f400..3f17ff42 100644 --- a/src/main/java/org/eclipse/keyple/core/service/CardInsertionActiveMonitoringJobAdapter.java +++ b/src/main/java/org/eclipse/keyple/core/service/CardInsertionActiveMonitoringJobAdapter.java @@ -31,6 +31,8 @@ final class CardInsertionActiveMonitoringJobAdapter extends AbstractMonitoringJo private static final Logger logger = LoggerFactory.getLogger(CardInsertionActiveMonitoringJobAdapter.class); + private static final String JOB_ID = "InsertionActive"; + private final long sleepDurationMillis; private final boolean monitorInsertion; private final CardReader reader; @@ -76,7 +78,8 @@ public void run() { try { if (logger.isTraceEnabled()) { logger.trace( - "Start monitoring job polling process using 'isCardPresent()' method on reader [{}]", + "[fsmJob={}, reader={}] Starting monitoring job polling process using 'isCardPresent()'", + JOB_ID, reader.getName()); } // re-init loop value to true @@ -85,7 +88,7 @@ public void run() { // polls for CARD_INSERTED if (monitorInsertion && reader.isCardPresent()) { if (logger.isTraceEnabled()) { - logger.trace("Card present"); + logger.trace("[fsmJob={}, reader={}] Card present", JOB_ID, reader.getName()); } monitoringState.onEvent(ObservableLocalReaderAdapter.InternalEvent.CARD_INSERTED); return; @@ -93,7 +96,7 @@ public void run() { // polls for CARD_REMOVED if (!monitorInsertion && !reader.isCardPresent()) { if (logger.isTraceEnabled()) { - logger.trace("Card not present"); + logger.trace("[fsmJob={}, reader={}] Card not present", JOB_ID, reader.getName()); } loop.set(false); monitoringState.onEvent(ObservableLocalReaderAdapter.InternalEvent.CARD_REMOVED); @@ -109,7 +112,10 @@ public void run() { } } if (logger.isTraceEnabled()) { - logger.trace("Monitoring job polling process stopped"); + logger.trace( + "[fsmJob={}, reader={}] Monitoring job polling process stopped", + JOB_ID, + reader.getName()); } } catch (RuntimeException e) { ((ObservableLocalReaderAdapter) reader) diff --git a/src/main/java/org/eclipse/keyple/core/service/CardInsertionPassiveMonitoringJobAdapter.java b/src/main/java/org/eclipse/keyple/core/service/CardInsertionPassiveMonitoringJobAdapter.java index 1776919d..e85f4e38 100644 --- a/src/main/java/org/eclipse/keyple/core/service/CardInsertionPassiveMonitoringJobAdapter.java +++ b/src/main/java/org/eclipse/keyple/core/service/CardInsertionPassiveMonitoringJobAdapter.java @@ -41,6 +41,8 @@ final class CardInsertionPassiveMonitoringJobAdapter extends AbstractMonitoringJ private static final Logger logger = LoggerFactory.getLogger(CardInsertionPassiveMonitoringJobAdapter.class); + private static final String JOB_ID = "InsertionPassive"; + private final ObservableReaderSpi readerSpi; /** @@ -76,7 +78,10 @@ Runnable getMonitoringJob(final AbstractObservableStateAdapter monitoringState) public void run() { try { if (logger.isTraceEnabled()) { - logger.trace("Start monitoring job process on reader [{}]", getReader().getName()); + logger.trace( + "[fsmJob={}, reader={}] Starting monitoring job process", + JOB_ID, + getReader().getName()); } if (readerSpi instanceof CardInsertionWaiterBlockingSpi) { ((CardInsertionWaiterBlockingSpi) readerSpi).waitForCardInsertion(); @@ -87,11 +92,16 @@ public void run() { } catch (ReaderIOException e) { // just warn as it can be a disconnection of the reader. logger.warn( - "Monitoring job error while processing card insertion event on reader [{}]: {}", + "[fsmJob={}, reader={}] Failed to process card insertion event [reason={}]", + JOB_ID, getReader().getName(), e.getMessage()); } catch (TaskCanceledException e) { - logger.warn("Monitoring job process cancelled: {}", e.getMessage()); + logger.warn( + "[fsmJob={}, reader={}] Monitoring job process cancelled [reason={}]", + JOB_ID, + getReader().getName(), + e.getMessage()); } catch (RuntimeException e) { getReader() .getObservationExceptionHandler() @@ -109,7 +119,8 @@ public void run() { @Override void stop() { if (logger.isTraceEnabled()) { - logger.trace("Stop monitoring job process"); + logger.trace( + "[fsmJob={}, reader={}] Stopping monitoring job process", JOB_ID, getReader().getName()); } if (readerSpi instanceof CardInsertionWaiterBlockingSpi) { ((CardInsertionWaiterBlockingSpi) readerSpi).stopWaitForCardInsertion(); @@ -117,7 +128,8 @@ void stop() { ((WaitForCardInsertionBlockingSpi) readerSpi).stopWaitForCardInsertion(); } if (logger.isTraceEnabled()) { - logger.trace("Monitoring job process stopped"); + logger.trace( + "[fsmJob={}, reader={}] Monitoring job process stopped", JOB_ID, getReader().getName()); } } } diff --git a/src/main/java/org/eclipse/keyple/core/service/CardRemovalActiveMonitoringJobAdapter.java b/src/main/java/org/eclipse/keyple/core/service/CardRemovalActiveMonitoringJobAdapter.java index 0baf8b1f..8fe7e0be 100644 --- a/src/main/java/org/eclipse/keyple/core/service/CardRemovalActiveMonitoringJobAdapter.java +++ b/src/main/java/org/eclipse/keyple/core/service/CardRemovalActiveMonitoringJobAdapter.java @@ -39,6 +39,8 @@ final class CardRemovalActiveMonitoringJobAdapter extends AbstractMonitoringJobA private static final Logger logger = LoggerFactory.getLogger(CardRemovalActiveMonitoringJobAdapter.class); + private static final String JOB_ID = "RemovalActive"; + private final AtomicBoolean loop = new AtomicBoolean(); private final long sleepDurationMillis; @@ -79,7 +81,8 @@ public void run() { try { if (logger.isTraceEnabled()) { logger.trace( - "Start monitoring job polling process using 'isCardPresentPing()' method on reader [{}]", + "[fsmJob={}, reader={}] Starting monitoring job polling process using 'isCardPresentPing()'", + JOB_ID, getReader().getName()); } // re-init loop value to true @@ -87,7 +90,8 @@ public void run() { while (loop.get()) { if (!getReader().isCardPresentPing()) { if (logger.isTraceEnabled()) { - logger.trace("Card stop responding"); + logger.trace( + "[fsmJob={}, reader={}] Card stop responding", JOB_ID, getReader().getName()); } break; } @@ -101,7 +105,10 @@ public void run() { } } if (logger.isTraceEnabled()) { - logger.trace("Monitoring job polling process stopped"); + logger.trace( + "[fsmJob={}, reader={}] Monitoring job polling process stopped", + JOB_ID, + getReader().getName()); } } catch (RuntimeException e) { getReader() diff --git a/src/main/java/org/eclipse/keyple/core/service/CardRemovalPassiveMonitoringJobAdapter.java b/src/main/java/org/eclipse/keyple/core/service/CardRemovalPassiveMonitoringJobAdapter.java index c1b8b1fc..79412b70 100644 --- a/src/main/java/org/eclipse/keyple/core/service/CardRemovalPassiveMonitoringJobAdapter.java +++ b/src/main/java/org/eclipse/keyple/core/service/CardRemovalPassiveMonitoringJobAdapter.java @@ -51,6 +51,8 @@ final class CardRemovalPassiveMonitoringJobAdapter extends AbstractMonitoringJob private static final Logger logger = LoggerFactory.getLogger(CardRemovalPassiveMonitoringJobAdapter.class); + private static final String JOB_ID = "RemovalPassive"; + private final ObservableReaderSpi readerSpi; /** @@ -98,12 +100,17 @@ public void run() { } catch (ReaderIOException e) { // just warn as it can be a disconnection of the reader. logger.warn( - "Monitoring job error while processing card removal event on reader [{}]: {}", + "[fsmJob={}, reader={}] Failed to process card removal event [reason={}]", + JOB_ID, getReader().getName(), e.getMessage()); } catch (TaskCanceledException e) { isTaskCanceled = true; - logger.warn("Monitoring job process cancelled: {}", e.getMessage()); + logger.warn( + "[fsmJob={}, reader={}] Monitoring job process cancelled [reason={}]", + JOB_ID, + getReader().getName(), + e.getMessage()); } catch (RuntimeException e) { getReader() .getObservationExceptionHandler() @@ -125,7 +132,8 @@ public void run() { @Override void stop() { if (logger.isTraceEnabled()) { - logger.trace("Stop monitoring job process"); + logger.trace( + "[fsmJob={}, reader={}] Stopping monitoring job process", JOB_ID, getReader().getName()); } if (readerSpi instanceof CardRemovalWaiterBlockingSpi) { ((CardRemovalWaiterBlockingSpi) readerSpi).stopWaitForCardRemoval(); @@ -138,7 +146,8 @@ void stop() { .stopWaitForCardRemovalDuringProcessing(); } if (logger.isTraceEnabled()) { - logger.trace("Monitoring job process stopped"); + logger.trace( + "[fsmJob={}, reader={}] Monitoring job process stopped", JOB_ID, getReader().getName()); } } } diff --git a/src/main/java/org/eclipse/keyple/core/service/CardResponseAdapter.java b/src/main/java/org/eclipse/keyple/core/service/CardResponseAdapter.java index bdd202c0..c2934984 100644 --- a/src/main/java/org/eclipse/keyple/core/service/CardResponseAdapter.java +++ b/src/main/java/org/eclipse/keyple/core/service/CardResponseAdapter.java @@ -13,7 +13,6 @@ import java.util.ArrayList; import java.util.List; -import org.eclipse.keyple.core.util.json.JsonUtil; import org.eclipse.keypop.card.ApduResponseApi; import org.eclipse.keypop.card.CardResponseApi; @@ -64,13 +63,18 @@ public boolean isLogicalChannelOpen() { } /** - * Converts the card response into a string where the data is encoded in a json format. + * Returns a string representation of the object. * - * @return A not empty String + * @return A string that represents the current state of the object. * @since 2.0.0 */ @Override public String toString() { - return "CARD_RESPONSE = " + JsonUtil.toJson(this); + return "CardResponseAdapter{" + + "apduResponses=" + + apduResponses + + ", isLogicalChannelOpen=" + + isLogicalChannelOpen + + '}'; } } diff --git a/src/main/java/org/eclipse/keyple/core/service/CardSelectionManagerAdapter.java b/src/main/java/org/eclipse/keyple/core/service/CardSelectionManagerAdapter.java index 55a5f4c3..9511d50f 100644 --- a/src/main/java/org/eclipse/keyple/core/service/CardSelectionManagerAdapter.java +++ b/src/main/java/org/eclipse/keyple/core/service/CardSelectionManagerAdapter.java @@ -205,7 +205,7 @@ public int importCardSelectionScenario(String cardSelectionScenario) { JsonUtil.getParser().fromJson(cardSelectorsJsonArray.get(i), classOfCardSelector); } catch (ClassNotFoundException e) { throw new IllegalArgumentException( - "Original CardSelector type [" + cardSelectorsTypes.get(i) + "] not found", e); + "Original CardSelector type '" + cardSelectorsTypes.get(i) + "' not found", e); } CardSelectionExtension cardSelection; try { @@ -217,7 +217,7 @@ public int importCardSelectionScenario(String cardSelectionScenario) { } catch (ClassNotFoundException e) { // Default card selection logger.warn( - "Original CardSelection type [{}] not found. Use default type [{}] for deserialization", + "Original CardSelection type '{}' not found. Replaced by default type '{}' for deserialization", cardSelectionsTypes.get(i), CardSelectionAdapter.class.getName()); cardSelection = diff --git a/src/main/java/org/eclipse/keyple/core/service/CardSelectionResponseAdapter.java b/src/main/java/org/eclipse/keyple/core/service/CardSelectionResponseAdapter.java index 848314fe..dbc47a37 100644 --- a/src/main/java/org/eclipse/keyple/core/service/CardSelectionResponseAdapter.java +++ b/src/main/java/org/eclipse/keyple/core/service/CardSelectionResponseAdapter.java @@ -11,7 +11,6 @@ ************************************************************************************** */ package org.eclipse.keyple.core.service; -import org.eclipse.keyple.core.util.json.JsonUtil; import org.eclipse.keypop.card.ApduResponseApi; import org.eclipse.keypop.card.CardResponseApi; import org.eclipse.keypop.card.CardSelectionResponseApi; @@ -96,13 +95,23 @@ public CardResponseApi getCardResponse() { } /** - * Converts the card selection response into a string where the data is encoded in a json format. + * Returns a string representation of the object. * - * @return A not empty String + * @return A string that represents the current state of the object. * @since 2.0.0 */ @Override public String toString() { - return "CARD_SELECTION_RESPONSE = " + JsonUtil.toJson(this); + return "CardSelectionResponseAdapter{" + + "hasMatched=" + + hasMatched + + ", powerOnData='" + + powerOnData + + '\'' + + ", selectApplicationResponse=" + + selectApplicationResponse + + ", cardResponse=" + + cardResponse + + '}'; } } diff --git a/src/main/java/org/eclipse/keyple/core/service/CardSelectionScenarioAdapter.java b/src/main/java/org/eclipse/keyple/core/service/CardSelectionScenarioAdapter.java index bc314170..f8199c1a 100644 --- a/src/main/java/org/eclipse/keyple/core/service/CardSelectionScenarioAdapter.java +++ b/src/main/java/org/eclipse/keyple/core/service/CardSelectionScenarioAdapter.java @@ -13,7 +13,6 @@ import java.util.List; import org.eclipse.keyple.core.util.Assert; -import org.eclipse.keyple.core.util.json.JsonUtil; import org.eclipse.keypop.card.ChannelControl; import org.eclipse.keypop.card.spi.CardSelectionRequestSpi; import org.eclipse.keypop.reader.selection.CardSelector; @@ -115,13 +114,22 @@ ChannelControl getChannelControl() { } /** - * Converts the card selection scenario into a string where the data is encoded in a json format. + * Returns a string representation of the object. * - * @return A not empty String + * @return A string that represents the current state of the object. * @since 2.0.0 */ @Override public String toString() { - return "CARD_SELECTION_SCENARIO = " + JsonUtil.toJson(this); + return "CardSelectionScenarioAdapter{" + + "cardSelectors=" + + cardSelectors + + ", cardSelectionRequests=" + + cardSelectionRequests + + ", multiSelectionProcessing=" + + multiSelectionProcessing + + ", channelControl=" + + channelControl + + '}'; } } diff --git a/src/main/java/org/eclipse/keyple/core/service/DistributedLocalServiceAdapter.java b/src/main/java/org/eclipse/keyple/core/service/DistributedLocalServiceAdapter.java index 58ca74b1..383cbb34 100644 --- a/src/main/java/org/eclipse/keyple/core/service/DistributedLocalServiceAdapter.java +++ b/src/main/java/org/eclipse/keyple/core/service/DistributedLocalServiceAdapter.java @@ -102,12 +102,17 @@ public void setPoolPluginNames(String... poolPluginNames) { public String executeLocally(String jsonData, String readerName) { if (readerName != null) { if (logger.isDebugEnabled()) { - logger.debug("Service [{}] processes data on reader [{}]: {}", name, readerName, jsonData); + logger.debug( + "[localService={}] Processing locally data on reader [name={}, jsonData={}]", + name, + readerName, + jsonData); } return new LocalReaderExecutor(jsonData, readerName).execute(); } else { if (logger.isDebugEnabled()) { - logger.debug("Service [{}] processes data on plugins: {}", name, jsonData); + logger.debug( + "[localService={}] Processing locally data on plugins [jsonData={}]", name, jsonData); } return new LocalPluginExecutor(jsonData).execute(); } @@ -145,7 +150,7 @@ public void onPluginEvent(PluginEvent pluginEvent) { if (logger.isDebugEnabled()) { logger.debug( - "Service [{}] forwards plugin event [{}] associated to local reader [{}] of local plugin [{}]", + "[localService={}] Forwarding local plugin event [pluginEvent={}, reader={}, plugin={}]", name, pluginEvent.getType().name(), pluginEvent.getReaderNames().first(), @@ -169,7 +174,7 @@ public void onReaderEvent(CardReaderEvent readerEvent) { if (logger.isDebugEnabled()) { logger.debug( - "Service [{}] forwards reader event [{}] associated to local reader [{}] of local plugin [{}]", + "[localService={}] Forwarding local reader event [readerEvent={}, reader={}, plugin={}]", name, readerEvent.getType().name(), readerEvent.getReaderName(), @@ -191,7 +196,8 @@ public void onReaderEvent(CardReaderEvent readerEvent) { void register() { int distributedApiLevel = localServiceSpi.exchangeApiLevel(CORE_API_LEVEL); logger.info( - "Distributed Core API level: {}, Distributed API level (Local Service): {}", + "[localService={}] Registering distributed local service [coreApiLevel={}, localServiceApiLevel={}]", + name, CORE_API_LEVEL, distributedApiLevel); isRegistered = true; diff --git a/src/main/java/org/eclipse/keyple/core/service/DistributedUtilAdapter.java b/src/main/java/org/eclipse/keyple/core/service/DistributedUtilAdapter.java index 4363254a..ee0576ee 100644 --- a/src/main/java/org/eclipse/keyple/core/service/DistributedUtilAdapter.java +++ b/src/main/java/org/eclipse/keyple/core/service/DistributedUtilAdapter.java @@ -63,13 +63,13 @@ static JsonObject executePluginServiceRemotely( throws Exception { // NOSONAR if (logger.isDebugEnabled()) { - logger.debug("Plugin [{}] --> jsonData: {}", pluginName, input); + logger.debug("[plugin={}] Send [jsonData={}]", pluginName, input); } String outputJson = remotePluginSpi.executeRemotely(input.toString()); if (logger.isDebugEnabled()) { - logger.debug("Plugin [{}] <-- jsonData: {}", pluginName, outputJson); + logger.debug("[plugin={}] Receive [jsonData={}]", pluginName, outputJson); } return getJsonObject(outputJson); @@ -93,13 +93,13 @@ static JsonObject executeReaderServiceRemotely( throws Exception { // NOSONAR if (logger.isDebugEnabled()) { - logger.debug("Reader [{}] --> jsonData: {}", readerName, input); + logger.debug("[reader={}] Send [jsonData={}]", readerName, input); } String outputJson = remoteReaderSpi.executeRemotely(input.toString()); if (logger.isDebugEnabled()) { - logger.debug("Reader [{}] <-- jsonData: {}", readerName, outputJson); + logger.debug("[reader={}] Receive [jsonData={}]", readerName, outputJson); } return getJsonObject(outputJson); diff --git a/src/main/java/org/eclipse/keyple/core/service/InternalDto.java b/src/main/java/org/eclipse/keyple/core/service/InternalDto.java index 2683e32b..31b94b8d 100644 --- a/src/main/java/org/eclipse/keyple/core/service/InternalDto.java +++ b/src/main/java/org/eclipse/keyple/core/service/InternalDto.java @@ -11,10 +11,8 @@ ************************************************************************************** */ package org.eclipse.keyple.core.service; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.util.*; +import org.eclipse.keyple.core.util.HexUtil; import org.eclipse.keyple.core.util.json.JsonUtil; import org.eclipse.keypop.card.CardSelectionResponseApi; import org.eclipse.keypop.card.spi.*; @@ -68,7 +66,7 @@ public SmartCardSpi parse(CardSelectionResponseApi cardSelectionResponseApi) { @Override public String toString() { - return "CARD_SELECTION = " + JsonUtil.toJson(this); + return "CardSelectionAdapter{" + "cardSelectionRequest=" + cardSelectionRequest + '}'; } } @@ -114,7 +112,12 @@ public CardRequestSpi getCardRequest() { @Override public String toString() { - return "CARD_SELECTION_REQUEST = " + JsonUtil.toJson(this); + return "CardSelectionRequest{" + + "cardRequest=" + + cardRequest + + ", successfulSelectionStatusWords=" + + JsonUtil.toJson(successfulSelectionStatusWords) + + '}'; } } @@ -161,7 +164,12 @@ public boolean stopOnUnsuccessfulStatusWord() { @Override public String toString() { - return "CARD_REQUEST = " + JsonUtil.toJson(this); + return "CardRequest{" + + "apduRequests=" + + apduRequests + + ", stopOnUnsuccessfulStatusWord=" + + stopOnUnsuccessfulStatusWord + + '}'; } } @@ -212,7 +220,16 @@ public String getInfo() { @Override public String toString() { - return "APDU_REQUEST = " + JsonUtil.toJson(this); + return "ApduRequest{" + + "apdu='" + + HexUtil.toHex(apdu) + + '\'' + + ", successfulStatusWords=" + + JsonUtil.toJson(successfulStatusWords) + + ", info='" + + info + + '\'' + + '}'; } } } diff --git a/src/main/java/org/eclipse/keyple/core/service/InternalLegacyDto.java b/src/main/java/org/eclipse/keyple/core/service/InternalLegacyDto.java index dec4b0ec..536e098f 100644 --- a/src/main/java/org/eclipse/keyple/core/service/InternalLegacyDto.java +++ b/src/main/java/org/eclipse/keyple/core/service/InternalLegacyDto.java @@ -14,6 +14,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Set; +import org.eclipse.keyple.core.util.HexUtil; import org.eclipse.keyple.core.util.json.JsonUtil; import org.eclipse.keypop.card.spi.ApduRequestSpi; import org.eclipse.keypop.card.spi.CardRequestSpi; @@ -134,7 +135,12 @@ static final class LegacyCardSelectionRequestV0 { @Override public String toString() { - return "CARD_SELECTION_REQUEST = " + JsonUtil.toJson(this); + return "LegacyCardSelectionRequestV0{" + + "cardSelector=" + + cardSelector + + ", cardRequest=" + + cardRequest + + '}'; } } @@ -147,7 +153,12 @@ static final class LegacyCardSelectionRequestV1 { @Override public String toString() { - return "CARD_SELECTION_REQUEST = " + JsonUtil.toJson(this); + return "LegacyCardSelectionRequestV1{" + + "cardSelector=" + + cardSelector + + ", cardRequest=" + + cardRequest + + '}'; } } @@ -164,7 +175,23 @@ static final class LegacyCardSelector { @Override public String toString() { - return "CARD_SELECTOR = " + JsonUtil.toJson(this); + return "LegacyCardSelector{" + + "cardProtocol='" + + cardProtocol + + '\'' + + ", powerOnDataRegex='" + + powerOnDataRegex + + '\'' + + ", aid='" + + HexUtil.toHex(aid) + + '\'' + + ", fileOccurrence=" + + fileOccurrence + + ", fileControlInformation=" + + fileControlInformation + + ", successfulSelectionStatusWords=" + + JsonUtil.toJson(successfulSelectionStatusWords) + + '}'; } } @@ -177,7 +204,12 @@ static final class LegacyCardRequestV0 { @Override public String toString() { - return "CARD_REQUEST = " + JsonUtil.toJson(this); + return "LegacyCardRequestV0{" + + "apduRequests=" + + apduRequests + + ", isStatusCodesVerificationEnabled=" + + isStatusCodesVerificationEnabled + + '}'; } } @@ -190,7 +222,12 @@ static final class LegacyCardRequestV1 { @Override public String toString() { - return "CARD_REQUEST = " + JsonUtil.toJson(this); + return "LegacyCardRequestV1{" + + "apduRequests=" + + apduRequests + + ", stopOnUnsuccessfulStatusWord=" + + stopOnUnsuccessfulStatusWord + + '}'; } } @@ -204,7 +241,16 @@ static class LegacyApduRequest { @Override public String toString() { - return "APDU_REQUEST = " + JsonUtil.toJson(this); + return "LegacyApduRequest{" + + "apdu='" + + HexUtil.toHex(apdu) + + '\'' + + ", successfulStatusWords=" + + JsonUtil.toJson(successfulStatusWords) + + ", info='" + + info + + '\'' + + '}'; } } } diff --git a/src/main/java/org/eclipse/keyple/core/service/IsoCardSelectorAdapter.java b/src/main/java/org/eclipse/keyple/core/service/IsoCardSelectorAdapter.java index 4c9f6ab1..0ba35a8a 100644 --- a/src/main/java/org/eclipse/keyple/core/service/IsoCardSelectorAdapter.java +++ b/src/main/java/org/eclipse/keyple/core/service/IsoCardSelectorAdapter.java @@ -12,7 +12,6 @@ package org.eclipse.keyple.core.service; import org.eclipse.keyple.core.util.HexUtil; -import org.eclipse.keyple.core.util.json.JsonUtil; import org.eclipse.keypop.reader.selection.IsoCardSelector; /** @@ -145,13 +144,27 @@ public IsoCardSelector filterByPowerOnData(String powerOnDataRegex) { } /** - * Converts the current instance into a string where the data is encoded in a json format. + * Returns a string representation of the object. * - * @return A not empty String + * @return A string that represents the current state of the object. * @since 3.0.0 */ @Override public String toString() { - return "ISO_CARD_SELECTOR = " + JsonUtil.toJson(this); + return "IsoCardSelectorAdapter{" + + "logicalProtocolName='" + + logicalProtocolName + + '\'' + + ", powerOnDataRegex='" + + powerOnDataRegex + + '\'' + + ", aid='" + + HexUtil.toHex(aid) + + '\'' + + ", fileOccurrence=" + + fileOccurrence + + ", fileControlInformation=" + + fileControlInformation + + '}'; } } diff --git a/src/main/java/org/eclipse/keyple/core/service/LocalPluginAdapter.java b/src/main/java/org/eclipse/keyple/core/service/LocalPluginAdapter.java index 39da05e2..fc6ca361 100644 --- a/src/main/java/org/eclipse/keyple/core/service/LocalPluginAdapter.java +++ b/src/main/java/org/eclipse/keyple/core/service/LocalPluginAdapter.java @@ -74,7 +74,10 @@ void unregister() { try { pluginSpi.onUnregister(); } catch (Exception e) { - logger.warn("Error unregistering plugin extension [{}]: {}", getName(), e.getMessage()); + logger.warn( + "[plugin={}] Failed to unregister plugin extension [reason={}]", + getName(), + e.getMessage()); } super.unregister(); } diff --git a/src/main/java/org/eclipse/keyple/core/service/LocalPoolPluginAdapter.java b/src/main/java/org/eclipse/keyple/core/service/LocalPoolPluginAdapter.java index b38bbd39..c48fd1c4 100644 --- a/src/main/java/org/eclipse/keyple/core/service/LocalPoolPluginAdapter.java +++ b/src/main/java/org/eclipse/keyple/core/service/LocalPoolPluginAdapter.java @@ -58,7 +58,8 @@ void unregister() { try { poolPluginSpi.onUnregister(); } catch (Exception e) { - logger.warn("Error unregistering plugin extension [{}]: {}", getName(), e.getMessage()); + logger.warn( + "Failed to unregister plugin extension [name={}, reason={}]", getName(), e.getMessage()); } super.unregister(); } @@ -93,7 +94,7 @@ public CardReader allocateReader(String readerGroupReference) { checkStatus(); if (logger.isDebugEnabled()) { logger.debug( - "Pool plugin [{}] allocates reader of group reference [{}]", + "[plugin={}] Allocating reader [readerGroupReference={}]", getName(), readerGroupReference); } @@ -140,7 +141,7 @@ public void releaseReader(CardReader reader) { checkStatus(); if (logger.isDebugEnabled()) { logger.debug( - "Pool plugin [{}] releases reader [{}]", + "[plugin={}] Releasing reader [name={}]", getName(), reader != null ? reader.getName() : null); } diff --git a/src/main/java/org/eclipse/keyple/core/service/LocalReaderAdapter.java b/src/main/java/org/eclipse/keyple/core/service/LocalReaderAdapter.java index a4903d60..e6b6da79 100644 --- a/src/main/java/org/eclipse/keyple/core/service/LocalReaderAdapter.java +++ b/src/main/java/org/eclipse/keyple/core/service/LocalReaderAdapter.java @@ -118,7 +118,7 @@ final void closeLogicalAndPhysicalChannelsSilently() { readerSpi.closePhysicalChannel(); } catch (ReaderIOException e) { logger.error( - "Error closing physical channel on reader [{}]: {}", this.getName(), e.getMessage(), e); + "[reader={}] Failed to close physical channel [reason={}]", getName(), e.getMessage(), e); } } @@ -134,12 +134,16 @@ void unregister() { try { readerSpi.closePhysicalChannel(); } catch (Exception e) { - logger.warn("Error closing physical channel on reader [{}]: {}", getName(), e.getMessage()); + logger.warn( + "[reader={}] Failed to close physical channel [reason={}]", getName(), e.getMessage()); } try { readerSpi.onUnregister(); } catch (Exception e) { - logger.warn("Error unregistering reader extension [{}]: {}", getName(), e.getMessage()); + logger.warn( + "[reader={}] Failed to unregister reader extension [reason={}]", + getName(), + e.getMessage()); } super.unregister(); } @@ -361,8 +365,8 @@ private ApduResponseAdapter processApduRequest(ApduRequestSpi apduRequest) long elapsed10ms = (timeStamp - before) / 100000; this.before = timeStamp; logger.debug( - "Reader [{}] --> apduRequest: {}, elapsed {} ms", - this.getName(), + "[reader={}] Send [type=ApduRequest, content={}, elapsedMs={}]", + getName(), apduRequest, elapsed10ms / 10.0); } @@ -374,8 +378,8 @@ private ApduResponseAdapter processApduRequest(ApduRequestSpi apduRequest) long elapsed10ms = (timeStamp - before) / 100000; this.before = timeStamp; logger.debug( - "Reader [{}] <-- apduResponse: {}, elapsed {} ms", - this.getName(), + "[reader={}] Receive [type=ApduResponse, content={}, elapsedMs={}]", + getName(), apduResponse, elapsed10ms / 10.0); } @@ -408,8 +412,8 @@ private ApduResponseAdapter processApduRequest(ApduRequestSpi apduRequest) long elapsed10ms = (timeStamp - before) / 100000; this.before = timeStamp; logger.debug( - "Reader [{}] --> GET RESPONSE (chained): {}, elapsed {} ms", - this.getName(), + "[reader={}] Send [type=RawApduRequest:GetResponse, content={}, elapsedMs={}]", + getName(), HexUtil.toHex(getResponseApdu), elapsed10ms / 10.0); } @@ -423,8 +427,8 @@ private ApduResponseAdapter processApduRequest(ApduRequestSpi apduRequest) long elapsed10ms = (timeStamp - before) / 100000; this.before = timeStamp; logger.debug( - "Reader [{}] <-- apduResponse (chained): {}, elapsed {} ms", - this.getName(), + "[reader={}] Receive [type=RawApduResponse:GetResponse, content={}, elapsedMs={}]", + getName(), apduResponse, elapsed10ms / 10.0); } @@ -627,7 +631,8 @@ private boolean checkPowerOnData(String powerOnData, InternalCardSelector cardSe if (powerOnData != null && powerOnDataRegex != null && !powerOnData.matches(powerOnDataRegex)) { if (logger.isTraceEnabled()) { logger.trace( - "Power-on data didn't match (powerOnData: {}, powerOnDataRegex: {})", + "[reader={}] Power-on data mismatched [powerOnData={}, powerOnDataRegex={}]", + getName(), powerOnData, powerOnDataRegex); } @@ -685,8 +690,7 @@ private ApduResponseAdapter processExplicitAidSelection(InternalIsoCardSelector final byte[] aid = cardSelector.getAid(); if (logger.isDebugEnabled()) { - logger.debug( - "Reader [{}] selects application with AID [{}]", this.getName(), HexUtil.toHex(aid)); + logger.debug("[reader={}] Selecting application [aid={}]", getName(), HexUtil.toHex(aid)); } /* * build a get response command the actual length expected by the card in the get response @@ -769,7 +773,7 @@ private byte computeSelectApplicationP2( /** Close the logical channel. */ private void closeLogicalChannel() { if (logger.isTraceEnabled()) { - logger.trace("Reader [{}] closes logical channel", this.getName()); + logger.trace("[reader={}] Closing logical channel", getName()); } if (readerSpi instanceof AutonomousSelectionReaderSpi) { /* AutonomousSelectionReader have an explicit method for closing channels */ @@ -777,7 +781,7 @@ private void closeLogicalChannel() { } isLogicalChannelOpen = false; if (logger.isTraceEnabled()) { - logger.trace("Logical channel closed"); + logger.trace("[reader={}] Logical channel closed", getName()); } } diff --git a/src/main/java/org/eclipse/keyple/core/service/ObservableLocalPluginAdapter.java b/src/main/java/org/eclipse/keyple/core/service/ObservableLocalPluginAdapter.java index bf21d07b..9fda6ef6 100644 --- a/src/main/java/org/eclipse/keyple/core/service/ObservableLocalPluginAdapter.java +++ b/src/main/java/org/eclipse/keyple/core/service/ObservableLocalPluginAdapter.java @@ -64,7 +64,7 @@ boolean isMonitoring() { public void addObserver(PluginObserverSpi observer) { super.addObserver(observer); if (countObservers() == 1) { - logger.info("Start monitoring of plugin [{}]", getName()); + logger.info("[plugin={}] Starting plugin monitoring", getName()); thread = new EventThread(getName()); thread.setName("PluginEventMonitoringThread"); thread.setUncaughtExceptionHandler( @@ -92,7 +92,7 @@ public void removeObserver(PluginObserverSpi observer) { if (countObservers() == 0) { if (thread != null) { thread.end(); - logger.info("Plugin monitoring stopped"); + logger.info("[plugin={}] Plugin monitoring stopped", getName()); } } } @@ -108,7 +108,7 @@ public void clearObservers() { super.clearObservers(); if (thread != null) { thread.end(); - logger.info("Plugin monitoring stopped"); + logger.info("[plugin={}] Plugin monitoring stopped", getName()); } } @@ -148,7 +148,10 @@ private void addReader(String readerName) throws PluginIOException { LocalReaderAdapter reader = buildLocalReaderAdapter(readerSpi); reader.register(); getReadersMap().put(reader.getName(), reader); - logger.info("Plugin [{}] adds plugged reader [{}] to readers list", pluginName, readerName); + logger.info( + "[plugin={}] Adding new plugged reader to readers list [name={}]", + pluginName, + readerName); } /** Removes a reader from the list of known readers (by the plugin) */ @@ -156,23 +159,11 @@ private void removeReader(CardReader reader) { ((LocalReaderAdapter) reader).unregister(); getReadersMap().remove(reader.getName()); logger.info( - "Plugin [{}] removes unplugged reader [{}] from readers list", + "[plugin={}] Removing unplugged reader from readers list [name={}]", pluginName, reader.getName()); } - /** Notifies observers of changes in the list of readers */ - private void notifyChanges(PluginEvent.Type type, SortedSet changedReaderNames) { - /* grouped notification */ - if (logger.isTraceEnabled()) { - logger.trace( - "Notify reader {}(s): {}", - type == PluginEvent.Type.READER_CONNECTED ? "connection" : "disconnection", - changedReaderNames); - } - notifyObservers(new PluginEventAdapter(pluginName, changedReaderNames, type)); - } - /** * Compares the list of current readers to the list provided by the system and adds or removes * readers accordingly.
@@ -201,7 +192,9 @@ private void processChanges(Set actualNativeReaderNames) throws PluginIO removeReader(reader); } } - notifyChanges(PluginEvent.Type.READER_DISCONNECTED, changedReaderNames); + notifyObservers( + new PluginEventAdapter( + pluginName, changedReaderNames, PluginEvent.Type.READER_DISCONNECTED)); /* clean the list for a possible connection notification */ changedReaderNames.clear(); } @@ -218,7 +211,9 @@ private void processChanges(Set actualNativeReaderNames) throws PluginIO } /* notify connections if any */ if (!changedReaderNames.isEmpty()) { - notifyChanges(PluginEvent.Type.READER_CONNECTED, changedReaderNames); + notifyObservers( + new PluginEventAdapter( + pluginName, changedReaderNames, PluginEvent.Type.READER_CONNECTED)); } } @@ -246,7 +241,8 @@ public void run() { } } catch (InterruptedException e) { logger.info( - "Plugin monitoring stopped, possibly because there is no more registered observer"); + "[plugin={}] Plugin monitoring stopped, possibly because there is no more registered observer", + getName()); // Restore interrupted state... Thread.currentThread().interrupt(); } catch (PluginIOException e) { diff --git a/src/main/java/org/eclipse/keyple/core/service/ObservableLocalReaderAdapter.java b/src/main/java/org/eclipse/keyple/core/service/ObservableLocalReaderAdapter.java index 7c9ec8df..096ec311 100644 --- a/src/main/java/org/eclipse/keyple/core/service/ObservableLocalReaderAdapter.java +++ b/src/main/java/org/eclipse/keyple/core/service/ObservableLocalReaderAdapter.java @@ -229,14 +229,16 @@ final CardReaderEvent processCardInserted() { // RL-DET-INSNOTIF.1 if (logger.isTraceEnabled()) { - logger.trace("Process inserted card"); + logger.trace("[reader={}] Processing inserted card", getName()); } isCardRemovedEventNotificationEnabled = true; if (cardSelectionScenario == null) { if (logger.isTraceEnabled()) { - logger.trace("No card selection scenario defined. Notify [CARD_INSERTED] event"); + logger.trace( + "[reader={}] No card selection scenario defined. Notifying card reader event [eventType=CARD_INSERTED]", + getName()); } /* no default request is defined, just notify the card insertion */ return new ReaderEventAdapter( @@ -265,15 +267,19 @@ final CardReaderEvent processCardInserted() { /* notify only if a card matched the selection, just ignore if not */ if (logger.isTraceEnabled()) { logger.trace( - "Selection hasn't matched. Do not throw any event because of [MATCHED_ONLY] flag"); + "[reader={}] Selection hasn't matched. Event not notified because the notification mode is MATCHED_ONLY", + getName()); } isCardRemovedEventNotificationEnabled = false; return null; } // the card didn't match, notify an CARD_INSERTED event with the received response - if (logger.isTraceEnabled()) { - logger.trace("None of {} selection cases matched", cardSelectionResponses.size()); + if (logger.isDebugEnabled()) { + logger.debug( + "[reader={}] No selection cases matched [selectionCaseCount={}]", + getName(), + cardSelectionResponses.size()); } return new ReaderEventAdapter( getPluginName(), @@ -294,7 +300,10 @@ final CardReaderEvent processCardInserted() { closeLogicalAndPhysicalChannelsSilently(); // The card was removed or not read correctly, no exception raising or event notification, // just log. - logger.warn("Error while processing card selection scenario: {}", e.getMessage()); + logger.warn( + "[reader={}] Failed to process card selection scenario [reason={}]", + getName(), + e.getMessage()); } // Here we close the physical channel in case it was opened for a card excluded by the selection @@ -324,7 +333,7 @@ private boolean hasACardMatched(List cardSelectionResp for (CardSelectionResponseApi cardSelectionResponse : cardSelectionResponses) { if (cardSelectionResponse != null && cardSelectionResponse.hasMatched()) { if (logger.isTraceEnabled()) { - logger.trace("A default selection case matched"); + logger.trace("[reader={}] A default selection case matched", getName()); } return true; } @@ -371,18 +380,19 @@ final void switchState(AbstractObservableStateAdapter.MonitoringState stateId) { * @since 2.0.0 */ final void notifyObservers(final CardReaderEvent event) { - if (logger.isDebugEnabled()) { logger.debug( - "Reader [{}] notifies event [{}] to {} observer(s)", + "[reader={}] Notifying observers [eventType={}, observerCount={}]", getName(), event.getType().name(), countObservers()); } - for (CardReaderObserverSpi observer : observationManager.getObservers()) { notifyObserver(observer, event); } + if (logger.isDebugEnabled()) { + logger.debug("[reader={}] Observers notified", getName()); + } } /** @@ -400,8 +410,13 @@ private void notifyObserver(CardReaderObserverSpi observer, CardReaderEvent even .getObservationExceptionHandler() .onReaderObservationError(getPluginName(), getName(), e); } catch (Exception e2) { - logger.error("Event notification error: {}", e2.getMessage(), e2); - logger.error("Original cause: {}", e.getMessage(), e); + logger.error( + "[reader={}] Failed to notify observer [reason={}]", getName(), e.getMessage(), e); + logger.error( + "[reader={}] Failed to notify observation exception handler [reason={}]", + getName(), + e2.getMessage(), + e2); } } } @@ -442,7 +457,8 @@ final void unregister() { stopCardDetection(); stateService.shutdown(); } catch (Exception e) { - logger.warn("Error stopping card detection on reader [{}]: {}", getName(), e.getMessage()); + logger.warn( + "[reader={}] Failed to stop card detection [reason={}]", getName(), e.getMessage()); } notifyObservers( new ReaderEventAdapter(getPluginName(), getName(), CardReaderEvent.Type.UNAVAILABLE, null)); @@ -525,8 +541,7 @@ public final void clearObservers() { public final void startCardDetection(DetectionMode detectionMode) { // RL-DET-REMCTRL.1 checkStatus(); - logger.info( - "Reader [{}] starts card detection with polling mode [{}]", getName(), detectionMode); + logger.info("[reader={}] Starting card detection [detectionMode={}]", getName(), detectionMode); Assert.getInstance().notNull(detectionMode, "detectionMode"); this.detectionMode = detectionMode; stateService.onEvent(InternalEvent.START_DETECT); @@ -540,7 +555,7 @@ public final void startCardDetection(DetectionMode detectionMode) { @Override public final void stopCardDetection() { // RL-DET-REMCTRL.1 - logger.info("Reader [{}] stops card detection", getName()); + logger.info("[reader={}] Stopping card detection", getName()); stateService.onEvent(InternalEvent.STOP_DETECT); } @@ -550,7 +565,7 @@ public final void stopCardDetection() { * @since 2.0.0 */ public final void finalizeCardProcessing() { - logger.info("Reader [{}] starts card removal sequence", getName()); + logger.info("[reader={}] Starting card removal sequence", getName()); stateService.onEvent(InternalEvent.CARD_PROCESSED); } diff --git a/src/main/java/org/eclipse/keyple/core/service/ObservableReaderStateServiceAdapter.java b/src/main/java/org/eclipse/keyple/core/service/ObservableReaderStateServiceAdapter.java index 21c2f6d5..f91cc41e 100644 --- a/src/main/java/org/eclipse/keyple/core/service/ObservableReaderStateServiceAdapter.java +++ b/src/main/java/org/eclipse/keyple/core/service/ObservableReaderStateServiceAdapter.java @@ -58,22 +58,22 @@ final class ObservableReaderStateServiceAdapter { */ ObservableReaderStateServiceAdapter(ObservableLocalReaderAdapter reader) { this.reader = reader; - this.readerSpi = reader.getObservableReaderSpi(); + readerSpi = reader.getObservableReaderSpi(); - this.states = new EnumMap<>(AbstractObservableStateAdapter.MonitoringState.class); - this.executorService = Executors.newSingleThreadExecutor(); + states = new EnumMap<>(AbstractObservableStateAdapter.MonitoringState.class); + executorService = Executors.newSingleThreadExecutor(); // initialize states for each case: // wait for start - this.states.put( + states.put( AbstractObservableStateAdapter.MonitoringState.WAIT_FOR_START_DETECTION, new WaitForStartDetectStateAdapter(this.reader)); // insertion if (readerSpi instanceof CardInsertionWaiterAsynchronousSpi || readerSpi instanceof WaitForCardInsertionAutonomousSpi) { - this.states.put( + states.put( AbstractObservableStateAdapter.MonitoringState.WAIT_FOR_CARD_INSERTION, new WaitForCardInsertionStateAdapter(this.reader)); } else if (readerSpi instanceof CardInsertionWaiterNonBlockingSpi @@ -85,10 +85,10 @@ final class ObservableReaderStateServiceAdapter { : 100; CardInsertionActiveMonitoringJobAdapter cardInsertionActiveMonitoringJobAdapter = new CardInsertionActiveMonitoringJobAdapter(reader, sleepDurationMillis, true); - this.states.put( + states.put( AbstractObservableStateAdapter.MonitoringState.WAIT_FOR_CARD_INSERTION, new WaitForCardInsertionStateAdapter( - this.reader, cardInsertionActiveMonitoringJobAdapter, this.executorService)); + this.reader, cardInsertionActiveMonitoringJobAdapter, executorService)); } else if (readerSpi instanceof CardInsertionWaiterBlockingSpi || readerSpi instanceof WaitForCardInsertionBlockingSpi) { final CardInsertionPassiveMonitoringJobAdapter cardInsertionPassiveMonitoringJobAdapter = @@ -96,7 +96,7 @@ final class ObservableReaderStateServiceAdapter { states.put( AbstractObservableStateAdapter.MonitoringState.WAIT_FOR_CARD_INSERTION, new WaitForCardInsertionStateAdapter( - this.reader, cardInsertionPassiveMonitoringJobAdapter, this.executorService)); + this.reader, cardInsertionPassiveMonitoringJobAdapter, executorService)); } else { throw new IllegalStateException( "Reader should implement implement a WaitForCardInsertion interface"); @@ -107,12 +107,12 @@ final class ObservableReaderStateServiceAdapter { || readerSpi instanceof WaitForCardRemovalDuringProcessingBlockingSpi) { final CardRemovalPassiveMonitoringJobAdapter cardRemovalPassiveMonitoringJobAdapter = new CardRemovalPassiveMonitoringJobAdapter(reader); - this.states.put( + states.put( AbstractObservableStateAdapter.MonitoringState.WAIT_FOR_CARD_PROCESSING, new WaitForCardProcessingStateAdapter( - this.reader, cardRemovalPassiveMonitoringJobAdapter, this.executorService)); + this.reader, cardRemovalPassiveMonitoringJobAdapter, executorService)); } else { - this.states.put( + states.put( AbstractObservableStateAdapter.MonitoringState.WAIT_FOR_CARD_PROCESSING, new WaitForCardProcessingStateAdapter(this.reader)); } @@ -120,7 +120,7 @@ final class ObservableReaderStateServiceAdapter { // removal if (readerSpi instanceof CardRemovalWaiterAsynchronousSpi || readerSpi instanceof WaitForCardRemovalAutonomousSpi) { - this.states.put( + states.put( AbstractObservableStateAdapter.MonitoringState.WAIT_FOR_CARD_REMOVAL, new WaitForCardRemovalStateAdapter(this.reader)); @@ -133,10 +133,10 @@ final class ObservableReaderStateServiceAdapter { : 100; CardRemovalActiveMonitoringJobAdapter cardRemovalActiveMonitoringJobAdapter = new CardRemovalActiveMonitoringJobAdapter(this.reader, sleepDurationMillis); - this.states.put( + states.put( AbstractObservableStateAdapter.MonitoringState.WAIT_FOR_CARD_REMOVAL, new WaitForCardRemovalStateAdapter( - this.reader, cardRemovalActiveMonitoringJobAdapter, this.executorService)); + this.reader, cardRemovalActiveMonitoringJobAdapter, executorService)); } else if (readerSpi instanceof CardRemovalWaiterBlockingSpi || readerSpi instanceof WaitForCardRemovalBlockingSpi) { final CardRemovalPassiveMonitoringJobAdapter cardRemovalPassiveMonitoringJobAdapter = @@ -144,7 +144,7 @@ final class ObservableReaderStateServiceAdapter { states.put( AbstractObservableStateAdapter.MonitoringState.WAIT_FOR_CARD_REMOVAL, new WaitForCardRemovalStateAdapter( - this.reader, cardRemovalPassiveMonitoringJobAdapter, this.executorService)); + this.reader, cardRemovalPassiveMonitoringJobAdapter, executorService)); } else { throw new IllegalStateException( "Reader should implement implement a WaitForCardRemoval interface"); @@ -172,7 +172,7 @@ synchronized void onEvent(ObservableLocalReaderAdapter.InternalEvent event) { readerSpi.onStartDetection(); break; } - this.currentState.onEvent(event); + currentState.onEvent(event); } /** @@ -187,20 +187,21 @@ synchronized void switchState(AbstractObservableStateAdapter.MonitoringState sta if (currentState != null) { if (logger.isTraceEnabled()) { logger.trace( - "Switch state of reader [{}] from {} to {}", - this.reader.getName(), - this.currentState.getMonitoringState(), + "[fsmService={}] Switching state [from={}, to={}]", + reader.getName(), + currentState.getMonitoringState(), stateId); } currentState.onDeactivate(); } else { if (logger.isTraceEnabled()) { - logger.trace("Switch state of reader [{}] to {}", this.reader.getName(), stateId); + logger.trace( + "[fsmService={}] Switching state [from=null, to={}]", reader.getName(), stateId); } } // switch currentState - currentState = this.states.get(stateId); + currentState = states.get(stateId); // As soon as the state machine returns to the WAIT_FOR_START_DETECTION state, // we deactivate card detection in the plugin. @@ -210,16 +211,14 @@ synchronized void switchState(AbstractObservableStateAdapter.MonitoringState sta // onActivate the new current state currentState.onActivate(); - } - /** - * Get reader current state - * - * @return reader current state - * @since 2.0.0 - */ - synchronized AbstractObservableStateAdapter getCurrentState() { - return currentState; + if (logger.isTraceEnabled()) { + logger.trace( + "[fsmService={}] State switched [current={}, expected={}]", + reader.getName(), + currentState.getMonitoringState(), + stateId); + } } /** @@ -229,7 +228,7 @@ synchronized AbstractObservableStateAdapter getCurrentState() { * @since 2.0.0 */ synchronized AbstractObservableStateAdapter.MonitoringState getCurrentMonitoringState() { - return this.currentState.getMonitoringState(); + return currentState.getMonitoringState(); } /** diff --git a/src/main/java/org/eclipse/keyple/core/service/ObservableRemotePluginAdapter.java b/src/main/java/org/eclipse/keyple/core/service/ObservableRemotePluginAdapter.java index 57d86f43..178822d4 100644 --- a/src/main/java/org/eclipse/keyple/core/service/ObservableRemotePluginAdapter.java +++ b/src/main/java/org/eclipse/keyple/core/service/ObservableRemotePluginAdapter.java @@ -75,9 +75,10 @@ private void notifyObservers(final PluginEvent event) { if (logger.isDebugEnabled()) { logger.debug( - "Plugin [{}] notifies event [{}] to {} observer(s)", + "[plugin={}] Notifying observers [eventType={}, readerNames={}, observerCount={}]", getName(), event.getType().name(), + event.getReaderNames(), countObservers()); } @@ -96,13 +97,25 @@ public void run() { .getObservationExceptionHandler() .onPluginObservationError(getName(), e); } catch (Exception e2) { - logger.error("Event notification error: {}", e2.getMessage(), e2); - logger.error("Original cause: {}", e.getMessage(), e); + logger.error( + "[plugin={}] Failed to notify observer [reason={}]", + getName(), + e.getMessage(), + e); + logger.error( + "[plugin={}] Failed to notify observation exception handler [reason={}]", + getName(), + e2.getMessage(), + e2); } } } }); } + + if (logger.isDebugEnabled()) { + logger.debug("[plugin={}] Observers notified", getName()); + } } /** @@ -132,7 +145,7 @@ public void addObserver(PluginObserverSpi observer) { observationManager.addObserver(observer); if (observationManager.countObservers() == 1) { - logger.info("Start monitoring of plugin [{}]", getName()); + logger.info("[plugin={}] Starting plugin monitoring", getName()); // Start the observation remotely. JsonObject input = new JsonObject(); @@ -184,7 +197,7 @@ public void clearObservers() { /** Stops the monitoring of the plugin. */ private void stopPluginMonitoring() { - logger.info("Stop plugin monitoring"); + logger.info("[plugin={}] Stopping plugin monitoring", getName()); // Notify the SPI first. observableRemotePluginSpi.onStopObservation(); @@ -203,7 +216,7 @@ private void stopPluginMonitoring() { } catch (Exception e) { throwRuntimeException(e); } - logger.info("Plugin monitoring stopped"); + logger.info("[plugin={}] Plugin monitoring stopped", getName()); } /** @@ -238,7 +251,7 @@ public void addRemoteReader(RemoteReaderSpi remoteReaderSpi, int clientCoreApiLe checkStatus(); if (logger.isDebugEnabled()) { logger.debug( - "Plugin [{}] registers reader [{}]", + "[plugin={}] Registering remote reader [name={}]", getName(), remoteReaderSpi != null ? remoteReaderSpi.getName() : null); } @@ -274,7 +287,8 @@ public void addRemoteReader(RemoteReaderSpi remoteReaderSpi, int clientCoreApiLe public void removeRemoteReader(String remoteReaderName) { if (logger.isDebugEnabled()) { - logger.debug("Plugin [{}] unregisters reader [{}]", getName(), remoteReaderName); + logger.debug( + "[plugin={}] Unregistering remote reader [name={}]", getName(), remoteReaderName); } Assert.getInstance().notEmpty(remoteReaderName, "remoteReaderName"); @@ -298,7 +312,7 @@ public void onPluginEvent(String jsonData) { checkStatus(); if (logger.isDebugEnabled()) { - logger.debug("Plugin [{}] receives plugin event: {}", getName(), jsonData); + logger.debug("[plugin={}] Receiving remote plugin event [jsonData={}]", getName(), jsonData); } Assert.getInstance().notEmpty(jsonData, "jsonData"); diff --git a/src/main/java/org/eclipse/keyple/core/service/ObservableRemoteReaderAdapter.java b/src/main/java/org/eclipse/keyple/core/service/ObservableRemoteReaderAdapter.java index 621627a1..e2022793 100644 --- a/src/main/java/org/eclipse/keyple/core/service/ObservableRemoteReaderAdapter.java +++ b/src/main/java/org/eclipse/keyple/core/service/ObservableRemoteReaderAdapter.java @@ -71,7 +71,7 @@ void notifyObservers(final CardReaderEvent event) { if (logger.isDebugEnabled()) { logger.debug( - "Reader [{}] notifies event [{}] to {} observer(s)", + "[reader={}] Notifying observers [eventType={}, observerCount={}]", getName(), event.getType().name(), countObservers()); @@ -92,13 +92,25 @@ public void run() { .getObservationExceptionHandler() .onReaderObservationError(getPluginName(), getName(), e); } catch (Exception e2) { - logger.error("Event notification error: {}", e2.getMessage(), e2); - logger.error("Original cause: {}", e.getMessage(), e); + logger.error( + "[reader={}] Failed to notify observer [reason={}]", + getName(), + e.getMessage(), + e); + logger.error( + "[reader={}] Failed to notify observation exception handler [reason={}]", + getName(), + e2.getMessage(), + e2); } } } }); } + + if (logger.isDebugEnabled()) { + logger.debug("[reader={}] Observers notified", getName()); + } } /** @@ -160,7 +172,8 @@ void unregister() { try { stopCardDetection(); } catch (Exception e) { - logger.warn("Error stopping card detection on reader [{}]: {}", getName(), e.getMessage()); + logger.warn( + "[reader={}] Failed to stop card detection [reason={}]", getName(), e.getMessage()); } notifyObservers( new ReaderEventAdapter(getPluginName(), getName(), CardReaderEvent.Type.UNAVAILABLE, null)); @@ -221,8 +234,7 @@ public void clearObservers() { public void startCardDetection(DetectionMode detectionMode) { checkStatus(); - logger.info( - "Reader [{}] starts card detection with polling mode [{}]", getName(), detectionMode); + logger.info("[reader={}] Starting card detection [detectionMode={}]", getName(), detectionMode); Assert.getInstance().notNull(detectionMode, "detectionMode"); // Build the input JSON data. @@ -257,7 +269,7 @@ public void startCardDetection(DetectionMode detectionMode) { @Override public void stopCardDetection() { - logger.info("Reader [{}] stops card detection", getName()); + logger.info("[reader={}] Stopping card detection", getName()); // Notify the SPI first. observableRemoteReaderSpi.onStopObservation(); @@ -286,7 +298,7 @@ public void stopCardDetection() { @Override public void finalizeCardProcessing() { - logger.info("Reader [{}] starts card removal sequence", getName()); + logger.info("[reader={}] Starting card removal sequence", getName()); // Build the input JSON data. JsonObject input = new JsonObject(); diff --git a/src/main/java/org/eclipse/keyple/core/service/ObservationManagerAdapter.java b/src/main/java/org/eclipse/keyple/core/service/ObservationManagerAdapter.java index 90e25d38..af6c0514 100644 --- a/src/main/java/org/eclipse/keyple/core/service/ObservationManagerAdapter.java +++ b/src/main/java/org/eclipse/keyple/core/service/ObservationManagerAdapter.java @@ -47,9 +47,9 @@ final class ObservationManagerAdapter { */ ObservationManagerAdapter(String pluginName, String readerName) { if (readerName == null) { - this.ownerComponent = String.format("Plugin [%s]", pluginName); + this.ownerComponent = String.format("[plugin=%s]", pluginName); } else { - this.ownerComponent = String.format("Reader [%s]", readerName); + this.ownerComponent = String.format("[reader=%s]", readerName); } this.observers = new LinkedHashSet<>(1); this.monitor = new Object(); @@ -65,7 +65,7 @@ final class ObservationManagerAdapter { */ void addObserver(T observer) { logger.info( - "{} adds observer [{}]", + "{} Adding observer [className={}]", ownerComponent, observer != null ? observer.getClass().getSimpleName() : null); Assert.getInstance().notNull(observer, "observer"); @@ -86,7 +86,7 @@ void addObserver(T observer) { */ void removeObserver(T observer) { logger.info( - "{} removes observer [{}]", + "{} Removing observer [className={}]", ownerComponent, observer != null ? observer.getClass().getSimpleName() : null); synchronized (monitor) { @@ -100,7 +100,7 @@ void removeObserver(T observer) { * @since 2.0.0 */ void clearObservers() { - logger.info("{} removes all observers", ownerComponent); + logger.info("{} Removing all observers", ownerComponent); synchronized (monitor) { observers.clear(); } diff --git a/src/main/java/org/eclipse/keyple/core/service/RemotePluginAdapter.java b/src/main/java/org/eclipse/keyple/core/service/RemotePluginAdapter.java index 550505bd..faea283a 100644 --- a/src/main/java/org/eclipse/keyple/core/service/RemotePluginAdapter.java +++ b/src/main/java/org/eclipse/keyple/core/service/RemotePluginAdapter.java @@ -68,7 +68,8 @@ final void register() throws PluginIOException { int distributedApiLevel = remotePluginSpi.exchangeApiLevel(CORE_API_LEVEL); logger.info( - "Distributed Core API level: {}, Distributed API level (Remote Plugin): {}", + "[plugin={}] Registering distributed remote plugin [coreApiLevel={}, remotePluginApiLevel={}]", + getName(), CORE_API_LEVEL, distributedApiLevel); @@ -113,7 +114,12 @@ final void register() throws PluginIOException { new ObservableRemoteReaderAdapter( observableRemoteReaderSpi, getName(), CORE_API_LEVEL); } catch (IllegalStateException e) { - logger.warn(e.getMessage()); + logger.warn( + "[plugin={}] Failed to create observable remote reader [remoteReaderName={}, localReaderName={}, reason={}]", + getName(), + remoteReaderName, + localReaderName, + e.getMessage()); isObservable = false; } } @@ -139,7 +145,10 @@ void unregister() { try { remotePluginSpi.onUnregister(); } catch (Exception e) { - logger.warn("Error unregistering plugin extension [{}]: {}", getName(), e.getMessage()); + logger.warn( + "[plugin={}] Failed to unregister plugin extension [reason={}]", + getName(), + e.getMessage()); } super.unregister(); } @@ -154,7 +163,7 @@ public final void onReaderEvent(String jsonData) { checkStatus(); if (logger.isDebugEnabled()) { - logger.debug("Plugin [{}] receives reader event: {}", getName(), jsonData); + logger.debug("[plugin={}] Receiving remote reader event [jsonData={}]", getName(), jsonData); } Assert.getInstance().notEmpty(jsonData, "jsonData"); diff --git a/src/main/java/org/eclipse/keyple/core/service/RemotePoolPluginAdapter.java b/src/main/java/org/eclipse/keyple/core/service/RemotePoolPluginAdapter.java index 5a4d012f..a7e8b9b7 100644 --- a/src/main/java/org/eclipse/keyple/core/service/RemotePoolPluginAdapter.java +++ b/src/main/java/org/eclipse/keyple/core/service/RemotePoolPluginAdapter.java @@ -60,7 +60,8 @@ void register() throws PluginIOException { super.register(); int distributedApiLevel = remotePoolPluginSpi.exchangeApiLevel(CORE_API_LEVEL); logger.info( - "Distributed Core API level: {}, Distributed API level (Remote Pool Plugin): {}", + "[plugin={}] Registering distributed remote pool plugin [coreApiLevel={}, remotePluginApiLevel={}]", + getName(), CORE_API_LEVEL, distributedApiLevel); } @@ -75,7 +76,10 @@ void unregister() { try { remotePoolPluginSpi.onUnregister(); } catch (Exception e) { - logger.warn("Error unregistering plugin extension [{}]: {}", getName(), e.getMessage()); + logger.warn( + "[plugin={}] Failed to unregister plugin extension [reason={}]", + getName(), + e.getMessage()); } super.unregister(); } @@ -125,7 +129,7 @@ public CardReader allocateReader(String readerGroupReference) { checkStatus(); if (logger.isDebugEnabled()) { logger.debug( - "Pool plugin [{}] allocates reader of group reference [{}]", + "[plugin={}] Allocating reader [readerGroupReference={}]", getName(), readerGroupReference); } @@ -165,7 +169,11 @@ public CardReader allocateReader(String readerGroupReference) { (SmartCard) JsonUtil.getParser().fromJson(selectedSmartCardJson, classOfSelectedSmartCard); } catch (ClassNotFoundException e) { - logger.error("Class not found: {}", selectedSmartCardClassName, e); + logger.error( + "[plugin={}] Class not found [className={}]", + getName(), + selectedSmartCardClassName, + e); } } } catch (RuntimeException e) { @@ -209,7 +217,7 @@ public void releaseReader(CardReader reader) { checkStatus(); if (logger.isDebugEnabled()) { logger.debug( - "Pool plugin [{}] releases reader [{}]", + "[plugin={}] Releasing reader [name={}]", getName(), reader != null ? reader.getName() : null); } diff --git a/src/main/java/org/eclipse/keyple/core/service/SmartCardServiceAdapter.java b/src/main/java/org/eclipse/keyple/core/service/SmartCardServiceAdapter.java index 232408fb..0f7dec48 100644 --- a/src/main/java/org/eclipse/keyple/core/service/SmartCardServiceAdapter.java +++ b/src/main/java/org/eclipse/keyple/core/service/SmartCardServiceAdapter.java @@ -51,7 +51,7 @@ final class SmartCardServiceAdapter implements SmartCardService { private static final Logger logger = LoggerFactory.getLogger(SmartCardServiceAdapter.class); private static final String MSG_VERSION_MISMATCH_DETECTED = - "Version mismatch detected: {} [{}] uses '{}' version '{}' (expected '{}'). Compatibility issues may arise"; + "Version mismatch detected: {} '{}' uses '{}' version '{}' (expected '{}'). Compatibility issues may arise"; private static final SmartCardServiceAdapter INSTANCE = new SmartCardServiceAdapter(); @@ -307,11 +307,11 @@ private void checkDistributedLocalServiceVersion(LocalServiceFactorySpi localSer * @throws IllegalStateException if the plugin is already registered. */ private void checkPluginRegistration(String pluginName) { - logger.info("Register plugin [{}]", pluginName); + logger.info("Registering plugin [name={}]", pluginName); Assert.getInstance().notEmpty(pluginName, "pluginName"); if (plugins.containsKey(pluginName)) { throw new IllegalStateException( - String.format("Plugin [%s] has already been registered to the service", pluginName)); + String.format("Plugin '%s' has already been registered to the service", pluginName)); } } @@ -322,12 +322,12 @@ private void checkPluginRegistration(String pluginName) { * @throws IllegalStateException if the distributed local service is already registered. */ private void checkDistributedLocalServiceRegistration(String distributedLocalServiceName) { - logger.info("Register distributed local service [{}]", distributedLocalServiceName); + logger.info("Registering distributed local service [name={}]", distributedLocalServiceName); Assert.getInstance().notEmpty(distributedLocalServiceName, "distributedLocalServiceName"); if (distributedLocalServices.containsKey(distributedLocalServiceName)) { throw new IllegalStateException( String.format( - "Service [%s] has already been registered to the service", + "Service '%s' has already been registered to the service", distributedLocalServiceName)); } } @@ -466,7 +466,7 @@ private AbstractPluginAdapter createRemotePlugin(RemotePluginFactorySpi remotePl */ @Override public void unregisterPlugin(String pluginName) { - logger.info("Unregister plugin [{}]", pluginName); + logger.info("Unregistering plugin [name={}]", pluginName); synchronized (pluginMonitor) { Plugin plugin = plugins.get(pluginName); if (plugin != null) { @@ -476,7 +476,7 @@ public void unregisterPlugin(String pluginName) { plugins.remove(pluginName); } } else { - logger.warn("Plugin [{}] not registered", pluginName); + logger.warn("Plugin not registered [name={}]", pluginName); } } } @@ -627,14 +627,15 @@ public DistributedLocalService registerDistributedLocalService( */ @Override public void unregisterDistributedLocalService(String distributedLocalServiceName) { - logger.info("Unregister distributed local service [{}]", distributedLocalServiceName); + logger.info("Unregistering distributed local service [name={}]", distributedLocalServiceName); synchronized (distributedLocalServiceMonitor) { DistributedLocalService localService = distributedLocalServices.remove(distributedLocalServiceName); if (localService != null) { ((DistributedLocalServiceAdapter) localService).unregister(); } else { - logger.warn("Distributed local service [{}] not registered", distributedLocalServiceName); + logger.warn( + "Distributed local service not registered [name={}]", distributedLocalServiceName); } } } diff --git a/src/main/java/org/eclipse/keyple/core/service/WaitForCardInsertionStateAdapter.java b/src/main/java/org/eclipse/keyple/core/service/WaitForCardInsertionStateAdapter.java index e43fab17..e2f1ab16 100644 --- a/src/main/java/org/eclipse/keyple/core/service/WaitForCardInsertionStateAdapter.java +++ b/src/main/java/org/eclipse/keyple/core/service/WaitForCardInsertionStateAdapter.java @@ -70,10 +70,10 @@ final class WaitForCardInsertionStateAdapter extends AbstractObservableStateAdap void onEvent(ObservableLocalReaderAdapter.InternalEvent event) { if (logger.isTraceEnabled()) { logger.trace( - "Internal event [{}] received for reader [{}] in current state [{}]", - event, + "[fsmState={}, reader={}] Processing internal event [type={}]", + getMonitoringState(), getReader().getName(), - getMonitoringState()); + event); } /* * Process InternalEvent @@ -92,7 +92,10 @@ void onEvent(ObservableLocalReaderAdapter.InternalEvent event) { // stay in the same state, however switch to WAIT_FOR_CARD_INSERTION to relaunch // the monitoring job if (logger.isTraceEnabled()) { - logger.trace("Inserted card hasn't matched"); + logger.trace( + "[fsmState={}, reader={}] Inserted card hasn't matched", + getMonitoringState(), + getReader().getName()); } switchState(MonitoringState.WAIT_FOR_CARD_REMOVAL); } @@ -104,9 +107,19 @@ void onEvent(ObservableLocalReaderAdapter.InternalEvent event) { default: if (logger.isTraceEnabled()) { - logger.trace("Event ignored"); + logger.trace( + "[fsmState={}, reader={}] Internal event ignored", + getMonitoringState(), + getReader().getName()); } break; } + if (logger.isTraceEnabled()) { + logger.trace( + "[fsmState={}, reader={}] Internal event processed [type={}]", + getMonitoringState(), + getReader().getName(), + event); + } } } diff --git a/src/main/java/org/eclipse/keyple/core/service/WaitForCardProcessingStateAdapter.java b/src/main/java/org/eclipse/keyple/core/service/WaitForCardProcessingStateAdapter.java index 4a73822f..348d5851 100644 --- a/src/main/java/org/eclipse/keyple/core/service/WaitForCardProcessingStateAdapter.java +++ b/src/main/java/org/eclipse/keyple/core/service/WaitForCardProcessingStateAdapter.java @@ -69,10 +69,10 @@ final class WaitForCardProcessingStateAdapter extends AbstractObservableStateAda void onEvent(ObservableLocalReaderAdapter.InternalEvent event) { if (logger.isTraceEnabled()) { logger.trace( - "Internal event [{}] received for reader [{}] in current state [{}]", - event, + "[fsmState={}, reader={}] Processing internal event [type={}]", + getMonitoringState(), getReader().getName(), - getMonitoringState()); + event); } /* * Process InternalEvent @@ -112,9 +112,19 @@ void onEvent(ObservableLocalReaderAdapter.InternalEvent event) { default: if (logger.isTraceEnabled()) { - logger.trace("Event ignored"); + logger.trace( + "[fsmState={}, reader={}] Internal event ignored", + getMonitoringState(), + getReader().getName()); } break; } + if (logger.isTraceEnabled()) { + logger.trace( + "[fsmState={}, reader={}] Internal event processed [type={}]", + getMonitoringState(), + getReader().getName(), + event); + } } } diff --git a/src/main/java/org/eclipse/keyple/core/service/WaitForCardRemovalStateAdapter.java b/src/main/java/org/eclipse/keyple/core/service/WaitForCardRemovalStateAdapter.java index 96ba52f3..46f4759f 100644 --- a/src/main/java/org/eclipse/keyple/core/service/WaitForCardRemovalStateAdapter.java +++ b/src/main/java/org/eclipse/keyple/core/service/WaitForCardRemovalStateAdapter.java @@ -69,10 +69,10 @@ final class WaitForCardRemovalStateAdapter extends AbstractObservableStateAdapte void onEvent(ObservableLocalReaderAdapter.InternalEvent event) { if (logger.isTraceEnabled()) { logger.trace( - "Internal event [{}] received for reader [{}] in current state [{}]", - event, + "[fsmState={}, reader={}] Processing internal event [type={}]", + getMonitoringState(), getReader().getName(), - getMonitoringState()); + event); } /* * Process InternalEvent @@ -98,9 +98,19 @@ void onEvent(ObservableLocalReaderAdapter.InternalEvent event) { default: if (logger.isTraceEnabled()) { - logger.trace("Event ignored"); + logger.trace( + "[fsmState={}, reader={}] Internal event ignored", + getMonitoringState(), + getReader().getName()); } break; } + if (logger.isTraceEnabled()) { + logger.trace( + "[fsmState={}, reader={}] Internal event processed [type={}]", + getMonitoringState(), + getReader().getName(), + event); + } } } diff --git a/src/main/java/org/eclipse/keyple/core/service/WaitForStartDetectStateAdapter.java b/src/main/java/org/eclipse/keyple/core/service/WaitForStartDetectStateAdapter.java index e2f7c05f..12753679 100644 --- a/src/main/java/org/eclipse/keyple/core/service/WaitForStartDetectStateAdapter.java +++ b/src/main/java/org/eclipse/keyple/core/service/WaitForStartDetectStateAdapter.java @@ -67,10 +67,10 @@ final class WaitForStartDetectStateAdapter extends AbstractObservableStateAdapte void onEvent(ObservableLocalReaderAdapter.InternalEvent event) { if (logger.isTraceEnabled()) { logger.trace( - "Internal event [{}] received for reader [{}] in current state [{}]", - event, + "[fsmState={}, reader={}] Processing internal event [type={}]", + getMonitoringState(), getReader().getName(), - getMonitoringState()); + event); } /* * Process InternalEvent @@ -81,9 +81,19 @@ void onEvent(ObservableLocalReaderAdapter.InternalEvent event) { break; default: if (logger.isTraceEnabled()) { - logger.trace("Event ignored"); + logger.trace( + "[fsmState={}, reader={}] Internal event ignored", + getMonitoringState(), + getReader().getName()); } break; } + if (logger.isTraceEnabled()) { + logger.trace( + "[fsmState={}, reader={}] Internal event processed [type={}]", + getMonitoringState(), + getReader().getName(), + event); + } } } diff --git a/src/main/uml/adapter_class_diagram.puml b/src/main/uml/adapter_class_diagram.puml index 587ed691..97e8eadf 100644 --- a/src/main/uml/adapter_class_diagram.puml +++ b/src/main/uml/adapter_class_diagram.puml @@ -487,7 +487,6 @@ package "org.eclipse.keyple.core.service" as service { ~void onEvent (InternalEvent event) ~void switchState (MonitoringState stateId) - ~AbstractObservableStateAdapter getCurrentState () ~MonitoringState getCurrentMonitoringState () ~void shutdown () } diff --git a/src/main/uml/adapter_class_diagram.svg b/src/main/uml/adapter_class_diagram.svg index e024b707..5abdd059 100644 --- a/src/main/uml/adapter_class_diagram.svg +++ b/src/main/uml/adapter_class_diagram.svg @@ -1 +1 @@ -Keyple - Adapter of keyple-service-java-lib - 3.3.6 (2025-07-17)Keyple - Adapter of keyple-service-java-lib - 3.3.6 (2025-07-17)Colors legend:External public API references:keyple-common-java-apikeypop-reader-java-apikeypop-card-java-apicom.google.code.gsonExternal private API references:keyple-plugin-java-apikeyple-distributed-remote-java-apikeyple-distributed-local-java-apiorg.eclipse.keyple.core.servicefinalSmartCardServiceProvider...MultiSelectionProcessingFIRST_MATCHPROCESS_ALLfinalJsonAdapter...finalInternalDto...finalInternalLegacyDto...InternalCardSelectorString getLogicalProtocolName ()String getPowerOnDataRegex ()InternalIsoCardSelectorbyte[] getAid ()CommonIsoCardSelector.FileOccurrencegetFileOccurrence ()CommonIsoCardSelector.FileControlInformationgetFileControlInformation ()<<BasicCardSelector>>finalBasicCardSelectorAdapter...<<IsoCardSelector>>finalIsoCardSelectorAdapter...«SmartCardService»finalSmartCardServiceAdapterSmartCardServiceAdapter getInstance () void boolean isAutomaticStatusCodeHandlingEnabled()Plugin registerPlugin (KeyplePluginExtensionFactorypluginFactory)void unregisterPlugin (String pluginName)Set<String> getPluginNames ()Set<Plugin> getPlugins ()Plugin getPlugin (String pluginName)Plugin getPlugin (CardReaderreader)CardReadergetReader (String readerName)CardReaderfindReader (String readerNameRegex)void checkCardExtension (KeypleCardExtensioncardExtension)DistributedLocalService registerDistributedLocalService (KeypleDistributedLocalServiceExtensionFactorydistributedLocalServiceFactory)void unregisterDistributedLocalService (String distributedLocalServiceName)DistributedLocalService getDistributedLocalService (String distributedLocalServiceName)ReaderApiFactorygetReaderApiFactory ()SmartCardService«Plugin»AbstractPluginAdapterfinalString REMOTE_READER_NAME_SUFFIXAbstractPluginAdapter (String pluginName,KeyplePluginExtensionpluginExtension) finalLocalReaderAdapter buildLocalReaderAdapter (ReaderSpi readerSpi)finalMap<String,CardReader> getReadersMap ()finalvoid checkStatus ()void register ()void unregister ()finalString getName ()final<T extendsKeyplePluginExtension> T getExtension (Class<T> pluginExtensionClass)final<T extendsKeypleReaderExtension> T getReaderExtension (Class<T> readerExtensionClass, String readerName)finalSet<String> getReaderNames ()finalSet<CardReader> getReaders ()final CardReadergetReader (String readerName)final CardReaderfindReader (String readerNameRegex)PluginLocalPluginAdapterLocalPluginAdapter (PluginSpipluginSpi)void register ()void unregister ()AbstractPluginAdapter<<RemotePluginApi>>RemotePluginAdapterRemotePluginAdapter (RemotePluginSpiremotePluginSpi)finalvoid register ()void unregister ()AbstractPluginAdapterfinalvoid onReaderEvent (String jsonData)RemotePluginApi«PoolPlugin»finalLocalPoolPluginAdapterLocalPoolPluginAdapter (PoolPluginSpipoolPluginSpi)void unregister ()AbstractPluginAdapterSortedSet<String> getReaderGroupReferences ()CardReaderallocateReader (String readerGroupReference)SmartCardgetSelectedSmartCard (CardReader cardReader)void releaseReader (CardReader cardReader)PoolPlugin«PoolPlugin»finalRemotePoolPluginAdapterRemotePoolPluginAdapter (RemotePoolPluginSpiremotePoolPluginSpi)void register ()void unregister ()AbstractPluginAdapterSortedSet<String> getReaderGroupReferences ()CardReaderallocateReader (String readerGroupReference)SmartCardgetSelectedSmartCard (CardReader cardReader)void releaseReader (CardReader cardReader)PoolPluginfinalObservationManagerAdapter T: PluginObserverSpiorCardReaderObserverSpi S: PluginObservationExceptionHandlerSpiorCardReaderObservationExceptionHandlerSpiT, SObservationManagerAdapter (String pluginName, String readerName) void setObservationExceptionHandler (S exceptionHandler)void addObserver (T observer)void removeObserver (T observer)void clearObservers ()int countObservers () Set<T> getObservers ()S getObservationExceptionHandler ()«ObservablePlugin»AbstractObservableLocalPluginAdapterAbstractObservableLocalPluginAdapter (PluginSpipluginSpi) finalObservationManagerAdapter<PluginObserverSpi, PluginObservationExceptionHandlerSpi> getObservationManager ()finalvoid notifyObservers (PluginEvent event)finalvoid unregister ()AbstractPluginAdapterfinalvoid setPluginObservationExceptionHandler (PluginObservationExceptionHandlerSpi exceptionHandler)void addObserver (PluginObserverSpi observer)void removeObserver (PluginObserverSpi observer)void clearObservers ()finalint countObservers ()ObservablePluginfinalObservableLocalPluginAdapterObservableLocalPluginAdapter (ObservablePluginSpiobservablePluginSpi) boolean isMonitoring ()void addObserver (PluginObserverSpi observer)void removeObserver (PluginObserverSpi observer)void clearObservers ()ObservablePlugin<<AutonomousObservablePluginApi>>finalAutonomousObservableLocalPluginAdapterAutonomousObservableLocalPluginAdapter (AutonomousObservablePluginSpiautonomousObservablePluginSpi)void onReaderConnected (Set<ReaderSpi> readers)void onReaderDisconnected (Set<String> readerNames)AutonomousObservablePluginApi«ObservablePlugin»<<ObservableRemotePluginApi>>finalObservableRemotePluginAdapterObservableRemotePluginAdapter (ObservableRemotePluginSpiobservableRemotePluginSpi)void unregister ()AbstractPluginAdaptervoid setPluginObservationExceptionHandler (PluginObservationExceptionHandlerSpi exceptionHandler)void addObserver (PluginObserverSpi observer)void removeObserver (PluginObserverSpi observer)void clearObservers ()int countObservers ()ObservablePluginvoid addRemoteReader (RemoteReaderSpiremoteReaderSpi, int clientCoreApiLevel)boolean removeRemoteReader (remoteReaderName)void onPluginEvent (String jsonData)ObservableRemotePluginApi«DistributedLocalService»«PluginObserverSpi»<<CardReaderObserverSpi>><<LocalServiceApi>>finalDistributedLocalServiceAdapterDistributedLocalServiceAdapter (LocalServiceSpilocalServiceSpi) void register ()void unregister ()String getName ()<T extendsKeypleDistributedLocalServiceExtension> T getExtension (Class<T> distributedLocalServiceExtensionClass)DistributedLocalServicevoid onPluginEvent (PluginEvent pluginEvent)PluginObserverSpivoid onReaderEvent (CardReaderEventcardReaderEvent)CardReaderObserverSpiboolean isReaderContactless (String readerName)void setPoolPluginNames (String... poolPluginNames)String executeLocally (String jsonData, String readerName)LocalServiceApifinalDistributedUtilAdapterJsonObjectexecutePluginServiceRemotely (JsonObjectinput,AbstractRemotePluginSpiremotePluginSpi,String pluginName, Logger logger)JsonObjectexecuteReaderServiceRemotely (JsonObjectinput,RemoteReaderSpiremoteReaderSpi,String readerName, String pluginName, Logger logger)void throwRuntimeException (Exception e)JsonProperty...PluginService...ReaderService...<<CardReader>><<ProxyReaderApi>>AbstractReaderAdapterAbstractReaderAdapter (String readerName,KeypleReaderExtensionreaderExtension, String pluginName, Boolean isContactless) finalString getPluginName ()final<T extendsKeypleReaderExtension> T getExtension (Class<T> readerExtensionClass) finalList<CardSelectionResponseApi> transmitCardSelectionRequests (List<CardSelector<?>> cardSelectors, List<CardSelectionRequestSpi> cardSelectionRequests,MultiSelectionProcessing multiSelectionProcessing,ChannelControlchannelControl) finalvoid checkStatus ()finalvoid register ()void unregister () abstractList<CardSelectionResponseApi> processCardSelectionRequests (List<CardSelector<?>> cardSelectors, List<CardSelectionRequestSpi> cardSelectionRequests,MultiSelectionProcessing multiSelectionProcessing,ChannelControlchannelControl)abstract CardResponseApiprocessCardRequest (CardRequestSpicardRequest,ChannelControlchannelControl)finalString getName ()CardReaderfinal CardResponseApitransmitCardRequest (CardRequestSpicardRequest,ChannelControlchannelControl)ProxyReaderApiLocalReaderAdapterLocalReaderAdapter (ReaderSpireaderSpi, String pluginName) final ReaderSpigetReaderSpi ()finalboolean isLogicalChannelOpen ()finalvoid closeLogicalAndPhysicalChannelsSilently ()finalvoid activateReaderProtocol (String physicalProtocolName, String logicalProtocolName)finalvoid deactivateReaderProtocol (String physicalProtocolName)finalString getCurrentPhysicalProtocolName ()void unregister ()finalList<CardSelectionResponseApi> processCardSelectionRequests (List<CardSelector<?>> cardSelectors,List<CardSelectionRequestSpi> cardSelectionRequests,MultiSelectionProcessing multiSelectionProcessing,ChannelControlchannelControl)final CardResponseApiprocessCardRequest (CardRequestSpicardRequest,ChannelControlchannelControl)AbstractReaderAdapterfinalboolean isContactless ()boolean isCardPresent ()CardReaderfinalvoid releaseChannel ()ProxyReaderApiRemoteReaderAdapterRemoteReaderAdapter (RemoteReaderSpiremoteReaderSpi, String pluginName,SmartCardselectedSmartCard, int clientCoreApiLevel) final SmartCardgetSelectedSmartCard ()finalint getClientCoreApiLevel ()finalList<CardSelectionResponseApi> processCardSelectionRequests (List<CardSelector<?>> cardSelectors,List<CardSelectionRequestSpi> cardSelectionRequests,MultiSelectionProcessing multiSelectionProcessing,ChannelControlchannelControl)final CardResponseApiprocessCardRequest (CardRequestSpicardRequest,ChannelControlchannelControl)AbstractReaderAdapterfinalboolean isContactless ()finalboolean isCardPresent ()CardReaderfinalvoid releaseChannel ()ProxyReaderApi<<ConfigurableCardReader>>finalLocalConfigurableReaderAdapterLocalConfigurableReaderAdapter (ConfigurableReaderSpiconfigurableReaderSpi,String pluginName)void activateProtocol (String physicalProtocolName, String logicalProtocolName)void deactivateProtocol (String physicalProtocolName)String getCurrentProtocol ()ConfigurableCardReaderfinalCardSelectionScenarioAdapterCardSelectionScenarioAdapter (List<CardSelector<?>> cardSelectors,List<CardSelectionRequestSpi> cardSelectionRequests,MultiSelectionProcessing multiSelectionProcessing,ChannelControlchannelControl) List<CardSelector<?>> getCardSelectors()List<CardSelectionRequestSpi> getCardSelectionRequests ()MultiSelectionProcessing getMultiSelectionProcessing ()ChannelControlgetChannelControl ()<<ObservableCardReader>><<CardInsertionWaiterAsynchronousApi>><<CardRemovalWaiterAsynchronousApi>><<WaitForCardInsertionAutonomousReaderApi>><<WaitForCardRemovalAutonomousReaderApi>>ObservableLocalReaderAdapterObservableLocalReaderAdapter (ObservableReaderSpiobservableReaderSpi, String pluginName) final ObservableReaderSpigetObservableReaderSpi ()final CardReaderObservationExceptionHandlerSpigetObservationExceptionHandler ()final DetectionModegetDetectionMode ()finalMonitoringState getCurrentMonitoringState ()finalboolean isCardPresentPing () final CardReaderEventprocessCardInserted ()finalvoid processCardRemoved ()finalvoid switchState (MonitoringState stateId)finalvoid notifyObservers (CardReaderEventevent) finalvoid scheduleCardSelectionScenario (CardSelectionScenarioAdapter cardSelectionScenario,NotificationModenotificationMode)finalvoid unregister ()AbstractReaderAdapterfinalboolean isCardPresent ()CardReaderfinalvoid setReaderObservationExceptionHandler (CardReaderObservationExceptionHandlerSpiexceptionHandler)finalvoid addObserver (CardReaderObserverSpiobserver)finalvoid removeObserver (CardReaderObserverSpiobserver)finalint countObservers ()finalvoid clearObservers ()finalvoid startCardDetection (DetectionModedetectionMode)finalvoid stopCardDetection ()finalvoid finalizeCardProcessing ()ObservableCardReaderfinalvoid onCardInserted ()WaitForCardInsertionAutonomousReaderApifinalvoid onCardRemoved ()WaitForCardRemovalAutonomousReaderApiInternalEventCARD_INSERTEDCARD_REMOVEDSE_PROCESSEDSTART_DETECTSTOP_DETECTTIME_OUT<<ConfigurableCardReader>>finalObservableLocalConfigurableReaderAdapterObservableLocalConfigurableReaderAdapter (ConfigurableReaderSpiconfigurableReaderSpi,String pluginName)void activateProtocol (String physicalProtocolName, String logicalProtocolName)void deactivateProtocol (String physicalProtocolName)String getCurrentProtocol ()ConfigurableCardReader<<ObservableCardReader>>finalObservableRemoteReaderAdapterObservableRemoteReaderAdapter (ObservableRemoteReaderSpiremoteReaderSpi, String pluginName, int clientCoreApiLevel) void notifyObservers (CardReaderEventevent) void scheduleCardSelectionScenario (CardSelectionScenarioAdapter cardSelectionScenario,NotificationModenotificationMode)void unregister ()AbstractReaderAdaptervoid setReaderObservationExceptionHandler (CardReaderObservationExceptionHandlerSpiexceptionHandler)void addObserver (CardReaderObserverSpiobserver)void removeObserver (CardReaderObserverSpiobserver)int countObservers ()void clearObservers ()void startCardDetection (DetectionModedetectionMode)void stopCardDetection ()void finalizeCardProcessing ()ObservableCardReader«PluginEvent»finalPluginEventAdapterPluginEventAdapter (String pluginName, String readerName, PluginEvent.Type type)PluginEventAdapter (String pluginName, Set<String> readerNames, PluginEvent.Type type)String getPluginName ()SortedSet<String> getReaderNames ()PluginEvent.Type getType ()PluginEvent<<CardReaderEvent>>finalReaderEventAdapterReaderEventAdapter (String pluginName, String readerName,CardReaderEvent.Typetype,ScheduledCardSelectionsResponsescheduledCardSelectionsResponse) String getPluginName ()String getReaderName ()CardReaderEvent.TypegetType ()ScheduledCardSelectionsResponsegetScheduledCardSelectionsResponse ()CardReaderEventfinalObservableReaderStateServiceAdapterObservableReaderStateServiceAdapter (ObservableLocalReaderAdapter reader) void onEvent (InternalEvent event)void switchState (MonitoringState stateId)AbstractObservableStateAdapter getCurrentState ()MonitoringState getCurrentMonitoringState ()void shutdown ()AbstractObservableStateAdapterAbstractObservableStateAdapter (MonitoringState monitoringState, ObservableLocalReaderAdapter reader, AbstractMonitoringJobAdapter monitoringJob, ExecutorService executorService)AbstractObservableStateAdapter (MonitoringState monitoringState, ObservableLocalReaderAdapter reader) finalMonitoringState getMonitoringState ()finalObservableLocalReaderAdapter getReader () finalvoid switchState (MonitoringState stateId) finalvoid onActivate ()finalvoid onDeactivate () abstractvoid onEvent (InternalEvent event)MonitoringStateWAIT_FOR_START_DETECTIONWAIT_FOR_SE_INSERTIONWAIT_FOR_SE_PROCESSINGWAIT_FOR_SE_REMOVALfinalWaitForCardInsertionStateAdapterWaitForCardInsertionStateAdapter (ObservableLocalReaderAdapter reader,AbstractMonitoringJobAdapter monitoringJob,ExecutorService executorService)WaitForCardInsertionStateAdapter (ObservableLocalReaderAdapter reader)void onEvent (InternalEvent event)AbstractObservableStateAdapterfinalWaitForCardProcessingStateAdapterWaitForCardProcessingStateAdapter (ObservableLocalReaderAdapter reader,AbstractMonitoringJobAdapter monitoringJob,ExecutorService executorService)WaitForCardProcessingStateAdapter (ObservableLocalReaderAdapter reader)void onEvent (InternalEvent event)AbstractObservableStateAdapterfinalWaitForCardRemovalStateAdapterWaitForCardRemovalStateAdapter (ObservableLocalReaderAdapter reader,AbstractMonitoringJobAdapter monitoringJob,ExecutorService executorService)WaitForCardRemovalStateAdapter (ObservableLocalReaderAdapter reader)void onEvent (InternalEvent event)AbstractObservableStateAdapterfinalWaitForStartDetectStateAdapterWaitForStartDetectStateAdapter (ObservableLocalReaderAdapter reader,AbstractMonitoringJobAdapter monitoringJob,ExecutorService executorService)WaitForStartDetectStateAdapter (ObservableLocalReaderAdapter reader)void onEvent (InternalEvent event)AbstractObservableStateAdapterAbstractMonitoringJobAdapterAbstractMonitoringJobAdapter (ObservableLocalReaderAdapter reader) finalObservableLocalReaderAdapter getReader () abstractRunnable getMonitoringJob (AbstractObservableStateAdapter monitoringState)abstractvoid stop ()finalCardRemovalActiveMonitoringJobAdapterCardRemovalActiveMonitoringJobAdapter (ObservableLocalReaderAdapter reader,long cycleDurationMillis)Runnable getMonitoringJob (AbstractObservableStateAdapter monitoringState)void stop ()AbstractMonitoringJobAdapterfinalCardInsertionActiveMonitoringJobAdapterCardInsertionActiveMonitoringJobAdapter (ObservableLocalReaderAdapter reader,long cycleDurationMillis,boolean monitorInsertion)Runnable getMonitoringJob (AbstractObservableStateAdapter monitoringState)void stop ()AbstractMonitoringJobAdapterfinalCardInsertionPassiveMonitoringJobAdapterCardInsertionPassiveMonitoringJobAdapter (ObservableLocalReaderAdapter reader)Runnable getMonitoringJob (AbstractObservableStateAdapter monitoringState)void stop ()AbstractMonitoringJobAdapterfinalCardRemovalPassiveMonitoringJobAdapterCardRemovalPassiveMonitoringJobAdapter (ObservableLocalReaderAdapter reader)Runnable getMonitoringJob (AbstractObservableStateAdapter monitoringState)void stop ()AbstractMonitoringJobAdapter<<CardSelectionManager>>finalCardSelectionManagerAdapterCardSelectionManagerAdapter (MultiSelectionProcessing multiSelectionProcessing)void setMultipleSelectionMode ()int prepareSelection (CardSelector<?> cardSelector,CardSelectionExtensioncardSelectionExtension)void prepareReleaseChannel ()String exportCardSelectionScenario ()int importCardSelectionScenario (String cardSelectionScenario)CardSelectionResultprocessCardSelectionScenario (CardReaderreader)void scheduleCardSelectionScenario (ObservableCardReaderobservableCardReader,NotificationModenotificationMode)CardSelectionResultparseScheduledCardSelectionsResponse (ScheduledCardSelectionsResponseAdapter scheduledCardSelectionsResponse)String exportProcessedCardSelectionScenario ()CardSelectionResultimportProcessedCardSelectionScenario (String processedCardSelectionScenario)CardSelectionManager<<ScheduledCardSelectionsResponse>>finalScheduledCardSelectionsResponseAdapterScheduledCardSelectionsResponseAdapter (List<CardSelectionResponseApi> cardSelectionResponses) List<CardSelectionResponseApi> getCardSelectionResponses ()<<CardSelectionResult>>finalCardSelectionResultAdapterCardSelectionResultAdapter () void addSmartCard (int selectionIndex,SmartCardsmartCard)Map<Integer,SmartCard> getSmartCards ()SmartCardgetActiveSmartCard ()int getActiveSelectionIndex ()CardSelectionResult<<CardSelectionResponseApi>>finalCardSelectionResponseAdapterCardSelectionResponseAdapter (byte[] powerOnData,ApduResponseApiselectApplicationResponse,boolean hasMatched,CardResponseApicardResponseApi)String getPowerOnData ()ApduResponseApigetSelectApplicationResponse ()boolean hasMatched ()CardResponseApigetCardResponse ()CardSelectionResponseApi<<CardResponseApi>>finalCardResponseAdapterCardResponseAdapter (List<ApduResponseApi> apduResponses,boolean isLogicalChannelOpen)List<ApduResponseApi> getApduResponses ()boolean isLogicalChannelOpen ()CardResponseApi<<ApduResponseApi>>finalApduResponseAdapterApduResponseAdapter (byte[] bytes)byte[] getApdu ()byte[] getDataOut ()int getStatusWord ()ApduResponseApiprovide0..N0..N11111use1..N110..110..N1usecreatecreateuse0..111..N \ No newline at end of file +Keyple - Adapter of keyple-service-java-lib - 3.3.6 (2025-07-17)Keyple - Adapter of keyple-service-java-lib - 3.3.6 (2025-07-17)Colors legend:External public API references:keyple-common-java-apikeypop-reader-java-apikeypop-card-java-apicom.google.code.gsonExternal private API references:keyple-plugin-java-apikeyple-distributed-remote-java-apikeyple-distributed-local-java-apiorg.eclipse.keyple.core.servicefinalSmartCardServiceProvider...MultiSelectionProcessingFIRST_MATCHPROCESS_ALLfinalJsonAdapter...finalInternalDto...finalInternalLegacyDto...InternalCardSelectorString getLogicalProtocolName ()String getPowerOnDataRegex ()InternalIsoCardSelectorbyte[] getAid ()CommonIsoCardSelector.FileOccurrencegetFileOccurrence ()CommonIsoCardSelector.FileControlInformationgetFileControlInformation ()<<BasicCardSelector>>finalBasicCardSelectorAdapter...<<IsoCardSelector>>finalIsoCardSelectorAdapter...«SmartCardService»finalSmartCardServiceAdapterSmartCardServiceAdapter getInstance () void boolean isAutomaticStatusCodeHandlingEnabled()Plugin registerPlugin (KeyplePluginExtensionFactorypluginFactory)void unregisterPlugin (String pluginName)Set<String> getPluginNames ()Set<Plugin> getPlugins ()Plugin getPlugin (String pluginName)Plugin getPlugin (CardReaderreader)CardReadergetReader (String readerName)CardReaderfindReader (String readerNameRegex)void checkCardExtension (KeypleCardExtensioncardExtension)DistributedLocalService registerDistributedLocalService (KeypleDistributedLocalServiceExtensionFactorydistributedLocalServiceFactory)void unregisterDistributedLocalService (String distributedLocalServiceName)DistributedLocalService getDistributedLocalService (String distributedLocalServiceName)ReaderApiFactorygetReaderApiFactory ()SmartCardService«Plugin»AbstractPluginAdapterfinalString REMOTE_READER_NAME_SUFFIXAbstractPluginAdapter (String pluginName,KeyplePluginExtensionpluginExtension) finalLocalReaderAdapter buildLocalReaderAdapter (ReaderSpi readerSpi)finalMap<String,CardReader> getReadersMap ()finalvoid checkStatus ()void register ()void unregister ()finalString getName ()final<T extendsKeyplePluginExtension> T getExtension (Class<T> pluginExtensionClass)final<T extendsKeypleReaderExtension> T getReaderExtension (Class<T> readerExtensionClass, String readerName)finalSet<String> getReaderNames ()finalSet<CardReader> getReaders ()final CardReadergetReader (String readerName)final CardReaderfindReader (String readerNameRegex)PluginLocalPluginAdapterLocalPluginAdapter (PluginSpipluginSpi)void register ()void unregister ()AbstractPluginAdapter<<RemotePluginApi>>RemotePluginAdapterRemotePluginAdapter (RemotePluginSpiremotePluginSpi)finalvoid register ()void unregister ()AbstractPluginAdapterfinalvoid onReaderEvent (String jsonData)RemotePluginApi«PoolPlugin»finalLocalPoolPluginAdapterLocalPoolPluginAdapter (PoolPluginSpipoolPluginSpi)void unregister ()AbstractPluginAdapterSortedSet<String> getReaderGroupReferences ()CardReaderallocateReader (String readerGroupReference)SmartCardgetSelectedSmartCard (CardReader cardReader)void releaseReader (CardReader cardReader)PoolPlugin«PoolPlugin»finalRemotePoolPluginAdapterRemotePoolPluginAdapter (RemotePoolPluginSpiremotePoolPluginSpi)void register ()void unregister ()AbstractPluginAdapterSortedSet<String> getReaderGroupReferences ()CardReaderallocateReader (String readerGroupReference)SmartCardgetSelectedSmartCard (CardReader cardReader)void releaseReader (CardReader cardReader)PoolPluginfinalObservationManagerAdapter T: PluginObserverSpiorCardReaderObserverSpi S: PluginObservationExceptionHandlerSpiorCardReaderObservationExceptionHandlerSpiT, SObservationManagerAdapter (String pluginName, String readerName) void setObservationExceptionHandler (S exceptionHandler)void addObserver (T observer)void removeObserver (T observer)void clearObservers ()int countObservers () Set<T> getObservers ()S getObservationExceptionHandler ()«ObservablePlugin»AbstractObservableLocalPluginAdapterAbstractObservableLocalPluginAdapter (PluginSpipluginSpi) finalObservationManagerAdapter<PluginObserverSpi, PluginObservationExceptionHandlerSpi> getObservationManager ()finalvoid notifyObservers (PluginEvent event)finalvoid unregister ()AbstractPluginAdapterfinalvoid setPluginObservationExceptionHandler (PluginObservationExceptionHandlerSpi exceptionHandler)void addObserver (PluginObserverSpi observer)void removeObserver (PluginObserverSpi observer)void clearObservers ()finalint countObservers ()ObservablePluginfinalObservableLocalPluginAdapterObservableLocalPluginAdapter (ObservablePluginSpiobservablePluginSpi) boolean isMonitoring ()void addObserver (PluginObserverSpi observer)void removeObserver (PluginObserverSpi observer)void clearObservers ()ObservablePlugin<<AutonomousObservablePluginApi>>finalAutonomousObservableLocalPluginAdapterAutonomousObservableLocalPluginAdapter (AutonomousObservablePluginSpiautonomousObservablePluginSpi)void onReaderConnected (Set<ReaderSpi> readers)void onReaderDisconnected (Set<String> readerNames)AutonomousObservablePluginApi«ObservablePlugin»<<ObservableRemotePluginApi>>finalObservableRemotePluginAdapterObservableRemotePluginAdapter (ObservableRemotePluginSpiobservableRemotePluginSpi)void unregister ()AbstractPluginAdaptervoid setPluginObservationExceptionHandler (PluginObservationExceptionHandlerSpi exceptionHandler)void addObserver (PluginObserverSpi observer)void removeObserver (PluginObserverSpi observer)void clearObservers ()int countObservers ()ObservablePluginvoid addRemoteReader (RemoteReaderSpiremoteReaderSpi, int clientCoreApiLevel)boolean removeRemoteReader (remoteReaderName)void onPluginEvent (String jsonData)ObservableRemotePluginApi«DistributedLocalService»«PluginObserverSpi»<<CardReaderObserverSpi>><<LocalServiceApi>>finalDistributedLocalServiceAdapterDistributedLocalServiceAdapter (LocalServiceSpilocalServiceSpi) void register ()void unregister ()String getName ()<T extendsKeypleDistributedLocalServiceExtension> T getExtension (Class<T> distributedLocalServiceExtensionClass)DistributedLocalServicevoid onPluginEvent (PluginEvent pluginEvent)PluginObserverSpivoid onReaderEvent (CardReaderEventcardReaderEvent)CardReaderObserverSpiboolean isReaderContactless (String readerName)void setPoolPluginNames (String... poolPluginNames)String executeLocally (String jsonData, String readerName)LocalServiceApifinalDistributedUtilAdapterJsonObjectexecutePluginServiceRemotely (JsonObjectinput,AbstractRemotePluginSpiremotePluginSpi,String pluginName, Logger logger)JsonObjectexecuteReaderServiceRemotely (JsonObjectinput,RemoteReaderSpiremoteReaderSpi,String readerName, String pluginName, Logger logger)void throwRuntimeException (Exception e)JsonProperty...PluginService...ReaderService...<<CardReader>><<ProxyReaderApi>>AbstractReaderAdapterAbstractReaderAdapter (String readerName,KeypleReaderExtensionreaderExtension, String pluginName, Boolean isContactless) finalString getPluginName ()final<T extendsKeypleReaderExtension> T getExtension (Class<T> readerExtensionClass) finalList<CardSelectionResponseApi> transmitCardSelectionRequests (List<CardSelector<?>> cardSelectors, List<CardSelectionRequestSpi> cardSelectionRequests,MultiSelectionProcessing multiSelectionProcessing,ChannelControlchannelControl) finalvoid checkStatus ()finalvoid register ()void unregister () abstractList<CardSelectionResponseApi> processCardSelectionRequests (List<CardSelector<?>> cardSelectors, List<CardSelectionRequestSpi> cardSelectionRequests,MultiSelectionProcessing multiSelectionProcessing,ChannelControlchannelControl)abstract CardResponseApiprocessCardRequest (CardRequestSpicardRequest,ChannelControlchannelControl)finalString getName ()CardReaderfinal CardResponseApitransmitCardRequest (CardRequestSpicardRequest,ChannelControlchannelControl)ProxyReaderApiLocalReaderAdapterLocalReaderAdapter (ReaderSpireaderSpi, String pluginName) final ReaderSpigetReaderSpi ()finalboolean isLogicalChannelOpen ()finalvoid closeLogicalAndPhysicalChannelsSilently ()finalvoid activateReaderProtocol (String physicalProtocolName, String logicalProtocolName)finalvoid deactivateReaderProtocol (String physicalProtocolName)finalString getCurrentPhysicalProtocolName ()void unregister ()finalList<CardSelectionResponseApi> processCardSelectionRequests (List<CardSelector<?>> cardSelectors,List<CardSelectionRequestSpi> cardSelectionRequests,MultiSelectionProcessing multiSelectionProcessing,ChannelControlchannelControl)final CardResponseApiprocessCardRequest (CardRequestSpicardRequest,ChannelControlchannelControl)AbstractReaderAdapterfinalboolean isContactless ()boolean isCardPresent ()CardReaderfinalvoid releaseChannel ()ProxyReaderApiRemoteReaderAdapterRemoteReaderAdapter (RemoteReaderSpiremoteReaderSpi, String pluginName,SmartCardselectedSmartCard, int clientCoreApiLevel) final SmartCardgetSelectedSmartCard ()finalint getClientCoreApiLevel ()finalList<CardSelectionResponseApi> processCardSelectionRequests (List<CardSelector<?>> cardSelectors,List<CardSelectionRequestSpi> cardSelectionRequests,MultiSelectionProcessing multiSelectionProcessing,ChannelControlchannelControl)final CardResponseApiprocessCardRequest (CardRequestSpicardRequest,ChannelControlchannelControl)AbstractReaderAdapterfinalboolean isContactless ()finalboolean isCardPresent ()CardReaderfinalvoid releaseChannel ()ProxyReaderApi<<ConfigurableCardReader>>finalLocalConfigurableReaderAdapterLocalConfigurableReaderAdapter (ConfigurableReaderSpiconfigurableReaderSpi,String pluginName)void activateProtocol (String physicalProtocolName, String logicalProtocolName)void deactivateProtocol (String physicalProtocolName)String getCurrentProtocol ()ConfigurableCardReaderfinalCardSelectionScenarioAdapterCardSelectionScenarioAdapter (List<CardSelector<?>> cardSelectors,List<CardSelectionRequestSpi> cardSelectionRequests,MultiSelectionProcessing multiSelectionProcessing,ChannelControlchannelControl) List<CardSelector<?>> getCardSelectors()List<CardSelectionRequestSpi> getCardSelectionRequests ()MultiSelectionProcessing getMultiSelectionProcessing ()ChannelControlgetChannelControl ()<<ObservableCardReader>><<CardInsertionWaiterAsynchronousApi>><<CardRemovalWaiterAsynchronousApi>><<WaitForCardInsertionAutonomousReaderApi>><<WaitForCardRemovalAutonomousReaderApi>>ObservableLocalReaderAdapterObservableLocalReaderAdapter (ObservableReaderSpiobservableReaderSpi, String pluginName) final ObservableReaderSpigetObservableReaderSpi ()final CardReaderObservationExceptionHandlerSpigetObservationExceptionHandler ()final DetectionModegetDetectionMode ()finalMonitoringState getCurrentMonitoringState ()finalboolean isCardPresentPing () final CardReaderEventprocessCardInserted ()finalvoid processCardRemoved ()finalvoid switchState (MonitoringState stateId)finalvoid notifyObservers (CardReaderEventevent) finalvoid scheduleCardSelectionScenario (CardSelectionScenarioAdapter cardSelectionScenario,NotificationModenotificationMode)finalvoid unregister ()AbstractReaderAdapterfinalboolean isCardPresent ()CardReaderfinalvoid setReaderObservationExceptionHandler (CardReaderObservationExceptionHandlerSpiexceptionHandler)finalvoid addObserver (CardReaderObserverSpiobserver)finalvoid removeObserver (CardReaderObserverSpiobserver)finalint countObservers ()finalvoid clearObservers ()finalvoid startCardDetection (DetectionModedetectionMode)finalvoid stopCardDetection ()finalvoid finalizeCardProcessing ()ObservableCardReaderfinalvoid onCardInserted ()WaitForCardInsertionAutonomousReaderApifinalvoid onCardRemoved ()WaitForCardRemovalAutonomousReaderApiInternalEventCARD_INSERTEDCARD_REMOVEDSE_PROCESSEDSTART_DETECTSTOP_DETECTTIME_OUT<<ConfigurableCardReader>>finalObservableLocalConfigurableReaderAdapterObservableLocalConfigurableReaderAdapter (ConfigurableReaderSpiconfigurableReaderSpi,String pluginName)void activateProtocol (String physicalProtocolName, String logicalProtocolName)void deactivateProtocol (String physicalProtocolName)String getCurrentProtocol ()ConfigurableCardReader<<ObservableCardReader>>finalObservableRemoteReaderAdapterObservableRemoteReaderAdapter (ObservableRemoteReaderSpiremoteReaderSpi, String pluginName, int clientCoreApiLevel) void notifyObservers (CardReaderEventevent) void scheduleCardSelectionScenario (CardSelectionScenarioAdapter cardSelectionScenario,NotificationModenotificationMode)void unregister ()AbstractReaderAdaptervoid setReaderObservationExceptionHandler (CardReaderObservationExceptionHandlerSpiexceptionHandler)void addObserver (CardReaderObserverSpiobserver)void removeObserver (CardReaderObserverSpiobserver)int countObservers ()void clearObservers ()void startCardDetection (DetectionModedetectionMode)void stopCardDetection ()void finalizeCardProcessing ()ObservableCardReader«PluginEvent»finalPluginEventAdapterPluginEventAdapter (String pluginName, String readerName, PluginEvent.Type type)PluginEventAdapter (String pluginName, Set<String> readerNames, PluginEvent.Type type)String getPluginName ()SortedSet<String> getReaderNames ()PluginEvent.Type getType ()PluginEvent<<CardReaderEvent>>finalReaderEventAdapterReaderEventAdapter (String pluginName, String readerName,CardReaderEvent.Typetype,ScheduledCardSelectionsResponsescheduledCardSelectionsResponse) String getPluginName ()String getReaderName ()CardReaderEvent.TypegetType ()ScheduledCardSelectionsResponsegetScheduledCardSelectionsResponse ()CardReaderEventfinalObservableReaderStateServiceAdapterObservableReaderStateServiceAdapter (ObservableLocalReaderAdapter reader) void onEvent (InternalEvent event)void switchState (MonitoringState stateId)MonitoringState getCurrentMonitoringState ()void shutdown ()AbstractObservableStateAdapterAbstractObservableStateAdapter (MonitoringState monitoringState, ObservableLocalReaderAdapter reader, AbstractMonitoringJobAdapter monitoringJob, ExecutorService executorService)AbstractObservableStateAdapter (MonitoringState monitoringState, ObservableLocalReaderAdapter reader) finalMonitoringState getMonitoringState ()finalObservableLocalReaderAdapter getReader () finalvoid switchState (MonitoringState stateId) finalvoid onActivate ()finalvoid onDeactivate () abstractvoid onEvent (InternalEvent event)MonitoringStateWAIT_FOR_START_DETECTIONWAIT_FOR_SE_INSERTIONWAIT_FOR_SE_PROCESSINGWAIT_FOR_SE_REMOVALfinalWaitForCardInsertionStateAdapterWaitForCardInsertionStateAdapter (ObservableLocalReaderAdapter reader,AbstractMonitoringJobAdapter monitoringJob,ExecutorService executorService)WaitForCardInsertionStateAdapter (ObservableLocalReaderAdapter reader)void onEvent (InternalEvent event)AbstractObservableStateAdapterfinalWaitForCardProcessingStateAdapterWaitForCardProcessingStateAdapter (ObservableLocalReaderAdapter reader,AbstractMonitoringJobAdapter monitoringJob,ExecutorService executorService)WaitForCardProcessingStateAdapter (ObservableLocalReaderAdapter reader)void onEvent (InternalEvent event)AbstractObservableStateAdapterfinalWaitForCardRemovalStateAdapterWaitForCardRemovalStateAdapter (ObservableLocalReaderAdapter reader,AbstractMonitoringJobAdapter monitoringJob,ExecutorService executorService)WaitForCardRemovalStateAdapter (ObservableLocalReaderAdapter reader)void onEvent (InternalEvent event)AbstractObservableStateAdapterfinalWaitForStartDetectStateAdapterWaitForStartDetectStateAdapter (ObservableLocalReaderAdapter reader,AbstractMonitoringJobAdapter monitoringJob,ExecutorService executorService)WaitForStartDetectStateAdapter (ObservableLocalReaderAdapter reader)void onEvent (InternalEvent event)AbstractObservableStateAdapterAbstractMonitoringJobAdapterAbstractMonitoringJobAdapter (ObservableLocalReaderAdapter reader) finalObservableLocalReaderAdapter getReader () abstractRunnable getMonitoringJob (AbstractObservableStateAdapter monitoringState)abstractvoid stop ()finalCardRemovalActiveMonitoringJobAdapterCardRemovalActiveMonitoringJobAdapter (ObservableLocalReaderAdapter reader,long cycleDurationMillis)Runnable getMonitoringJob (AbstractObservableStateAdapter monitoringState)void stop ()AbstractMonitoringJobAdapterfinalCardInsertionActiveMonitoringJobAdapterCardInsertionActiveMonitoringJobAdapter (ObservableLocalReaderAdapter reader,long cycleDurationMillis,boolean monitorInsertion)Runnable getMonitoringJob (AbstractObservableStateAdapter monitoringState)void stop ()AbstractMonitoringJobAdapterfinalCardInsertionPassiveMonitoringJobAdapterCardInsertionPassiveMonitoringJobAdapter (ObservableLocalReaderAdapter reader)Runnable getMonitoringJob (AbstractObservableStateAdapter monitoringState)void stop ()AbstractMonitoringJobAdapterfinalCardRemovalPassiveMonitoringJobAdapterCardRemovalPassiveMonitoringJobAdapter (ObservableLocalReaderAdapter reader)Runnable getMonitoringJob (AbstractObservableStateAdapter monitoringState)void stop ()AbstractMonitoringJobAdapter<<CardSelectionManager>>finalCardSelectionManagerAdapterCardSelectionManagerAdapter (MultiSelectionProcessing multiSelectionProcessing)void setMultipleSelectionMode ()int prepareSelection (CardSelector<?> cardSelector,CardSelectionExtensioncardSelectionExtension)void prepareReleaseChannel ()String exportCardSelectionScenario ()int importCardSelectionScenario (String cardSelectionScenario)CardSelectionResultprocessCardSelectionScenario (CardReaderreader)void scheduleCardSelectionScenario (ObservableCardReaderobservableCardReader,NotificationModenotificationMode)CardSelectionResultparseScheduledCardSelectionsResponse (ScheduledCardSelectionsResponseAdapter scheduledCardSelectionsResponse)String exportProcessedCardSelectionScenario ()CardSelectionResultimportProcessedCardSelectionScenario (String processedCardSelectionScenario)CardSelectionManager<<ScheduledCardSelectionsResponse>>finalScheduledCardSelectionsResponseAdapterScheduledCardSelectionsResponseAdapter (List<CardSelectionResponseApi> cardSelectionResponses) List<CardSelectionResponseApi> getCardSelectionResponses ()<<CardSelectionResult>>finalCardSelectionResultAdapterCardSelectionResultAdapter () void addSmartCard (int selectionIndex,SmartCardsmartCard)Map<Integer,SmartCard> getSmartCards ()SmartCardgetActiveSmartCard ()int getActiveSelectionIndex ()CardSelectionResult<<CardSelectionResponseApi>>finalCardSelectionResponseAdapterCardSelectionResponseAdapter (byte[] powerOnData,ApduResponseApiselectApplicationResponse,boolean hasMatched,CardResponseApicardResponseApi)String getPowerOnData ()ApduResponseApigetSelectApplicationResponse ()boolean hasMatched ()CardResponseApigetCardResponse ()CardSelectionResponseApi<<CardResponseApi>>finalCardResponseAdapterCardResponseAdapter (List<ApduResponseApi> apduResponses,boolean isLogicalChannelOpen)List<ApduResponseApi> getApduResponses ()boolean isLogicalChannelOpen ()CardResponseApi<<ApduResponseApi>>finalApduResponseAdapterApduResponseAdapter (byte[] bytes)byte[] getApdu ()byte[] getDataOut ()int getStatusWord ()ApduResponseApiprovide0..N0..N11111use1..N110..110..N1usecreatecreateuse0..111..N \ No newline at end of file From 57ff63f4d257100a6c737a125df762aeb822fb58 Mon Sep 17 00:00:00 2001 From: Andrei Cristea Date: Tue, 10 Feb 2026 16:35:27 +0100 Subject: [PATCH 2/3] refactor: normalize logging --- .../core/service/CardInsertionActiveMonitoringJobAdapter.java | 2 +- .../core/service/CardInsertionPassiveMonitoringJobAdapter.java | 2 +- .../core/service/CardRemovalActiveMonitoringJobAdapter.java | 2 +- .../core/service/CardRemovalPassiveMonitoringJobAdapter.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/eclipse/keyple/core/service/CardInsertionActiveMonitoringJobAdapter.java b/src/main/java/org/eclipse/keyple/core/service/CardInsertionActiveMonitoringJobAdapter.java index 3f17ff42..6425b473 100644 --- a/src/main/java/org/eclipse/keyple/core/service/CardInsertionActiveMonitoringJobAdapter.java +++ b/src/main/java/org/eclipse/keyple/core/service/CardInsertionActiveMonitoringJobAdapter.java @@ -31,7 +31,7 @@ final class CardInsertionActiveMonitoringJobAdapter extends AbstractMonitoringJo private static final Logger logger = LoggerFactory.getLogger(CardInsertionActiveMonitoringJobAdapter.class); - private static final String JOB_ID = "InsertionActive"; + private static final String JOB_ID = "INSERTION_ACTIVE"; private final long sleepDurationMillis; private final boolean monitorInsertion; diff --git a/src/main/java/org/eclipse/keyple/core/service/CardInsertionPassiveMonitoringJobAdapter.java b/src/main/java/org/eclipse/keyple/core/service/CardInsertionPassiveMonitoringJobAdapter.java index e85f4e38..9917535d 100644 --- a/src/main/java/org/eclipse/keyple/core/service/CardInsertionPassiveMonitoringJobAdapter.java +++ b/src/main/java/org/eclipse/keyple/core/service/CardInsertionPassiveMonitoringJobAdapter.java @@ -41,7 +41,7 @@ final class CardInsertionPassiveMonitoringJobAdapter extends AbstractMonitoringJ private static final Logger logger = LoggerFactory.getLogger(CardInsertionPassiveMonitoringJobAdapter.class); - private static final String JOB_ID = "InsertionPassive"; + private static final String JOB_ID = "INSERTION_PASSIVE"; private final ObservableReaderSpi readerSpi; diff --git a/src/main/java/org/eclipse/keyple/core/service/CardRemovalActiveMonitoringJobAdapter.java b/src/main/java/org/eclipse/keyple/core/service/CardRemovalActiveMonitoringJobAdapter.java index 8fe7e0be..6dd809b6 100644 --- a/src/main/java/org/eclipse/keyple/core/service/CardRemovalActiveMonitoringJobAdapter.java +++ b/src/main/java/org/eclipse/keyple/core/service/CardRemovalActiveMonitoringJobAdapter.java @@ -39,7 +39,7 @@ final class CardRemovalActiveMonitoringJobAdapter extends AbstractMonitoringJobA private static final Logger logger = LoggerFactory.getLogger(CardRemovalActiveMonitoringJobAdapter.class); - private static final String JOB_ID = "RemovalActive"; + private static final String JOB_ID = "REMOVAL_ACTIVE"; private final AtomicBoolean loop = new AtomicBoolean(); private final long sleepDurationMillis; diff --git a/src/main/java/org/eclipse/keyple/core/service/CardRemovalPassiveMonitoringJobAdapter.java b/src/main/java/org/eclipse/keyple/core/service/CardRemovalPassiveMonitoringJobAdapter.java index 79412b70..90ab4ef3 100644 --- a/src/main/java/org/eclipse/keyple/core/service/CardRemovalPassiveMonitoringJobAdapter.java +++ b/src/main/java/org/eclipse/keyple/core/service/CardRemovalPassiveMonitoringJobAdapter.java @@ -51,7 +51,7 @@ final class CardRemovalPassiveMonitoringJobAdapter extends AbstractMonitoringJob private static final Logger logger = LoggerFactory.getLogger(CardRemovalPassiveMonitoringJobAdapter.class); - private static final String JOB_ID = "RemovalPassive"; + private static final String JOB_ID = "REMOVAL_PASSIVE"; private final ObservableReaderSpi readerSpi; From 190b28fe2f6b95e52818906703894b555bae92df Mon Sep 17 00:00:00 2001 From: Andrei Cristea Date: Tue, 10 Feb 2026 16:46:17 +0100 Subject: [PATCH 3/3] refactor: normalize logging --- .../keyple/core/service/ObservationManagerAdapter.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/eclipse/keyple/core/service/ObservationManagerAdapter.java b/src/main/java/org/eclipse/keyple/core/service/ObservationManagerAdapter.java index af6c0514..5a4fb6e0 100644 --- a/src/main/java/org/eclipse/keyple/core/service/ObservationManagerAdapter.java +++ b/src/main/java/org/eclipse/keyple/core/service/ObservationManagerAdapter.java @@ -47,12 +47,12 @@ final class ObservationManagerAdapter { */ ObservationManagerAdapter(String pluginName, String readerName) { if (readerName == null) { - this.ownerComponent = String.format("[plugin=%s]", pluginName); + ownerComponent = "[plugin=" + pluginName + "]"; } else { - this.ownerComponent = String.format("[reader=%s]", readerName); + ownerComponent = "[reader=" + readerName + "]"; } - this.observers = new LinkedHashSet<>(1); - this.monitor = new Object(); + observers = new LinkedHashSet<>(1); + monitor = new Object(); } /**