gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[libeufin] branch master updated: restructure JAXB


From: gnunet
Subject: [libeufin] branch master updated: restructure JAXB
Date: Tue, 05 Nov 2019 16:14:50 +0100

This is an automated email from the git hooks/post-receive script.

dold pushed a commit to branch master
in repository libeufin.

The following commit(s) were added to refs/heads/master by this push:
     new f229468  restructure JAXB
f229468 is described below

commit f229468d6edc3511673f04d5f720100ef9ce2e55
Author: Florian Dold <address@hidden>
AuthorDate: Tue Nov 5 16:14:47 2019 +0100

    restructure JAXB
---
 .../src/main/kotlin/tech/libeufin/sandbox/DB.kt    |  29 +-
 .../src/main/kotlin/tech/libeufin/sandbox/Main.kt  |  29 +-
 .../ebics_h004/EbicsKeyManagementResponse.kt       | 102 ++++
 .../libeufin/schema/ebics_h004/EbicsMessages.kt    | 634 ---------------------
 .../libeufin/schema/ebics_h004/EbicsNpkdRequest.kt |  91 +++
 .../libeufin/schema/ebics_h004/EbicsRequest.kt     |  46 ++
 .../libeufin/schema/ebics_h004/EbicsResponse.kt    | 146 +++++
 .../tech/libeufin/schema/ebics_h004/EbicsTypes.kt  | 200 +++++++
 .../schema/ebics_h004/EbicsUnsecuredRequest.kt     |  93 +++
 .../schema/ebics_h004/HIARequestOrderData.kt       |  33 ++
 .../schema/ebics_h004/HPBResponseOrderData.kt      |  21 +
 .../schema/ebics_h004/HTDResponseOrderData.kt      |  33 ++
 sandbox/src/test/kotlin/EbicsMessagesTest.kt       |  18 +-
 13 files changed, 816 insertions(+), 659 deletions(-)

diff --git a/sandbox/src/main/kotlin/tech/libeufin/sandbox/DB.kt 
b/sandbox/src/main/kotlin/tech/libeufin/sandbox/DB.kt
index ad02887..74a2475 100644
--- a/sandbox/src/main/kotlin/tech/libeufin/sandbox/DB.kt
+++ b/sandbox/src/main/kotlin/tech/libeufin/sandbox/DB.kt
@@ -145,7 +145,7 @@ class EbicsHostEntity(id: EntityID<Int>) : IntEntity(id) {
  * Subscribers table.  This table associates users with partners
  * and systems.  Each value can appear multiple times in the same column.
  */
-object EbicsSubscribersTable: IntIdTable() {
+object EbicsSubscribersTable : IntIdTable() {
     val userId = text("userID")
     val partnerId = text("partnerID")
     val systemId = text("systemID").nullable()
@@ -172,6 +172,33 @@ class EbicsSubscriberEntity(id: EntityID<Int>) : 
IntEntity(id) {
 }
 
 
+object EbicsDownloadTransactionsTable : IdTable<String>() {
+    override val id = text("transactionID").entityId()
+    val orderType = text("orderType")
+    val host = reference("host", EbicsHostsTable)
+    val subscriber = reference("subscriber", EbicsSubscribersTable)
+    val encodedResponse = blob("encodedResponse")
+    val orderID = text("orderID")
+    val numSegments = integer("numSegments")
+    val segmentSize = integer("segmentSize")
+    val receiptReceived = bool("receiptReceived")
+}
+
+
+class EbicsDownloadTransactionEntity(id: EntityID<String>) : 
Entity<String>(id) {
+    companion object : EntityClass<String, 
EbicsDownloadTransactionEntity>(EbicsDownloadTransactionsTable)
+
+    var orderType by EbicsDownloadTransactionsTable.orderType
+    var host by EbicsDownloadTransactionsTable.host
+    var subscriber by EbicsDownloadTransactionsTable.host
+    var encodedResponse by EbicsDownloadTransactionsTable.encodedResponse
+    var orderID by EbicsDownloadTransactionsTable.orderID
+    var numSegments by EbicsDownloadTransactionsTable.numSegments
+    var segmentSize by EbicsDownloadTransactionsTable.segmentSize
+    var receiptReceived by EbicsDownloadTransactionsTable.receiptReceived
+}
+
+
 fun dbCreateTables() {
     Database.connect("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1", driver = 
"org.h2.Driver")
 
diff --git a/sandbox/src/main/kotlin/tech/libeufin/sandbox/Main.kt 
b/sandbox/src/main/kotlin/tech/libeufin/sandbox/Main.kt
index 85376ad..102bc58 100644
--- a/sandbox/src/main/kotlin/tech/libeufin/sandbox/Main.kt
+++ b/sandbox/src/main/kotlin/tech/libeufin/sandbox/Main.kt
@@ -53,7 +53,6 @@ import java.security.interfaces.RSAPublicKey
 import java.text.DateFormat
 import javax.sql.rowset.serial.SerialBlob
 import javax.xml.bind.JAXBContext
-import javax.xml.datatype.XMLGregorianCalendar
 
 val logger: Logger = LoggerFactory.getLogger("tech.libeufin.sandbox")
 
@@ -75,32 +74,32 @@ private suspend fun 
ApplicationCall.respondEbicsKeyManagement(
         version = "H004"
         header = EbicsKeyManagementResponse.Header().apply {
             authenticate = true
-            mutable = 
EbicsKeyManagementResponse.Header.KeyManagementResponseMutableHeaderType().apply
 {
+            mutable = EbicsKeyManagementResponse.MutableHeaderType().apply {
                 reportText = errorText
                 returnCode = errorCode
                 if (orderId != null) {
                     this.orderID = orderId
                 }
             }
-            _static = EbicsKeyManagementResponse.Header.EmptyStaticHeader()
+            _static = EbicsKeyManagementResponse.EmptyStaticHeader()
         }
         body = EbicsKeyManagementResponse.Body().apply {
-            this.returnCode = 
EbicsKeyManagementResponse.Body.ReturnCode().apply {
+            this.returnCode = EbicsKeyManagementResponse.ReturnCode().apply {
                 this.authenticate = true
                 this.value = bankReturnCode
             }
             if (dataTransfer != null) {
-                this.dataTransfer = 
EbicsKeyManagementResponse.Body.DataTransfer().apply {
-                    this.dataEncryptionInfo = DataEncryptionInfo().apply {
+                this.dataTransfer = 
EbicsKeyManagementResponse.DataTransfer().apply {
+                    this.dataEncryptionInfo = 
EbicsTypes.DataEncryptionInfo().apply {
                         this.authenticate = true
                         this.transactionKey = 
dataTransfer.encryptedTransactionKey
-                        this.encryptionPubKeyDigest = 
DataEncryptionInfo.EncryptionPubKeyDigest().apply {
+                        this.encryptionPubKeyDigest = 
EbicsTypes.DataEncryptionInfo.EncryptionPubKeyDigest().apply {
                             this.algorithm = 
"http://www.w3.org/2001/04/xmlenc#sha256";
                             this.version = "E002"
                             this.value = dataTransfer.pubKeyDigest
                         }
                     }
-                    this.orderData = 
EbicsResponse.Body.DataTransferResponseType.OrderData().apply {
+                    this.orderData = 
EbicsKeyManagementResponse.OrderData().apply {
                         this.value = dataTransfer.encryptedData
                     }
                 }
@@ -149,7 +148,7 @@ data class EbicsHostInfo(
 
 
 private suspend fun ApplicationCall.handleEbicsHia(header: 
EbicsUnsecuredRequest.Header, orderData: ByteArray) {
-    val keyObject = 
EbicsOrderUtil.decodeOrderDataXml<HIARequestOrderDataType>(orderData)
+    val keyObject = 
EbicsOrderUtil.decodeOrderDataXml<HIARequestOrderData>(orderData)
     val encPubXml = keyObject.encryptionPubKeyInfo.pubKeyValue.rsaKeyValue
     val authPubXml = keyObject.authenticationPubKeyInfo.pubKeyValue.rsaKeyValue
     val encPub = CryptoUtil.loadRsaPublicKeyFromComponents(encPubXml.modulus, 
encPubXml.exponent)
@@ -208,7 +207,7 @@ private suspend fun ApplicationCall.handleEbicsIni(header: 
EbicsUnsecuredRequest
 private suspend fun ApplicationCall.handleEbicsHpb(
     ebicsHostInfo: EbicsHostInfo,
     requestDocument: Document,
-    header: EbicsNoPubKeyDigestsRequest.Header
+    header: EbicsNpkdRequest.Header
 ) {
     val subscriberKeys = transaction {
         val ebicsSubscriber =
@@ -235,18 +234,18 @@ private suspend fun ApplicationCall.handleEbicsHpb(
         throw EbicsKeyManagementError("invalid signature", "90000");
     }
     val hpbRespondeData = HPBResponseOrderData().apply {
-        this.authenticationPubKeyInfo = AuthenticationPubKeyInfoType().apply {
+        this.authenticationPubKeyInfo = 
EbicsTypes.AuthenticationPubKeyInfoType().apply {
             this.authenticationVersion = "X002"
-            this.pubKeyValue = PubKeyValueType().apply {
+            this.pubKeyValue = EbicsTypes.PubKeyValueType().apply {
                 this.rsaKeyValue = RSAKeyValueType().apply {
                     this.exponent = 
ebicsHostInfo.authenticationPublicKey.publicExponent.toByteArray()
                     this.modulus = 
ebicsHostInfo.authenticationPublicKey.modulus.toByteArray()
                 }
             }
         }
-        this.encryptionPubKeyInfo = EncryptionPubKeyInfoType().apply {
+        this.encryptionPubKeyInfo = 
EbicsTypes.EncryptionPubKeyInfoType().apply {
             this.encryptionVersion = "E002"
-            this.pubKeyValue = PubKeyValueType().apply {
+            this.pubKeyValue = EbicsTypes.PubKeyValueType().apply {
                 this.rsaKeyValue = RSAKeyValueType().apply {
                     this.exponent = 
ebicsHostInfo.encryptionPublicKey.publicExponent.toByteArray()
                     this.modulus = 
ebicsHostInfo.encryptionPublicKey.modulus.toByteArray()
@@ -334,7 +333,7 @@ private suspend fun ApplicationCall.ebicsweb() {
             respondText(strResp, ContentType.Application.Xml, 
HttpStatusCode.OK)
         }
         "ebicsNoPubKeyDigestsRequest" -> {
-            val requestObject = 
requestDocument.toObject<EbicsNoPubKeyDigestsRequest>()
+            val requestObject = requestDocument.toObject<EbicsNpkdRequest>()
             val hostInfo = ensureEbicsHost(requestObject.header.static.hostID)
             when (requestObject.header.static.orderDetails.orderType) {
                 "HPB" -> handleEbicsHpb(hostInfo, requestDocument, 
requestObject.header)
diff --git 
a/sandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/EbicsKeyManagementResponse.kt
 
b/sandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/EbicsKeyManagementResponse.kt
new file mode 100644
index 0000000..7d4ec06
--- /dev/null
+++ 
b/sandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/EbicsKeyManagementResponse.kt
@@ -0,0 +1,102 @@
+package tech.libeufin.schema.ebics_h004
+
+import javax.xml.bind.annotation.*
+import javax.xml.bind.annotation.adapters.CollapsedStringAdapter
+import javax.xml.bind.annotation.adapters.NormalizedStringAdapter
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter
+
+
+@XmlAccessorType(XmlAccessType.NONE)
+@XmlType(name = "", propOrder = ["header", "body"])
+@XmlRootElement(name = "ebicsKeyManagementResponse")
+class EbicsKeyManagementResponse {
+    @get:XmlElement(required = true)
+    lateinit var header: Header
+
+    @get:XmlElement(required = true)
+    lateinit var body: Body
+
+    @get:XmlAttribute(name = "Version", required = true)
+    @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class)
+    lateinit var version: String
+
+    @get:XmlAttribute(name = "Revision")
+    var revision: Int? = null
+
+    @XmlAccessorType(XmlAccessType.NONE)
+    @XmlType(name = "", propOrder = ["_static", "mutable"])
+    class Header {
+        @get:XmlElement(name = "static", required = true)
+        lateinit var _static: EmptyStaticHeader
+
+        @get:XmlElement(required = true)
+        lateinit var mutable: MutableHeaderType
+
+        @get:XmlAttribute(name = "authenticate", required = true)
+        var authenticate: Boolean = false
+    }
+
+    @XmlAccessorType(XmlAccessType.NONE)
+    @XmlType(name = "", propOrder = ["orderID", "returnCode", "reportText"])
+    class MutableHeaderType {
+        @get:XmlElement(name = "OrderID")
+        @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class)
+        @get:XmlSchemaType(name = "token")
+        var orderID: String? = null
+
+        @get:XmlElement(name = "ReturnCode", required = true)
+        @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class)
+        @get:XmlSchemaType(name = "token")
+        lateinit var returnCode: String
+
+        @get:XmlElement(name = "ReportText", required = true)
+        @get:XmlJavaTypeAdapter(NormalizedStringAdapter::class)
+        @get:XmlSchemaType(name = "normalizedString")
+        lateinit var reportText: String
+    }
+
+    @XmlAccessorType(XmlAccessType.NONE)
+    @XmlType(name = "")
+    class EmptyStaticHeader
+
+
+    @XmlAccessorType(XmlAccessType.NONE)
+    @XmlType(name = "", propOrder = ["dataTransfer", "returnCode", 
"timestampBankParameter"])
+    class Body {
+        @get:XmlElement(name = "DataTransfer")
+        var dataTransfer: DataTransfer? = null
+
+        @get:XmlElement(name = "ReturnCode", required = true)
+        lateinit var returnCode: ReturnCode
+
+        @get:XmlElement(name = "TimestampBankParameter")
+        var timestampBankParameter: EbicsTypes.TimestampBankParameter? = null
+    }
+
+
+    @XmlAccessorType(XmlAccessType.NONE)
+    class ReturnCode {
+        @get:XmlValue
+        @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class)
+        lateinit var value: String
+
+        @get:XmlAttribute(name = "authenticate", required = true)
+        var authenticate: Boolean = false
+    }
+
+    @XmlAccessorType(XmlAccessType.NONE)
+    @XmlType(name = "", propOrder = ["dataEncryptionInfo", "orderData"])
+    class DataTransfer {
+        @get:XmlElement(name = "DataEncryptionInfo")
+        var dataEncryptionInfo: EbicsTypes.DataEncryptionInfo? = null
+
+        @get:XmlElement(name = "OrderData", required = true)
+        lateinit var orderData: OrderData
+    }
+
+    @XmlAccessorType(XmlAccessType.NONE)
+    class OrderData {
+        @get:XmlValue
+        lateinit var value: ByteArray
+    }
+}
diff --git 
a/sandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/EbicsMessages.kt 
b/sandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/EbicsMessages.kt
deleted file mode 100644
index 964fdc7..0000000
--- a/sandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/EbicsMessages.kt
+++ /dev/null
@@ -1,634 +0,0 @@
-/*
- * This file is part of LibEuFin.
- * Copyright (C) 2019 Stanisci and Dold.
-
- * LibEuFin is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation; either version 3, or
- * (at your option) any later version.
-
- * LibEuFin is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Affero General
- * Public License for more details.
-
- * You should have received a copy of the GNU Affero General Public
- * License along with LibEuFin; see the file COPYING.  If not, see
- * <http://www.gnu.org/licenses/>
- */
-
-package tech.libeufin.schema.ebics_h004
-
-import org.apache.xml.security.binding.xmldsig.RSAKeyValueType
-import org.apache.xml.security.binding.xmldsig.SignatureType
-import org.w3c.dom.Element
-import java.math.BigInteger
-import java.util.*
-import javax.xml.bind.annotation.*
-import javax.xml.bind.annotation.adapters.CollapsedStringAdapter
-import javax.xml.bind.annotation.adapters.HexBinaryAdapter
-import javax.xml.bind.annotation.adapters.NormalizedStringAdapter
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter
-import javax.xml.datatype.XMLGregorianCalendar
-import javax.xml.namespace.QName
-
-@XmlAccessorType(XmlAccessType.NONE)
-@XmlType(name = "Product", propOrder = ["value"])
-class Product {
-    @get:XmlValue
-    @get:XmlJavaTypeAdapter(NormalizedStringAdapter::class)
-    lateinit var value: String
-
-    @get:XmlAttribute(name = "Language", required = true)
-    @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class)
-    lateinit var language: String
-
-    @get:XmlAttribute(name = "InstituteID")
-    @get:XmlJavaTypeAdapter(NormalizedStringAdapter::class)
-    var instituteID: String? = null
-}
-
-
-/**
- * Order details for the static EBICS header.
- */
-@XmlAccessorType(XmlAccessType.NONE)
-@XmlType(name = "OrderDetailsType", propOrder = ["orderType", 
"orderAttribute"])
-class OrderDetails {
-    @get:XmlElement(name = "OrderType", required = true)
-    @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class)
-    lateinit var orderType: String
-
-    @get:XmlElement(name = "OrderAttribute", required = true)
-    @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class)
-    lateinit var orderAttribute: String
-}
-
-
-@XmlAccessorType(XmlAccessType.NONE)
-@XmlType(
-    name = "StaticHeader",
-    propOrder = ["hostID", "nonce", "timestamp", "partnerID", "userID", 
"systemID", "product", "orderDetails", "securityMedium"]
-)
-class StaticHeader {
-    @get:XmlElement(name = "HostID", required = true)
-    @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class)
-    lateinit var hostID: String
-
-    @get:XmlElement(name = "Nonce", type = String::class)
-    @get:XmlJavaTypeAdapter(HexBinaryAdapter::class)
-    @get:XmlSchemaType(name = "hexBinary")
-    var nonce: ByteArray? = null
-
-    @get:XmlElement(name = "Timestamp")
-    @get:XmlSchemaType(name = "dateTime")
-    var timestamp: XMLGregorianCalendar? = null
-
-    @get:XmlElement(name = "PartnerID", required = true)
-    @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class)
-    lateinit var partnerID: String
-
-    @get:XmlElement(name = "UserID", required = true)
-    @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class)
-    lateinit var userID: String
-
-    @get:XmlElement(name = "SystemID")
-    @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class)
-    var systemID: String? = null
-
-    @get:XmlElement(name = "Product")
-    val product: Product? = null
-
-    @get:XmlElement(name = "OrderDetails", required = true)
-    lateinit var orderDetails: OrderDetails
-
-    @get:XmlElement(name = "SecurityMedium", required = true)
-    lateinit var securityMedium: String
-}
-
-
-@XmlAccessorType(XmlAccessType.NONE)
-@XmlType(name = "", propOrder = ["header", "body"])
-@XmlRootElement(name = "ebicsUnsecuredRequest")
-class EbicsUnsecuredRequest {
-    @XmlAccessorType(XmlAccessType.NONE)
-    @XmlType(name = "", propOrder = ["static", "mutable"])
-    class Header {
-        @XmlAccessorType(XmlAccessType.NONE)
-        @XmlType(name = "")
-        class EmptyMutableHeader
-
-        @get:XmlElement(name = "static", required = true)
-        lateinit var static: StaticHeader
-
-        @get:XmlElement(required = true)
-        lateinit var mutable: EmptyMutableHeader
-
-        @get:XmlAttribute(name = "authenticate", required = true)
-        var authenticate: Boolean = false
-    }
-
-    @XmlAccessorType(XmlAccessType.NONE)
-    @XmlType(name = "", propOrder = ["dataTransfer"])
-    class Body {
-        @get:XmlElement(name = "DataTransfer", required = true)
-        lateinit var dataTransfer: UnsecuredDataTransfer
-
-        @XmlAccessorType(XmlAccessType.NONE)
-        @XmlType(name = "", propOrder = ["orderData"])
-        class UnsecuredDataTransfer {
-            @get:XmlElement(name = "OrderData", required = true)
-            lateinit var orderData: OrderData
-
-            @XmlAccessorType(XmlAccessType.NONE)
-            @XmlType(name = "")
-            class OrderData {
-                @get:XmlValue
-                lateinit var value: ByteArray
-
-                @get:XmlAnyAttribute
-                val otherAttributes = HashMap<QName, String>()
-            }
-        }
-    }
-
-    @get:XmlAttribute(name = "Version", required = true)
-    @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class)
-    lateinit var version: String
-
-    @get:XmlAttribute(name = "Revision")
-    var revision: Int? = null
-
-    @get:XmlElement(name = "header", required = true)
-    lateinit var header: Header
-
-    @get:XmlElement(required = true)
-    lateinit var body: Body
-}
-
-@XmlAccessorType(XmlAccessType.NONE)
-class DataEncryptionInfo {
-    @get:XmlAttribute(name = "authenticate", required = true)
-    var authenticate: Boolean = false
-
-    @get:XmlElement(name = "EncryptionPubKeyDigest", required = true)
-    lateinit var encryptionPubKeyDigest: EncryptionPubKeyDigest
-
-    @get:XmlElement(name = "TransactionKey", required = true)
-    lateinit var transactionKey: ByteArray
-
-    @get:XmlAnyElement(lax = true)
-    var any: List<Any>? = null
-
-    @XmlAccessorType(XmlAccessType.NONE)
-    class EncryptionPubKeyDigest {
-        /**
-         * Version of the *digest* of the public key.
-         */
-        @get:XmlAttribute(name = "Version", required = true)
-        @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class)
-        lateinit var version: String
-
-        @XmlAttribute(name = "Algorithm", required = true)
-        @XmlSchemaType(name = "anyURI")
-        lateinit var algorithm: String
-
-        @get:XmlValue
-        lateinit var value: ByteArray
-    }
-}
-
-
-@XmlAccessorType(XmlAccessType.NONE)
-@XmlType(
-    name = "ResponseMutableHeaderType",
-    propOrder = ["transactionPhase", "segmentNumber", "orderID", "returnCode", 
"reportText", "any"]
-)
-class EbicsResponseMutableHeaderType {
-    @get:XmlElement(name = "TransactionPhase", required = true)
-    @get:XmlSchemaType(name = "token")
-    lateinit var transactionPhase: TransactionPhaseType
-
-    @get:XmlElement(name = "SegmentNumber")
-    var segmentNumber: SegmentNumber? = null
-
-    @get:XmlElement(name = "OrderID")
-    @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class)
-    @get:XmlSchemaType(name = "token")
-    var orderID: String? = null
-
-    @get:XmlElement(name = "ReturnCode", required = true)
-    @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class)
-    @get:XmlSchemaType(name = "token")
-    lateinit var returnCode: String
-
-    @get:XmlElement(name = "ReportText", required = true)
-    @get:XmlJavaTypeAdapter(NormalizedStringAdapter::class)
-    @get:XmlSchemaType(name = "normalizedString")
-    lateinit var reportText: String
-
-    @get:XmlAnyElement(lax = true)
-    var any: List<Any>? = null
-
-    @XmlAccessorType(XmlAccessType.NONE)
-    @XmlType(name = "", propOrder = ["value"])
-    class SegmentNumber {
-        @XmlValue
-        lateinit var value: BigInteger
-
-        @XmlAttribute(name = "lastSegment", required = true)
-        var lastSegment: Boolean = false
-    }
-}
-
-@Suppress("UNUSED_PARAMETER")
-enum class TransactionPhaseType(value: String) {
-    @XmlEnumValue("Initialisation")
-    INITIALISATION("Initialisation"),
-
-    /**
-     * Auftragsdatentransfer
-     *
-     */
-    @XmlEnumValue("Transfer")
-    TRANSFER("Transfer"),
-
-    /**
-     * Quittungstransfer
-     *
-     */
-    @XmlEnumValue("Receipt")
-    RECEIPT("Receipt");
-}
-
-@XmlAccessorType(XmlAccessType.NONE)
-@XmlType(name = "ResponseStaticHeaderType", propOrder = ["transactionID", 
"numSegments"])
-class ResponseStaticHeaderType {
-    @get:XmlElement(name = "TransactionID", type = String::class)
-    @get:XmlJavaTypeAdapter(HexBinaryAdapter::class)
-    @get:XmlSchemaType(name = "hexBinary")
-    var transactionID: ByteArray? = null
-
-    @get:XmlElement(name = "NumSegments")
-    @get:XmlSchemaType(name = "positiveInteger")
-    var numSegments: BigInteger? = null
-}
-
-
-@XmlAccessorType(XmlAccessType.NONE)
-@XmlType(name = "")
-class TimestampBankParameter {
-    @get:XmlValue
-    lateinit var value: XMLGregorianCalendar
-
-    @get:XmlAttribute(name = "authenticate", required = true)
-    var authenticate: Boolean = false
-}
-
-
-@XmlAccessorType(XmlAccessType.NONE)
-@XmlType(name = "", propOrder = ["header", "authSignature", "body"])
-@XmlRootElement(name = "ebicsResponse")
-class EbicsResponse {
-    @get:XmlElement(required = true)
-    lateinit var header: EbicsResponse.Header
-
-    @get:XmlElement(name = "AuthSignature", required = true)
-    lateinit var authSignature: SignatureType
-
-    @get:XmlElement(required = true)
-    lateinit var body: Body
-
-    @get:XmlAttribute(name = "Version", required = true)
-    @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class)
-    lateinit var version: String
-
-    @get:XmlAttribute(name = "Revision")
-    var revision: Int? = null
-
-    @get:XmlAnyAttribute
-    var otherAttributes = HashMap<QName, String>()
-
-    @XmlAccessorType(XmlAccessType.NONE)
-    @XmlType(name = "", propOrder = ["_static", "mutable"])
-    class Header {
-        @get:XmlElement(name = "static", required = true)
-        lateinit var _static: ResponseStaticHeaderType
-
-        @get:XmlElement(required = true)
-        lateinit var mutable: EbicsResponseMutableHeaderType
-
-        @get:XmlAttribute(name = "authenticate", required = true)
-        var authenticate: Boolean = false
-    }
-
-    @XmlAccessorType(XmlAccessType.NONE)
-    @XmlType(name = "", propOrder = ["dataTransfer", "returnCode", 
"timestampBankParameter"])
-    class Body {
-        @get:XmlElement(name = "DataTransfer")
-        var dataTransfer: DataTransferResponseType? = null
-
-        @get:XmlElement(name = "ReturnCode", required = true)
-        lateinit var returnCode: ReturnCode
-
-        @get:XmlElement(name = "TimestampBankParameter")
-        var timestampBankParameter: TimestampBankParameter? = null
-
-        @XmlAccessorType(XmlAccessType.NONE)
-        class ReturnCode {
-            @get:XmlValue
-            @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class)
-            lateinit var value: String
-
-            @get:XmlAttribute(name = "authenticate", required = true)
-            var authenticate: Boolean = false
-        }
-
-        @XmlAccessorType(XmlAccessType.NONE)
-        @XmlType(name = "DataTransferResponseType", propOrder = 
["dataEncryptionInfo", "orderData", "any"])
-        class DataTransferResponseType {
-            @get:XmlElement(name = "DataEncryptionInfo")
-            var dataEncryptionInfo: DataEncryptionInfo? = null
-
-            @get:XmlElement(name = "OrderData", required = true)
-            lateinit var orderData: OrderData
-
-            @get:XmlAnyElement(lax = true)
-            var any: List<Any>? = null
-
-            @XmlAccessorType(XmlAccessType.NONE)
-            class OrderData {
-                @get:XmlValue
-                lateinit var value: ByteArray
-
-                @get:XmlAnyAttribute
-                var otherAttributes = HashMap<QName, String>()
-            }
-        }
-    }
-}
-
-
-@XmlType(
-    name = "PubKeyValueType", propOrder = [
-        "rsaKeyValue",
-        "timeStamp"
-    ]
-)
-@XmlAccessorType(XmlAccessType.NONE)
-class PubKeyValueType {
-    @get:XmlElement(name = "RSAKeyValue", namespace = 
"http://www.w3.org/2000/09/xmldsig#";, required = true)
-    lateinit var rsaKeyValue: RSAKeyValueType
-
-    @get:XmlElement(name = "TimeStamp", required = false)
-    @get:XmlSchemaType(name = "dateTime")
-    var timeStamp: XMLGregorianCalendar? = null
-}
-
-
-@XmlAccessorType(XmlAccessType.NONE)
-@XmlType(
-    name = "AuthenticationPubKeyInfoType", propOrder = [
-        "x509Data",
-        "pubKeyValue",
-        "authenticationVersion"
-    ]
-)
-class AuthenticationPubKeyInfoType {
-    @get:XmlAnyElement()
-    var x509Data: Element? = null
-
-    @get:XmlElement(name = "PubKeyValue", required = true)
-    lateinit var pubKeyValue: PubKeyValueType
-
-    @get:XmlElement(name = "AuthenticationVersion", required = true)
-    @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class)
-    @get:XmlSchemaType(name = "token")
-    lateinit var authenticationVersion: String
-}
-
-
-@XmlAccessorType(XmlAccessType.NONE)
-@XmlType(
-    name = "EncryptionPubKeyInfoType", propOrder = [
-        "x509Data",
-        "pubKeyValue",
-        "encryptionVersion"
-    ]
-)
-class EncryptionPubKeyInfoType {
-    @get:XmlAnyElement()
-    var x509Data: Element? = null
-
-    @get:XmlElement(name = "PubKeyValue", required = true)
-    lateinit var pubKeyValue: PubKeyValueType
-
-    @get:XmlElement(name = "EncryptionVersion", required = true)
-    @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class)
-    @get:XmlSchemaType(name = "token")
-    lateinit var encryptionVersion: String
-}
-
-
-@XmlAccessorType(XmlAccessType.NONE)
-@XmlType(
-    name = "HIARequestOrderDataType",
-    propOrder = ["authenticationPubKeyInfo", "encryptionPubKeyInfo", 
"partnerID", "userID", "any"]
-)
-@XmlRootElement(name = "HIARequestOrderData")
-class HIARequestOrderDataType {
-    @get:XmlElement(name = "AuthenticationPubKeyInfo", required = true)
-    lateinit var authenticationPubKeyInfo: AuthenticationPubKeyInfoType
-
-    @get:XmlElement(name = "EncryptionPubKeyInfo", required = true)
-    lateinit var encryptionPubKeyInfo: EncryptionPubKeyInfoType
-
-    @get:XmlElement(name = "PartnerID", required = true)
-    @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class)
-    @get:XmlSchemaType(name = "token")
-    lateinit var partnerID: String
-
-    @get:XmlElement(name = "UserID", required = true)
-    @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class)
-    @get:XmlSchemaType(name = "token")
-    lateinit var userID: String
-
-    @get:XmlAnyElement(lax = true)
-    var any: List<Any>? = null
-}
-
-@XmlAccessorType(XmlAccessType.NONE)
-@XmlType(name = "", propOrder = ["header", "body"])
-@XmlRootElement(name = "ebicsKeyManagementResponse")
-class EbicsKeyManagementResponse {
-    @get:XmlElement(required = true)
-    lateinit var header: Header
-
-    @get:XmlElement(required = true)
-    lateinit var body: Body
-
-    @get:XmlAttribute(name = "Version", required = true)
-    @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class)
-    lateinit var version: String
-
-    @get:XmlAttribute(name = "Revision")
-    var revision: Int? = null
-
-    @XmlAccessorType(XmlAccessType.NONE)
-    @XmlType(name = "", propOrder = ["_static", "mutable"])
-    class Header {
-        @get:XmlElement(name = "static", required = true)
-        lateinit var _static: EmptyStaticHeader
-
-        @get:XmlElement(required = true)
-        lateinit var mutable: KeyManagementResponseMutableHeaderType
-
-        @get:XmlAttribute(name = "authenticate", required = true)
-        var authenticate: Boolean = false
-
-        @XmlAccessorType(XmlAccessType.NONE)
-        @XmlType(name = "")
-        class EmptyStaticHeader
-
-        @XmlAccessorType(XmlAccessType.NONE)
-        @XmlType(name = "", propOrder = ["orderID", "returnCode", 
"reportText"])
-        class KeyManagementResponseMutableHeaderType {
-            @get:XmlElement(name = "OrderID")
-            @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class)
-            @get:XmlSchemaType(name = "token")
-            var orderID: String? = null
-
-            @get:XmlElement(name = "ReturnCode", required = true)
-            @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class)
-            @get:XmlSchemaType(name = "token")
-            lateinit var returnCode: String
-
-            @get:XmlElement(name = "ReportText", required = true)
-            @get:XmlJavaTypeAdapter(NormalizedStringAdapter::class)
-            @get:XmlSchemaType(name = "normalizedString")
-            lateinit var reportText: String
-        }
-    }
-
-    @XmlAccessorType(XmlAccessType.NONE)
-    @XmlType(name = "", propOrder = ["dataTransfer", "returnCode", 
"timestampBankParameter"])
-    class Body {
-        @get:XmlElement(name = "DataTransfer")
-        var dataTransfer: DataTransfer? = null
-
-        @get:XmlElement(name = "ReturnCode", required = true)
-        lateinit var returnCode: ReturnCode
-
-        @get:XmlElement(name = "TimestampBankParameter")
-        var timestampBankParameter: TimestampBankParameter? = null
-
-        @XmlAccessorType(XmlAccessType.NONE)
-        class ReturnCode {
-            @get:XmlValue
-            @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class)
-            lateinit var value: String
-
-            @get:XmlAttribute(name = "authenticate", required = true)
-            var authenticate: Boolean = false
-        }
-
-        @XmlAccessorType(XmlAccessType.NONE)
-        @XmlType(name = "", propOrder = ["dataEncryptionInfo", "orderData"])
-        class DataTransfer {
-            @get:XmlElement(name = "DataEncryptionInfo")
-            var dataEncryptionInfo: DataEncryptionInfo? = null
-
-            @get:XmlElement(name = "OrderData", required = true)
-            lateinit var orderData: 
EbicsResponse.Body.DataTransferResponseType.OrderData
-        }
-    }
-}
-
-
-@XmlAccessorType(XmlAccessType.NONE)
-@XmlType(name = "", propOrder = ["header", "authSignature", "body"])
-@XmlRootElement(name = "ebicsNoPubKeyDigestsRequest")
-class EbicsNoPubKeyDigestsRequest {
-    @get:XmlAttribute(name = "Version", required = true)
-    @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class)
-    lateinit var version: String
-
-    @get:XmlAttribute(name = "Revision")
-    var revision: Int? = null
-
-    @get:XmlElement(name = "header", required = true)
-    lateinit var header: Header
-
-    @get:XmlElement(name = "AuthSignature", required = true)
-    lateinit var authSignature: SignatureType
-
-    @get:XmlElement(required = true)
-    lateinit var body: EmptyBody
-
-    @XmlAccessorType(XmlAccessType.NONE)
-    @XmlType(name = "", propOrder = ["static", "mutable"])
-    class Header {
-        @get:XmlAttribute(name = "authenticate", required = true)
-        var authenticate: Boolean = false
-
-        @get:XmlElement(name = "static", required = true)
-        lateinit var static: StaticHeader
-
-        @get:XmlElement(required = true)
-        lateinit var mutable: EmptyMutableHeader
-
-        @XmlAccessorType(XmlAccessType.NONE)
-        @XmlType(name = "")
-        class EmptyMutableHeader
-    }
-
-    @XmlAccessorType(XmlAccessType.NONE)
-    class EmptyBody
-}
-
-
-@XmlAccessorType(XmlAccessType.NONE)
-@XmlType(name = "", propOrder = ["authenticationPubKeyInfo", 
"encryptionPubKeyInfo", "hostID"])
-@XmlRootElement(name = "HPBResponseOrderData")
-class HPBResponseOrderData {
-    @get:XmlElement(name = "AuthenticationPubKeyInfo", required = true)
-    lateinit var authenticationPubKeyInfo: AuthenticationPubKeyInfoType
-
-    @get:XmlElement(name = "EncryptionPubKeyInfo", required = true)
-    lateinit var encryptionPubKeyInfo: EncryptionPubKeyInfoType
-
-    @get:XmlElement(name = "HostID", required = true)
-    @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class)
-    lateinit var hostID: String
-}
-
-
-@XmlAccessorType(XmlAccessType.NONE)
-@XmlType(name = "", propOrder = ["partnerInfo", "userInfo"])
-@XmlRootElement(name = "HTDResponseOrderData")
-class HTDesponseOrderData {
-    @get:XmlElement(name = "PartnerInfo", required = true)
-    lateinit var partnerInfo: PartnerInfo
-
-    @get:XmlElement(name = "UserInfo", required = true)
-    lateinit var userInfo: UserInfo
-
-    @XmlAccessorType(XmlAccessType.NONE)
-    class PartnerInfo {
-
-    }
-
-    @XmlAccessorType(XmlAccessType.NONE)
-    class UserInfo {
-
-        @get:XmlElement(name = "AddressInfo", required = true)
-        lateinit var addressInfo: AddressInfo
-
-        @get:XmlElement(name = "BankInfo", required = true)
-        lateinit var bankInfo: BankInfo
-
-        class AddressInfo
-        class BankInfo
-
-    }
-}
\ No newline at end of file
diff --git 
a/sandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/EbicsNpkdRequest.kt 
b/sandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/EbicsNpkdRequest.kt
new file mode 100644
index 0000000..e079536
--- /dev/null
+++ 
b/sandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/EbicsNpkdRequest.kt
@@ -0,0 +1,91 @@
+package tech.libeufin.schema.ebics_h004
+
+import org.apache.xml.security.binding.xmldsig.SignatureType
+import javax.xml.bind.annotation.*
+import javax.xml.bind.annotation.adapters.CollapsedStringAdapter
+import javax.xml.bind.annotation.adapters.HexBinaryAdapter
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter
+import javax.xml.datatype.XMLGregorianCalendar
+
+
+@XmlAccessorType(XmlAccessType.NONE)
+@XmlType(name = "", propOrder = ["header", "authSignature", "body"])
+@XmlRootElement(name = "ebicsNoPubKeyDigestsRequest")
+class EbicsNpkdRequest {
+    @get:XmlAttribute(name = "Version", required = true)
+    @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class)
+    lateinit var version: String
+
+    @get:XmlAttribute(name = "Revision")
+    var revision: Int? = null
+
+    @get:XmlElement(name = "header", required = true)
+    lateinit var header: Header
+
+    @get:XmlElement(name = "AuthSignature", required = true)
+    lateinit var authSignature: SignatureType
+
+    @get:XmlElement(required = true)
+    lateinit var body: EmptyBody
+
+    @XmlAccessorType(XmlAccessType.NONE)
+    @XmlType(name = "", propOrder = ["static", "mutable"])
+    class Header {
+        @get:XmlAttribute(name = "authenticate", required = true)
+        var authenticate: Boolean = false
+
+        @get:XmlElement(name = "static", required = true)
+        lateinit var static: StaticHeaderType
+
+        @get:XmlElement(required = true)
+        lateinit var mutable: EmptyMutableHeader
+    }
+
+    @XmlAccessorType(XmlAccessType.NONE)
+    @XmlType(
+        name = "StaticHeader",
+        propOrder = ["hostID", "nonce", "timestamp", "partnerID", "userID", 
"systemID", "product", "orderDetails", "securityMedium"]
+    )
+    class StaticHeaderType {
+        @get:XmlElement(name = "HostID", required = true)
+        @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class)
+        lateinit var hostID: String
+
+        @get:XmlElement(name = "Nonce", type = String::class)
+        @get:XmlJavaTypeAdapter(HexBinaryAdapter::class)
+        @get:XmlSchemaType(name = "hexBinary")
+        lateinit var nonce: ByteArray
+
+        @get:XmlElement(name = "Timestamp")
+        @get:XmlSchemaType(name = "dateTime")
+        var timestamp: XMLGregorianCalendar? = null
+
+        @get:XmlElement(name = "PartnerID", required = true)
+        @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class)
+        lateinit var partnerID: String
+
+        @get:XmlElement(name = "UserID", required = true)
+        @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class)
+        lateinit var userID: String
+
+        @get:XmlElement(name = "SystemID")
+        @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class)
+        var systemID: String? = null
+
+        @get:XmlElement(name = "Product")
+        val product: EbicsTypes.Product? = null
+
+        @get:XmlElement(name = "OrderDetails", required = true)
+        lateinit var orderDetails: EbicsTypes.SimpleOrderDetails
+
+        @get:XmlElement(name = "SecurityMedium", required = true)
+        lateinit var securityMedium: String
+    }
+
+    @XmlAccessorType(XmlAccessType.NONE)
+    @XmlType(name = "")
+    class EmptyMutableHeader
+
+    @XmlAccessorType(XmlAccessType.NONE)
+    class EmptyBody
+}
\ No newline at end of file
diff --git 
a/sandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/EbicsRequest.kt 
b/sandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/EbicsRequest.kt
new file mode 100644
index 0000000..544b7a9
--- /dev/null
+++ b/sandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/EbicsRequest.kt
@@ -0,0 +1,46 @@
+package tech.libeufin.schema.ebics_h004
+
+import org.apache.xml.security.binding.xmldsig.SignatureType
+import javax.xml.bind.annotation.*
+
+@XmlAccessorType(XmlAccessType.NONE)
+@XmlType(name = "", propOrder = ["header", "authSignature", "body"])
+@XmlRootElement(name = "ebicsRequest")
+class EbicsRequest {
+    @get:XmlElement(name = "header", required = true)
+    lateinit var header: Header
+
+    @get:XmlElement(name = "AuthSignature", required = true)
+    lateinit var authSignature: SignatureType
+
+    @get:XmlElement(name = "body")
+    lateinit var body: Body
+
+    @XmlAccessorType(XmlAccessType.NONE)
+    class Body {
+
+    }
+
+    @XmlAccessorType(XmlAccessType.NONE)
+    @XmlType(name = "", propOrder = ["static", "mutable"])
+    class Header {
+        @get:XmlElement(name = "static", required = true)
+        lateinit var static: StaticHeaderType
+
+        @get:XmlElement(required = true)
+        lateinit var mutable: MutableHeader
+
+        @get:XmlAttribute(name = "authenticate", required = true)
+        var authenticate: Boolean = false
+
+    }
+
+    class StaticHeaderType {
+    }
+
+    @XmlAccessorType(XmlAccessType.NONE)
+    @XmlType(name = "")
+    class MutableHeader {
+
+    }
+}
diff --git 
a/sandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/EbicsResponse.kt 
b/sandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/EbicsResponse.kt
new file mode 100644
index 0000000..63e6d9f
--- /dev/null
+++ b/sandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/EbicsResponse.kt
@@ -0,0 +1,146 @@
+package tech.libeufin.schema.ebics_h004
+
+import org.apache.xml.security.binding.xmldsig.SignatureType
+import java.math.BigInteger
+import javax.xml.bind.annotation.*
+import javax.xml.bind.annotation.adapters.CollapsedStringAdapter
+import javax.xml.bind.annotation.adapters.HexBinaryAdapter
+import javax.xml.bind.annotation.adapters.NormalizedStringAdapter
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter
+import javax.xml.namespace.QName
+
+@XmlAccessorType(XmlAccessType.NONE)
+@XmlType(name = "", propOrder = ["header", "authSignature", "body"])
+@XmlRootElement(name = "ebicsResponse")
+class EbicsResponse {
+    @get:XmlElement(required = true)
+    lateinit var header: EbicsResponse.Header
+
+    @get:XmlElement(name = "AuthSignature", required = true)
+    lateinit var authSignature: SignatureType
+
+    @get:XmlElement(required = true)
+    lateinit var body: Body
+
+    @get:XmlAttribute(name = "Version", required = true)
+    @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class)
+    lateinit var version: String
+
+    @get:XmlAttribute(name = "Revision")
+    var revision: Int? = null
+
+    @get:XmlAnyAttribute
+    var otherAttributes = HashMap<QName, String>()
+
+    @XmlAccessorType(XmlAccessType.NONE)
+    @XmlType(name = "", propOrder = ["_static", "mutable"])
+    class Header {
+        @get:XmlElement(name = "static", required = true)
+        lateinit var _static: StaticHeaderType
+
+        @get:XmlElement(required = true)
+        lateinit var mutable: MutableHeaderType
+
+        @get:XmlAttribute(name = "authenticate", required = true)
+        var authenticate: Boolean = false
+    }
+
+    @XmlAccessorType(XmlAccessType.NONE)
+    @XmlType(name = "", propOrder = ["dataTransfer", "returnCode", 
"timestampBankParameter"])
+    class Body {
+        @get:XmlElement(name = "DataTransfer")
+        var dataTransfer: DataTransferResponseType? = null
+
+        @get:XmlElement(name = "ReturnCode", required = true)
+        lateinit var returnCode: ReturnCode
+
+        @get:XmlElement(name = "TimestampBankParameter")
+        var timestampBankParameter: EbicsTypes.TimestampBankParameter? = null
+    }
+
+
+    @XmlAccessorType(XmlAccessType.NONE)
+    @XmlType(
+        name = "ResponseMutableHeaderType",
+        propOrder = ["transactionPhase", "segmentNumber", "orderID", 
"returnCode", "reportText", "any"]
+    )
+    class MutableHeaderType {
+        @get:XmlElement(name = "TransactionPhase", required = true)
+        @get:XmlSchemaType(name = "token")
+        lateinit var transactionPhase: EbicsTypes.TransactionPhaseType
+
+        @get:XmlElement(name = "SegmentNumber")
+        var segmentNumber: SegmentNumber? = null
+
+        @get:XmlElement(name = "OrderID")
+        @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class)
+        @get:XmlSchemaType(name = "token")
+        var orderID: String? = null
+
+        @get:XmlElement(name = "ReturnCode", required = true)
+        @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class)
+        @get:XmlSchemaType(name = "token")
+        lateinit var returnCode: String
+
+        @get:XmlElement(name = "ReportText", required = true)
+        @get:XmlJavaTypeAdapter(NormalizedStringAdapter::class)
+        @get:XmlSchemaType(name = "normalizedString")
+        lateinit var reportText: String
+
+        @get:XmlAnyElement(lax = true)
+        var any: List<Any>? = null
+    }
+
+    @XmlAccessorType(XmlAccessType.NONE)
+    @XmlType(name = "", propOrder = ["value"])
+    class SegmentNumber {
+        @XmlValue
+        lateinit var value: BigInteger
+
+        @XmlAttribute(name = "lastSegment", required = true)
+        var lastSegment: Boolean = false
+    }
+
+    @XmlAccessorType(XmlAccessType.NONE)
+    class OrderData {
+        @get:XmlValue
+        lateinit var value: ByteArray
+    }
+
+    @XmlAccessorType(XmlAccessType.NONE)
+    class ReturnCode {
+        @get:XmlValue
+        @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class)
+        lateinit var value: String
+
+        @get:XmlAttribute(name = "authenticate", required = true)
+        var authenticate: Boolean = false
+    }
+
+    @XmlAccessorType(XmlAccessType.NONE)
+    @XmlType(name = "DataTransferResponseType", propOrder = 
["dataEncryptionInfo", "orderData", "any"])
+    class DataTransferResponseType {
+        @get:XmlElement(name = "DataEncryptionInfo")
+        var dataEncryptionInfo: EbicsTypes.DataEncryptionInfo? = null
+
+        @get:XmlElement(name = "OrderData", required = true)
+        lateinit var orderData: OrderData
+
+        @get:XmlAnyElement(lax = true)
+        var any: List<Any>? = null
+    }
+
+
+    @XmlAccessorType(XmlAccessType.NONE)
+    @XmlType(name = "ResponseStaticHeaderType", propOrder = ["transactionID", 
"numSegments"])
+    class StaticHeaderType {
+        @get:XmlElement(name = "TransactionID", type = String::class)
+        @get:XmlJavaTypeAdapter(HexBinaryAdapter::class)
+        @get:XmlSchemaType(name = "hexBinary")
+        var transactionID: ByteArray? = null
+
+        @get:XmlElement(name = "NumSegments")
+        @get:XmlSchemaType(name = "positiveInteger")
+        var numSegments: BigInteger? = null
+    }
+}
diff --git 
a/sandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/EbicsTypes.kt 
b/sandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/EbicsTypes.kt
new file mode 100644
index 0000000..fa84ce1
--- /dev/null
+++ b/sandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/EbicsTypes.kt
@@ -0,0 +1,200 @@
+/*
+ * This file is part of LibEuFin.
+ * Copyright (C) 2019 Stanisci and Dold.
+
+ * LibEuFin is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation; either version 3, or
+ * (at your option) any later version.
+
+ * LibEuFin is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Affero General
+ * Public License for more details.
+
+ * You should have received a copy of the GNU Affero General Public
+ * License along with LibEuFin; see the file COPYING.  If not, see
+ * <http://www.gnu.org/licenses/>
+ */
+
+package tech.libeufin.schema.ebics_h004
+
+import org.apache.xml.security.binding.xmldsig.RSAKeyValueType
+import org.w3c.dom.Element
+import java.math.BigInteger
+import javax.xml.bind.annotation.*
+import javax.xml.bind.annotation.adapters.CollapsedStringAdapter
+import javax.xml.bind.annotation.adapters.HexBinaryAdapter
+import javax.xml.bind.annotation.adapters.NormalizedStringAdapter
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter
+import javax.xml.datatype.XMLGregorianCalendar
+
+
+/**
+ * EBICS type definitions that are shared between other requests / responses / 
order types.
+ */
+class EbicsTypes private constructor() {
+    /**
+     * EBICS client product.  Identifies the software that accesses the EBICS 
host.
+     */
+    @XmlAccessorType(XmlAccessType.NONE)
+    @XmlType(name = "Product", propOrder = ["value"])
+    class Product {
+        @get:XmlValue
+        @get:XmlJavaTypeAdapter(NormalizedStringAdapter::class)
+        lateinit var value: String
+
+        @get:XmlAttribute(name = "Language", required = true)
+        @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class)
+        lateinit var language: String
+
+        @get:XmlAttribute(name = "InstituteID")
+        @get:XmlJavaTypeAdapter(NormalizedStringAdapter::class)
+        var instituteID: String? = null
+    }
+
+    /**
+     * Order details for the static EBICS header.
+     */
+    @XmlAccessorType(XmlAccessType.NONE)
+    @XmlType(name = "OrderDetailsType", propOrder = ["orderType", 
"orderAttribute"])
+    class SimpleOrderDetails {
+        @get:XmlElement(name = "OrderType", required = true)
+        @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class)
+        lateinit var orderType: String
+
+        @get:XmlElement(name = "OrderAttribute", required = true)
+        @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class)
+        lateinit var orderAttribute: String
+    }
+
+
+
+
+
+    @XmlAccessorType(XmlAccessType.NONE)
+    class DataEncryptionInfo {
+        @get:XmlAttribute(name = "authenticate", required = true)
+        var authenticate: Boolean = false
+
+        @get:XmlElement(name = "EncryptionPubKeyDigest", required = true)
+        lateinit var encryptionPubKeyDigest: EncryptionPubKeyDigest
+
+        @get:XmlElement(name = "TransactionKey", required = true)
+        lateinit var transactionKey: ByteArray
+
+        @get:XmlAnyElement(lax = true)
+        var any: List<Any>? = null
+
+        @XmlAccessorType(XmlAccessType.NONE)
+        class EncryptionPubKeyDigest {
+            /**
+             * Version of the *digest* of the public key.
+             */
+            @get:XmlAttribute(name = "Version", required = true)
+            @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class)
+            lateinit var version: String
+
+            @XmlAttribute(name = "Algorithm", required = true)
+            @XmlSchemaType(name = "anyURI")
+            lateinit var algorithm: String
+
+            @get:XmlValue
+            lateinit var value: ByteArray
+        }
+    }
+
+
+    @Suppress("UNUSED_PARAMETER")
+    enum class TransactionPhaseType(value: String) {
+        @XmlEnumValue("Initialisation")
+        INITIALISATION("Initialisation"),
+
+        /**
+         * Auftragsdatentransfer
+         *
+         */
+        @XmlEnumValue("Transfer")
+        TRANSFER("Transfer"),
+
+        /**
+         * Quittungstransfer
+         *
+         */
+        @XmlEnumValue("Receipt")
+        RECEIPT("Receipt");
+    }
+
+
+    @XmlAccessorType(XmlAccessType.NONE)
+    @XmlType(name = "")
+    class TimestampBankParameter {
+        @get:XmlValue
+        lateinit var value: XMLGregorianCalendar
+
+        @get:XmlAttribute(name = "authenticate", required = true)
+        var authenticate: Boolean = false
+    }
+
+
+
+    @XmlType(
+        name = "PubKeyValueType", propOrder = [
+            "rsaKeyValue",
+            "timeStamp"
+        ]
+    )
+    @XmlAccessorType(XmlAccessType.NONE)
+    class PubKeyValueType {
+        @get:XmlElement(name = "RSAKeyValue", namespace = 
"http://www.w3.org/2000/09/xmldsig#";, required = true)
+        lateinit var rsaKeyValue: RSAKeyValueType
+
+        @get:XmlElement(name = "TimeStamp", required = false)
+        @get:XmlSchemaType(name = "dateTime")
+        var timeStamp: XMLGregorianCalendar? = null
+    }
+
+
+    @XmlAccessorType(XmlAccessType.NONE)
+    @XmlType(
+        name = "AuthenticationPubKeyInfoType", propOrder = [
+            "x509Data",
+            "pubKeyValue",
+            "authenticationVersion"
+        ]
+    )
+    class AuthenticationPubKeyInfoType {
+        @get:XmlAnyElement()
+        var x509Data: Element? = null
+
+        @get:XmlElement(name = "PubKeyValue", required = true)
+        lateinit var pubKeyValue: PubKeyValueType
+
+        @get:XmlElement(name = "AuthenticationVersion", required = true)
+        @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class)
+        @get:XmlSchemaType(name = "token")
+        lateinit var authenticationVersion: String
+    }
+
+
+    @XmlAccessorType(XmlAccessType.NONE)
+    @XmlType(
+        name = "EncryptionPubKeyInfoType", propOrder = [
+            "x509Data",
+            "pubKeyValue",
+            "encryptionVersion"
+        ]
+    )
+    class EncryptionPubKeyInfoType {
+        @get:XmlAnyElement()
+        var x509Data: Element? = null
+
+        @get:XmlElement(name = "PubKeyValue", required = true)
+        lateinit var pubKeyValue: PubKeyValueType
+
+        @get:XmlElement(name = "EncryptionVersion", required = true)
+        @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class)
+        @get:XmlSchemaType(name = "token")
+        lateinit var encryptionVersion: String
+    }
+}
\ No newline at end of file
diff --git 
a/sandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/EbicsUnsecuredRequest.kt
 
b/sandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/EbicsUnsecuredRequest.kt
new file mode 100644
index 0000000..51e991e
--- /dev/null
+++ 
b/sandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/EbicsUnsecuredRequest.kt
@@ -0,0 +1,93 @@
+package tech.libeufin.schema.ebics_h004
+
+import javax.xml.bind.annotation.*
+import javax.xml.bind.annotation.adapters.CollapsedStringAdapter
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter
+
+@XmlAccessorType(XmlAccessType.NONE)
+@XmlType(name = "", propOrder = ["header", "body"])
+@XmlRootElement(name = "ebicsUnsecuredRequest")
+class EbicsUnsecuredRequest {
+    @get:XmlAttribute(name = "Version", required = true)
+    @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class)
+    lateinit var version: String
+
+    @get:XmlAttribute(name = "Revision")
+    var revision: Int? = null
+
+    @get:XmlElement(name = "header", required = true)
+    lateinit var header: Header
+
+    @get:XmlElement(required = true)
+    lateinit var body: Body
+
+    @XmlAccessorType(XmlAccessType.NONE)
+    @XmlType(name = "", propOrder = ["static", "mutable"])
+    class Header {
+        @XmlAccessorType(XmlAccessType.NONE)
+        @XmlType(name = "")
+        class EmptyMutableHeader
+
+        @get:XmlElement(name = "static", required = true)
+        lateinit var static: StaticHeaderType
+
+        @get:XmlElement(required = true)
+        lateinit var mutable: EmptyMutableHeader
+
+        @get:XmlAttribute(name = "authenticate", required = true)
+        var authenticate: Boolean = false
+    }
+
+    @XmlAccessorType(XmlAccessType.NONE)
+    @XmlType(name = "", propOrder = ["dataTransfer"])
+    class Body {
+        @get:XmlElement(name = "DataTransfer", required = true)
+        lateinit var dataTransfer: UnsecuredDataTransfer
+    }
+
+    @XmlAccessorType(XmlAccessType.NONE)
+    @XmlType(name = "", propOrder = ["orderData"])
+    class UnsecuredDataTransfer {
+        @get:XmlElement(name = "OrderData", required = true)
+        lateinit var orderData: OrderData
+    }
+
+    @XmlAccessorType(XmlAccessType.NONE)
+    @XmlType(name = "")
+    class OrderData {
+        @get:XmlValue
+        lateinit var value: ByteArray
+    }
+
+    @XmlAccessorType(XmlAccessType.NONE)
+    @XmlType(
+        name = "",
+        propOrder = ["hostID", "partnerID", "userID", "systemID", "product", 
"orderDetails", "securityMedium"]
+    )
+    class StaticHeaderType {
+        @get:XmlElement(name = "HostID", required = true)
+        @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class)
+        lateinit var hostID: String
+
+        @get:XmlElement(name = "PartnerID", required = true)
+        @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class)
+        lateinit var partnerID: String
+
+        @get:XmlElement(name = "UserID", required = true)
+        @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class)
+        lateinit var userID: String
+
+        @get:XmlElement(name = "SystemID")
+        @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class)
+        var systemID: String? = null
+
+        @get:XmlElement(name = "Product")
+        val product: EbicsTypes.Product? = null
+
+        @get:XmlElement(name = "OrderDetails", required = true)
+        lateinit var orderDetails: EbicsTypes.SimpleOrderDetails
+
+        @get:XmlElement(name = "SecurityMedium", required = true)
+        lateinit var securityMedium: String
+    }
+}
diff --git 
a/sandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/HIARequestOrderData.kt
 
b/sandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/HIARequestOrderData.kt
new file mode 100644
index 0000000..1164825
--- /dev/null
+++ 
b/sandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/HIARequestOrderData.kt
@@ -0,0 +1,33 @@
+package tech.libeufin.schema.ebics_h004
+
+import javax.xml.bind.annotation.*
+import javax.xml.bind.annotation.adapters.CollapsedStringAdapter
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter
+
+
+@XmlAccessorType(XmlAccessType.NONE)
+@XmlType(
+    name = "HIARequestOrderDataType",
+    propOrder = ["authenticationPubKeyInfo", "encryptionPubKeyInfo", 
"partnerID", "userID", "any"]
+)
+@XmlRootElement(name = "HIARequestOrderData")
+class HIARequestOrderData {
+    @get:XmlElement(name = "AuthenticationPubKeyInfo", required = true)
+    lateinit var authenticationPubKeyInfo: 
EbicsTypes.AuthenticationPubKeyInfoType
+
+    @get:XmlElement(name = "EncryptionPubKeyInfo", required = true)
+    lateinit var encryptionPubKeyInfo: EbicsTypes.EncryptionPubKeyInfoType
+
+    @get:XmlElement(name = "PartnerID", required = true)
+    @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class)
+    @get:XmlSchemaType(name = "token")
+    lateinit var partnerID: String
+
+    @get:XmlElement(name = "UserID", required = true)
+    @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class)
+    @get:XmlSchemaType(name = "token")
+    lateinit var userID: String
+
+    @get:XmlAnyElement(lax = true)
+    var any: List<Any>? = null
+}
\ No newline at end of file
diff --git 
a/sandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/HPBResponseOrderData.kt
 
b/sandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/HPBResponseOrderData.kt
new file mode 100644
index 0000000..9efe51b
--- /dev/null
+++ 
b/sandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/HPBResponseOrderData.kt
@@ -0,0 +1,21 @@
+package tech.libeufin.schema.ebics_h004
+
+import javax.xml.bind.annotation.*
+import javax.xml.bind.annotation.adapters.CollapsedStringAdapter
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter
+
+
+@XmlAccessorType(XmlAccessType.NONE)
+@XmlType(name = "", propOrder = ["authenticationPubKeyInfo", 
"encryptionPubKeyInfo", "hostID"])
+@XmlRootElement(name = "HPBResponseOrderData")
+class HPBResponseOrderData {
+    @get:XmlElement(name = "AuthenticationPubKeyInfo", required = true)
+    lateinit var authenticationPubKeyInfo: 
EbicsTypes.AuthenticationPubKeyInfoType
+
+    @get:XmlElement(name = "EncryptionPubKeyInfo", required = true)
+    lateinit var encryptionPubKeyInfo: EbicsTypes.EncryptionPubKeyInfoType
+
+    @get:XmlElement(name = "HostID", required = true)
+    @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class)
+    lateinit var hostID: String
+}
\ No newline at end of file
diff --git 
a/sandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/HTDResponseOrderData.kt
 
b/sandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/HTDResponseOrderData.kt
new file mode 100644
index 0000000..64ea996
--- /dev/null
+++ 
b/sandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/HTDResponseOrderData.kt
@@ -0,0 +1,33 @@
+package tech.libeufin.schema.ebics_h004
+
+import javax.xml.bind.annotation.*
+
+@XmlAccessorType(XmlAccessType.NONE)
+@XmlType(name = "", propOrder = ["partnerInfo", "userInfo"])
+@XmlRootElement(name = "HTDResponseOrderData")
+class HTDResponseOrderData {
+    @get:XmlElement(name = "PartnerInfo", required = true)
+    lateinit var partnerInfo: PartnerInfo
+
+    @get:XmlElement(name = "UserInfo", required = true)
+    lateinit var userInfo: UserInfo
+
+    @XmlAccessorType(XmlAccessType.NONE)
+    class PartnerInfo {
+
+    }
+
+    @XmlAccessorType(XmlAccessType.NONE)
+    class UserInfo {
+
+        @get:XmlElement(name = "AddressInfo", required = true)
+        lateinit var addressInfo: AddressInfo
+
+        @get:XmlElement(name = "BankInfo", required = true)
+        lateinit var bankInfo: BankInfo
+
+        class AddressInfo
+        class BankInfo
+
+    }
+}
diff --git a/sandbox/src/test/kotlin/EbicsMessagesTest.kt 
b/sandbox/src/test/kotlin/EbicsMessagesTest.kt
index 20f7b20..e47f932 100644
--- a/sandbox/src/test/kotlin/EbicsMessagesTest.kt
+++ b/sandbox/src/test/kotlin/EbicsMessagesTest.kt
@@ -73,15 +73,15 @@ class EbicsMessagesTest {
     fun testKeyMgmgResponse() {
         val responseXml = EbicsKeyManagementResponse().apply {
             header = EbicsKeyManagementResponse.Header().apply {
-                mutable = 
EbicsKeyManagementResponse.Header.KeyManagementResponseMutableHeaderType().apply
 {
+                mutable = EbicsKeyManagementResponse.MutableHeaderType().apply 
{
                     reportText = "foo"
                     returnCode = "bar"
                 }
-                _static = EbicsKeyManagementResponse.Header.EmptyStaticHeader()
+                _static = EbicsKeyManagementResponse.EmptyStaticHeader()
             }
             version = "H004"
             body = EbicsKeyManagementResponse.Body().apply {
-                returnCode = 
EbicsKeyManagementResponse.Body.ReturnCode().apply {
+                returnCode = EbicsKeyManagementResponse.ReturnCode().apply {
                     authenticate = true
                     value = "000000"
                 }
@@ -95,7 +95,7 @@ class EbicsMessagesTest {
     fun testParseHiaRequestOrderData() {
         val classLoader = ClassLoader.getSystemClassLoader()
         val hia = 
classLoader.getResource("hia_request_order_data.xml")!!.readText()
-        XMLUtil.convertStringToJaxb<HIARequestOrderDataType>(hia)
+        XMLUtil.convertStringToJaxb<HIARequestOrderData>(hia)
     }
 
     @Test
@@ -148,16 +148,16 @@ class EbicsMessagesTest {
         val response = EbicsResponse().apply {
             version = "H004"
             header = EbicsResponse.Header().apply {
-                _static = ResponseStaticHeaderType()
-                mutable = EbicsResponseMutableHeaderType().apply {
+                _static = EbicsResponse.StaticHeaderType()
+                mutable = EbicsResponse.MutableHeaderType().apply {
                     this.reportText = "foo"
                     this.returnCode = "bar"
-                    this.transactionPhase = TransactionPhaseType.INITIALISATION
+                    this.transactionPhase = 
EbicsTypes.TransactionPhaseType.INITIALISATION
                 }
             }
             authSignature = SignatureType()
             body = EbicsResponse.Body().apply {
-                returnCode = EbicsResponse.Body.ReturnCode().apply {
+                returnCode = EbicsResponse.ReturnCode().apply {
                     authenticate = true
                     value = "asdf"
                 }
@@ -170,6 +170,6 @@ class EbicsMessagesTest {
     fun testLoadHpb() {
         val classLoader = ClassLoader.getSystemClassLoader()
         val text = classLoader.getResource("hpb_request.xml")!!.readText()
-        XMLUtil.convertStringToJaxb<EbicsNoPubKeyDigestsRequest>(text)
+        XMLUtil.convertStringToJaxb<EbicsNpkdRequest>(text)
     }
 }
\ No newline at end of file

-- 
To stop receiving notification emails like this one, please contact
address@hidden.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]