From c62956616c196740b0bac52c281e436b570a8ba0 Mon Sep 17 00:00:00 2001 From: Karolina Bogacka Date: Thu, 20 Mar 2025 14:51:03 +0100 Subject: [PATCH 01/12] Add base functionality and tests --- .../neverblink/jelly/cli/JellyCommand.scala | 6 ++- .../jelly/cli/command/rdf/RdfFromJelly.scala | 38 ++++++++++++++---- .../command/rdf/RdfFromJelly.scala.semanticdb | Bin 0 -> 46792 bytes .../jelly/cli/command/RdfFromJellySpec.scala | 19 ++++++++- ...AfterTest.scala => CleanUpAfterTest.scala} | 3 +- .../cli/command/helpers/DataGenHelper.scala | 35 ++++++++++++++-- 6 files changed, 87 insertions(+), 14 deletions(-) create mode 100644 src/main/scala/eu/neverblink/jelly/cli/command/rdf/RdfFromJelly.scala.semanticdb rename src/test/scala/eu/neverblink/jelly/cli/command/helpers/{CleanUpFilesAfterTest.scala => CleanUpAfterTest.scala} (72%) diff --git a/src/main/scala/eu/neverblink/jelly/cli/JellyCommand.scala b/src/main/scala/eu/neverblink/jelly/cli/JellyCommand.scala index 9bb527e..de0e072 100644 --- a/src/main/scala/eu/neverblink/jelly/cli/JellyCommand.scala +++ b/src/main/scala/eu/neverblink/jelly/cli/JellyCommand.scala @@ -3,7 +3,7 @@ package eu.neverblink.jelly.cli import caseapp.* import eu.neverblink.jelly.cli.JellyCommand.emptyRemainingArgs -import java.io.{ByteArrayOutputStream, PrintStream} +import java.io.{ByteArrayOutputStream, OutputStream, PrintStream} import scala.compiletime.uninitialized object JellyCommand: @@ -39,6 +39,10 @@ abstract class JellyCommand[T: {Parser, Help}] extends Command[T]: s else throw new IllegalStateException("Not in test mode") + def getOutputStream: OutputStream = + if isTest then osOut + else System.out + def getErr: String = if isTest then err.flush() diff --git a/src/main/scala/eu/neverblink/jelly/cli/command/rdf/RdfFromJelly.scala b/src/main/scala/eu/neverblink/jelly/cli/command/rdf/RdfFromJelly.scala index 31af120..db54991 100644 --- a/src/main/scala/eu/neverblink/jelly/cli/command/rdf/RdfFromJelly.scala +++ b/src/main/scala/eu/neverblink/jelly/cli/command/rdf/RdfFromJelly.scala @@ -1,16 +1,40 @@ package eu.neverblink.jelly.cli.command.rdf import caseapp.* import eu.neverblink.jelly.cli.JellyCommand +import eu.ostrzyciel.jelly.convert.jena.riot.JellyLanguage +import org.apache.jena.riot.system.StreamRDFWriter +import org.apache.jena.riot.{RDFLanguages, RDFParser} -case class FromJellyRdfOptions() +import java.io.{ByteArrayInputStream, ByteArrayOutputStream, File, FileInputStream, InputStream} + +case class RdfFromJellyOptions( + @ExtraName("input-file") inputFile: Option[String], +) + +object RdfFromJelly extends JellyCommand[RdfFromJellyOptions]: + override def group = "rdf" -object RdfFromJelly extends JellyCommand[FromJellyRdfOptions]: override def names: List[List[String]] = List( List("rdf", "from-jelly"), ) - override def run(options: FromJellyRdfOptions, remainingArgs: RemainingArgs): Unit = - // This is a placeholder for the actual implementation - println("rdf from-jelly") - println(options) - println(remainingArgs) + override def run(options: RdfFromJellyOptions, remainingArgs: RemainingArgs): Unit = + val inputStream = options.inputFile match { + case Some(fileName: String) => + FileInputStream(File(fileName)) + case None => System.in + } + rewriteFormats(inputStream) + + /* + This method reads the Jelly file, rewrite it to NQuads and writes it to the output stream + * @param inputStream InputStream + */ + private def rewriteFormats(inputStream: InputStream): Unit = + // TODO: Add error handling; return success/failure in the future + val interStream = new ByteArrayOutputStream() + val interWriter = StreamRDFWriter.getWriterStream(interStream, RDFLanguages.NQUADS) + RDFParser.source(inputStream).lang(JellyLanguage.JELLY).parse(interWriter) + val readerStream = new ByteArrayInputStream(interStream.toByteArray) + val nQuadWriter = StreamRDFWriter.getWriterStream(getOutputStream, RDFLanguages.NQUADS) + RDFParser.source(readerStream).lang(RDFLanguages.NQUADS).parse(nQuadWriter) diff --git a/src/main/scala/eu/neverblink/jelly/cli/command/rdf/RdfFromJelly.scala.semanticdb b/src/main/scala/eu/neverblink/jelly/cli/command/rdf/RdfFromJelly.scala.semanticdb new file mode 100644 index 0000000000000000000000000000000000000000..388b3124811028edaf51a99f835e441083e6ad3c GIT binary patch literal 46792 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 override def afterEach(): Unit = { DataGenHelper.cleanUpFile() + DataGenHelper.resetInputStream() } } diff --git a/src/test/scala/eu/neverblink/jelly/cli/command/helpers/DataGenHelper.scala b/src/test/scala/eu/neverblink/jelly/cli/command/helpers/DataGenHelper.scala index d81cf91..9509bed 100644 --- a/src/test/scala/eu/neverblink/jelly/cli/command/helpers/DataGenHelper.scala +++ b/src/test/scala/eu/neverblink/jelly/cli/command/helpers/DataGenHelper.scala @@ -2,9 +2,9 @@ package eu.neverblink.jelly.cli.command.helpers import eu.ostrzyciel.jelly.convert.jena.riot.JellyLanguage import org.apache.jena.rdf.model.{Model, ModelFactory, ResourceFactory} -import org.apache.jena.riot.RDFDataMgr +import org.apache.jena.riot.{RDFDataMgr, RDFLanguages} -import java.io.FileOutputStream +import java.io.{ByteArrayInputStream, ByteArrayOutputStream, FileOutputStream} import java.nio.file.{Files, Paths} import scala.util.Using @@ -14,6 +14,7 @@ import scala.util.Using object DataGenHelper: private val testFile = "testInput.jelly" + private val inputStream = System.in /* * This method generates a triple model with nTriples @@ -37,14 +38,40 @@ object DataGenHelper: /* This method generates a Jelly file with nTriples * @param nTriples number of triples to generate * @param fileName name of the file to generate + * @return String */ - def generateJellyFile(nTriples: Int): Unit = + def generateJellyFile(nTriples: Int): String = val model = generateTripleModel(nTriples) // TODO: Add configurable generation for different variants of Jelly (small strict etc) Using.resource(FileOutputStream(testFile)) { file => RDFDataMgr.write(file, model, JellyLanguage.JELLY) } + testFile + + /* + * This method generates a Jelly byte input stream with nTriples + * @param nTriples number of triples to generate + * @return String + */ + def generateJellyInputStream(nTriples: Int): ByteArrayInputStream = + val model = generateTripleModel(nTriples) + val outputStream = new ByteArrayOutputStream() + RDFDataMgr.write(outputStream, model, JellyLanguage.JELLY) + new ByteArrayInputStream(outputStream.toByteArray) + + /* + * This method generates a NQuad string with nTriples + * @param nTriples number of triples to generate + * @return String + */ + def generateNQuadString(nTriples: Int): String = + val model = generateTripleModel(nTriples) + val outputStream = new ByteArrayOutputStream() + RDFDataMgr.write(outputStream, model, RDFLanguages.NQUADS) + outputStream.toString - /* This method cleans up the file after the test*/ def cleanUpFile(): Unit = Files.deleteIfExists(Paths.get(testFile)) + + def resetInputStream(): Unit = + System.setIn(inputStream) From dd60627c3a89ddcf2add3a84a72172388480ee7d Mon Sep 17 00:00:00 2001 From: Karolina Bogacka Date: Thu, 20 Mar 2025 16:11:37 +0100 Subject: [PATCH 02/12] Simplify cod --- .../neverblink/jelly/cli/JellyCommand.scala | 2 +- .../jelly/cli/command/rdf/RdfFromJelly.scala | 25 +++++++----- .../command/rdf/RdfFromJelly.scala.semanticdb | Bin 46792 -> 49539 bytes .../jelly/cli/command/RdfFromJellySpec.scala | 38 ++++++++++++++++-- .../command/helpers/CleanUpAfterTest.scala | 2 +- .../cli/command/helpers/DataGenHelper.scala | 16 +++++++- .../helpers/DataGenHelper.scala.semanticdb | Bin 0 -> 46703 bytes 7 files changed, 64 insertions(+), 19 deletions(-) create mode 100644 src/test/scala/eu/neverblink/jelly/cli/command/helpers/DataGenHelper.scala.semanticdb diff --git a/src/main/scala/eu/neverblink/jelly/cli/JellyCommand.scala b/src/main/scala/eu/neverblink/jelly/cli/JellyCommand.scala index de0e072..69d3e32 100644 --- a/src/main/scala/eu/neverblink/jelly/cli/JellyCommand.scala +++ b/src/main/scala/eu/neverblink/jelly/cli/JellyCommand.scala @@ -39,7 +39,7 @@ abstract class JellyCommand[T: {Parser, Help}] extends Command[T]: s else throw new IllegalStateException("Not in test mode") - def getOutputStream: OutputStream = + protected def getStdOut: OutputStream = if isTest then osOut else System.out diff --git a/src/main/scala/eu/neverblink/jelly/cli/command/rdf/RdfFromJelly.scala b/src/main/scala/eu/neverblink/jelly/cli/command/rdf/RdfFromJelly.scala index db54991..810549e 100644 --- a/src/main/scala/eu/neverblink/jelly/cli/command/rdf/RdfFromJelly.scala +++ b/src/main/scala/eu/neverblink/jelly/cli/command/rdf/RdfFromJelly.scala @@ -5,10 +5,11 @@ import eu.ostrzyciel.jelly.convert.jena.riot.JellyLanguage import org.apache.jena.riot.system.StreamRDFWriter import org.apache.jena.riot.{RDFLanguages, RDFParser} -import java.io.{ByteArrayInputStream, ByteArrayOutputStream, File, FileInputStream, InputStream} +import java.io.{File, FileInputStream, FileOutputStream, InputStream, OutputStream} case class RdfFromJellyOptions( - @ExtraName("input-file") inputFile: Option[String], + @ExtraName("") inputFile: Option[String], + @ExtraName("to") outputFile: Option[String], ) object RdfFromJelly extends JellyCommand[RdfFromJellyOptions]: @@ -24,17 +25,19 @@ object RdfFromJelly extends JellyCommand[RdfFromJellyOptions]: FileInputStream(File(fileName)) case None => System.in } - rewriteFormats(inputStream) + val outputStream = options.outputFile match { + case Some(fileName: String) => + FileOutputStream(fileName) + case None => getStdOut + } + doConversion(inputStream, outputStream) /* - This method reads the Jelly file, rewrite it to NQuads and writes it to the output stream + This method reads the Jelly file, rewrite it to NQuads and writes it to some output stream * @param inputStream InputStream + * @param outputStream OutputStream */ - private def rewriteFormats(inputStream: InputStream): Unit = + private def doConversion(inputStream: InputStream, outputStream: OutputStream): Unit = // TODO: Add error handling; return success/failure in the future - val interStream = new ByteArrayOutputStream() - val interWriter = StreamRDFWriter.getWriterStream(interStream, RDFLanguages.NQUADS) - RDFParser.source(inputStream).lang(JellyLanguage.JELLY).parse(interWriter) - val readerStream = new ByteArrayInputStream(interStream.toByteArray) - val nQuadWriter = StreamRDFWriter.getWriterStream(getOutputStream, RDFLanguages.NQUADS) - RDFParser.source(readerStream).lang(RDFLanguages.NQUADS).parse(nQuadWriter) + val nQuadWriter = StreamRDFWriter.getWriterStream(outputStream, RDFLanguages.NQUADS) + RDFParser.source(inputStream).lang(JellyLanguage.JELLY).parse(nQuadWriter) diff --git a/src/main/scala/eu/neverblink/jelly/cli/command/rdf/RdfFromJelly.scala.semanticdb b/src/main/scala/eu/neverblink/jelly/cli/command/rdf/RdfFromJelly.scala.semanticdb index 388b3124811028edaf51a99f835e441083e6ad3c..4afec816ef8c8041469a8ed8da1f5807f6c353d7 100644 GIT binary patch delta 4167 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 diff --git a/src/test/scala/eu/neverblink/jelly/cli/command/RdfFromJellySpec.scala b/src/test/scala/eu/neverblink/jelly/cli/command/RdfFromJellySpec.scala index d1b6a1b..4ca357a 100644 --- a/src/test/scala/eu/neverblink/jelly/cli/command/RdfFromJellySpec.scala +++ b/src/test/scala/eu/neverblink/jelly/cli/command/RdfFromJellySpec.scala @@ -2,28 +2,58 @@ package eu.neverblink.jelly.cli.command import eu.neverblink.jelly.cli.command.helpers.* import eu.neverblink.jelly.cli.command.rdf.* +import org.apache.jena.riot.RDFLanguages import org.scalatest.matchers.should.Matchers import org.scalatest.wordspec.AnyWordSpec +import scala.io.Source +import scala.util.Using + class RdfFromJellySpec extends AnyWordSpec with Matchers with CleanUpAfterTest: "rdf from-jelly command" should { - "be able to convert a Jelly file to NTriples" in { + "be able to convert a Jelly file to NTriples output stream" in { val jellyFile = DataGenHelper.generateJellyFile(3) val nQuadString = DataGenHelper.generateNQuadString(3) - val options = RdfFromJellyOptions(inputFile = Some(jellyFile)) + val options = RdfFromJellyOptions(inputFile = Some(jellyFile), outputFile = None) val (out, err) = RdfFromJelly.runTest(options) val sortedOut = out.split("\n").map(_.trim).sorted val sortedQuads = nQuadString.split("\n").map(_.trim).sorted sortedOut should contain theSameElementsAs sortedQuads } - "be able to convert a Jelly stream to NTriples" in { + "be able to convert a Jelly stream to NTriples output stream" in { val jellyStream = DataGenHelper.generateJellyInputStream(3) System.setIn(jellyStream) val nQuadString = DataGenHelper.generateNQuadString(3) - val options = RdfFromJellyOptions(inputFile = None) + val options = RdfFromJellyOptions(inputFile = None, outputFile = None) val (out, err) = RdfFromJelly.runTest(options) val sortedOut = out.split("\n").map(_.trim).sorted val sortedQuads = nQuadString.split("\n").map(_.trim).sorted sortedOut should contain theSameElementsAs sortedQuads } + "be able to convert a Jelly file to NTriples file" in { + val jellyFile = DataGenHelper.generateJellyFile(3) + val nQuadString = DataGenHelper.generateNQuadString(3) + val outputFile = DataGenHelper.generateOutputFile(RDFLanguages.NQUADS) + val options = RdfFromJellyOptions(inputFile = Some(jellyFile), outputFile = Some(outputFile)) + val (out, err) = RdfFromJelly.runTest(options) + val sortedOut = Using.resource(Source.fromFile(outputFile)) { content => + content.getLines().toList.map(_.trim).sorted + } + val sortedQuads = nQuadString.split("\n").map(_.trim).sorted + sortedOut should contain theSameElementsAs sortedQuads + out.length should be(0) + } + "be able to convert a Jelly stream to NTriples file" in { + val jellyStream = DataGenHelper.generateJellyInputStream(3) + val outputFile = DataGenHelper.generateOutputFile(RDFLanguages.NQUADS) + val nQuadString = DataGenHelper.generateNQuadString(3) + val options = RdfFromJellyOptions(inputFile = None, outputFile = Some(outputFile)) + val (out, err) = RdfFromJelly.runTest(options) + val sortedOut = Using.resource(Source.fromFile(outputFile)) { content => + content.getLines().toList.map(_.trim).sorted + } + val sortedQuads = nQuadString.split("\n").map(_.trim).sorted + sortedOut should contain theSameElementsAs sortedQuads + out.length should be(0) + } } diff --git a/src/test/scala/eu/neverblink/jelly/cli/command/helpers/CleanUpAfterTest.scala b/src/test/scala/eu/neverblink/jelly/cli/command/helpers/CleanUpAfterTest.scala index d162389..4d73c62 100644 --- a/src/test/scala/eu/neverblink/jelly/cli/command/helpers/CleanUpAfterTest.scala +++ b/src/test/scala/eu/neverblink/jelly/cli/command/helpers/CleanUpAfterTest.scala @@ -6,7 +6,7 @@ import org.scalatest.wordspec.AnyWordSpec trait CleanUpAfterTest extends BeforeAndAfterEach { this: AnyWordSpec => override def afterEach(): Unit = { - DataGenHelper.cleanUpFile() + DataGenHelper.cleanUpFiles() DataGenHelper.resetInputStream() } } diff --git a/src/test/scala/eu/neverblink/jelly/cli/command/helpers/DataGenHelper.scala b/src/test/scala/eu/neverblink/jelly/cli/command/helpers/DataGenHelper.scala index 9509bed..766c0cd 100644 --- a/src/test/scala/eu/neverblink/jelly/cli/command/helpers/DataGenHelper.scala +++ b/src/test/scala/eu/neverblink/jelly/cli/command/helpers/DataGenHelper.scala @@ -2,10 +2,11 @@ package eu.neverblink.jelly.cli.command.helpers import eu.ostrzyciel.jelly.convert.jena.riot.JellyLanguage import org.apache.jena.rdf.model.{Model, ModelFactory, ResourceFactory} -import org.apache.jena.riot.{RDFDataMgr, RDFLanguages} +import org.apache.jena.riot.{RDFDataMgr, RDFLanguages, Lang} import java.io.{ByteArrayInputStream, ByteArrayOutputStream, FileOutputStream} import java.nio.file.{Files, Paths} +import scala.collection.mutable.ListBuffer import scala.util.Using /* @@ -15,6 +16,7 @@ object DataGenHelper: private val testFile = "testInput.jelly" private val inputStream = System.in + protected val outputFiles = ListBuffer[String]() /* * This method generates a triple model with nTriples @@ -70,8 +72,18 @@ object DataGenHelper: RDFDataMgr.write(outputStream, model, RDFLanguages.NQUADS) outputStream.toString - def cleanUpFile(): Unit = + /* + * Generates and then cleans the file for test purposes + */ + def generateOutputFile(format: Lang = RDFLanguages.NQUADS): String = + val extension = format.getFileExtensions.get(0) + val fileName = s"testOutput${outputFiles.size}.${extension}" + outputFiles += fileName + fileName + + def cleanUpFiles(): Unit = Files.deleteIfExists(Paths.get(testFile)) + for file <- outputFiles do Files.deleteIfExists(Paths.get(file)) def resetInputStream(): Unit = System.setIn(inputStream) diff --git a/src/test/scala/eu/neverblink/jelly/cli/command/helpers/DataGenHelper.scala.semanticdb b/src/test/scala/eu/neverblink/jelly/cli/command/helpers/DataGenHelper.scala.semanticdb new file mode 100644 index 0000000000000000000000000000000000000000..5efa4a2526abdfc179dcdf84ba75bed124f16621 GIT binary patch literal 46703 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 literal 0 HcmV?d00001 From 130ee75bc51b8dcfbd22fcd4a23ef66c9448624a Mon Sep 17 00:00:00 2001 From: Karolina Bogacka Date: Thu, 20 Mar 2025 16:25:10 +0100 Subject: [PATCH 03/12] Correct test error --- .../jelly/cli/command/RdfFromJellySpec.scala | 5 ++--- .../cli/command/helpers/DataGenHelper.scala | 6 +++--- .../helpers/DataGenHelper.scala.semanticdb | Bin 46703 -> 49577 bytes 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/test/scala/eu/neverblink/jelly/cli/command/RdfFromJellySpec.scala b/src/test/scala/eu/neverblink/jelly/cli/command/RdfFromJellySpec.scala index 4ca357a..3cb2bb1 100644 --- a/src/test/scala/eu/neverblink/jelly/cli/command/RdfFromJellySpec.scala +++ b/src/test/scala/eu/neverblink/jelly/cli/command/RdfFromJellySpec.scala @@ -21,8 +21,7 @@ class RdfFromJellySpec extends AnyWordSpec with Matchers with CleanUpAfterTest: sortedOut should contain theSameElementsAs sortedQuads } "be able to convert a Jelly stream to NTriples output stream" in { - val jellyStream = DataGenHelper.generateJellyInputStream(3) - System.setIn(jellyStream) + DataGenHelper.generateJellyInputStream(3) val nQuadString = DataGenHelper.generateNQuadString(3) val options = RdfFromJellyOptions(inputFile = None, outputFile = None) val (out, err) = RdfFromJelly.runTest(options) @@ -44,7 +43,7 @@ class RdfFromJellySpec extends AnyWordSpec with Matchers with CleanUpAfterTest: out.length should be(0) } "be able to convert a Jelly stream to NTriples file" in { - val jellyStream = DataGenHelper.generateJellyInputStream(3) + DataGenHelper.generateJellyInputStream(3) val outputFile = DataGenHelper.generateOutputFile(RDFLanguages.NQUADS) val nQuadString = DataGenHelper.generateNQuadString(3) val options = RdfFromJellyOptions(inputFile = None, outputFile = Some(outputFile)) diff --git a/src/test/scala/eu/neverblink/jelly/cli/command/helpers/DataGenHelper.scala b/src/test/scala/eu/neverblink/jelly/cli/command/helpers/DataGenHelper.scala index 766c0cd..d6e5f89 100644 --- a/src/test/scala/eu/neverblink/jelly/cli/command/helpers/DataGenHelper.scala +++ b/src/test/scala/eu/neverblink/jelly/cli/command/helpers/DataGenHelper.scala @@ -53,13 +53,13 @@ object DataGenHelper: /* * This method generates a Jelly byte input stream with nTriples * @param nTriples number of triples to generate - * @return String */ - def generateJellyInputStream(nTriples: Int): ByteArrayInputStream = + def generateJellyInputStream(nTriples: Int): Unit = val model = generateTripleModel(nTriples) val outputStream = new ByteArrayOutputStream() RDFDataMgr.write(outputStream, model, JellyLanguage.JELLY) - new ByteArrayInputStream(outputStream.toByteArray) + val jellyStream = new ByteArrayInputStream(outputStream.toByteArray) + System.setIn(jellyStream) /* * This method generates a NQuad string with nTriples diff --git a/src/test/scala/eu/neverblink/jelly/cli/command/helpers/DataGenHelper.scala.semanticdb b/src/test/scala/eu/neverblink/jelly/cli/command/helpers/DataGenHelper.scala.semanticdb index 5efa4a2526abdfc179dcdf84ba75bed124f16621..babc834012d5222a91e0dad966b46e9a00b67365 100644 GIT binary patch delta 4732 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 Cl)JG2 From 61f385b78415597cb243d6180794fdcef6a6bbe1 Mon Sep 17 00:00:00 2001 From: Karolina Bogacka Date: Thu, 20 Mar 2025 16:32:44 +0100 Subject: [PATCH 04/12] Uncommit semanticdb files --- .gitignore | 2 +- .../command/rdf/RdfFromJelly.scala.semanticdb | Bin 49539 -> 0 bytes .../helpers/DataGenHelper.scala.semanticdb | Bin 49577 -> 0 bytes 3 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 src/main/scala/eu/neverblink/jelly/cli/command/rdf/RdfFromJelly.scala.semanticdb delete mode 100644 src/test/scala/eu/neverblink/jelly/cli/command/helpers/DataGenHelper.scala.semanticdb diff --git a/.gitignore b/.gitignore index a6fcde6..03ba4de 100644 --- a/.gitignore +++ b/.gitignore @@ -26,7 +26,7 @@ out/ bin/ !**/src/main/**/bin/ !**/src/test/**/bin/ - +*.semanticdb ### NetBeans ### /nbproject/private/ /nbbuild/ diff --git a/src/main/scala/eu/neverblink/jelly/cli/command/rdf/RdfFromJelly.scala.semanticdb b/src/main/scala/eu/neverblink/jelly/cli/command/rdf/RdfFromJelly.scala.semanticdb deleted file mode 100644 index 4afec816ef8c8041469a8ed8da1f5807f6c353d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49539 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 Date: Thu, 20 Mar 2025 16:34:36 +0100 Subject: [PATCH 05/12] Move to more meaningful part of gitignore --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 03ba4de..18269d2 100644 --- a/.gitignore +++ b/.gitignore @@ -26,7 +26,7 @@ out/ bin/ !**/src/main/**/bin/ !**/src/test/**/bin/ -*.semanticdb + ### NetBeans ### /nbproject/private/ /nbbuild/ @@ -45,6 +45,7 @@ build/ ### Scala ### .bsp/ +*.semanticdb ### IDEA ### /.idea/ From 2819d7078743616b26e71ba3d98485d55110d36c Mon Sep 17 00:00:00 2001 From: Karolina Bogacka Date: Thu, 20 Mar 2025 18:59:19 +0100 Subject: [PATCH 06/12] Move input file to remaining parameters to make it positional --- .gitignore | 1 + .../jelly/cli/command/rdf/RdfFromJelly.scala | 8 +++----- .../jelly/cli/command/RdfFromJellySpec.scala | 19 +++++++++++++------ 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/.gitignore b/.gitignore index 18269d2..a463476 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ target/ !.mvn/wrapper/maven-wrapper.jar !**/src/main/**/target/ !**/src/test/**/target/ +testData/** ### IntelliJ IDEA ### .idea/modules.xml diff --git a/src/main/scala/eu/neverblink/jelly/cli/command/rdf/RdfFromJelly.scala b/src/main/scala/eu/neverblink/jelly/cli/command/rdf/RdfFromJelly.scala index 810549e..7b90697 100644 --- a/src/main/scala/eu/neverblink/jelly/cli/command/rdf/RdfFromJelly.scala +++ b/src/main/scala/eu/neverblink/jelly/cli/command/rdf/RdfFromJelly.scala @@ -8,8 +8,7 @@ import org.apache.jena.riot.{RDFLanguages, RDFParser} import java.io.{File, FileInputStream, FileOutputStream, InputStream, OutputStream} case class RdfFromJellyOptions( - @ExtraName("") inputFile: Option[String], - @ExtraName("to") outputFile: Option[String], + @ExtraName("to") outputFile: Option[String] = None, ) object RdfFromJelly extends JellyCommand[RdfFromJellyOptions]: @@ -20,10 +19,10 @@ object RdfFromJelly extends JellyCommand[RdfFromJellyOptions]: ) override def run(options: RdfFromJellyOptions, remainingArgs: RemainingArgs): Unit = - val inputStream = options.inputFile match { + val inputStream = remainingArgs.remaining.headOption match { case Some(fileName: String) => FileInputStream(File(fileName)) - case None => System.in + case _ => System.in } val outputStream = options.outputFile match { case Some(fileName: String) => @@ -38,6 +37,5 @@ object RdfFromJelly extends JellyCommand[RdfFromJellyOptions]: * @param outputStream OutputStream */ private def doConversion(inputStream: InputStream, outputStream: OutputStream): Unit = - // TODO: Add error handling; return success/failure in the future val nQuadWriter = StreamRDFWriter.getWriterStream(outputStream, RDFLanguages.NQUADS) RDFParser.source(inputStream).lang(JellyLanguage.JELLY).parse(nQuadWriter) diff --git a/src/test/scala/eu/neverblink/jelly/cli/command/RdfFromJellySpec.scala b/src/test/scala/eu/neverblink/jelly/cli/command/RdfFromJellySpec.scala index 3cb2bb1..e7721bd 100644 --- a/src/test/scala/eu/neverblink/jelly/cli/command/RdfFromJellySpec.scala +++ b/src/test/scala/eu/neverblink/jelly/cli/command/RdfFromJellySpec.scala @@ -1,5 +1,6 @@ package eu.neverblink.jelly.cli.command +import caseapp.core.{Indexed, RemainingArgs} import eu.neverblink.jelly.cli.command.helpers.* import eu.neverblink.jelly.cli.command.rdf.* import org.apache.jena.riot.RDFLanguages @@ -14,8 +15,13 @@ class RdfFromJellySpec extends AnyWordSpec with Matchers with CleanUpAfterTest: "be able to convert a Jelly file to NTriples output stream" in { val jellyFile = DataGenHelper.generateJellyFile(3) val nQuadString = DataGenHelper.generateNQuadString(3) - val options = RdfFromJellyOptions(inputFile = Some(jellyFile), outputFile = None) - val (out, err) = RdfFromJelly.runTest(options) + val options = RdfFromJellyOptions(outputFile = None) + val args = RemainingArgs(indexedRemaining = List(Indexed(jellyFile)), Seq.empty) + val (out, err) = + RdfFromJelly.runTest( + options, + args, + ) val sortedOut = out.split("\n").map(_.trim).sorted val sortedQuads = nQuadString.split("\n").map(_.trim).sorted sortedOut should contain theSameElementsAs sortedQuads @@ -23,7 +29,7 @@ class RdfFromJellySpec extends AnyWordSpec with Matchers with CleanUpAfterTest: "be able to convert a Jelly stream to NTriples output stream" in { DataGenHelper.generateJellyInputStream(3) val nQuadString = DataGenHelper.generateNQuadString(3) - val options = RdfFromJellyOptions(inputFile = None, outputFile = None) + val options = RdfFromJellyOptions(outputFile = None) val (out, err) = RdfFromJelly.runTest(options) val sortedOut = out.split("\n").map(_.trim).sorted val sortedQuads = nQuadString.split("\n").map(_.trim).sorted @@ -31,10 +37,11 @@ class RdfFromJellySpec extends AnyWordSpec with Matchers with CleanUpAfterTest: } "be able to convert a Jelly file to NTriples file" in { val jellyFile = DataGenHelper.generateJellyFile(3) + val args = RemainingArgs(indexedRemaining = List(Indexed(jellyFile)), Seq.empty) val nQuadString = DataGenHelper.generateNQuadString(3) val outputFile = DataGenHelper.generateOutputFile(RDFLanguages.NQUADS) - val options = RdfFromJellyOptions(inputFile = Some(jellyFile), outputFile = Some(outputFile)) - val (out, err) = RdfFromJelly.runTest(options) + val options = RdfFromJellyOptions(outputFile = Some(outputFile)) + val (out, err) = RdfFromJelly.runTest(options, args) val sortedOut = Using.resource(Source.fromFile(outputFile)) { content => content.getLines().toList.map(_.trim).sorted } @@ -46,7 +53,7 @@ class RdfFromJellySpec extends AnyWordSpec with Matchers with CleanUpAfterTest: DataGenHelper.generateJellyInputStream(3) val outputFile = DataGenHelper.generateOutputFile(RDFLanguages.NQUADS) val nQuadString = DataGenHelper.generateNQuadString(3) - val options = RdfFromJellyOptions(inputFile = None, outputFile = Some(outputFile)) + val options = RdfFromJellyOptions(outputFile = Some(outputFile)) val (out, err) = RdfFromJelly.runTest(options) val sortedOut = Using.resource(Source.fromFile(outputFile)) { content => content.getLines().toList.map(_.trim).sorted From d5554f6462e02fe5bbe796c31fbc30f7be1963a1 Mon Sep 17 00:00:00 2001 From: Karolina Bogacka Date: Thu, 20 Mar 2025 19:21:41 +0100 Subject: [PATCH 07/12] Move to a stable version of jelly --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 09be481..23e207d 100644 --- a/build.sbt +++ b/build.sbt @@ -5,7 +5,7 @@ resolvers += "Sonatype OSS Snapshots" at "https://s01.oss.sonatype.org/content/repositories/snapshots" lazy val jenaV = "5.3.0" -lazy val jellyV = "2.8.0+14-4181e89a-SNAPSHOT" +lazy val jellyV = "2.8.0" addCommandAlias("fixAll", "scalafixAll; scalafmtAll") From 5fb4631e5e4634229cfef100752624791510980e Mon Sep 17 00:00:00 2001 From: Karolina Bogacka Date: Thu, 20 Mar 2025 19:44:07 +0100 Subject: [PATCH 08/12] Check if lifecycle changes help --- .../eu/neverblink/jelly/cli/command/rdf/RdfFromJelly.scala | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/scala/eu/neverblink/jelly/cli/command/rdf/RdfFromJelly.scala b/src/main/scala/eu/neverblink/jelly/cli/command/rdf/RdfFromJelly.scala index 7b90697..f6185ff 100644 --- a/src/main/scala/eu/neverblink/jelly/cli/command/rdf/RdfFromJelly.scala +++ b/src/main/scala/eu/neverblink/jelly/cli/command/rdf/RdfFromJelly.scala @@ -1,7 +1,7 @@ package eu.neverblink.jelly.cli.command.rdf import caseapp.* import eu.neverblink.jelly.cli.JellyCommand -import eu.ostrzyciel.jelly.convert.jena.riot.JellyLanguage +import eu.ostrzyciel.jelly.convert.jena.riot.{JellyLanguage, JellySubsystemLifecycle} import org.apache.jena.riot.system.StreamRDFWriter import org.apache.jena.riot.{RDFLanguages, RDFParser} @@ -37,5 +37,7 @@ object RdfFromJelly extends JellyCommand[RdfFromJellyOptions]: * @param outputStream OutputStream */ private def doConversion(inputStream: InputStream, outputStream: OutputStream): Unit = + val mod = JellySubsystemLifecycle() + mod.start() val nQuadWriter = StreamRDFWriter.getWriterStream(outputStream, RDFLanguages.NQUADS) RDFParser.source(inputStream).lang(JellyLanguage.JELLY).parse(nQuadWriter) From 66a7f520135c5df210b843c80955241b82c1bc61 Mon Sep 17 00:00:00 2001 From: Karolina Bogacka Date: Thu, 20 Mar 2025 19:56:55 +0100 Subject: [PATCH 09/12] Change jena versions --- build.sbt | 2 +- .../eu/neverblink/jelly/cli/command/rdf/RdfFromJelly.scala | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/build.sbt b/build.sbt index 23e207d..dd3dd9b 100644 --- a/build.sbt +++ b/build.sbt @@ -4,7 +4,7 @@ ThisBuild / scalaVersion := "3.6.4" resolvers += "Sonatype OSS Snapshots" at "https://s01.oss.sonatype.org/content/repositories/snapshots" -lazy val jenaV = "5.3.0" +lazy val jenaV = "5.2.0" lazy val jellyV = "2.8.0" addCommandAlias("fixAll", "scalafixAll; scalafmtAll") diff --git a/src/main/scala/eu/neverblink/jelly/cli/command/rdf/RdfFromJelly.scala b/src/main/scala/eu/neverblink/jelly/cli/command/rdf/RdfFromJelly.scala index f6185ff..7b90697 100644 --- a/src/main/scala/eu/neverblink/jelly/cli/command/rdf/RdfFromJelly.scala +++ b/src/main/scala/eu/neverblink/jelly/cli/command/rdf/RdfFromJelly.scala @@ -1,7 +1,7 @@ package eu.neverblink.jelly.cli.command.rdf import caseapp.* import eu.neverblink.jelly.cli.JellyCommand -import eu.ostrzyciel.jelly.convert.jena.riot.{JellyLanguage, JellySubsystemLifecycle} +import eu.ostrzyciel.jelly.convert.jena.riot.JellyLanguage import org.apache.jena.riot.system.StreamRDFWriter import org.apache.jena.riot.{RDFLanguages, RDFParser} @@ -37,7 +37,5 @@ object RdfFromJelly extends JellyCommand[RdfFromJellyOptions]: * @param outputStream OutputStream */ private def doConversion(inputStream: InputStream, outputStream: OutputStream): Unit = - val mod = JellySubsystemLifecycle() - mod.start() val nQuadWriter = StreamRDFWriter.getWriterStream(outputStream, RDFLanguages.NQUADS) RDFParser.source(inputStream).lang(JellyLanguage.JELLY).parse(nQuadWriter) From ae9a4cf0391b055379a6db99efd400b67d0a20fe Mon Sep 17 00:00:00 2001 From: Karolina Bogacka Date: Thu, 20 Mar 2025 20:04:09 +0100 Subject: [PATCH 10/12] Revert "Change jena versions" This reverts commit 66a7f520135c5df210b843c80955241b82c1bc61. --- build.sbt | 2 +- .../eu/neverblink/jelly/cli/command/rdf/RdfFromJelly.scala | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/build.sbt b/build.sbt index dd3dd9b..23e207d 100644 --- a/build.sbt +++ b/build.sbt @@ -4,7 +4,7 @@ ThisBuild / scalaVersion := "3.6.4" resolvers += "Sonatype OSS Snapshots" at "https://s01.oss.sonatype.org/content/repositories/snapshots" -lazy val jenaV = "5.2.0" +lazy val jenaV = "5.3.0" lazy val jellyV = "2.8.0" addCommandAlias("fixAll", "scalafixAll; scalafmtAll") diff --git a/src/main/scala/eu/neverblink/jelly/cli/command/rdf/RdfFromJelly.scala b/src/main/scala/eu/neverblink/jelly/cli/command/rdf/RdfFromJelly.scala index 7b90697..f6185ff 100644 --- a/src/main/scala/eu/neverblink/jelly/cli/command/rdf/RdfFromJelly.scala +++ b/src/main/scala/eu/neverblink/jelly/cli/command/rdf/RdfFromJelly.scala @@ -1,7 +1,7 @@ package eu.neverblink.jelly.cli.command.rdf import caseapp.* import eu.neverblink.jelly.cli.JellyCommand -import eu.ostrzyciel.jelly.convert.jena.riot.JellyLanguage +import eu.ostrzyciel.jelly.convert.jena.riot.{JellyLanguage, JellySubsystemLifecycle} import org.apache.jena.riot.system.StreamRDFWriter import org.apache.jena.riot.{RDFLanguages, RDFParser} @@ -37,5 +37,7 @@ object RdfFromJelly extends JellyCommand[RdfFromJellyOptions]: * @param outputStream OutputStream */ private def doConversion(inputStream: InputStream, outputStream: OutputStream): Unit = + val mod = JellySubsystemLifecycle() + mod.start() val nQuadWriter = StreamRDFWriter.getWriterStream(outputStream, RDFLanguages.NQUADS) RDFParser.source(inputStream).lang(JellyLanguage.JELLY).parse(nQuadWriter) From 0e27d8ce4fe908dfb3fc3e5e118be44a2c82a263 Mon Sep 17 00:00:00 2001 From: Ostrzyciel Date: Thu, 20 Mar 2025 20:29:32 +0100 Subject: [PATCH 11/12] Fix AOT - Set up a static initializer of the Jena system to avoid issues with race conditions. - Added a thingy for Graal to know which classes from Caffeine to compile into the binary. See: https://github.com/ben-manes/caffeine/issues/1840 --- build.sbt | 1 + .../caffeine/reflect-config.json | 605 ++++++++++++++++++ .../scala/eu/neverblink/jelly/cli/App.scala | 4 + 3 files changed, 610 insertions(+) create mode 100644 src/main/resources/META-INF/native-image/com.github.ben-manes.caffeine/caffeine/reflect-config.json diff --git a/build.sbt b/build.sbt index 23e207d..998137d 100644 --- a/build.sbt +++ b/build.sbt @@ -45,4 +45,5 @@ lazy val root = (project in file(".")) Compile / mainClass := Some("eu.neverblink.jelly.cli.App"), // Do a fast build if it's a dev build graalVMNativeImageOptions := (if (isDevBuild) Seq("-Ob") else Seq("--emit build-report")), + graalVMNativeImageCommand := "/opt/graalvm_2025_02/bin/native-image", ) diff --git a/src/main/resources/META-INF/native-image/com.github.ben-manes.caffeine/caffeine/reflect-config.json b/src/main/resources/META-INF/native-image/com.github.ben-manes.caffeine/caffeine/reflect-config.json new file mode 100644 index 0000000..feb2266 --- /dev/null +++ b/src/main/resources/META-INF/native-image/com.github.ben-manes.caffeine/caffeine/reflect-config.json @@ -0,0 +1,605 @@ +[ + { + "condition": { + "typeReachable": "com.github.benmanes.caffeine.cache.BBHeader$ReadAndWriteCounterRef" + }, + "name": "com.github.benmanes.caffeine.cache.BBHeader$ReadAndWriteCounterRef", + "fields": [ + { + "name": "writeCounter" + } + ] + }, + { + "condition": { + "typeReachable": "com.github.benmanes.caffeine.cache.BBHeader$ReadAndWriteCounterRef" + }, + "name": "com.github.benmanes.caffeine.cache.BBHeader$ReadCounterRef", + "fields": [ + { + "name": "readCounter" + } + ] + }, + { + "condition": { + "typeReachable": "com.github.benmanes.caffeine.cache.BLCHeader$DrainStatusRef" + }, + "name": "com.github.benmanes.caffeine.cache.BLCHeader$DrainStatusRef", + "fields": [ + { + "name": "drainStatus" + } + ] + }, + { + "condition": { + "typeReachable": "com.github.benmanes.caffeine.cache.BaseMpscLinkedArrayQueue" + }, + "name": "com.github.benmanes.caffeine.cache.BaseMpscLinkedArrayQueueColdProducerFields", + "fields": [ + { + "name": "producerLimit" + } + ] + }, + { + "condition": { + "typeReachable": "com.github.benmanes.caffeine.cache.BaseMpscLinkedArrayQueue" + }, + "name": "com.github.benmanes.caffeine.cache.BaseMpscLinkedArrayQueueConsumerFields", + "fields": [ + { + "name": "consumerIndex" + } + ] + }, + { + "condition": { + "typeReachable": "com.github.benmanes.caffeine.cache.BaseMpscLinkedArrayQueue" + }, + "name": "com.github.benmanes.caffeine.cache.BaseMpscLinkedArrayQueueProducerFields", + "fields": [ + { + "name": "producerIndex" + } + ] + }, + { + "condition": { + "typeReachable": "com.github.benmanes.caffeine.cache.BoundedLocalCache" + }, + "name": "com.github.benmanes.caffeine.cache.BoundedLocalCache", + "fields": [ + { + "name": "refreshes" + } + ] + }, + { + "condition": { + "typeReachable": "com.github.benmanes.caffeine.cache.Caffeine" + }, + "name": "com.github.benmanes.caffeine.cache.CacheLoader", + "methods": [ + { + "name": "asyncLoadAll", + "parameterTypes": [ + "java.util.Set", + "java.util.concurrent.Executor" + ] + }, + { + "name": "loadAll", + "parameterTypes": [ + "java.util.Set" + ] + } + ] + }, + { + "condition": { + "typeReachable": "com.github.benmanes.caffeine.cache.LocalLoadingCache" + }, + "name": "com.github.benmanes.caffeine.cache.CacheLoader", + "methods": [ + { + "name": "loadAll", + "parameterTypes": [ + "java.util.Set" + ] + } + ] + }, + { + "condition": { + "typeReachable": "com.github.benmanes.caffeine.cache.FS" + }, + "name": "com.github.benmanes.caffeine.cache.FS", + "fields": [ + { + "name": "key" + }, + { + "name": "value" + } + ] + }, + { + "condition": { + "typeReachable": "com.github.benmanes.caffeine.cache.WS" + }, + "name": "com.github.benmanes.caffeine.cache.FS", + "methods": [ + { + "name": "", + "parameterTypes": [] + } + ] + }, + { + "condition": { + "typeReachable": "com.github.benmanes.caffeine.cache.FW" + }, + "name": "com.github.benmanes.caffeine.cache.FW", + "fields": [ + { + "name": "value" + } + ] + }, + { + "condition": { + "typeReachable": "com.github.benmanes.caffeine.cache.WI" + }, + "name": "com.github.benmanes.caffeine.cache.FW", + "methods": [ + { + "name": "", + "parameterTypes": [] + } + ] + }, + { + "condition": { + "typeReachable": "com.github.benmanes.caffeine.cache.PD" + }, + "name": "com.github.benmanes.caffeine.cache.PD", + "fields": [ + { + "name": "value" + } + ] + }, + { + "condition": { + "typeReachable": "com.github.benmanes.caffeine.cache.PS" + }, + "name": "com.github.benmanes.caffeine.cache.PS", + "fields": [ + { + "name": "key" + }, + { + "name": "value" + } + ] + }, + { + "condition": { + "typeReachable": "com.github.benmanes.caffeine.cache.PSA" + }, + "name": "com.github.benmanes.caffeine.cache.PSA", + "fields": [ + { + "name": "accessTime" + } + ] + }, + { + "condition": { + "typeReachable": "com.github.benmanes.caffeine.cache.SSA" + }, + "name": "com.github.benmanes.caffeine.cache.PSA", + "methods": [ + { + "name": "", + "parameterTypes": [] + } + ] + }, + { + "condition": { + "typeReachable": "com.github.benmanes.caffeine.cache.SSSMS" + }, + "name": "com.github.benmanes.caffeine.cache.PSMS", + "methods": [ + { + "name": "", + "parameterTypes": [] + } + ] + }, + { + "condition": { + "typeReachable": "com.github.benmanes.caffeine.cache.SSMW" + }, + "name": "com.github.benmanes.caffeine.cache.PSMW", + "methods": [ + { + "name": "", + "parameterTypes": [] + } + ] + }, + { + "condition": { + "typeReachable": "com.github.benmanes.caffeine.cache.PSR" + }, + "name": "com.github.benmanes.caffeine.cache.PSR", + "fields": [ + { + "name": "writeTime" + } + ] + }, + { + "condition": { + "typeReachable": "com.github.benmanes.caffeine.cache.SSMSR" + }, + "name": "com.github.benmanes.caffeine.cache.PSRMS", + "methods": [ + { + "name": "", + "parameterTypes": [] + } + ] + }, + { + "condition": { + "typeReachable": "com.github.benmanes.caffeine.cache.PSW" + }, + "name": "com.github.benmanes.caffeine.cache.PSW", + "fields": [ + { + "name": "writeTime" + } + ] + }, + { + "condition": { + "typeReachable": "com.github.benmanes.caffeine.cache.SSA" + }, + "name": "com.github.benmanes.caffeine.cache.PSW", + "methods": [ + { + "name": "", + "parameterTypes": [] + } + ] + }, + { + "condition": { + "typeReachable": "com.github.benmanes.caffeine.cache.SSW" + }, + "name": "com.github.benmanes.caffeine.cache.PSW", + "methods": [ + { + "name": "", + "parameterTypes": [] + } + ] + }, + { + "condition": { + "typeReachable": "com.github.benmanes.caffeine.cache.SSSMW" + }, + "name": "com.github.benmanes.caffeine.cache.PSWMW", + "methods": [ + { + "name": "", + "parameterTypes": [] + } + ] + }, + { + "condition": { + "typeReachable": "com.github.benmanes.caffeine.cache.PW" + }, + "name": "com.github.benmanes.caffeine.cache.PW", + "fields": [ + { + "name": "value" + } + ] + }, + { + "condition": { + "typeReachable": "com.github.benmanes.caffeine.cache.BoundedLocalCache$BoundedLocalManualCache" + }, + "name": "com.github.benmanes.caffeine.cache.SI", + "methods": [ + { + "name": "", + "parameterTypes": [ + "com.github.benmanes.caffeine.cache.Caffeine", + "com.github.benmanes.caffeine.cache.AsyncCacheLoader", + "boolean" + ] + } + ] + }, + { + "condition": { + "typeReachable": "com.github.benmanes.caffeine.cache.BoundedLocalCache$BoundedLocalLoadingCache" + }, + "name": "com.github.benmanes.caffeine.cache.SSA", + "methods": [ + { + "name": "", + "parameterTypes": [ + "com.github.benmanes.caffeine.cache.Caffeine", + "com.github.benmanes.caffeine.cache.AsyncCacheLoader", + "boolean" + ] + } + ] + }, + { + "name": "com.github.benmanes.caffeine.cache.SSMS", + "methods": [ + { + "name": "", + "parameterTypes": [ + "com.github.benmanes.caffeine.cache.Caffeine", + "com.github.benmanes.caffeine.cache.AsyncCacheLoader", + "boolean" + ] + } + ] + }, + { + "condition": { + "typeReachable": "com.github.benmanes.caffeine.cache.BoundedLocalCache$BoundedLocalLoadingCache" + }, + "name": "com.github.benmanes.caffeine.cache.SSMSR", + "methods": [ + { + "name": "", + "parameterTypes": [ + "com.github.benmanes.caffeine.cache.Caffeine", + "com.github.benmanes.caffeine.cache.AsyncCacheLoader", + "boolean" + ] + } + ] + }, + { + "condition": { + "typeReachable": "com.github.benmanes.caffeine.cache.BoundedLocalCache$BoundedLocalAsyncCache" + }, + "name": "com.github.benmanes.caffeine.cache.SSMSW", + "methods": [ + { + "name": "", + "parameterTypes": [ + "com.github.benmanes.caffeine.cache.Caffeine", + "com.github.benmanes.caffeine.cache.AsyncCacheLoader", + "boolean" + ] + } + ] + }, + { + "condition": { + "typeReachable": "com.github.benmanes.caffeine.cache.BoundedLocalCache$BoundedLocalAsyncLoadingCache" + }, + "name": "com.github.benmanes.caffeine.cache.SSMSW", + "methods": [ + { + "name": "", + "parameterTypes": [ + "com.github.benmanes.caffeine.cache.Caffeine", + "com.github.benmanes.caffeine.cache.AsyncCacheLoader", + "boolean" + ] + } + ] + }, + { + "condition": { + "typeReachable": "com.github.benmanes.caffeine.cache.BoundedLocalCache$BoundedLocalManualCache" + }, + "name": "com.github.benmanes.caffeine.cache.SSMSW", + "methods": [ + { + "name": "", + "parameterTypes": [ + "com.github.benmanes.caffeine.cache.Caffeine", + "com.github.benmanes.caffeine.cache.AsyncCacheLoader", + "boolean" + ] + } + ] + }, + { + "condition": { + "typeReachable": "com.github.benmanes.caffeine.cache.BoundedLocalCache$BoundedLocalLoadingCache" + }, + "name": "com.github.benmanes.caffeine.cache.SSMW", + "methods": [ + { + "name": "", + "parameterTypes": [ + "com.github.benmanes.caffeine.cache.Caffeine", + "com.github.benmanes.caffeine.cache.AsyncCacheLoader", + "boolean" + ] + } + ] + }, + { + "condition": { + "typeReachable": "com.github.benmanes.caffeine.cache.BoundedLocalCache$BoundedLocalManualCache" + }, + "name": "com.github.benmanes.caffeine.cache.SSSMS", + "methods": [ + { + "name": "", + "parameterTypes": [ + "com.github.benmanes.caffeine.cache.Caffeine", + "com.github.benmanes.caffeine.cache.AsyncCacheLoader", + "boolean" + ] + } + ] + }, + { + "condition": { + "typeReachable": "com.github.benmanes.caffeine.cache.BoundedLocalCache$BoundedLocalLoadingCache" + }, + "name": "com.github.benmanes.caffeine.cache.SSSMWW", + "methods": [ + { + "name": "", + "parameterTypes": [ + "com.github.benmanes.caffeine.cache.Caffeine", + "com.github.benmanes.caffeine.cache.AsyncCacheLoader", + "boolean" + ] + } + ] + }, + { + "condition": { + "typeReachable": "com.github.benmanes.caffeine.cache.BoundedLocalCache$BoundedLocalLoadingCache" + }, + "name": "com.github.benmanes.caffeine.cache.SSW", + "methods": [ + { + "name": "", + "parameterTypes": [ + "com.github.benmanes.caffeine.cache.Caffeine", + "com.github.benmanes.caffeine.cache.AsyncCacheLoader", + "boolean" + ] + } + ] + }, + { + "condition": { + "typeReachable": "com.github.benmanes.caffeine.cache.StripedBuffer" + }, + "name": "com.github.benmanes.caffeine.cache.StripedBuffer", + "fields": [ + { + "name": "tableBusy" + } + ] + }, + { + "condition": { + "typeReachable": "com.github.benmanes.caffeine.cache.UnboundedLocalCache" + }, + "name": "com.github.benmanes.caffeine.cache.UnboundedLocalCache", + "fields": [ + { + "name": "refreshes" + } + ] + }, + { + "condition": { + "typeReachable": "com.github.benmanes.caffeine.cache.BoundedLocalCache$BoundedLocalLoadingCache" + }, + "name": "com.github.benmanes.caffeine.cache.WI", + "methods": [ + { + "name": "", + "parameterTypes": [ + "com.github.benmanes.caffeine.cache.Caffeine", + "com.github.benmanes.caffeine.cache.AsyncCacheLoader", + "boolean" + ] + } + ] + }, + { + "condition": { + "typeReachable": "com.github.benmanes.caffeine.cache.BoundedLocalCache$BoundedLocalLoadingCache" + }, + "name": "com.github.benmanes.caffeine.cache.WS", + "methods": [ + { + "name": "", + "parameterTypes": [ + "com.github.benmanes.caffeine.cache.Caffeine", + "com.github.benmanes.caffeine.cache.AsyncCacheLoader", + "boolean" + ] + } + ] + }, + { + "condition": { + "typeReachable": "com.github.benmanes.caffeine.cache.Caffeine" + }, + "name": "com.github.benmanes.caffeine.cache.WS", + "methods": [ + { + "name": "", + "parameterTypes": [ + "com.github.benmanes.caffeine.cache.Caffeine", + "com.github.benmanes.caffeine.cache.AsyncCacheLoader", + "boolean" + ] + } + ] + }, + { + "condition": { + "typeReachable": "com.github.benmanes.caffeine.cache.NodeFactory" + }, + "name": "com.github.benmanes.caffeine.cache.PSWMS", + "methods": [ + { + "name": "", + "parameterTypes": [] + } + ] + }, + { + "condition": { + "typeReachable": "com.github.benmanes.caffeine.cache.NodeFactory" + }, + "name": "com.github.benmanes.caffeine.cache.PD", + "fields": [ + { + "name": "value" + } + ], + "methods": [ + { + "name": "", + "parameterTypes": [] + } + ] + }, + { + "condition": { + "typeReachable": "com.github.benmanes.caffeine.cache.NodeFactory" + }, + "name": "com.github.benmanes.caffeine.cache.PW", + "fields": [ + { + "name": "value" + } + ], + "methods": [ + { + "name": "", + "parameterTypes": [] + } + ] + } +] diff --git a/src/main/scala/eu/neverblink/jelly/cli/App.scala b/src/main/scala/eu/neverblink/jelly/cli/App.scala index 6741882..bb1c8de 100644 --- a/src/main/scala/eu/neverblink/jelly/cli/App.scala +++ b/src/main/scala/eu/neverblink/jelly/cli/App.scala @@ -3,10 +3,14 @@ package eu.neverblink.jelly.cli import caseapp.* import eu.neverblink.jelly.cli.command.* import eu.neverblink.jelly.cli.command.rdf.* +import org.apache.jena.sys.JenaSystem /** Main entrypoint. */ object App extends CommandsEntryPoint: + // Initialize Jena now to avoid race conditions later + JenaSystem.init() + override def progName: String = "jelly-cli" override def commands: Seq[Command[?]] = Seq( From c6d3d51152d81ac3fa101901fc9424454aa7495c Mon Sep 17 00:00:00 2001 From: Ostrzyciel Date: Thu, 20 Mar 2025 20:31:15 +0100 Subject: [PATCH 12/12] revert build.sbt change --- build.sbt | 1 - 1 file changed, 1 deletion(-) diff --git a/build.sbt b/build.sbt index 998137d..23e207d 100644 --- a/build.sbt +++ b/build.sbt @@ -45,5 +45,4 @@ lazy val root = (project in file(".")) Compile / mainClass := Some("eu.neverblink.jelly.cli.App"), // Do a fast build if it's a dev build graalVMNativeImageOptions := (if (isDevBuild) Seq("-Ob") else Seq("--emit build-report")), - graalVMNativeImageCommand := "/opt/graalvm_2025_02/bin/native-image", )