From a13556c1ec4ad43b3fea130690b5e086c99da411 Mon Sep 17 00:00:00 2001 From: Dimitris Zarras <138439389+dzarras@users.noreply.github.com> Date: Fri, 6 Sep 2024 11:39:09 +0300 Subject: [PATCH] Remove QRGen in favor of zxing (#209) --- build.gradle.kts | 5 +-- gradle/libs.versions.toml | 4 +- .../adapter/out/qr/DefaultGenerateQrCode.kt | 38 ++++++++++--------- 3 files changed, 24 insertions(+), 23 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 2c904e18..cf895109 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -16,9 +16,6 @@ plugins { repositories { mavenCentral() - maven { - url = uri("https://jitpack.io") - } maven { url = uri("https://repo.danubetech.com/repository/maven-public") } @@ -59,7 +56,7 @@ dependencies { implementation(libs.bootstrap) { because("For inclusion in HTML templates") } - implementation(libs.qrgen) { + implementation(libs.zxing) { because("To generate a QR Code for Credentials Offer URI") } implementation(libs.did.common) { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 7b7ce851..80bd6ac0 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -16,7 +16,6 @@ bouncyCastle = "1.78.1" dependencyCheck = "10.0.3" sonarqube = "5.0.0.4638" bootstrap = "5.3.3" -qrgen = "3.0.1" jacoco = "0.8.11" didCommon = "1.13.0" multiformat = "1.1.0" @@ -25,6 +24,7 @@ keycloak = "25.0.1" waltid = "0.3.1" uri-kmp = "0.0.18" authlete-cbor = "1.18" +zxing = "3.5.3" [libraries] kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "coroutines" } @@ -38,7 +38,6 @@ nimbus-oauth2 = { module = "com.nimbusds:oauth2-oidc-sdk", version.ref = "nimbus eudi-sdjwt = { module = "eu.europa.ec.eudi:eudi-lib-jvm-sdjwt-kt", version.ref = "eudiSdJwt" } bouncy-castle = { module = "org.bouncycastle:bcpkix-jdk18on", version.ref = "bouncyCastle" } bootstrap = { module = "org.webjars:bootstrap", version.ref = "bootstrap" } -qrgen = { module = "com.github.kenglxn.QRGen:javase", version.ref = "qrgen" } did-common = { module = "decentralized-identity:did-common-java", version.ref = "didCommon" } multiformat = { module = "org.erwinkok.multiformat:multiformat", version.ref = "multiformat" } result-monad = { module = "org.erwinkok.result:result-monad", version.ref = "resultMonad" } @@ -46,6 +45,7 @@ keycloak-admin-client = { module = "org.keycloak:keycloak-admin-client", version waltid-mdoc-credentials = { module = "id.walt:waltid-mdoc-credentials-jvm", version.ref = "waltid" } uri-kmp = { module = "com.eygraber:uri-kmp", version.ref = "uri-kmp" } authlete-cbor = { module = "com.authlete:cbor", version.ref = "authlete-cbor" } +zxing = { module = "com.google.zxing:javase", version.ref = "zxing" } [plugins] foojay-resolver-convention = { id = "org.gradle.toolchains.foojay-resolver-convention", version.ref = "foojay" } diff --git a/src/main/kotlin/eu/europa/ec/eudi/pidissuer/adapter/out/qr/DefaultGenerateQrCode.kt b/src/main/kotlin/eu/europa/ec/eudi/pidissuer/adapter/out/qr/DefaultGenerateQrCode.kt index a8cb53d0..b61301b9 100644 --- a/src/main/kotlin/eu/europa/ec/eudi/pidissuer/adapter/out/qr/DefaultGenerateQrCode.kt +++ b/src/main/kotlin/eu/europa/ec/eudi/pidissuer/adapter/out/qr/DefaultGenerateQrCode.kt @@ -16,12 +16,16 @@ package eu.europa.ec.eudi.pidissuer.adapter.out.qr import arrow.core.raise.result +import com.google.zxing.BarcodeFormat +import com.google.zxing.EncodeHintType +import com.google.zxing.client.j2se.MatrixToImageConfig +import com.google.zxing.client.j2se.MatrixToImageWriter +import com.google.zxing.qrcode.QRCodeWriter import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel import eu.europa.ec.eudi.pidissuer.port.out.qr.Dimensions import eu.europa.ec.eudi.pidissuer.port.out.qr.Format import eu.europa.ec.eudi.pidissuer.port.out.qr.GenerateQqCode -import net.glxn.qrgen.core.image.ImageType -import net.glxn.qrgen.javase.QRCode +import org.apache.commons.io.output.ByteArrayOutputStream import java.net.URI /** @@ -31,20 +35,20 @@ class DefaultGenerateQrCode : GenerateQqCode { override fun invoke(content: URI, format: Format, dimensions: Dimensions): Result = result { - val imageType = - when (format) { - Format.JPG -> ImageType.JPG - Format.GIF -> ImageType.GIF - Format.PNG -> ImageType.PNG - Format.BMP -> ImageType.BMP - } - - QRCode.from(content.toString()) - .to(imageType) - .withSize(dimensions.width.value.toInt(), dimensions.height.value.toInt()) - .withCharset(Charsets.UTF_8.name()) - .withErrorCorrection(ErrorCorrectionLevel.H) - .stream() - .toByteArray() + val writer = QRCodeWriter() + val matrix = writer.encode( + content.toString(), + BarcodeFormat.QR_CODE, + dimensions.width.value.toInt(), + dimensions.height.value.toInt(), + mapOf( + EncodeHintType.CHARACTER_SET to Charsets.UTF_8.name(), + EncodeHintType.ERROR_CORRECTION to ErrorCorrectionLevel.H, + ), + ) + ByteArrayOutputStream().use { + MatrixToImageWriter.writeToStream(matrix, format.name, it, MatrixToImageConfig()) + it.toByteArray() + } } }