@startuml
title
    Calypsonet - calypsonet-terminal-calypso-java-api - 1.1.+ (04/01/2022)
end title

' == THEME ==

'Couleurs issues de : https://htmlcolorcodes.com/fr/tableau-de-couleur/tableau-de-couleur-design-plat/
!define C_GREY1 F8F9F9
!define C_GREY2 F2F3F4
!define C_GREY3 E5E7E9
!define C_GREY4 D7DBDD
!define C_GREY5 CACFD2
!define C_GREY6 BDC3C7
!define C_LINK 3498DB
!define C_USE 27AE60

skinparam Shadowing false
skinparam ClassFontStyle italic
skinparam ClassBorderColor #D4AC0D
skinparam stereotypeABorderColor #A9DCDF
skinparam stereotypeIBorderColor #B4A7E5
skinparam stereotypeCBorderColor #ADD1B2
skinparam stereotypeEBorderColor #EB93DF
' Red
skinparam ClassBackgroundColor<<red>> #FDEDEC
skinparam ClassBorderColor<<red>> #E74C3C
hide <<red>> stereotype
' Purple
skinparam ClassBackgroundColor<<purple>> #F4ECF7
skinparam ClassBorderColor<<purple>> #8E44AD
hide <<purple>> stereotype
' blue
skinparam ClassBackgroundColor<<blue>> #EBF5FB
skinparam ClassBorderColor<<blue>> #3498DB
hide <<blue>> stereotype
' Green
skinparam ClassBackgroundColor<<green>> #E9F7EF
skinparam ClassBorderColor<<green>> #27AE60
hide <<green>> stereotype
' Grey
skinparam ClassBackgroundColor<<grey>> #EAECEE
skinparam ClassBorderColor<<grey>> #2C3E50
hide <<grey>> stereotype

' == CONTENT ==

legend top
    __Colors legend__ :
    * __External public API references__ :
    ** <back:yellow>**calypsonet-terminal-reader-java-api**</back>
end legend

package "org.calypsonet.terminal.calypso" as api {

    +class "**final** CalypsoApiProperties" as ApiProperties {
        +{static} **final** String VERSION
    }
    +enum WriteAccessLevel {
        PERSONALIZATION
        LOAD
        DEBIT
    }
    +enum SelectFileControl {
        FIRST_EF
        NEXT_EF
        CURRENT_DF
    }
    +enum GetDataTag {
        FCP_FOR_CURRENT_FILE
        FCI_FOR_CURRENT_DF
        EF_LIST
        TRACEABILITY_INFORMATION
    }
    package card {
        +interface "<<<back:yellow>CardSelection</back>>>\nCalypsoCardSelection" as CalypsoCardSelection {
            +CalypsoCardSelection filterByCardProtocol (String cardProtocol)

            +CalypsoCardSelection filterByPowerOnData (String powerOnDataRegex)

            +CalypsoCardSelection filterByDfName (byte[] aid)
            +CalypsoCardSelection filterByDfName (String aid)
            +CalypsoCardSelection setFileOccurrence (FileOccurrence fileOccurrence)
            +CalypsoCardSelection setFileControlInformation (FileControlInformation fileControlInformation)
            +<s>CalypsoCardSelection addSuccessfulStatusWord (int statusWord)</s>

            +CalypsoCardSelection acceptInvalidatedCard ()

            +CalypsoCardSelection prepareSelectFile (byte[] lid)
            +CalypsoCardSelection prepareSelectFile (short lid)
            +CalypsoCardSelection prepareSelectFile (SelectFileControl selectControl)

            +CalypsoCardSelection prepareGetData (GetDataTag tag)

            +<s>CalypsoCardSelection prepareReadRecordFile (byte sfi, int recordNumber)</s>
            +CalypsoCardSelection prepareReadRecord (byte sfi, int recordNumber)
            +CalypsoCardSelection prepareReadRecordMultiple (byte sfi, int firstRecordNumber, int nbRecordsToRead, int offset, int nbBytesToRead)
        }
        +enum FileOccurrence {
            FIRST
            LAST
            NEXT
            PREVIOUS
        }
        +enum FileControlInformation {
            FCI
            NO_RESPONSE
        }
        +interface "<<<back:yellow>SmartCard</back>>>\nCalypsoCard" as CalypsoCard {
            +ProductType getProductType ()
            +boolean isHce ()

            +byte[] getDfName ()
            +byte[] getApplicationSerialNumber ()

            +byte[] getStartupInfoRawData ()
            +byte getPlatform ()
            +byte getApplicationType ()
            +byte getApplicationSubtype ()
            +byte getSoftwareIssuer ()
            +byte getSoftwareVersion ()
            +byte getSoftwareRevision ()
            +byte getSessionModification ()

            +byte[] getTraceabilityInformation ()

            +DirectoryHeader getDirectoryHeader ()
            +ElementaryFile getFileBySfi (byte sfi)
            +ElementaryFile getFileByLid (short lid)
            +Map<Byte, ElementaryFile> getAllFiles ()

            +boolean isDfInvalidated ()
            +boolean isDfRatified ()

            +boolean isPkiModeSupported ()
            +boolean isExtendedModeSupported ()
            +boolean isRatificationOnDeselectSupported ()

            +boolean isPinFeatureAvailable ()
            +boolean isPinBlocked ()
            +int getPinAttemptRemaining ()

            +boolean isSvFeatureAvailable ()
            +int getSvBalance ()
            +int getSvLastTNum ()
            +SvLoadLogRecord getSvLoadLogRecord ()
            +SvDebitLogRecord getSvDebitLogLastRecord ()
            +List<SvDebitLogRecord> getSvDebitLogAllRecords ()
        }
        +interface DirectoryHeader {
            +short getLid ()
            +Byte getDfStatus ()

            +byte[] getAccessConditions ()
            +byte[] getKeyIndexes ()

            +byte getKif (WriteAccessLevel writeAccessLevel)
            +byte getKvc (WriteAccessLevel writeAccessLevel)
        }
        +interface ElementaryFile {
            +byte getSfi ()
            +FileHeader getHeader ()
            +FileData getData ()
        }
        +interface FileHeader {
            +short getLid ()
            +byte getDfStatus ()
            +ElementaryFile.Type getEfType ()

            +int getRecordsNumber ()
            +int getRecordSize ()

            +byte[] getAccessConditions ()
            +byte[] getKeyIndexes ()

            +Short getSharedReference ()
        }
        +enum "Type" as FileType {
            LINEAR
            BINARY
            CYCLIC
            COUNTERS
            SIMULATED_COUNTERS
        }
        +interface FileData {
            +byte[] getContent ()
            +byte[] getContent (int numRecord)
            +byte[] getContent (int numRecord, int dataOffset, int dataLength)
            +SortedMap<Integer, byte[]> getAllRecordsContent ()

            +Integer getContentAsCounterValue (int numCounter)
            +SortedMap<Integer, Integer> getAllCountersValue ()
        }
        +enum "ProductType" as CardProductType {
            PRIME_REVISION_1
            PRIME_REVISION_2
            PRIME_REVISION_3
            LIGHT
            BASIC
            UNKNOWN
        }
        +interface SvLoadLogRecord {
            +byte[] getRawData ()

            +byte[] getLoadDate ()
            +byte[] getLoadTime ()

            +int getAmount ()
            +int getBalance ()
            +byte[] getFreeData ()

            +byte getKvc ()
            +byte[] getSamId ()
            +int getSamTNum ()
            +int getSvTNum ()
        }
        +interface SvDebitLogRecord {
            +byte[] getRawData ()

            +byte[] getDebitDate ()
            +byte[] getDebitTime ()

            +int getAmount ()
            +int getBalance ()

            +byte getKvc ()
            +byte[] getSamId ()
            +int getSamTNum ()
            +int getSvTNum ()
        }
    }
    package sam {
        +interface "<<<back:yellow>CardSelection</back>>>\nCalypsoSamSelection" as CalypsoSamSelection {
            +CalypsoSamSelection filterByProductType (CalypsoSam.ProductType productType)
            +CalypsoSamSelection filterBySerialNumber (String serialNumberRegex)

            +CalypsoSamSelection setUnlockData (String unlockData)
        }
        +interface "<<<back:yellow>SmartCard</back>>>\nCalypsoSam" as CalypsoSam {
            +ProductType getProductType ()
            +String getProductInfo ()

            +byte[] getSerialNumber ()
            +byte getPlatform ()
            +byte getApplicationType ()
            +byte getApplicationSubType ()
            +byte getSoftwareIssuer ()
            +byte getSoftwareVersion ()
            +byte getSoftwareRevision ()
        }
        +enum "ProductType" as SamProductType {
            SAM_C1
            SAM_S1E1
            SAM_S1Dx
            CSAM_F
            UNKNOWN
        }
    }
    package transaction {
        +interface CardTransactionManager {
            +<back:yellow>CardReader</back> getCardReader ()
            +CalypsoCard getCalypsoCard ()
            +CardSecuritySetting getCardSecuritySetting ()
            +String getTransactionAuditData ()

            +CardTransactionManager prepareSelectFile (byte[] lid)
            +CardTransactionManager prepareSelectFile (SelectFileControl selectFileControl)

            +CardTransactionManager prepareGetData (GetDataTag tag)

            +<s>CardTransactionManager prepareReadRecordFile (byte sfi, int recordNumber)</s>
            +<s>CardTransactionManager prepareReadRecordFile (byte sfi, int firstRecordNumber, int numberOfRecords, int recordSize)</s>
            +<s>CardTransactionManager prepareReadCounterFile (byte sfi, int countersNumber)</s>
            +CardTransactionManager prepareReadRecord (byte sfi, int recordNumber)
            +CardTransactionManager prepareReadRecord (byte sfi, int firstRecordNumber, int nbRecordsToRead, int recordSize)
            +CardTransactionManager prepareReadRecordMultiple (byte sfi, int firstRecordNumber, int nbRecordsToRead, int offset, int nbBytesToRead)
            +CardTransactionManager prepareReadBinary (byte sfi, int offset, int nbBytesToRead)
            +CardTransactionManager prepareReadCounter (byte sfi, int nbCountersToRead)

            +CardTransactionManager prepareCheckPinStatus ()

            +CardTransactionManager prepareAppendRecord (byte sfi, byte[] recordData)
            +CardTransactionManager prepareUpdateRecord (byte sfi, int recordNumber, byte[] recordData)
            +CardTransactionManager prepareWriteRecord (byte sfi, int recordNumber, byte[] recordData)

            +CardTransactionManager prepareUpdateBinary (byte sfi, int offset, byte[] data)
            +CardTransactionManager prepareWriteBinary (byte sfi, int offset, byte[] data)

            +CardTransactionManager prepareIncreaseCounter (byte sfi, int counterNumber, int incValue)
            +CardTransactionManager prepareDecreaseCounter (byte sfi, int counterNumber, int decValue)
            +CardTransactionManager prepareSetCounter (byte sfi, int counterNumber, int newValue)

            +CardTransactionManager prepareSvGet (SvOperation svOperation, SvAction svAction)
            +CardTransactionManager prepareSvReload (int amount, byte[] date, byte[] time, byte[] free)
            +CardTransactionManager prepareSvReload (int amount)
            +CardTransactionManager prepareSvDebit (int amount, byte[] date, byte[] time)
            +CardTransactionManager prepareSvDebit (int amount)
            +CardTransactionManager prepareSvReadAllLogs ()

            +CardTransactionManager prepareInvalidate ()
            +CardTransactionManager prepareRehabilitate ()

            +CardTransactionManager prepareReleaseCardChannel ()

            +CardTransactionManager processCardCommands ()

            +CardTransactionManager processVerifyPin (byte[] pin)
            +CardTransactionManager processChangePin (byte[] newPin)

            +CardTransactionManager processOpening (WriteAccessLevel writeAccessLevel)
            +CardTransactionManager processClosing ()
            +CardTransactionManager processCancel ()
        }
        +enum SvOperation {
            RELOAD
            DEBIT
        }
        +enum SvAction {
            DO
            UNDO
        }
        +interface CardSecuritySetting {
            +CardSecuritySetting setSamResource (<back:yellow>CardReader</back> samReader, CalypsoSam calypsoSam)

            +CardSecuritySetting enableMultipleSession ()
            +CardSecuritySetting enableRatificationMechanism ()
            +CardSecuritySetting enablePinPlainTransmission ()
            +CardSecuritySetting enableTransactionAudit ()
            +CardSecuritySetting enableSvLoadAndDebitLog ()
            +CardSecuritySetting authorizeSvNegativeBalance ()

            +CardSecuritySetting assignKif (WriteAccessLevel writeAccessLevel, byte kvc, byte kif)
            +CardSecuritySetting assignDefaultKif (WriteAccessLevel writeAccessLevel, byte kif)
            +CardSecuritySetting assignDefaultKvc (WriteAccessLevel writeAccessLevel, byte kvc)

            +CardSecuritySetting addAuthorizedSessionKey (byte kif, byte kvc)
            +CardSecuritySetting addAuthorizedSvKey (byte kif, byte kvc)

            +CardSecuritySetting setPinVerificationCipheringKey (byte kif, byte kvc)
            +CardSecuritySetting setPinModificationCipheringKey (byte kif, byte kvc)
        }
    }
}

' Associations

CalypsoCardSelection +-- FileOccurrence
CalypsoCardSelection ..> FileOccurrence #C_LINK : provide >
CalypsoCardSelection +-- FileControlInformation
CalypsoCardSelection ..> FileControlInformation #C_LINK : provide >

CardTransactionManager ..> WriteAccessLevel #C_USE : use >
CardTransactionManager ..> SvOperation #C_USE : use >
CardTransactionManager ..> SvAction #C_USE : use >
CardTransactionManager .up.> SelectFileControl #C_USE : use >
CardTransactionManager .up.> GetDataTag #C_USE : use >
CardTransactionManager .right.> CalypsoCard #C_LINK : use and provide up to date content >
CardTransactionManager ..> CardSecuritySetting #C_LINK : provide >

CardSecuritySetting ..> WriteAccessLevel #C_USE : use >
CardSecuritySetting ..> CalypsoSam #C_LINK : provide >

CalypsoSamSelection ..> SamProductType #C_USE : use >

CalypsoSam +-- SamProductType
CalypsoSam ..> SamProductType #C_LINK : provide >

CalypsoCardSelection .up.> SelectFileControl #C_USE : use >
CalypsoCardSelection .up.> GetDataTag #C_USE : use >

CalypsoCard ..> DirectoryHeader #C_LINK : provide >
CalypsoCard ..> ElementaryFile #C_LINK : provide >
CalypsoCard +-- CardProductType
CalypsoCard ..> CardProductType #C_LINK : provide >
CalypsoCard ..> SvLoadLogRecord #C_LINK : provide >
CalypsoCard ..> SvDebitLogRecord #C_LINK : provide >

DirectoryHeader ..> WriteAccessLevel #C_USE : use >

ElementaryFile +-- FileType
ElementaryFile ..> FileHeader #C_LINK : provide >
ElementaryFile ..> FileData #C_LINK : provide >

FileHeader .right.> FileType #C_LINK : provide >

' == LAYOUT ==

'ProductType -[hidden]- SamCardResourceServiceBuilder

' == STYLE ==

package api #C_GREY1 {}
package card #C_GREY2 {}
package sam #C_GREY2 {}
package transaction #C_GREY2 {}


@enduml