diff --git a/CHANGELOG.md b/CHANGELOG.md index 96b6a4b..47674ab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Changed +- Migrated to `keypop-genericcard-jvm-api` 1.0.0 +### Removed +- Removed deprecated enum `ChannelControl` +- Removed deprecated class `TransactionException` + ## [3.2.1] - 2026-02-20 ### Changed - Normalized logging and error messages using Keyple coding standards. diff --git a/build.gradle.kts b/build.gradle.kts index b33221b..9ce06b6 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -16,6 +16,7 @@ plugins { 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.keypop:keypop-genericcard-jvm-api:1.0.0") implementation("org.eclipse.keyple:keyple-common-java-api:2.0.2") implementation("org.eclipse.keyple:keyple-service-resource-java-lib:3.1.1") implementation("org.eclipse.keyple:keyple-util-java-lib:2.4.1") diff --git a/src/main/java/org/eclipse/keyple/card/generic/CardTransactionManager.java b/src/main/java/org/eclipse/keyple/card/generic/CardTransactionManager.java deleted file mode 100644 index 05a58a3..0000000 --- a/src/main/java/org/eclipse/keyple/card/generic/CardTransactionManager.java +++ /dev/null @@ -1,129 +0,0 @@ -/* ************************************************************************************** - * Copyright (c) 2021 Calypso Networks Association https://calypsonet.org/ - * - * See the NOTICE file(s) distributed with this work for additional information - * regarding copyright ownership. - * - * This program and the accompanying materials are made available under the terms of the - * Eclipse Public License 2.0 which is available at http://www.eclipse.org/legal/epl-2.0 - * - * SPDX-License-Identifier: EPL-2.0 - ************************************************************************************** */ -package org.eclipse.keyple.card.generic; - -import java.util.List; - -/** Provides basic methods to prepare and process APDU exchange with a card. */ -public interface CardTransactionManager - extends org.eclipse.keypop.reader.transaction.spi.CardTransactionManager< - CardTransactionManager> { - - /** - * Prepares an APDU to be transmitted the next time {@link - * #processApdusToByteArrays(ChannelControl)} is invoked. - * - * @param apduCommand A not empty hexadecimal string containing a raw APDU command. - * @return This instance. - * @since 2.0.0 - */ - CardTransactionManager prepareApdu(String apduCommand); - - /** - * Prepares an APDU to be transmitted the next time {@link - * #processApdusToByteArrays(ChannelControl)} is invoked. - * - * @param apduCommand A not empty byte arrays containing raw APDU commands. - * @return This instance. - * @since 2.0.0 - */ - CardTransactionManager prepareApdu(byte[] apduCommand); - - /** - * Prepares an APDU to be transmitted the next time {@link - * #processApdusToByteArrays(ChannelControl)} is invoked. - * - * @param cla The class byte. - * @param ins The instruction byte. - * @param p1 The P1 parameter. - * @param p2 The P2 parameter. - * @param dataIn The APDU data, null if there is no data. - * @param le The expected output length, 0 if the output length is unspecified, null if no output - * data is expected. - * @return This instance. - * @since 2.0.0 - */ - CardTransactionManager prepareApdu(byte cla, byte ins, byte p1, byte p2, byte[] dataIn, Byte le); - - /** - * Transmits all prepared APDUs, closes the physical channel if required, and returns a list of - * responses to the APDUs in the form of list of of byte arrays. - * - *

If the prepared APDU list is empty an empty list is returned. - * - *

The prepared APDU list is cleared after this method has been invoked. - * - * @param channelControl Policy for managing the physical channel after executing commands to the - * card. - * @return A not null reference. - * @throws TransactionException If the communication with the card or the reader has failed. - * @since 2.0.0 - * @deprecated Use {@link #processCommands(org.eclipse.keypop.reader.ChannelControl)} and {@link - * #getResponsesAsByteArrays()} instead. - */ - @Deprecated - List processApdusToByteArrays(ChannelControl channelControl) throws TransactionException; - - /** - * Transmits all prepared APDUs, closes the physical channel if required, and returns a list of - * responses to the APDUs in the form of list of hexadecimal strings. - * - *

If the prepared APDU list is empty an empty list is returned. - * - *

The prepared APDU list is cleared after this method has been invoked. - * - * @param channelControl Policy for managing the physical channel after executing commands to the - * card. - * @return A not null reference. - * @throws TransactionException If the communication with the card or the reader has failed. - * @since 2.0.0 - * @deprecated Use {@link #processCommands(org.eclipse.keypop.reader.ChannelControl)} and {@link - * #getResponsesAsHexStrings()} instead. - */ - @Deprecated - List processApdusToHexStrings(ChannelControl channelControl) throws TransactionException; - - /** - * Returns the list of responses corresponding to the commands executed by the last call to {@link - * #processCommands(org.eclipse.keypop.reader.ChannelControl)}, represented as byte arrays. - * - *

Each element in the returned list represents the response of one command, in the same order - * as the commands were prepared. The returned list is never {@code null}.
- * This method does not alter the internal state of the manager: the list of responses remains - * available for later calls until {@link - * #processCommands(org.eclipse.keypop.reader.ChannelControl)} is invoked again, at which point it - * is replaced by the new set of responses. - * - * @return A not {@code null} list of byte arrays representing the command responses, in the same - * order as the commands were sent. - * @since 3.2.0 - */ - List getResponsesAsByteArrays(); - - /** - * Returns the list of responses corresponding to the commands executed by the last call to {@link - * #processCommands(org.eclipse.keypop.reader.ChannelControl)}, represented as hexadecimal - * strings. - * - *

Each element in the returned list represents the response of one command, in the same order - * as the commands were prepared. The returned list is never {@code null}.
- * This method does not alter the internal state of the manager: the list of responses remains - * available for later calls until {@link - * #processCommands(org.eclipse.keypop.reader.ChannelControl)} is invoked again, at which point it - * is replaced by the new set of responses. - * - * @return A not {@code null} list of hexadecimal strings representing the command responses, in - * the same order as the commands were sent. - * @since 3.2.0 - */ - List getResponsesAsHexStrings(); -} diff --git a/src/main/java/org/eclipse/keyple/card/generic/CardTransactionManagerAdapter.java b/src/main/java/org/eclipse/keyple/card/generic/CardTransactionManagerAdapter.java index adf196a..a8f9d5e 100644 --- a/src/main/java/org/eclipse/keyple/card/generic/CardTransactionManagerAdapter.java +++ b/src/main/java/org/eclipse/keyple/card/generic/CardTransactionManagerAdapter.java @@ -18,6 +18,7 @@ import org.eclipse.keyple.core.util.HexUtil; import org.eclipse.keypop.card.*; import org.eclipse.keypop.card.spi.ApduRequestSpi; +import org.eclipse.keypop.genericcard.CardTransactionManager; import org.eclipse.keypop.reader.CardCommunicationException; import org.eclipse.keypop.reader.CardReader; import org.eclipse.keypop.reader.InvalidCardResponseException; @@ -94,60 +95,6 @@ public CardTransactionManager prepareApdu( return this; } - /** - * {@inheritDoc} - * - * @since 2.0.0 - */ - @Override - @Deprecated - public List processApdusToByteArrays(ChannelControl channelControl) - throws TransactionException { - CardResponseApi cardResponse; - if (apduRequests.isEmpty()) { - return new ArrayList<>(0); - } - try { - cardResponse = - ((ProxyReaderApi) reader) - .transmitCardRequest( - new CardRequestAdapter(apduRequests, false), - channelControl == ChannelControl.CLOSE_AFTER - ? org.eclipse.keypop.card.ChannelControl.CLOSE_AFTER - : org.eclipse.keypop.card.ChannelControl.KEEP_OPEN); - } catch (ReaderBrokenCommunicationException e) { - throw new TransactionException("Reader communication error", e); - } catch (CardBrokenCommunicationException e) { - throw new TransactionException("Card communication error", e); - } catch (UnexpectedStatusWordException e) { - throw new TransactionException("APDU error", e); - } finally { - apduRequests.clear(); - } - List apduResponsesBytes = new ArrayList<>(); - for (ApduResponseApi apduResponse : cardResponse.getApduResponses()) { - apduResponsesBytes.add(apduResponse.getApdu()); - } - return apduResponsesBytes; - } - - /** - * {@inheritDoc} - * - * @since 2.0.0 - */ - @Override - @Deprecated - public List processApdusToHexStrings(ChannelControl channelControl) - throws TransactionException { - List apduResponsesBytes = processApdusToByteArrays(channelControl); - List apduResponsesHex = new ArrayList<>(); - for (byte[] bytes : apduResponsesBytes) { - apduResponsesHex.add(HexUtil.toHex(bytes)); - } - return apduResponsesHex; - } - /** * {@inheritDoc} * diff --git a/src/main/java/org/eclipse/keyple/card/generic/ChannelControl.java b/src/main/java/org/eclipse/keyple/card/generic/ChannelControl.java deleted file mode 100644 index 5f934cd..0000000 --- a/src/main/java/org/eclipse/keyple/card/generic/ChannelControl.java +++ /dev/null @@ -1,38 +0,0 @@ -/* ************************************************************************************** - * Copyright (c) 2023 Calypso Networks Association https://calypsonet.org/ - * - * See the NOTICE file(s) distributed with this work for additional information - * regarding copyright ownership. - * - * This program and the accompanying materials are made available under the terms of the - * Eclipse Public License 2.0 which is available at http://www.eclipse.org/legal/epl-2.0 - * - * SPDX-License-Identifier: EPL-2.0 - ************************************************************************************** */ -package org.eclipse.keyple.card.generic; - -/** - * Policy for managing the physical channel after a card request is executed. - * - * @since 3.0.0 - * @deprecated Will be removed in a future version. - */ -@Deprecated -public enum ChannelControl { - - /** - * Leaves the physical channel open. - * - * @since 3.0.0 - */ - KEEP_OPEN, - - /** - * Terminates communication with the card.
- * The physical channel closes instantly or a card removal sequence is initiated depending on the - * observation mode. - * - * @since 3.0.0 - */ - CLOSE_AFTER -} diff --git a/src/main/java/org/eclipse/keyple/card/generic/GenericCardApiFactoryAdapter.java b/src/main/java/org/eclipse/keyple/card/generic/GenericCardApiFactoryAdapter.java new file mode 100644 index 0000000..a00bb04 --- /dev/null +++ b/src/main/java/org/eclipse/keyple/card/generic/GenericCardApiFactoryAdapter.java @@ -0,0 +1,46 @@ +/* ************************************************************************************** + * Copyright (c) 2026 Calypso Networks Association https://calypsonet.org/ + * + * See the NOTICE file(s) distributed with this work for additional information + * regarding copyright ownership. + * + * This program and the accompanying materials are made available under the terms of the + * Eclipse Public License 2.0 which is available at http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + ************************************************************************************** */ +package org.eclipse.keyple.card.generic; + +import org.eclipse.keypop.genericcard.CardTransactionManager; +import org.eclipse.keypop.genericcard.GenericCardApiFactory; +import org.eclipse.keypop.genericcard.GenericCardSelectionExtension; +import org.eclipse.keypop.reader.CardReader; +import org.eclipse.keypop.reader.selection.spi.SmartCard; + +/** + * Adapter of {@link GenericCardApiFactory}. + * + * @since 4.0.0 + */ +class GenericCardApiFactoryAdapter implements GenericCardApiFactory { + + /** + * {@inheritDoc} + * + * @since 4.0.0 + */ + @Override + public GenericCardSelectionExtension createGenericCardSelectionExtension() { + return new GenericCardSelectionExtensionAdapter(); + } + + /** + * {@inheritDoc} + * + * @since 4.0.0 + */ + @Override + public CardTransactionManager createCardTransaction(CardReader cardReader, SmartCard card) { + return new CardTransactionManagerAdapter(cardReader, card); + } +} diff --git a/src/main/java/org/eclipse/keyple/card/generic/GenericCardResourceProfileExtensionAdapter.java b/src/main/java/org/eclipse/keyple/card/generic/GenericCardResourceProfileExtensionAdapter.java index 09fe4a9..8e8b6b0 100644 --- a/src/main/java/org/eclipse/keyple/card/generic/GenericCardResourceProfileExtensionAdapter.java +++ b/src/main/java/org/eclipse/keyple/card/generic/GenericCardResourceProfileExtensionAdapter.java @@ -13,6 +13,7 @@ import org.eclipse.keyple.core.service.resource.spi.CardResourceProfileExtension; import org.eclipse.keyple.core.util.Assert; +import org.eclipse.keypop.genericcard.GenericCardSelectionExtension; import org.eclipse.keypop.reader.CardReader; import org.eclipse.keypop.reader.ReaderApiFactory; import org.eclipse.keypop.reader.selection.CardSelectionManager; @@ -24,8 +25,8 @@ import org.slf4j.LoggerFactory; /** - * Implementation of {@link CardResourceProfileExtension} that provides the capability to filter - * cards of any type. + * Implementation of {@link CardResourceProfileExtension} that provides the ability to filter cards + * of any type. * * @since 2.0.0 */ diff --git a/src/main/java/org/eclipse/keyple/card/generic/GenericCardSelectionExtension.java b/src/main/java/org/eclipse/keyple/card/generic/GenericCardSelectionExtension.java deleted file mode 100644 index 8aee252..0000000 --- a/src/main/java/org/eclipse/keyple/card/generic/GenericCardSelectionExtension.java +++ /dev/null @@ -1,34 +0,0 @@ -/* ************************************************************************************** - * Copyright (c) 2023 Calypso Networks Association https://calypsonet.org/ - * - * See the NOTICE file(s) distributed with this work for additional information - * regarding copyright ownership. - * - * This program and the accompanying materials are made available under the terms of the - * Eclipse Public License 2.0 which is available at http://www.eclipse.org/legal/epl-2.0 - * - * SPDX-License-Identifier: EPL-2.0 - ************************************************************************************** */ -package org.eclipse.keyple.card.generic; - -import org.eclipse.keypop.reader.selection.spi.CardSelectionExtension; - -/** - * Card specific {@link CardSelectionExtension} providing means to add successful status word. - * - * @since 3.0.0 - */ -public interface GenericCardSelectionExtension extends CardSelectionExtension { - - /** - * Adds a status word to the list of those that should be considered successful for the Select - * Application APDU. - * - *

Note: initially, the list contains the standard successful status word {@code 9000h}. - * - * @param statusWord A positive int ≤ {@code FFFFh}. - * @return The current instance. - * @since 2.0.0 - */ - GenericCardSelectionExtension addSuccessfulStatusWord(int statusWord); -} diff --git a/src/main/java/org/eclipse/keyple/card/generic/GenericCardSelectionExtensionAdapter.java b/src/main/java/org/eclipse/keyple/card/generic/GenericCardSelectionExtensionAdapter.java index b09bcad..97db432 100644 --- a/src/main/java/org/eclipse/keyple/card/generic/GenericCardSelectionExtensionAdapter.java +++ b/src/main/java/org/eclipse/keyple/card/generic/GenericCardSelectionExtensionAdapter.java @@ -15,6 +15,7 @@ import java.util.Set; import org.eclipse.keypop.card.CardSelectionResponseApi; import org.eclipse.keypop.card.spi.*; +import org.eclipse.keypop.genericcard.GenericCardSelectionExtension; /** * Implementation of {@link GenericCardSelectionExtension}. diff --git a/src/main/java/org/eclipse/keyple/card/generic/GenericExtensionService.java b/src/main/java/org/eclipse/keyple/card/generic/GenericExtensionService.java index 613d122..d946a78 100644 --- a/src/main/java/org/eclipse/keyple/card/generic/GenericExtensionService.java +++ b/src/main/java/org/eclipse/keyple/card/generic/GenericExtensionService.java @@ -15,11 +15,10 @@ import org.eclipse.keyple.core.common.KeypleCardExtension; import org.eclipse.keyple.core.service.resource.spi.CardResourceProfileExtension; import org.eclipse.keypop.card.CardApiProperties; -import org.eclipse.keypop.reader.CardReader; +import org.eclipse.keypop.genericcard.GenericCardApiFactory; +import org.eclipse.keypop.genericcard.GenericCardSelectionExtension; import org.eclipse.keypop.reader.ReaderApiProperties; import org.eclipse.keypop.reader.selection.IsoCardSelector; -import org.eclipse.keypop.reader.selection.spi.CardSelectionExtension; -import org.eclipse.keypop.reader.selection.spi.SmartCard; /** * Card extension service providing basic access to APDU exchange functions with a card. @@ -43,25 +42,13 @@ public static GenericExtensionService getInstance() { } /** - * Creates an instance of {@link CardSelectionExtension}. + * Returns an instance of {@link GenericCardApiFactory}. * * @return A not null reference. - * @since 2.0.0 - */ - public GenericCardSelectionExtension createGenericCardSelectionExtension() { - return new GenericCardSelectionExtensionAdapter(); - } - - /** - * Creates an instance of {@link CardTransactionManager}. - * - * @param reader The reader through which the card communicates. - * @param card The initial card data provided by the selection process. - * @return A not null reference. - * @since 2.0.0 + * @since 4.0.0 */ - public CardTransactionManager createCardTransaction(CardReader reader, SmartCard card) { - return new CardTransactionManagerAdapter(reader, card); + public GenericCardApiFactory getGenericCardApiFactory() { + return new GenericCardApiFactoryAdapter(); } /** diff --git a/src/main/java/org/eclipse/keyple/card/generic/TransactionException.java b/src/main/java/org/eclipse/keyple/card/generic/TransactionException.java deleted file mode 100644 index 1a3567b..0000000 --- a/src/main/java/org/eclipse/keyple/card/generic/TransactionException.java +++ /dev/null @@ -1,43 +0,0 @@ -/* ************************************************************************************** - * Copyright (c) 2021 Calypso Networks Association https://calypsonet.org/ - * - * See the NOTICE file(s) distributed with this work for additional information - * regarding copyright ownership. - * - * This program and the accompanying materials are made available under the terms of the - * Eclipse Public License 2.0 which is available at http://www.eclipse.org/legal/epl-2.0 - * - * SPDX-License-Identifier: EPL-2.0 - ************************************************************************************** */ -package org.eclipse.keyple.card.generic; - -/** - * Exception when an error or a communication failure with the card or the reader occurs. - * - * @since 2.0.0 - * @deprecated Will be removed in a future version. - */ -@Deprecated -public class TransactionException extends RuntimeException { - - /** - * Builds a new exception. - * - * @param message Message to identify the exception context. - * @since 2.0.0 - */ - public TransactionException(String message) { - super(message); - } - - /** - * Builds a new exception with the originating exception. - * - * @param message Message to identify the exception context. - * @param cause The cause - * @since 2.0.0 - */ - public TransactionException(String message, Throwable cause) { - super(message, cause); - } -} diff --git a/src/main/javadoc/overview.html b/src/main/javadoc/overview.html index 59c1336..a587145 100644 --- a/src/main/javadoc/overview.html +++ b/src/main/javadoc/overview.html @@ -10,17 +10,9 @@

Overview

- + \ No newline at end of file diff --git a/src/main/uml/api_class_diagram.puml b/src/main/uml/api_class_diagram.puml index 75f79c3..55fc2e4 100644 --- a/src/main/uml/api_class_diagram.puml +++ b/src/main/uml/api_class_diagram.puml @@ -1,6 +1,6 @@ @startuml title - Keyple - keyple-card-generic-java-lib - 3.2.+ (2025-11-10) + Keyple - keyple-card-generic-java-lib - 4.0+ (2026-03-11) end title ' == THEME == @@ -58,6 +58,7 @@ legend top ** **keypop-reader-java-api** ** **keyple-common-java-api** ** **keyple-service-resource-java-lib** + ** **keypop-genericcard-jvm-api** end legend package "org.eclipse.keyple.card.generic" as generic { @@ -65,49 +66,20 @@ package "org.eclipse.keyple.card.generic" as generic { -- +{static} GenericExtensionService getInstance () - +GenericCardSelectionExtension createGenericCardSelectionExtension () - +CardResourceProfileExtension createCardResourceProfileExtension (IsoCardSelector cardSelector, GenericCardSelectionExtension genericCardSelectionExtension) - +CardTransactionManager createCardTransaction (CardReader cardReader, SmartCard card) + +GenericCardApiFactory getGenericCardApiFactory() + +CardResourceProfileExtension createCardResourceProfileExtension (IsoCardSelector cardSelector, GenericCardSelectionExtension genericCardSelectionExtension) -- **KeypleCardExtension** -- +String getCommonApiVersion () +String getReaderApiVersion () +String getCardApiVersion () } - +interface "<<CardSelectionExtension>>\nGenericCardSelectionExtension" as GenericCardSelectionExtension { - +GenericCardSelectionExtension addSuccessfulStatusWord (int statusWord) - } - +interface "<<CardTransactionManager>>\nCardTransactionManager" as CardTransactionManager { - +CardTransactionManager prepareApdu (String apduCommand) - +CardTransactionManager prepareApdu (byte[] apduCommand) - +CardTransactionManager prepareApdu (byte cla, byte ins, byte p1, byte p2, byte[] dataIn, Byte le) - - +List processApdusToByteArrays (ChannelControl channelControl) throws TransactionException - +List processApdusToHexStrings (ChannelControl channelControl) throws TransactionException - - +List getResponsesAsByteArrays () - +List getResponsesAsHexStrings () - } - +enum "ChannelControl" as ChannelControl <> { - KEEP_OPEN - CLOSE_AFTER - } - +class "<>\n**final** TransactionException" as TransactionException <> { - +TransactionException (String message) - +TransactionException (String message, Throwable cause) - } } ' Associations ' == LAYOUT == -GenericExtensionService ..> GenericCardSelectionExtension #C_LINK : create > -GenericExtensionService ..> CardTransactionManager #C_LINK : create > - -CardTransactionManager ..> ChannelControl #C_USE : use > -CardTransactionManager ..> TransactionException #C_THROW : throw > - ' == STYLE == package generic #C_GREY1 {} diff --git a/src/main/uml/api_class_diagram.svg b/src/main/uml/api_class_diagram.svg index e61adbd..e6aeb1f 100644 --- a/src/main/uml/api_class_diagram.svg +++ b/src/main/uml/api_class_diagram.svg @@ -1 +1 @@ -Keyple - keyple-card-generic-java-lib - 3.2.+ (2025-11-10)Keyple - keyple-card-generic-java-lib - 3.2.+ (2025-11-10)Colors legend:External API references:keypop-reader-java-apikeyple-common-java-apikeyple-service-resource-java-liborg.eclipse.keyple.card.generic<<KeypleCardExtension>>finalGenericExtensionServiceGenericExtensionService getInstance () GenericCardSelectionExtension createGenericCardSelectionExtension ()CardResourceProfileExtensioncreateCardResourceProfileExtension (IsoCardSelector cardSelector, GenericCardSelectionExtension genericCardSelectionExtension)CardTransactionManager createCardTransaction (CardReadercardReader,SmartCardcard) String getCommonApiVersion ()String getReaderApiVersion ()String getCardApiVersion ()KeypleCardExtension<<CardSelectionExtension>>GenericCardSelectionExtensionGenericCardSelectionExtension addSuccessfulStatusWord (int statusWord)<<CardTransactionManager>>CardTransactionManagerCardTransactionManager prepareApdu (String apduCommand)CardTransactionManager prepareApdu (byte[] apduCommand)CardTransactionManager prepareApdu (byte cla, byte ins, byte p1, byte p2, byte[] dataIn, Byte le) List<byte[]> processApdusToByteArrays (ChannelControl channelControl) throws TransactionExceptionList<String> processApdusToHexStrings (ChannelControl channelControl) throws TransactionException List<byte[]> getResponsesAsByteArrays ()List<String> getResponsesAsHexStrings ()ChannelControlKEEP_OPENCLOSE_AFTER«RuntimeException»finalTransactionExceptionTransactionException (String message)TransactionException (String message, Throwable cause)createcreateusethrow \ No newline at end of file +Keyple - keyple-card-generic-java-lib - 4.0+ (2026-03-11)Keyple - keyple-card-generic-java-lib - 4.0+ (2026-03-11)Colors legend:External API references:keypop-reader-java-apikeyple-common-java-apikeyple-service-resource-java-libkeypop-genericcard-jvm-apiorg.eclipse.keyple.card.generic<<KeypleCardExtension>>finalGenericExtensionServiceGenericExtensionService getInstance () GenericCardApiFactorygetGenericCardApiFactory()CardResourceProfileExtensioncreateCardResourceProfileExtension (IsoCardSelectorcardSelector,GenericCardSelectionExtensiongenericCardSelectionExtension) String getCommonApiVersion ()String getReaderApiVersion ()String getCardApiVersion ()KeypleCardExtension \ No newline at end of file