From 569476405d4164aed0a907e3f17f081da84a935e Mon Sep 17 00:00:00 2001 From: Johannes Lichtenberger Date: Mon, 13 Nov 2023 17:35:33 +0100 Subject: [PATCH] Update to java21 (#679) * Fix merge conflicts * Fix bug... should always be serialized * Disable tests * Add test case for parsing JSON alone via GSON * Disable test and add stopwatch * Add message... * Add disabled annotation... * Intermediate commit/push... issue with parallelization * Fixes issue due to parallelization * Revert changes * Fix compile error * Recycle bytes instance * Update gradle.yml * Update Chronicle Bytes and switch Kotlin compile jvmTarget * Switch Kotlin compile jvmTarget * Add GC logs * Add G1 GC logs * Add most recent changes * Disable test * Update chronicle bytes * Update settings.gradle * Update settings.gradle * Minor changes... * Update Java version in github workflow --- .github/workflows/gradle.yml | 4 +- README.md | 8 +- build.gradle | 17 +- bundles/sirix-core/build.gradle | 1 - bundles/sirix-core/mylog-g1.log | 39 +++ bundles/sirix-core/mylog-g1.log.0 | 105 +++++++ bundles/sirix-core/mylog.log* | 48 +++ bundles/sirix-core/mylog.log*.0 | 38 +++ .../sirix/access/ResourceConfiguration.java | 4 +- .../sirix/access/trx/node/PotentialLock.java | 7 +- .../page/AbstractForwardingPageWriteTrx.java | 3 +- .../access/trx/page/NodePageReadOnlyTrx.java | 11 +- .../io/sirix/access/trx/page/NodePageTrx.java | 6 +- .../axis/visitor/VisitorDescendantAxis.java | 4 +- .../io/sirix/index/path/summary/PathNode.java | 5 +- .../redblacktree/ImmutableRBNodeImpl.java | 5 +- .../sirix/index/redblacktree/RBNodeKey.java | 7 +- .../sirix/index/redblacktree/RBNodeValue.java | 7 +- .../sirix/io/directio/FileChannelWriter.java | 4 +- .../java/io/sirix/io/file/FileReader.java | 3 +- .../java/io/sirix/io/file/FileWriter.java | 4 +- .../io/filechannel/FileChannelWriter.java | 4 +- .../io/sirix/io/iouring/IOUringReader.java | 6 +- .../io/sirix/io/iouring/IOUringWriter.java | 15 +- .../io/sirix/io/memorymapped/MMStorage.java | 6 +- .../main/java/io/sirix/node/DeletedNode.java | 7 +- .../io/sirix/node/DeweyIDMappingNode.java | 5 +- .../src/main/java/io/sirix/node/NodeKind.java | 73 +++-- .../node/delegates/NameNodeDelegate.java | 6 +- .../node/delegates/StructNodeDelegate.java | 6 +- .../node/delegates/ValueNodeDelegate.java | 6 +- .../sirix/node/json/AbstractBooleanNode.java | 5 +- .../io/sirix/node/json/AbstractNullNode.java | 4 +- .../sirix/node/json/AbstractNumberNode.java | 4 +- .../sirix/node/json/AbstractStringNode.java | 4 +- .../java/io/sirix/node/json/ArrayNode.java | 7 +- .../sirix/node/json/JsonDocumentRootNode.java | 5 +- .../java/io/sirix/node/json/NullNode.java | 4 +- .../io/sirix/node/json/ObjectKeyNode.java | 7 +- .../java/io/sirix/node/json/ObjectNode.java | 7 +- .../xml/AbstractStructForwardingNode.java | 4 +- .../java/io/sirix/node/xml/AttributeNode.java | 6 +- .../java/io/sirix/node/xml/CommentNode.java | 6 +- .../java/io/sirix/node/xml/ElementNode.java | 19 +- .../java/io/sirix/node/xml/NamespaceNode.java | 6 +- .../main/java/io/sirix/node/xml/PINode.java | 7 +- .../main/java/io/sirix/node/xml/TextNode.java | 6 +- .../sirix/node/xml/XmlDocumentRootNode.java | 5 +- .../main/java/io/sirix/page/DeweyIDPage.java | 24 +- .../main/java/io/sirix/page/OverflowPage.java | 5 +- .../src/main/java/io/sirix/page/UberPage.java | 6 +- ...nMaxLevelMaxNodesMaxChildNodesVisitor.java | 4 +- .../trx/page/NodePageReadOnlyTrxTest.java | 5 +- .../json/shredder/JsonShredderTest.java | 3 +- .../json/SerializeVersionedJsonResource.java | 5 +- bundles/sirix-kotlin-api/build.gradle | 10 +- bundles/sirix-kotlin-cli/build.gradle | 7 +- .../walker/json/AbstractJsonPathWalker.java | 5 +- .../translator/DerefDescendantExpr.java | 5 +- .../io/sirix/query/function/jn/diff/Diff.java | 5 +- bundles/sirix-rest-api/build.gradle | 8 - .../kotlin/io/sirix/rest/crud/json/JsonGet.kt | 15 +- .../kotlin/io/sirix/rest/crud/xml/XmlGet.kt | 17 +- gradle/wrapper/gradle-wrapper.jar | Bin 58910 -> 63721 bytes gradle/wrapper/gradle-wrapper.properties | 4 +- gradlew | 282 +++++++++++------- gradlew.bat | 34 +-- libraries.gradle | 11 +- 68 files changed, 645 insertions(+), 380 deletions(-) create mode 100644 bundles/sirix-core/mylog-g1.log create mode 100644 bundles/sirix-core/mylog-g1.log.0 create mode 100644 bundles/sirix-core/mylog.log* create mode 100644 bundles/sirix-core/mylog.log*.0 diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 155e5fe8d..7e984d989 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -24,7 +24,7 @@ jobs: uses: actions/setup-java@v2 with: distribution: 'temurin' - java-version: '20' + java-version: '21' - uses: actions/cache@v3 with: path: | @@ -73,7 +73,7 @@ jobs: uses: actions/setup-java@v2 with: distribution: 'temurin' - java-version: '20' + java-version: '21' - name: Gradle deploy run: ./gradlew travisReleaseSnapshot --info - name: Login to Docker Hub diff --git a/README.md b/README.md index 559692864..a9884aed9 100644 --- a/README.md +++ b/README.md @@ -429,7 +429,7 @@ Articles published on Medium: ## Status SirixDB as of now has not been tested in production. It is recommended for experiments, testing, benchmarking, etc., but is not recommended for production usage. Let us know if you'd like to use SirixDB in production and get in touch. We'd like to test real-world datasets and fix issues we encounter along the way. -Please also get in touch if you like our vision and you want to sponsor us or help with man-power or if you want to use SirixDB as a research system. We'd be glad to get input from the database and scientific community. +Please also get in touch if you like our vision, and you want to sponsor us or help with man-power or if you want to use SirixDB as a research system. We'd be glad to get input from the database and scientific community. ## Getting started @@ -441,7 +441,7 @@ git clone https://github.com/sirixdb/sirix.git or use the following dependencies in your Maven or Gradle project. -**SirixDB uses Java 20, thus you need an up-to-date Gradle (if you want to work on SirixDB) and an IDE (for instance IntelliJ or Eclipse).** +**SirixDB uses Java 21, thus you need an up-to-date Gradle (if you want to work on SirixDB) and an IDE (for instance IntelliJ or Eclipse). Also make sure to use the provided Gradle wrapper.** ### Maven artifacts At this stage of development, you should use the latest SNAPSHOT artifacts from [the OSS snapshot repository](https://oss.sonatype.org/content/repositories/snapshots/io/sirix/) to get the most recent changes. @@ -533,7 +533,7 @@ You have to add the following JVM parameters currently: Plus we recommend using the Shenandoah GC or ZGC (if possible in the future the generational versions): ``` --XX:+UseShenandoahGC +-XX:+UseZGC -Xlog:gc -XX:+AlwaysPreTouch -XX:+UseLargePages @@ -541,7 +541,7 @@ Plus we recommend using the Shenandoah GC or ZGC (if possible in the future the -XX:+DisableExplicitGC ``` -We've also had tremendously good results using GraalVM, possibly due to its JIT compiler and the improved escape analysis. +We've also had perfect results using GraalVM, possibly due to its JIT compiler and the improved escape analysis. ### Setup of the SirixDB HTTP-Server and Keycloak to use the REST-API diff --git a/build.gradle b/build.gradle index 61ec6910e..3fbe08ca0 100644 --- a/build.gradle +++ b/build.gradle @@ -37,6 +37,10 @@ release { buildTasks = ['releaseBuild'] } +tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinJvmCompile).configureEach { + jvmTargetValidationMode.set(org.jetbrains.kotlin.gradle.dsl.jvm.JvmTargetValidationMode.WARNING) +} + task releaseBuild { project.afterEvaluate { dependsOn project.getTasksByName('build', true) @@ -86,20 +90,20 @@ subprojects { apply plugin: "com.diffplug.spotless" java { - sourceCompatibility = JavaVersion.VERSION_20 - targetCompatibility = JavaVersion.VERSION_20 + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 withSourcesJar() withJavadocJar() if (JavaVersion.current() != targetCompatibility) { - throw new GradleException(JavaVersion.current().toString()+ targetCompatibility.toString()) + throw new GradleException(JavaVersion.current().toString() + targetCompatibility.toString()) } } javadoc { failOnError = false options { - addStringOption('-release', '20') + addStringOption('-release', '21') addBooleanOption('-enable-preview', true) } } @@ -252,7 +256,10 @@ subprojects { "--add-opens=java.base/java.io=ALL-UNNAMED", "--add-opens=java.base/java.util=ALL-UNNAMED", "--add-opens=java.base/java.lang.reflect=ALL-UNNAMED", - // "-XX:+UseZGC", + "-XX:+UseZGC", + //"-XX:+ZGenerational", + "-Xlog:gc:zgc-generational-insert.log", + "-verbose:gc", "-XX:+UnlockExperimentalVMOptions", "-XX:+AlwaysPreTouch", "-XX:+UseLargePages", diff --git a/bundles/sirix-core/build.gradle b/bundles/sirix-core/build.gradle index 4f6f589f1..b39c2f172 100644 --- a/bundles/sirix-core/build.gradle +++ b/bundles/sirix-core/build.gradle @@ -22,7 +22,6 @@ dependencies { implementation implLibraries.snappyJava implementation implLibraries.browniesCollections - implementation implLibraries.chronicleMap implementation implLibraries.integercompression implementation implLibraries.chronicleBytes implementation implLibraries.fastObjectPool diff --git a/bundles/sirix-core/mylog-g1.log b/bundles/sirix-core/mylog-g1.log new file mode 100644 index 000000000..af7b2675c --- /dev/null +++ b/bundles/sirix-core/mylog-g1.log @@ -0,0 +1,39 @@ +[0.973s][info][gc] Using The Z Garbage Collector +[1,393s][info][gc] GC(0) Major Collection (Metadata GC Threshold) +[1,423s][info][gc] GC(0) Major Collection (Metadata GC Threshold) 82M(1%)->60M(1%) 0,029s +[2,892s][info][gc] GC(1) Major Collection (Warmup) +[2,998s][info][gc] GC(1) Major Collection (Warmup) 820M(10%)->318M(4%) 0,107s +[4,572s][info][gc] GC(2) Major Collection (Warmup) +[4,980s][info][gc] GC(2) Major Collection (Warmup) 1648M(20%)->1012M(12%) 0,408s +[6,061s][info][gc] GC(3) Major Collection (Warmup) +[6,115s][info][gc] GC(3) Major Collection (Warmup) 2460M(30%)->240M(3%) 0,054s +[7,491s][info][gc] GC(4) Minor Collection (Allocation Rate) +[7,562s][info][gc] GC(4) Minor Collection (Allocation Rate) 2748M(34%)->340M(4%) 0,071s +[9,108s][info][gc] GC(5) Minor Collection (Allocation Rate) +[9,137s][info][gc] GC(5) Minor Collection (Allocation Rate) 3046M(37%)->144M(2%) 0,029s +[13,045s][info][gc] GC(6) Minor Collection (Allocation Rate) +[13,289s][info][gc] GC(6) Minor Collection (Allocation Rate) 6174M(75%)->1428M(17%) 0,244s +[16,120s][info][gc] GC(7) Minor Collection (Allocation Rate) +[16,317s][info][gc] GC(7) Minor Collection (Allocation Rate) 6054M(74%)->1432M(17%) 0,196s +[18,532s][info][gc] GC(8) Minor Collection (Allocation Rate) +[18,922s][info][gc] GC(8) Minor Collection (Allocation Rate) 4850M(59%)->1612M(20%) 0,390s +[21,376s][info][gc] GC(9) Minor Collection (Allocation Rate) +[21,584s][info][gc] GC(9) Minor Collection (Allocation Rate) 5780M(71%)->674M(8%) 0,208s +[24,616s][info][gc] GC(10) Minor Collection (Allocation Rate) +[24,915s][info][gc] GC(10) Minor Collection (Allocation Rate) 5950M(73%)->1450M(18%) 0,298s +[27,916s][info][gc] GC(11) Minor Collection (Allocation Rate) +[28,363s][info][gc] GC(11) Minor Collection (Allocation Rate) 6362M(78%)->1550M(19%) 0,447s +[30,709s][info][gc] GC(12) Major Collection (Allocation Rate) +[30,986s][info][gc] GC(12) Major Collection (Allocation Rate) 5606M(68%)->750M(9%) 0,278s +[33,733s][info][gc] GC(13) Minor Collection (Allocation Rate) +[33,970s][info][gc] GC(13) Minor Collection (Allocation Rate) 5770M(70%)->752M(9%) 0,237s +[37,170s][info][gc] GC(14) Minor Collection (Allocation Rate) +[37,666s][info][gc] GC(14) Minor Collection (Allocation Rate) 6502M(79%)->1568M(19%) 0,496s +[39,525s][info][gc] GC(15) Minor Collection (Allocation Rate) +[40,029s][info][gc] GC(15) Minor Collection (Allocation Rate) 5082M(62%)->1514M(18%) 0,504s +[42,186s][info][gc] GC(16) Minor Collection (Allocation Rate) +[42,405s][info][gc] GC(16) Minor Collection (Allocation Rate) 5318M(65%)->566M(7%) 0,219s +[45,250s][info][gc] GC(17) Minor Collection (Allocation Rate) +[45,763s][info][gc] GC(17) Minor Collection (Allocation Rate) 5460M(67%)->1390M(17%) 0,514s +[47,980s][info][gc] GC(18) Minor Collection (Allocation Rate) +[48,083s][info][gc] GC(18) Minor Collection (Allocation Rate) 5076M(62%)->260M(3%) 0,102s diff --git a/bundles/sirix-core/mylog-g1.log.0 b/bundles/sirix-core/mylog-g1.log.0 new file mode 100644 index 000000000..8aae46f34 --- /dev/null +++ b/bundles/sirix-core/mylog-g1.log.0 @@ -0,0 +1,105 @@ +[0.003s][info][gc] Using G1 +[0,980s][info][gc] GC(0) Pause Young (Concurrent Start) (Metadata GC Threshold) 121M->17M(5128M) 3,254ms +[0,980s][info][gc] GC(1) Concurrent Mark Cycle +[0,984s][info][gc] GC(1) Pause Remark 21M->21M(5120M) 1,056ms +[0,984s][info][gc] GC(1) Pause Cleanup 21M->21M(5120M) 0,005ms +[0,986s][info][gc] GC(1) Concurrent Mark Cycle 6,080ms +[1,362s][info][gc] GC(2) Pause Young (Normal) (G1 Evacuation Pause) 257M->71M(5120M) 9,946ms +[1,537s][info][gc] GC(3) Pause Young (Normal) (G1 Evacuation Pause) 295M->128M(5120M) 10,436ms +[1,711s][info][gc] GC(4) Pause Young (Normal) (G1 Evacuation Pause) 352M->189M(5120M) 9,897ms +[1,885s][info][gc] GC(5) Pause Young (Normal) (G1 Evacuation Pause) 413M->248M(5120M) 9,162ms +[2,056s][info][gc] GC(6) Pause Young (Normal) (G1 Evacuation Pause) 472M->307M(5120M) 9,087ms +[2,225s][info][gc] GC(7) Pause Young (Normal) (G1 Evacuation Pause) 531M->366M(5120M) 9,266ms +[2,397s][info][gc] GC(8) Pause Young (Normal) (G1 Evacuation Pause) 594M->427M(5120M) 10,830ms +[2,692s][info][gc] GC(9) Pause Young (Normal) (G1 Evacuation Pause) 695M->483M(5120M) 7,991ms +[2,828s][info][gc] GC(10) Pause Young (Normal) (G1 Evacuation Pause) 731M->532M(5120M) 6,947ms +[3,078s][info][gc] GC(11) Pause Young (Normal) (G1 Evacuation Pause) 752M->577M(5120M) 7,818ms +[3,494s][info][gc] GC(12) Pause Young (Normal) (GCLocker Initiated GC) 1209M->973M(5120M) 36,638ms +[3,632s][info][gc] GC(13) Pause Young (Normal) (G1 Evacuation Pause) 1321M->1051M(5120M) 11,872ms +[3,778s][info][gc] GC(14) Pause Young (Normal) (G1 Evacuation Pause) 1251M->1107M(5120M) 11,161ms +[4,079s][info][gc] GC(15) Pause Young (Normal) (GCLocker Initiated GC) 1741M->1499M(5120M) 34,050ms +[4,151s][info][gc] GC(16) Pause Young (Normal) (G1 Evacuation Pause) 1903M->1461M(5120M) 3,824ms +[4,545s][info][gc] GC(17) Pause Young (Normal) (G1 Evacuation Pause) 2321M->1951M(5120M) 41,680ms +[4,911s][info][gc] GC(18) Pause Young (Normal) (G1 Evacuation Pause) 2651M->2189M(5292M) 42,354ms +[5,139s][info][gc] GC(19) Pause Young (Normal) (G1 Evacuation Pause) 2997M->2203M(5292M) 9,242ms +[5,711s][info][gc] GC(20) Pause Young (Normal) (G1 Evacuation Pause) 3551M->2358M(5292M) 20,688ms +[6,434s][info][gc] GC(21) Pause Young (Normal) (G1 Evacuation Pause) 4374M->2263M(5292M) 8,720ms +[7,231s][info][gc] GC(22) Pause Young (Normal) (GCLocker Initiated GC) 4409M->2775M(5292M) 44,969ms +[7,813s][info][gc] GC(23) Pause Young (Concurrent Start) (G1 Evacuation Pause) 4279M->2737M(5292M) 17,837ms +[7,813s][info][gc] GC(24) Concurrent Mark Cycle +[7,832s][info][gc] GC(24) Pause Remark 2763M->883M(5120M) 3,148ms +[7,839s][info][gc] GC(24) Pause Cleanup 895M->895M(5120M) 0,235ms +[7,842s][info][gc] GC(24) Concurrent Mark Cycle 28,924ms +[8,478s][info][gc] GC(25) Pause Young (Prepare Mixed) (GCLocker Initiated GC) 2501M->1167M(5120M) 40,351ms +[9,445s][info][gc] GC(26) Pause Young (Mixed) (G1 Evacuation Pause) 4011M->781M(5120M) 11,172ms +[10,516s][info][gc] GC(27) Pause Young (Normal) (GCLocker Initiated GC) 3755M->1167M(5120M) 42,982ms +[11,367s][info][gc] GC(28) Pause Young (Normal) (G1 Evacuation Pause) 3855M->863M(5120M) 6,283ms +[12,462s][info][gc] GC(29) Pause Young (Normal) (GCLocker Initiated GC) 3903M->1315M(5120M) 40,311ms +[13,282s][info][gc] GC(30) Pause Young (Normal) (G1 Evacuation Pause) 4003M->1142M(5120M) 15,003ms +[14,402s][info][gc] GC(31) Pause Young (Normal) (GCLocker Initiated GC) 4049M->1424M(5120M) 41,415ms +[15,224s][info][gc] GC(32) Pause Young (Normal) (GCLocker Initiated GC) 4096M->1606M(5120M) 45,978ms +[16,039s][info][gc] GC(33) Pause Young (Normal) (GCLocker Initiated GC) 3930M->1799M(5120M) 48,008ms +[16,829s][info][gc] GC(34) Pause Young (Normal) (GCLocker Initiated GC) 3839M->1983M(5120M) 43,373ms +[17,512s][info][gc] GC(35) Pause Young (Normal) (G1 Evacuation Pause) 3823M->2021M(5120M) 29,316ms +[18,060s][info][gc] GC(36) Pause Young (Normal) (GCLocker Initiated GC) 3865M->2349M(5120M) 50,831ms +[18,670s][info][gc] GC(37) Pause Young (Normal) (G1 Evacuation Pause) 3761M->2343M(5120M) 22,463ms +[19,279s][info][gc] GC(38) Pause Young (Normal) (GCLocker Initiated GC) 3915M->2615M(5120M) 38,648ms +[19,726s][info][gc] GC(39) Pause Young (Concurrent Start) (GCLocker Initiated GC) 3867M->2909M(5120M) 51,186ms +[19,727s][info][gc] GC(40) Concurrent Mark Cycle +[19,773s][info][gc] GC(40) Pause Remark 3237M->1361M(5120M) 3,444ms +[19,846s][info][gc] GC(40) Pause Cleanup 1453M->1453M(5120M) 0,223ms +[19,850s][info][gc] GC(40) Concurrent Mark Cycle 122,961ms +[20,157s][info][gc] GC(41) Pause Young (Prepare Mixed) (G1 Evacuation Pause) 2009M->1331M(5120M) 40,130ms +[20,969s][info][gc] GC(42) Pause Young (Mixed) (GCLocker Initiated GC) 3807M->1477M(5120M) 43,622ms +[21,771s][info][gc] GC(43) Pause Young (Normal) (GCLocker Initiated GC) 3804M->1703M(5120M) 48,887ms +[22,566s][info][gc] GC(44) Pause Young (Normal) (GCLocker Initiated GC) 3810M->1871M(5120M) 42,168ms +[23,200s][info][gc] GC(45) Pause Young (Normal) (G1 Evacuation Pause) 3831M->1877M(5120M) 24,469ms +[23,877s][info][gc] GC(46) Pause Young (Normal) (G1 Evacuation Pause) 3913M->1690M(5120M) 5,003ms +[24,715s][info][gc] GC(47) Pause Young (Normal) (G1 Evacuation Pause) 4118M->1792M(5120M) 14,668ms +[25,562s][info][gc] GC(48) Pause Young (Normal) (G1 Evacuation Pause) 4240M->1910M(5120M) 25,489ms +[26,368s][info][gc] GC(49) Pause Young (Normal) (G1 Evacuation Pause) 4258M->1946M(5120M) 27,244ms +[27,159s][info][gc] GC(50) Pause Young (Normal) (G1 Evacuation Pause) 4258M->1952M(5120M) 27,876ms +[27,948s][info][gc] GC(51) Pause Young (Normal) (G1 Evacuation Pause) 4260M->1962M(5120M) 29,171ms +[28,732s][info][gc] GC(52) Pause Young (Normal) (G1 Evacuation Pause) 4262M->1965M(5120M) 29,034ms +[29,529s][info][gc] GC(53) Pause Young (Normal) (G1 Evacuation Pause) 4273M->2016M(5120M) 34,784ms +[30,284s][info][gc] GC(54) Pause Young (Normal) (G1 Evacuation Pause) 4268M->2057M(5120M) 29,615ms +[31,045s][info][gc] GC(55) Pause Young (Normal) (G1 Evacuation Pause) 4289M->2018M(5120M) 22,963ms +[31,836s][info][gc] GC(56) Pause Young (Normal) (G1 Evacuation Pause) 4330M->2024M(5120M) 23,730ms +[32,629s][info][gc] GC(57) Pause Young (Normal) (G1 Evacuation Pause) 4368M->2065M(5120M) 26,511ms +[33,418s][info][gc] GC(58) Pause Young (Normal) (G1 Evacuation Pause) 4381M->2081M(5120M) 27,315ms +[34,194s][info][gc] GC(59) Pause Young (Normal) (G1 Evacuation Pause) 4381M->2081M(5120M) 27,416ms +[34,977s][info][gc] GC(60) Pause Young (Normal) (G1 Evacuation Pause) 4381M->2087M(5120M) 27,299ms +[35,759s][info][gc] GC(61) Pause Young (Normal) (G1 Evacuation Pause) 4383M->2081M(5120M) 28,294ms +[36,566s][info][gc] GC(62) Pause Young (Normal) (G1 Evacuation Pause) 4393M->2093M(5120M) 30,341ms +[37,333s][info][gc] GC(63) Pause Young (Normal) (G1 Evacuation Pause) 4389M->2089M(5120M) 28,163ms +[38,116s][info][gc] GC(64) Pause Young (Normal) (G1 Evacuation Pause) 4389M->2091M(5120M) 30,188ms +[38,877s][info][gc] GC(65) Pause Young (Normal) (G1 Evacuation Pause) 4387M->2089M(5120M) 28,268ms +[39,645s][info][gc] GC(66) Pause Young (Normal) (G1 Evacuation Pause) 4393M->2091M(5120M) 29,065ms +[40,405s][info][gc] GC(67) Pause Young (Normal) (G1 Evacuation Pause) 4391M->2093M(5120M) 30,542ms +[41,191s][info][gc] GC(68) Pause Young (Normal) (G1 Evacuation Pause) 4393M->2135M(5120M) 30,693ms +[41,943s][info][gc] GC(69) Pause Young (Normal) (G1 Evacuation Pause) 4379M->2161M(5120M) 29,520ms +[42,676s][info][gc] GC(70) Pause Young (Normal) (G1 Evacuation Pause) 4389M->2127M(5120M) 21,362ms +[43,450s][info][gc] GC(71) Pause Young (Normal) (G1 Evacuation Pause) 4411M->2113M(5120M) 20,055ms +[44,244s][info][gc] GC(72) Pause Young (Normal) (G1 Evacuation Pause) 4453M->2146M(5120M) 22,461ms +[45,045s][info][gc] GC(73) Pause Young (Normal) (G1 Evacuation Pause) 4470M->2162M(5120M) 25,420ms +[45,836s][info][gc] GC(74) Pause Young (Normal) (G1 Evacuation Pause) 4470M->2174M(5120M) 25,311ms +[46,612s][info][gc] GC(75) Pause Young (Normal) (G1 Evacuation Pause) 4466M->2170M(5120M) 25,172ms +[47,392s][info][gc] GC(76) Pause Young (Normal) (G1 Evacuation Pause) 4470M->2176M(5120M) 25,985ms +[48,180s][info][gc] GC(77) Pause Young (Normal) (G1 Evacuation Pause) 4472M->2174M(5120M) 25,974ms +[48,959s][info][gc] GC(78) Pause Young (Normal) (G1 Evacuation Pause) 4470M->2170M(5120M) 25,453ms +[49,727s][info][gc] GC(79) Pause Young (Normal) (G1 Evacuation Pause) 4474M->2182M(5120M) 26,077ms +[50,519s][info][gc] GC(80) Pause Young (Normal) (G1 Evacuation Pause) 4466M->2172M(5120M) 26,477ms +[51,297s][info][gc] GC(81) Pause Young (Normal) (G1 Evacuation Pause) 4472M->2172M(5120M) 24,930ms +[52,067s][info][gc] GC(82) Pause Young (Normal) (G1 Evacuation Pause) 4476M->2178M(5120M) 25,553ms +[52,828s][info][gc] GC(83) Pause Young (Normal) (G1 Evacuation Pause) 4474M->2180M(5120M) 31,466ms +[53,619s][info][gc] GC(84) Pause Young (Normal) (G1 Evacuation Pause) 4476M->2178M(5120M) 32,882ms +[54,441s][info][gc] GC(85) Pause Young (Normal) (G1 Evacuation Pause) 4474M->2176M(5120M) 30,771ms +[55,231s][info][gc] GC(86) Pause Young (Normal) (G1 Evacuation Pause) 4480M->2176M(5120M) 27,639ms +[56,039s][info][gc] GC(87) Pause Young (Normal) (G1 Evacuation Pause) 4480M->2178M(5120M) 32,953ms +[56,839s][info][gc] GC(88) Pause Young (Normal) (G1 Evacuation Pause) 4478M->2174M(5120M) 25,874ms +[57,648s][info][gc] GC(89) Pause Young (Normal) (G1 Evacuation Pause) 4482M->2184M(5120M) 33,768ms +[58,426s][info][gc] GC(90) Pause Young (Normal) (G1 Evacuation Pause) 4480M->2174M(5120M) 25,911ms +[59,235s][info][gc] GC(91) Pause Young (Normal) (G1 Evacuation Pause) 4482M->2178M(5120M) 25,922ms +[60,021s][info][gc] GC(92) Pause Young (Normal) (G1 Evacuation Pause) 4478M->2180M(5120M) 32,688ms +[60,827s][info][gc] GC(93) Pause Young (Normal) (G1 Evacuation Pause) 4480M->2174M(5120M) 30,890ms +[61,605s][info][gc] GC(94) Pause Young (Normal) (G1 Evacuation Pause) 4478M->2170M(5120M) 26,621ms diff --git a/bundles/sirix-core/mylog.log* b/bundles/sirix-core/mylog.log* new file mode 100644 index 000000000..c78ab068d --- /dev/null +++ b/bundles/sirix-core/mylog.log* @@ -0,0 +1,48 @@ +[1.363s][info][gc] Using The Z Garbage Collector +[1,832s][info][gc] GC(0) Garbage Collection (Metadata GC Threshold) 92M(1%)->60M(1%) +[2,747s][info][gc] GC(1) Garbage Collection (Warmup) 1028M(13%)->592M(7%) +[3,255s][info][gc] GC(2) Garbage Collection (Warmup) 1882M(23%)->616M(8%) +[4,059s][info][gc] GC(3) Garbage Collection (Warmup) 2658M(32%)->596M(7%) +[6,665s][info][gc] GC(4) Garbage Collection (Allocation Rate) 5828M(71%)->1312M(16%) +[6,837s][info][gc] GC(5) Garbage Collection (Allocation Rate) 1352M(17%)->738M(9%) +[9,350s][info][gc] GC(6) Garbage Collection (Allocation Rate) 6230M(76%)->1252M(15%) +[11,740s][info][gc] GC(7) Garbage Collection (Allocation Rate) 6588M(80%)->1220M(15%) +[14,132s][info][gc] GC(8) Garbage Collection (Allocation Rate) 6406M(78%)->1434M(18%) +[16,427s][info][gc] GC(9) Garbage Collection (Allocation Rate) 6368M(78%)->1480M(18%) +[18,736s][info][gc] GC(10) Garbage Collection (Allocation Rate) 6580M(80%)->1404M(17%) +[21,109s][info][gc] GC(11) Garbage Collection (Allocation Rate) 6784M(83%)->1298M(16%) +[23,526s][info][gc] GC(12) Garbage Collection (Allocation Rate) 6678M(82%)->1462M(18%) +[25,828s][info][gc] GC(13) Garbage Collection (Allocation Rate) 6544M(80%)->1474M(18%) +[28,119s][info][gc] GC(14) Garbage Collection (Allocation Rate) 6606M(81%)->1464M(18%) +[30,411s][info][gc] GC(15) Garbage Collection (Allocation Rate) 6626M(81%)->1414M(17%) +[32,818s][info][gc] GC(16) Garbage Collection (Allocation Rate) 6878M(84%)->1350M(16%) +[35,217s][info][gc] GC(17) Garbage Collection (Allocation Rate) 6786M(83%)->1442M(18%) +[37,531s][info][gc] GC(18) Garbage Collection (Allocation Rate) 6586M(80%)->1490M(18%) +[39,803s][info][gc] GC(19) Garbage Collection (Allocation Rate) 6694M(82%)->1436M(18%) +[42,122s][info][gc] GC(20) Garbage Collection (Allocation Rate) 6722M(82%)->1496M(18%) +[44,424s][info][gc] GC(21) Garbage Collection (Allocation Rate) 6720M(82%)->1488M(18%) +[46,725s][info][gc] GC(22) Garbage Collection (Allocation Rate) 6694M(82%)->1484M(18%) +[49,018s][info][gc] GC(23) Garbage Collection (Allocation Rate) 6690M(82%)->1464M(18%) +[51,346s][info][gc] GC(24) Garbage Collection (Allocation Rate) 6686M(82%)->1454M(18%) +[53,725s][info][gc] GC(25) Garbage Collection (Allocation Rate) 6564M(80%)->1478M(18%) +[56,119s][info][gc] GC(26) Garbage Collection (Allocation Rate) 6792M(83%)->1438M(18%) +[58,532s][info][gc] GC(27) Garbage Collection (Allocation Rate) 6764M(83%)->1472M(18%) +[60,915s][info][gc] GC(28) Garbage Collection (Allocation Rate) 6770M(83%)->1452M(18%) +[63,338s][info][gc] GC(29) Garbage Collection (Allocation Rate) 6754M(82%)->1472M(18%) +[65,726s][info][gc] GC(30) Garbage Collection (Allocation Rate) 6688M(82%)->1454M(18%) +[68,159s][info][gc] GC(31) Garbage Collection (Allocation Rate) 6738M(82%)->1554M(19%) +[70,450s][info][gc] GC(32) Garbage Collection (Allocation Rate) 6520M(80%)->1568M(19%) +[72,755s][info][gc] GC(33) Garbage Collection (Allocation Rate) 6546M(80%)->1546M(19%) +[75,156s][info][gc] GC(34) Garbage Collection (Allocation Rate) 6788M(83%)->1536M(19%) +[77,541s][info][gc] GC(35) Garbage Collection (Allocation Rate) 6784M(83%)->1514M(18%) +[79,839s][info][gc] GC(36) Garbage Collection (Allocation Rate) 6532M(80%)->1520M(19%) +[82,244s][info][gc] GC(37) Garbage Collection (Allocation Rate) 6812M(83%)->1526M(19%) +[84,640s][info][gc] GC(38) Garbage Collection (Allocation Rate) 6802M(83%)->1508M(18%) +[87,042s][info][gc] GC(39) Garbage Collection (Allocation Rate) 6782M(83%)->1538M(19%) +[89,462s][info][gc] GC(40) Garbage Collection (Allocation Rate) 6734M(82%)->1586M(19%) +[91,851s][info][gc] GC(41) Garbage Collection (Allocation Rate) 6736M(82%)->1526M(19%) +[94,255s][info][gc] GC(42) Garbage Collection (Allocation Rate) 6758M(82%)->1558M(19%) +[96,661s][info][gc] GC(43) Garbage Collection (Allocation Rate) 6738M(82%)->1576M(19%) +[99,030s][info][gc] GC(44) Garbage Collection (Allocation Rate) 6712M(82%)->1532M(19%) +[101,354s][info][gc] GC(45) Garbage Collection (Allocation Rate) 6556M(80%)->1572M(19%) +[103,655s][info][gc] GC(46) Garbage Collection (Allocation Rate) 6546M(80%)->1588M(19%) diff --git a/bundles/sirix-core/mylog.log*.0 b/bundles/sirix-core/mylog.log*.0 new file mode 100644 index 000000000..d2efd317b --- /dev/null +++ b/bundles/sirix-core/mylog.log*.0 @@ -0,0 +1,38 @@ +[1.369s][info][gc] Using The Z Garbage Collector +[1,760s][info][gc] GC(0) Garbage Collection (Metadata GC Threshold) 86M(1%)->58M(1%) +[2,885s][info][gc] GC(1) Garbage Collection (Warmup) 902M(11%)->406M(5%) +[4,038s][info][gc] GC(2) Garbage Collection (Warmup) 1788M(22%)->792M(10%) +[4,958s][info][gc] GC(3) Garbage Collection (Warmup) 2550M(31%)->692M(8%) +[6,356s][info][gc] GC(4) Garbage Collection (Allocation Rate) 5226M(64%)->282M(3%) +[7,934s][info][gc] GC(5) Garbage Collection (Allocation Rate) 5306M(65%)->714M(9%) +[9,804s][info][gc] GC(6) Garbage Collection (Allocation Rate) 6086M(74%)->468M(6%) +[11,408s][info][gc] GC(7) Garbage Collection (Allocation Rate) 5408M(66%)->480M(6%) +[13,249s][info][gc] GC(8) Garbage Collection (Allocation Rate) 6424M(78%)->670M(8%) +[15,202s][info][gc] GC(9) Garbage Collection (Allocation Rate) 6402M(78%)->1398M(17%) +[16,803s][info][gc] GC(10) Garbage Collection (Allocation Rate) 6346M(77%)->582M(7%) +[18,378s][info][gc] GC(11) Garbage Collection (Allocation Rate) 5638M(69%)->340M(4%) +[20,295s][info][gc] GC(12) Garbage Collection (Allocation Rate) 5800M(71%)->1740M(21%) +[21,387s][info][gc] GC(13) Garbage Collection (Allocation Rate) 5336M(65%)->398M(5%) +[23,139s][info][gc] GC(14) Garbage Collection (Allocation Rate) 5666M(69%)->1448M(18%) +[24,807s][info][gc] GC(15) Garbage Collection (Allocation Rate) 5894M(72%)->1788M(22%) +[26,120s][info][gc] GC(16) Garbage Collection (Allocation Rate) 5574M(68%)->1362M(17%) +[27,651s][info][gc] GC(17) Garbage Collection (Allocation Rate) 6514M(80%)->246M(3%) +[29,820s][info][gc] GC(18) Garbage Collection (Allocation Rate) 7088M(87%)->644M(8%) +[31,712s][info][gc] GC(19) Garbage Collection (Allocation Rate) 6914M(84%)->696M(8%) +[33,346s][info][gc] GC(20) Garbage Collection (Allocation Rate) 6526M(80%)->172M(2%) +[35,427s][info][gc] GC(21) Garbage Collection (Allocation Rate) 6006M(73%)->1828M(22%) +[36,364s][info][gc] GC(22) Garbage Collection (Allocation Rate) 5162M(63%)->284M(3%) +[38,182s][info][gc] GC(23) Garbage Collection (Allocation Rate) 5706M(70%)->794M(10%) +[39,820s][info][gc] GC(24) Garbage Collection (Allocation Rate) 6532M(80%)->134M(2%) +[41,879s][info][gc] GC(25) Garbage Collection (Allocation Rate) 6614M(81%)->304M(4%) +[44,286s][info][gc] GC(26) Garbage Collection (Allocation Rate) 6970M(85%)->1352M(17%) +[45,578s][info][gc] GC(27) Garbage Collection (Allocation Rate) 5316M(65%)->322M(4%) +[47,618s][info][gc] GC(28) Garbage Collection (Allocation Rate) 5986M(73%)->1798M(22%) +[48,672s][info][gc] GC(29) Garbage Collection (Allocation Rate) 5236M(64%)->300M(4%) +[50,541s][info][gc] GC(30) Garbage Collection (Allocation Rate) 5664M(69%)->1456M(18%) +[52,179s][info][gc] GC(31) Garbage Collection (Allocation Rate) 5818M(71%)->1662M(20%) +[53,793s][info][gc] GC(32) Garbage Collection (Allocation Rate) 6030M(74%)->1658M(20%) +[55,137s][info][gc] GC(33) Garbage Collection (Allocation Rate) 6360M(78%)->246M(3%) +[57,028s][info][gc] GC(34) Garbage Collection (Allocation Rate) 5786M(71%)->1408M(17%) +[58,697s][info][gc] GC(35) Garbage Collection (Allocation Rate) 5872M(72%)->1764M(22%) +[60,161s][info][gc] GC(36) Garbage Collection (Allocation Rate) 5790M(71%)->1602M(20%) diff --git a/bundles/sirix-core/src/main/java/io/sirix/access/ResourceConfiguration.java b/bundles/sirix-core/src/main/java/io/sirix/access/ResourceConfiguration.java index 17fe5ac86..55f196c15 100644 --- a/bundles/sirix-core/src/main/java/io/sirix/access/ResourceConfiguration.java +++ b/bundles/sirix-core/src/main/java/io/sirix/access/ResourceConfiguration.java @@ -169,8 +169,8 @@ public static int compareStructure(final Path file) { /** * Standard storage. */ - private static final StorageType STORAGE = - OS.isWindows() ? StorageType.FILE_CHANNEL : OS.is64Bit() ? StorageType.MEMORY_MAPPED : StorageType.FILE_CHANNEL; + private static final StorageType STORAGE = StorageType.IO_URING; + //OS.isWindows() ? StorageType.FILE_CHANNEL : OS.is64Bit() ? StorageType.MEMORY_MAPPED : StorageType.FILE_CHANNEL; /** * Standard versioning approach. diff --git a/bundles/sirix-core/src/main/java/io/sirix/access/trx/node/PotentialLock.java b/bundles/sirix-core/src/main/java/io/sirix/access/trx/node/PotentialLock.java index 5259e817e..acb6ea977 100644 --- a/bundles/sirix-core/src/main/java/io/sirix/access/trx/node/PotentialLock.java +++ b/bundles/sirix-core/src/main/java/io/sirix/access/trx/node/PotentialLock.java @@ -1,6 +1,8 @@ package io.sirix.access.trx.node; -import org.jetbrains.annotations.NotNull; + + +import org.checkerframework.checker.nullness.qual.NonNull; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Condition; @@ -39,7 +41,7 @@ public boolean tryLock() { } @Override - public boolean tryLock(long time, @NotNull TimeUnit unit) throws InterruptedException { + public boolean tryLock(long time, @NonNull TimeUnit unit) throws InterruptedException { if (lock != null) { return lock.tryLock(time, unit); } @@ -53,6 +55,7 @@ public void unlock() { } } + @NonNull @Override public Condition newCondition() { if (lock != null) { diff --git a/bundles/sirix-core/src/main/java/io/sirix/access/trx/page/AbstractForwardingPageWriteTrx.java b/bundles/sirix-core/src/main/java/io/sirix/access/trx/page/AbstractForwardingPageWriteTrx.java index 55724cda1..bab2a4cdf 100644 --- a/bundles/sirix-core/src/main/java/io/sirix/access/trx/page/AbstractForwardingPageWriteTrx.java +++ b/bundles/sirix-core/src/main/java/io/sirix/access/trx/page/AbstractForwardingPageWriteTrx.java @@ -9,7 +9,6 @@ import io.sirix.node.interfaces.DataRecord; import org.checkerframework.checker.index.qual.NonNegative; import org.checkerframework.checker.nullness.qual.NonNull; -import org.jetbrains.annotations.NotNull; /** * Forwards all methods to the delegate. @@ -67,5 +66,5 @@ public void commit(PageReference reference) { } @Override - protected abstract @NotNull PageTrx delegate(); + protected abstract @NonNull PageTrx delegate(); } diff --git a/bundles/sirix-core/src/main/java/io/sirix/access/trx/page/NodePageReadOnlyTrx.java b/bundles/sirix-core/src/main/java/io/sirix/access/trx/page/NodePageReadOnlyTrx.java index e79b83f54..1a6da5ed4 100644 --- a/bundles/sirix-core/src/main/java/io/sirix/access/trx/page/NodePageReadOnlyTrx.java +++ b/bundles/sirix-core/src/main/java/io/sirix/access/trx/page/NodePageReadOnlyTrx.java @@ -48,7 +48,6 @@ import org.checkerframework.checker.index.qual.NonNegative; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; -import org.jetbrains.annotations.NotNull; import java.nio.ByteBuffer; import java.util.ArrayList; @@ -485,7 +484,7 @@ private boolean isSecondMostRecentlyReadPage(IndexLogKey indexLogKey) { } @Nullable - private Page getFromBufferManager(@NotNull IndexLogKey indexLogKey, PageReference pageReferenceToRecordPage) { + private Page getFromBufferManager(@NonNull IndexLogKey indexLogKey, PageReference pageReferenceToRecordPage) { //if (trxIntentLog == null) { final Page recordPageFromBuffer = resourceBufferManager.getRecordPageCache().get(pageReferenceToRecordPage); @@ -498,7 +497,7 @@ private Page getFromBufferManager(@NotNull IndexLogKey indexLogKey, PageReferenc return null; } - private void setMostRecentlyReadRecordPage(@NotNull IndexLogKey indexLogKey, Page recordPageFromBuffer) { + private void setMostRecentlyReadRecordPage(@NonNull IndexLogKey indexLogKey, Page recordPageFromBuffer) { if (indexLogKey.getIndexType() == IndexType.PATH_SUMMARY) { pathSummaryRecordPage = new RecordPage(indexLogKey.getIndexNumber(), indexLogKey.getIndexType(), @@ -516,7 +515,7 @@ private void setMostRecentlyReadRecordPage(@NotNull IndexLogKey indexLogKey, Pag } @Nullable - private Page loadDataPageFromDurableStorageAndCombinePageFragments(@NotNull IndexLogKey indexLogKey, + private Page loadDataPageFromDurableStorageAndCombinePageFragments(@NonNull IndexLogKey indexLogKey, PageReference pageReferenceToRecordPage) { // Load list of page "fragments" from persistent storage. final List> pages = getPageFragments(pageReferenceToRecordPage); @@ -539,8 +538,8 @@ private Page loadDataPageFromDurableStorageAndCombinePageFragments(@NotNull Inde } @Nullable - private Page getInMemoryPageInstance(@NotNull IndexLogKey indexLogKey, - @NotNull PageReference pageReferenceToRecordPage) { + private Page getInMemoryPageInstance(@NonNull IndexLogKey indexLogKey, + @NonNull PageReference pageReferenceToRecordPage) { Page page = pageReferenceToRecordPage.getPage(); if (page != null) { diff --git a/bundles/sirix-core/src/main/java/io/sirix/access/trx/page/NodePageTrx.java b/bundles/sirix-core/src/main/java/io/sirix/access/trx/page/NodePageTrx.java index f169bd1df..66dc5c8d4 100644 --- a/bundles/sirix-core/src/main/java/io/sirix/access/trx/page/NodePageTrx.java +++ b/bundles/sirix-core/src/main/java/io/sirix/access/trx/page/NodePageTrx.java @@ -49,7 +49,6 @@ import org.checkerframework.checker.index.qual.NonNegative; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; -import org.jetbrains.annotations.NotNull; import java.io.IOException; import java.io.OutputStream; @@ -410,7 +409,7 @@ public UberPage commit(@Nullable final String commitMessage, @Nullable final Ins return readUberPage(); } - private void setCommitMessageAndTimestampIfRequired(@org.jetbrains.annotations.Nullable String commitMessage, + private void setCommitMessageAndTimestampIfRequired(@Nullable String commitMessage, @Nullable Instant commitTimestamp) { if (commitMessage != null) { newRevisionRootPage.setCommitMessage(commitMessage); @@ -443,6 +442,7 @@ private void parallelSerializationOfKeyValuePages() { .forEach(page -> { final Bytes bytes = Bytes.elasticByteBuffer(60_000); PageKind.KEYVALUELEAFPAGE.serializePage(this, bytes, page, SerializationType.DATA); + bytes.clear(); }); } @@ -647,7 +647,7 @@ public RevisionRootPage getActualRevisionRootPage() { } @Override - protected @NotNull PageReadOnlyTrx delegate() { + protected @NonNull PageReadOnlyTrx delegate() { return pageRtx; } diff --git a/bundles/sirix-core/src/main/java/io/sirix/axis/visitor/VisitorDescendantAxis.java b/bundles/sirix-core/src/main/java/io/sirix/axis/visitor/VisitorDescendantAxis.java index a312b2f30..d9098e274 100644 --- a/bundles/sirix-core/src/main/java/io/sirix/axis/visitor/VisitorDescendantAxis.java +++ b/bundles/sirix-core/src/main/java/io/sirix/axis/visitor/VisitorDescendantAxis.java @@ -30,7 +30,7 @@ import io.sirix.axis.IncludeSelf; import io.sirix.settings.Fixed; import org.checkerframework.checker.index.qual.NonNegative; -import org.jetbrains.annotations.Nullable; +import org.checkerframework.checker.nullness.qual.Nullable; import java.util.ArrayDeque; import java.util.Deque; @@ -204,7 +204,7 @@ else if (getTrx() instanceof JsonNodeReadOnlyTrx) @Nullable private long nextSiblingNodeKeyIfAvailable(VisitResult result, final NodeCursor cursor) { - if (rightSiblingKeyStack.size() > 0) { + if (!rightSiblingKeyStack.isEmpty()) { final var nextKey = rightSiblingKeyStack.pop(); final var nextNodeKey = getNextNodeKey(nextKey, cursor.getNodeKey()); diff --git a/bundles/sirix-core/src/main/java/io/sirix/index/path/summary/PathNode.java b/bundles/sirix-core/src/main/java/io/sirix/index/path/summary/PathNode.java index 508c4274d..4e3c1bf59 100644 --- a/bundles/sirix-core/src/main/java/io/sirix/index/path/summary/PathNode.java +++ b/bundles/sirix-core/src/main/java/io/sirix/index/path/summary/PathNode.java @@ -12,7 +12,6 @@ import org.checkerframework.checker.index.qual.NonNegative; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; -import org.jetbrains.annotations.NotNull; import io.sirix.node.xml.AbstractStructForwardingNode; import static com.google.common.base.Preconditions.checkArgument; @@ -210,7 +209,7 @@ protected StructNodeDelegate structDelegate() { } @Override - protected @NotNull NodeDelegate delegate() { + protected @NonNull NodeDelegate delegate() { return nodeDel; } @@ -237,7 +236,7 @@ public boolean equals(final @Nullable Object obj) { } @Override - public @NotNull String toString() { + public @NonNull String toString() { return MoreObjects.toStringHelper(this) .add("node delegate", nodeDel) .add("struct delegate", structNodeDel) diff --git a/bundles/sirix-core/src/main/java/io/sirix/index/redblacktree/ImmutableRBNodeImpl.java b/bundles/sirix-core/src/main/java/io/sirix/index/redblacktree/ImmutableRBNodeImpl.java index 748ad55f9..0b0d91df5 100644 --- a/bundles/sirix-core/src/main/java/io/sirix/index/redblacktree/ImmutableRBNodeImpl.java +++ b/bundles/sirix-core/src/main/java/io/sirix/index/redblacktree/ImmutableRBNodeImpl.java @@ -3,8 +3,9 @@ import io.sirix.index.redblacktree.interfaces.ImmutableRBNodeKey; import io.sirix.node.AbstractForwardingNode; import io.sirix.node.NodeKind; -import org.jetbrains.annotations.NotNull; + import io.sirix.node.delegates.NodeDelegate; +import org.checkerframework.checker.nullness.qual.NonNull; /** * Immutable RBNode. @@ -70,7 +71,7 @@ public long getRightChildKey() { } @Override - protected @NotNull NodeDelegate delegate() { + protected @NonNull NodeDelegate delegate() { return node.delegate(); } } diff --git a/bundles/sirix-core/src/main/java/io/sirix/index/redblacktree/RBNodeKey.java b/bundles/sirix-core/src/main/java/io/sirix/index/redblacktree/RBNodeKey.java index c09ac1116..b8d234aa4 100644 --- a/bundles/sirix-core/src/main/java/io/sirix/index/redblacktree/RBNodeKey.java +++ b/bundles/sirix-core/src/main/java/io/sirix/index/redblacktree/RBNodeKey.java @@ -7,8 +7,9 @@ import io.sirix.node.NodeKind; import io.sirix.node.SirixDeweyID; import io.brackit.query.atomic.QNm; +import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; -import org.jetbrains.annotations.NotNull; + import io.sirix.index.redblacktree.keyvalue.CASValue; import io.sirix.node.delegates.NodeDelegate; import io.sirix.settings.Fixed; @@ -74,7 +75,7 @@ public NodeKind getKind() { } @Override - protected @NotNull NodeDelegate delegate() { + protected @NonNull NodeDelegate delegate() { return nodeDelegate; } @@ -173,7 +174,7 @@ public boolean equals(final @Nullable Object obj) { } @Override - public @NotNull String toString() { + public @NonNull String toString() { return MoreObjects.toStringHelper(this) .add("node delegate", nodeDelegate) .add("left child", left) diff --git a/bundles/sirix-core/src/main/java/io/sirix/index/redblacktree/RBNodeValue.java b/bundles/sirix-core/src/main/java/io/sirix/index/redblacktree/RBNodeValue.java index e42f9830e..d50f5505c 100644 --- a/bundles/sirix-core/src/main/java/io/sirix/index/redblacktree/RBNodeValue.java +++ b/bundles/sirix-core/src/main/java/io/sirix/index/redblacktree/RBNodeValue.java @@ -6,8 +6,9 @@ import io.sirix.node.AbstractForwardingNode; import io.sirix.node.NodeKind; import io.sirix.node.SirixDeweyID; +import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; -import org.jetbrains.annotations.NotNull; + import io.sirix.node.delegates.NodeDelegate; import io.sirix.settings.Fixed; @@ -49,7 +50,7 @@ public NodeKind getKind() { } @Override - protected @NotNull NodeDelegate delegate() { + protected @NonNull NodeDelegate delegate() { return nodeDelegate; } @@ -94,7 +95,7 @@ public boolean equals(final @Nullable Object obj) { } @Override - public @NotNull String toString() { + public @NonNull String toString() { return MoreObjects.toStringHelper(this) .add("node delegate", nodeDelegate) .add("value", value) diff --git a/bundles/sirix-core/src/main/java/io/sirix/io/directio/FileChannelWriter.java b/bundles/sirix-core/src/main/java/io/sirix/io/directio/FileChannelWriter.java index 38e535454..18c30ad3d 100644 --- a/bundles/sirix-core/src/main/java/io/sirix/io/directio/FileChannelWriter.java +++ b/bundles/sirix-core/src/main/java/io/sirix/io/directio/FileChannelWriter.java @@ -28,7 +28,7 @@ import io.sirix.page.*; import io.sirix.page.interfaces.Page; import net.openhft.chronicle.bytes.Bytes; -import org.jetbrains.annotations.NotNull; +import org.checkerframework.checker.nullness.qual.NonNull; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; @@ -150,7 +150,7 @@ private long getOffset(Bytes bufferedBytes) throws IOException { return offset; } - @NotNull + @NonNull private FileChannelWriter writePageReference(final PageReadOnlyTrx pageReadOnlyTrx, final PageReference pageReference, final Bytes bufferedBytes, long offset) { // Perform byte operations. diff --git a/bundles/sirix-core/src/main/java/io/sirix/io/file/FileReader.java b/bundles/sirix-core/src/main/java/io/sirix/io/file/FileReader.java index 0aa00c496..dcccc126a 100644 --- a/bundles/sirix-core/src/main/java/io/sirix/io/file/FileReader.java +++ b/bundles/sirix-core/src/main/java/io/sirix/io/file/FileReader.java @@ -35,7 +35,6 @@ import net.openhft.chronicle.bytes.Bytes; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; -import org.jetbrains.annotations.NotNull; import java.io.ByteArrayInputStream; import java.io.IOException; @@ -123,7 +122,7 @@ public Page read(final @NonNull PageReference reference, final @Nullable PageRea } } - @NotNull + @NonNull private Page getPage(PageReadOnlyTrx pageReadTrx, byte[] page) throws IOException { final var inputStream = byteHandler.deserialize(new ByteArrayInputStream(page)); final Bytes input = Bytes.wrapForRead(inputStream.readAllBytes()); diff --git a/bundles/sirix-core/src/main/java/io/sirix/io/file/FileWriter.java b/bundles/sirix-core/src/main/java/io/sirix/io/file/FileWriter.java index 62c461b68..7bf50c2c3 100644 --- a/bundles/sirix-core/src/main/java/io/sirix/io/file/FileWriter.java +++ b/bundles/sirix-core/src/main/java/io/sirix/io/file/FileWriter.java @@ -28,7 +28,7 @@ import io.sirix.page.*; import io.sirix.page.interfaces.Page; import net.openhft.chronicle.bytes.Bytes; -import org.jetbrains.annotations.NotNull; +import org.checkerframework.checker.nullness.qual.NonNull; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; @@ -130,7 +130,7 @@ public FileWriter write(final PageReadOnlyTrx pageReadOnlyTrx, final PageReferen } } - @NotNull + @NonNull private FileWriter writePageReference(final PageReadOnlyTrx pageReadOnlyTrx, final PageReference pageReference, long offset) { // Perform byte operations. diff --git a/bundles/sirix-core/src/main/java/io/sirix/io/filechannel/FileChannelWriter.java b/bundles/sirix-core/src/main/java/io/sirix/io/filechannel/FileChannelWriter.java index 70480e448..54f87b633 100644 --- a/bundles/sirix-core/src/main/java/io/sirix/io/filechannel/FileChannelWriter.java +++ b/bundles/sirix-core/src/main/java/io/sirix/io/filechannel/FileChannelWriter.java @@ -28,7 +28,7 @@ import io.sirix.page.*; import io.sirix.page.interfaces.Page; import net.openhft.chronicle.bytes.Bytes; -import org.jetbrains.annotations.NotNull; +import org.checkerframework.checker.nullness.qual.NonNull; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; @@ -144,7 +144,7 @@ private long getOffset(Bytes bufferedBytes) throws IOException { return offset; } - @NotNull + @NonNull private FileChannelWriter writePageReference(final PageReadOnlyTrx pageReadOnlyTrx, final PageReference pageReference, final Bytes bufferedBytes, long offset) { // Perform byte operations. diff --git a/bundles/sirix-core/src/main/java/io/sirix/io/iouring/IOUringReader.java b/bundles/sirix-core/src/main/java/io/sirix/io/iouring/IOUringReader.java index a02e2ec5f..e7d6141dc 100644 --- a/bundles/sirix-core/src/main/java/io/sirix/io/iouring/IOUringReader.java +++ b/bundles/sirix-core/src/main/java/io/sirix/io/iouring/IOUringReader.java @@ -33,7 +33,7 @@ import one.jasyncfio.AsyncFile; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; -import org.jetbrains.annotations.NotNull; + import io.sirix.io.AbstractReader; import io.sirix.io.IOStorage; import io.sirix.io.Reader; @@ -103,8 +103,8 @@ public CompletableFuture readAsync(final @NonNull PageReference return CompletableFuture.supplyAsync(() -> readPageFragment(reference, pageReadTrx), POOL); } - @NotNull - private Page readPageFragment(@NotNull PageReference reference, @Nullable PageReadOnlyTrx pageReadTrx) { + @NonNull + private Page readPageFragment(@NonNull PageReference reference, @Nullable PageReadOnlyTrx pageReadTrx) { try { // Read page from file. ByteBuffer buffer = ByteBuffer.allocateDirect(IOStorage.OTHER_BEACON).order(ByteOrder.nativeOrder()); diff --git a/bundles/sirix-core/src/main/java/io/sirix/io/iouring/IOUringWriter.java b/bundles/sirix-core/src/main/java/io/sirix/io/iouring/IOUringWriter.java index 175b01f39..6ddf2bd1f 100644 --- a/bundles/sirix-core/src/main/java/io/sirix/io/iouring/IOUringWriter.java +++ b/bundles/sirix-core/src/main/java/io/sirix/io/iouring/IOUringWriter.java @@ -178,12 +178,16 @@ private IOUringWriter writePage(PageReadOnlyTrx pageReadOnlyTrx, PageReference p final byte[] serializedPage; - try (final ByteArrayOutputStream output = new ByteArrayOutputStream(byteArray.length)) { - try (final DataOutputStream dataOutput = new DataOutputStream(reader.getByteHandler().serialize(output))) { - dataOutput.write(byteArray); - dataOutput.flush(); + if (page instanceof KeyValueLeafPage) { + serializedPage = byteArray; + } else { + try (final ByteArrayOutputStream output = new ByteArrayOutputStream(byteArray.length)) { + try (final DataOutputStream dataOutput = new DataOutputStream(reader.getByteHandler().serialize(output))) { + dataOutput.write(byteArray); + dataOutput.flush(); + } + serializedPage = output.toByteArray(); } - serializedPage = output.toByteArray(); } byteBufferBytes.clear(); @@ -248,7 +252,6 @@ private IOUringWriter writePage(PageReadOnlyTrx pageReadOnlyTrx, PageReference p revisionsFileOffset = revisionsFile.size().join(); } revisionsFile.write(buffer, revisionsFileOffset).join(); - buffer = null; final long currOffset = offset; cache.put(revisionRootPage.getRevision(), CompletableFuture.supplyAsync(() -> new RevisionFileData(currOffset, diff --git a/bundles/sirix-core/src/main/java/io/sirix/io/memorymapped/MMStorage.java b/bundles/sirix-core/src/main/java/io/sirix/io/memorymapped/MMStorage.java index c81458c67..abcbf70e9 100644 --- a/bundles/sirix-core/src/main/java/io/sirix/io/memorymapped/MMStorage.java +++ b/bundles/sirix-core/src/main/java/io/sirix/io/memorymapped/MMStorage.java @@ -116,7 +116,7 @@ public Reader createReader() { createRevisionsOffsetFileIfItDoesNotExist(revisionsOffsetFilePath); - final var arena = Arena.openShared(); + final var arena = Arena.ofShared(); final var dataFileSegmentFileSize = Files.size(dataFilePath); final var revisionsOffsetSegmentFileSize = Files.size(revisionsOffsetFilePath); @@ -124,11 +124,11 @@ public Reader createReader() { try (final var dataFileChannel = FileChannel.open(dataFilePath); final var revisionsOffsetFileChannel = FileChannel.open(revisionsOffsetFilePath)) { final var dataFileSegment = - dataFileChannel.map(FileChannel.MapMode.READ_ONLY, 0, dataFileSegmentFileSize, arena.scope()); + dataFileChannel.map(FileChannel.MapMode.READ_ONLY, 0, dataFileSegmentFileSize, arena); final var revisionsOffsetFileSegment = revisionsOffsetFileChannel.map(FileChannel.MapMode.READ_ONLY, 0, revisionsOffsetSegmentFileSize, - arena.scope()); + arena); return new MMFileReader(dataFileSegment, revisionsOffsetFileSegment, new ByteHandlerPipeline(byteHandlerPipeline), diff --git a/bundles/sirix-core/src/main/java/io/sirix/node/DeletedNode.java b/bundles/sirix-core/src/main/java/io/sirix/node/DeletedNode.java index f270b823c..2cd532be5 100644 --- a/bundles/sirix-core/src/main/java/io/sirix/node/DeletedNode.java +++ b/bundles/sirix-core/src/main/java/io/sirix/node/DeletedNode.java @@ -30,8 +30,9 @@ import com.google.common.base.MoreObjects; import com.google.common.base.Objects; +import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; -import org.jetbrains.annotations.NotNull; + import io.sirix.node.delegates.NodeDelegate; import io.sirix.node.interfaces.Node; @@ -79,7 +80,7 @@ public boolean equals(final Object obj) { } @Override - public @NotNull String toString() { + public @NonNull String toString() { return MoreObjects.toStringHelper(this).add("delegate", nodeDelegate.toString()).toString(); } @@ -89,7 +90,7 @@ public boolean isSameItem(final @Nullable Node other) { } @Override - protected @NotNull NodeDelegate delegate() { + protected @NonNull NodeDelegate delegate() { return nodeDelegate; } } diff --git a/bundles/sirix-core/src/main/java/io/sirix/node/DeweyIDMappingNode.java b/bundles/sirix-core/src/main/java/io/sirix/node/DeweyIDMappingNode.java index 4f270217d..5ff1c7a73 100644 --- a/bundles/sirix-core/src/main/java/io/sirix/node/DeweyIDMappingNode.java +++ b/bundles/sirix-core/src/main/java/io/sirix/node/DeweyIDMappingNode.java @@ -1,10 +1,11 @@ package io.sirix.node; -import org.jetbrains.annotations.NotNull; import io.sirix.node.delegates.NodeDelegate; import static java.util.Objects.requireNonNull; +import org.checkerframework.checker.nullness.qual.NonNull; + /** * If a node is deleted, it will be encapsulated over this class. * @@ -33,7 +34,7 @@ public NodeKind getKind() { } @Override - protected @NotNull NodeDelegate delegate() { + protected @NonNull NodeDelegate delegate() { return mDelegate; } } diff --git a/bundles/sirix-core/src/main/java/io/sirix/node/NodeKind.java b/bundles/sirix-core/src/main/java/io/sirix/node/NodeKind.java index 5c81e6525..72ddeec28 100644 --- a/bundles/sirix-core/src/main/java/io/sirix/node/NodeKind.java +++ b/bundles/sirix-core/src/main/java/io/sirix/node/NodeKind.java @@ -47,7 +47,6 @@ import io.brackit.query.module.Namespaces; import org.checkerframework.checker.index.qual.NonNegative; import org.checkerframework.checker.nullness.qual.NonNull; -import org.jetbrains.annotations.NotNull; import org.roaringbitmap.longlong.Roaring64Bitmap; import io.sirix.access.ResourceConfiguration; import io.sirix.api.PageReadOnlyTrx; @@ -153,7 +152,7 @@ public void serialize(final BytesOut sink, final DataRecord record, */ ATTRIBUTE((byte) 2, AttributeNode.class) { @Override - public @NotNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, + public @NonNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, final byte[] deweyID, final PageReadOnlyTrx pageReadTrx) { // Node delegate. final NodeDelegate nodeDel = deserializeNodeDelegate(source, recordID, deweyID, pageReadTrx); @@ -185,7 +184,7 @@ public void serialize(final BytesOut sink, final DataRecord record, */ NAMESPACE((byte) 13, NamespaceNode.class) { @Override - public @NotNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, + public @NonNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, final byte[] deweyID, final PageReadOnlyTrx pageReadTrx) { // Node delegate. final NodeDelegate nodeDel = deserializeNodeDelegate(source, recordID, deweyID, pageReadTrx); @@ -209,7 +208,7 @@ public void serialize(final BytesOut sink, final DataRecord record, */ TEXT((byte) 3, TextNode.class) { @Override - public @NotNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, + public @NonNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, final byte[] deweyID, final PageReadOnlyTrx pageReadTrx) { // Node delegate. final NodeDelegate nodeDel = deserializeNodeDelegate(source, recordID, deweyID, pageReadTrx); @@ -250,7 +249,7 @@ public void serialize(final BytesOut sink, final DataRecord record, */ PROCESSING_INSTRUCTION((byte) 7, PINode.class) { @Override - public @NotNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, + public @NonNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, final byte[] deweyID, final PageReadOnlyTrx pageReadTrx) { // Node delegate. final NodeDelegate nodeDel = deserializeNodeDelegate(source, recordID, deweyID, pageReadTrx); @@ -290,7 +289,7 @@ public void serialize(final BytesOut sink, final DataRecord record, */ COMMENT((byte) 8, CommentNode.class) { @Override - public @NotNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, + public @NonNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, final byte[] deweyID, final PageReadOnlyTrx pageReadTrx) { // Node delegate. final NodeDelegate nodeDel = deserializeNodeDelegate(source, recordID, deweyID, pageReadTrx); @@ -332,7 +331,7 @@ public void serialize(final BytesOut sink, final DataRecord record, // Virtualize document root node? XML_DOCUMENT((byte) 9, XmlDocumentRootNode.class) { @Override - public @NotNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, + public @NonNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, final byte[] deweyID, final PageReadOnlyTrx pageReadTrx) { final var revisionNumber = pageReadTrx.getRevisionNumber(); final LongHashFunction hashFunction = pageReadTrx.getResourceSession().getResourceConfig().nodeHashFunction; @@ -379,7 +378,7 @@ public void serializeDeweyID(BytesOut sink, byte[] deweyID, byte[] nextDeweyI */ WHITESPACE((byte) 4, null) { @Override - public @NotNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, + public @NonNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, final byte[] deweyID, final PageReadOnlyTrx pageReadTrx) { throw new UnsupportedOperationException(); } @@ -405,7 +404,7 @@ public void serializeDeweyID(BytesOut sink, byte[] deweyID, byte[] nextDeweyI */ DELETE((byte) 5, DeletedNode.class) { @Override - public @NotNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, + public @NonNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, final byte[] deweyID, final PageReadOnlyTrx pageReadTrx) { final var revisionNumber = pageReadTrx.getRevisionNumber(); final LongHashFunction hashFunction = pageReadTrx.getResourceSession().getResourceConfig().nodeHashFunction; @@ -433,7 +432,7 @@ public void serializeDeweyID(BytesOut sink, byte[] deweyID, byte[] nextDeweyI */ NULL((byte) 6, NullNode.class) { @Override - public @NotNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, + public @NonNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, final byte[] deweyID, final PageReadOnlyTrx pageReadTrx) { throw new UnsupportedOperationException(); } @@ -459,7 +458,7 @@ public void serializeDeweyID(BytesOut sink, byte[] deweyID, byte[] nextDeweyI */ DUMB((byte) 20, DumbNode.class) { @Override - public @NotNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, + public @NonNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, final byte[] deweyID, final PageReadOnlyTrx pageReadTrx) { return new DumbNode(recordID); } @@ -486,7 +485,7 @@ public void serializeDeweyID(BytesOut sink, byte[] deweyID, byte[] nextDeweyI */ ATOMIC((byte) 15, AtomicValue.class) { @Override - public @NotNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, + public @NonNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, final byte[] deweyID, final PageReadOnlyTrx pageReadTrx) { throw new UnsupportedOperationException(); } @@ -513,7 +512,7 @@ public void serializeDeweyID(BytesOut sink, byte[] deweyID, byte[] nextDeweyI */ PATH((byte) 16, PathNode.class) { @Override - public @NotNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, + public @NonNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, final byte[] deweyID, final PageReadOnlyTrx pageReadTrx) { // Node delegate. final NodeDelegate nodeDel = deserializeNodeDelegateWithoutIDs(source, recordID, pageReadTrx); @@ -561,7 +560,7 @@ public void serializeDeweyID(BytesOut sink, byte[] deweyID, byte[] nextDeweyI */ CASRB((byte) 17, RBNodeKey.class) { @Override - public @NotNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, + public @NonNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, final byte[] deweyID, final PageReadOnlyTrx pageReadTrx) { final int valueSize = source.readInt(); final byte[] value = new byte[valueSize]; @@ -637,7 +636,7 @@ private Type resolveType(final String s) { */ PATHRB((byte) 18, RBNodeKey.class) { @Override - public @NotNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, + public @NonNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, final byte[] deweyID, final PageReadOnlyTrx pageReadTrx) { final long key = getVarLong(source); // Node delegate. @@ -681,7 +680,7 @@ public void serializeDeweyID(BytesOut sink, byte[] deweyID, byte[] nextDeweyI */ NAMERB((byte) 19, RBNodeKey.class) { @Override - public @NotNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, + public @NonNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, final byte[] deweyID, final PageReadOnlyTrx pageReadTrx) { final byte[] nspBytes = new byte[source.readInt()]; source.read(nspBytes); @@ -741,7 +740,7 @@ public void serializeDeweyID(BytesOut sink, byte[] deweyID, byte[] nextDeweyI */ RB_NODE_VALUE((byte) 55, RBNodeValue.class) { @Override - public @NotNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, + public @NonNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, final byte[] deweyID, final PageReadOnlyTrx pageReadTrx) { final var nodeKeys = deserializeNodeReferences(source); // Node delegate. @@ -775,7 +774,7 @@ public void serializeDeweyID(BytesOut sink, byte[] deweyID, byte[] nextDeweyI */ DEWEYIDMAPPING((byte) 23, DeweyIDMappingNode.class) { @Override - public @NotNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, + public @NonNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, final byte[] deweyID, final PageReadOnlyTrx pageReadTrx) { throw new UnsupportedOperationException(); } @@ -802,7 +801,7 @@ public void serializeDeweyID(BytesOut sink, byte[] deweyID, byte[] nextDeweyI */ OBJECT((byte) 24, ObjectNode.class) { @Override - public @NotNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, + public @NonNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, final byte[] deweyID, final PageReadOnlyTrx pageReadTrx) { var config = pageReadTrx.getResourceSession().getResourceConfig(); final long hashCode = getHash(source, pageReadTrx); @@ -842,7 +841,7 @@ public void serializeDeweyID(BytesOut sink, byte[] deweyID, byte[] nextDeweyI */ ARRAY((byte) 25, ArrayNode.class) { @Override - public @NotNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, + public @NonNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, final byte[] deweyID, final PageReadOnlyTrx pageReadTrx) { var config = pageReadTrx.getResourceSession().getResourceConfig(); final long hashCode = getHash(source, pageReadTrx); @@ -884,7 +883,7 @@ public void serializeDeweyID(BytesOut sink, byte[] deweyID, byte[] nextDeweyI */ OBJECT_KEY((byte) 26, ObjectKeyNode.class) { @Override - public @NotNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, + public @NonNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, final byte[] deweyID, final PageReadOnlyTrx pageReadTrx) { final long hashCode = getHash(source, pageReadTrx); @@ -962,7 +961,7 @@ public void serializeDeweyID(BytesOut sink, byte[] deweyID, byte[] nextDeweyI */ OBJECT_STRING_VALUE((byte) 40, ObjectStringNode.class) { @Override - public @NotNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, + public @NonNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, final byte[] deweyID, final PageReadOnlyTrx pageReadTrx) { // Node delegate. final NodeDelegate nodeDel = deserializeNodeDelegate(source, recordID, deweyID, pageReadTrx); @@ -1010,7 +1009,7 @@ public void serializeDeweyID(BytesOut sink, byte[] deweyID, byte[] nextDeweyI */ OBJECT_BOOLEAN_VALUE((byte) 41, ObjectBooleanNode.class) { @Override - public @NotNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, + public @NonNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, final byte[] deweyID, final PageReadOnlyTrx pageReadTrx) { final boolean boolValue = source.readBoolean(); // Node delegate. @@ -1053,7 +1052,7 @@ public void serializeDeweyID(BytesOut sink, byte[] deweyID, byte[] nextDeweyI */ OBJECT_NUMBER_VALUE((byte) 42, ObjectNumberNode.class) { @Override - public @NotNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, + public @NonNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, final byte[] deweyID, final PageReadOnlyTrx pageReadTrx) { final byte valueType = source.readByte(); final Number number; @@ -1143,7 +1142,7 @@ public void serializeDeweyID(BytesOut sink, byte[] deweyID, byte[] nextDeweyI */ OBJECT_NULL_VALUE((byte) 43, ObjectNullNode.class) { @Override - public @NotNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, + public @NonNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, final byte[] deweyID, final PageReadOnlyTrx pageReadTrx) { // Node delegate. final NodeDelegate nodeDel = deserializeNodeDelegate(source, recordID, deweyID, pageReadTrx); @@ -1184,7 +1183,7 @@ public void serializeDeweyID(BytesOut sink, byte[] deweyID, byte[] nextDeweyI */ STRING_VALUE((byte) 30, StringNode.class) { @Override - public @NotNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, + public @NonNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, final byte[] deweyID, final PageReadOnlyTrx pageReadTrx) { // Node delegate. final NodeDelegate nodeDel = deserializeNodeDelegate(source, recordID, deweyID, pageReadTrx); @@ -1227,7 +1226,7 @@ public void serializeDeweyID(BytesOut sink, byte[] deweyID, byte[] nextDeweyI */ BOOLEAN_VALUE((byte) 27, BooleanNode.class) { @Override - public @NotNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, + public @NonNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, final byte[] deweyID, final PageReadOnlyTrx pageReadTrx) { final boolean boolValue = source.readBoolean(); // Node delegate. @@ -1265,7 +1264,7 @@ public void serializeDeweyID(BytesOut sink, byte[] deweyID, byte[] nextDeweyI */ NUMBER_VALUE((byte) 28, NumberNode.class) { @Override - public @NotNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, + public @NonNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, final byte[] deweyID, final PageReadOnlyTrx pageReadTrx) { final byte valueType = source.readByte(); final Number number = switch (valueType) { @@ -1381,7 +1380,7 @@ public void serializeDeweyID(BytesOut sink, byte[] deweyID, byte[] nextDeweyI // Virtualize document root node? JSON_DOCUMENT((byte) 31, JsonDocumentRootNode.class) { @Override - public @NotNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, + public @NonNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, final byte[] deweyID, final PageReadOnlyTrx pageReadTrx) { final var revisionNumber = pageReadTrx.getRevisionNumber(); final LongHashFunction hashFunction = pageReadTrx.getResourceSession().getResourceConfig().nodeHashFunction; @@ -1426,7 +1425,7 @@ public void serializeDeweyID(BytesOut sink, byte[] deweyID, byte[] nextDeweyI HASH_ENTRY((byte) 32, HashEntryNode.class) { @Override - public @NotNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, + public @NonNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, final byte[] deweyID, final PageReadOnlyTrx pageReadTrx) { return new HashEntryNode(recordID, source.readInt(), source.readUtf8()); } @@ -1451,7 +1450,7 @@ public void serializeDeweyID(BytesOut sink, byte[] deweyID, byte[] nextDeweyI HASH_NAME_COUNT_TO_NAME_ENTRY((byte) 33, HashCountEntryNode.class) { @Override - public @NotNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, + public @NonNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, final byte[] deweyID, final PageReadOnlyTrx pageReadTrx) { return new HashCountEntryNode(recordID, source.readInt()); } @@ -1475,7 +1474,7 @@ public void serializeDeweyID(BytesOut sink, byte[] deweyID, byte[] nextDeweyI DEWEY_ID_NODE((byte) 34, DeweyIDNode.class) { @Override - public @NotNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, + public @NonNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, final byte[] deweyID, final PageReadOnlyTrx pageReadTrx) { return new DeweyIDNode(recordID, new SirixDeweyID(deweyID)); } @@ -1497,7 +1496,7 @@ public void serializeDeweyID(BytesOut sink, byte[] deweyID, byte[] nextDeweyI REVISION_REFERENCES_NODE((byte) 35, RevisionReferencesNode.class) { @Override - public @NotNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, + public @NonNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, final byte[] deweyID, final PageReadOnlyTrx pageReadTrx) { final boolean isCompressed = source.readBoolean(); final var length = source.readByte(); @@ -1548,7 +1547,7 @@ public void serializeDeweyID(BytesOut sink, byte[] deweyID, byte[] nextDeweyI */ UNKNOWN((byte) 22, null) { @Override - public @NotNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, + public @NonNull DataRecord deserialize(final BytesIn source, final @NonNegative long recordID, final byte[] deweyID, final PageReadOnlyTrx pageReadTrx) { throw new UnsupportedOperationException(); } @@ -1578,7 +1577,7 @@ private static void serializeNodeReferences(BytesOut sink, Roaring64 } } - @NotNull + @NonNull private static Roaring64Bitmap deserializeNodeReferences(BytesIn source) { final var nodeKeys = new Roaring64Bitmap(); try (var inputStream = new DataInputStream(source.inputStream())) { @@ -1680,7 +1679,7 @@ private static void serializeStructNodeJsonValueNode(BytesOut sink, putVarLong(sink, node.getNodeKey() - node.getLeftSiblingKey()); } - @NotNull + @NonNull private static StructNodeDelegate deserializeStructNodeJsonValueNode(BytesIn source, NodeDelegate nodeDel) { var nodeKey = nodeDel.getNodeKey(); @@ -1700,7 +1699,7 @@ private static StructNodeDelegate deserializeStructNodeJsonValueNode(BytesIn descendantCount); } - @NotNull + @NonNull private static StructNodeDelegate deserializeObjectOrArrayStructDelegate(BytesIn source, ResourceConfiguration config, NodeDelegate nodeDel) { var nodeKey = nodeDel.getNodeKey(); diff --git a/bundles/sirix-core/src/main/java/io/sirix/node/delegates/NameNodeDelegate.java b/bundles/sirix-core/src/main/java/io/sirix/node/delegates/NameNodeDelegate.java index baa4d5002..d85d5688c 100644 --- a/bundles/sirix-core/src/main/java/io/sirix/node/delegates/NameNodeDelegate.java +++ b/bundles/sirix-core/src/main/java/io/sirix/node/delegates/NameNodeDelegate.java @@ -37,7 +37,7 @@ import io.brackit.query.atomic.QNm; import org.checkerframework.checker.index.qual.NonNegative; import org.checkerframework.checker.nullness.qual.Nullable; -import org.jetbrains.annotations.NotNull; +import org.checkerframework.checker.nullness.qual.NonNull; import java.nio.ByteBuffer; @@ -184,7 +184,7 @@ public boolean equals(final @Nullable Object obj) { } @Override - public @NotNull String toString() { + public @NonNull String toString() { return MoreObjects.toStringHelper(this) .add("node delegate", nodeDelegate) .add("uriKey", uriKey) @@ -195,7 +195,7 @@ public boolean equals(final @Nullable Object obj) { } @Override - protected @NotNull NodeDelegate delegate() { + protected @NonNull NodeDelegate delegate() { return nodeDelegate; } diff --git a/bundles/sirix-core/src/main/java/io/sirix/node/delegates/StructNodeDelegate.java b/bundles/sirix-core/src/main/java/io/sirix/node/delegates/StructNodeDelegate.java index 5aed5ea8f..380d097c6 100644 --- a/bundles/sirix-core/src/main/java/io/sirix/node/delegates/StructNodeDelegate.java +++ b/bundles/sirix-core/src/main/java/io/sirix/node/delegates/StructNodeDelegate.java @@ -38,7 +38,7 @@ import net.openhft.chronicle.bytes.Bytes; import org.checkerframework.checker.index.qual.NonNegative; import org.checkerframework.checker.nullness.qual.Nullable; -import org.jetbrains.annotations.NotNull; +import org.checkerframework.checker.nullness.qual.NonNull; import java.nio.ByteBuffer; @@ -265,7 +265,7 @@ public boolean equals(final Object obj) { } @Override - public @NotNull String toString() { + public @NonNull String toString() { return MoreObjects.toStringHelper(this) .add("first child", getFirstChildKey()) .add("last child", getLastChildKey()) @@ -303,7 +303,7 @@ public boolean isSameItem(final @Nullable Node other) { } @Override - protected @NotNull NodeDelegate delegate() { + protected @NonNull NodeDelegate delegate() { return nodeDelegate; } diff --git a/bundles/sirix-core/src/main/java/io/sirix/node/delegates/ValueNodeDelegate.java b/bundles/sirix-core/src/main/java/io/sirix/node/delegates/ValueNodeDelegate.java index e0cc07405..4e4811b82 100644 --- a/bundles/sirix-core/src/main/java/io/sirix/node/delegates/ValueNodeDelegate.java +++ b/bundles/sirix-core/src/main/java/io/sirix/node/delegates/ValueNodeDelegate.java @@ -30,7 +30,7 @@ import io.sirix.utils.Compression; import net.openhft.chronicle.bytes.Bytes; import org.checkerframework.checker.nullness.qual.Nullable; -import org.jetbrains.annotations.NotNull; +import org.checkerframework.checker.nullness.qual.NonNull; import java.nio.ByteBuffer; import java.util.Arrays; @@ -145,7 +145,7 @@ public boolean equals(final @Nullable Object obj) { } @Override - public @NotNull String toString() { + public @NonNull String toString() { return MoreObjects.toStringHelper(this).add("value", new String(value)).toString(); } @@ -160,7 +160,7 @@ public NodeKind getKind() { } @Override - protected @NotNull NodeDelegate delegate() { + protected @NonNull NodeDelegate delegate() { return nodeDelegate; } diff --git a/bundles/sirix-core/src/main/java/io/sirix/node/json/AbstractBooleanNode.java b/bundles/sirix-core/src/main/java/io/sirix/node/json/AbstractBooleanNode.java index dfc7d3c1a..97d6ddea4 100644 --- a/bundles/sirix-core/src/main/java/io/sirix/node/json/AbstractBooleanNode.java +++ b/bundles/sirix-core/src/main/java/io/sirix/node/json/AbstractBooleanNode.java @@ -33,8 +33,9 @@ import io.sirix.node.interfaces.immutable.ImmutableJsonNode; import io.sirix.settings.Fixed; import net.openhft.chronicle.bytes.Bytes; -import org.jetbrains.annotations.NotNull; + import io.sirix.node.xml.AbstractStructForwardingNode; +import org.checkerframework.checker.nullness.qual.NonNull; import java.nio.ByteBuffer; @@ -112,7 +113,7 @@ protected StructNodeDelegate structDelegate() { } @Override - protected @NotNull NodeDelegate delegate() { + protected @NonNull NodeDelegate delegate() { return structNodeDelegate.getNodeDelegate(); } } diff --git a/bundles/sirix-core/src/main/java/io/sirix/node/json/AbstractNullNode.java b/bundles/sirix-core/src/main/java/io/sirix/node/json/AbstractNullNode.java index 7a899c04f..dacf5a03d 100644 --- a/bundles/sirix-core/src/main/java/io/sirix/node/json/AbstractNullNode.java +++ b/bundles/sirix-core/src/main/java/io/sirix/node/json/AbstractNullNode.java @@ -33,8 +33,8 @@ import io.sirix.node.interfaces.immutable.ImmutableJsonNode; import io.sirix.settings.Fixed; import net.openhft.chronicle.bytes.Bytes; -import org.jetbrains.annotations.NotNull; import io.sirix.node.xml.AbstractStructForwardingNode; +import org.checkerframework.checker.nullness.qual.NonNull; import java.nio.ByteBuffer; @@ -87,7 +87,7 @@ public long getHash() { } @Override - protected @NotNull NodeDelegate delegate() { + protected @NonNull NodeDelegate delegate() { return structNodeDelegate.getNodeDelegate(); } diff --git a/bundles/sirix-core/src/main/java/io/sirix/node/json/AbstractNumberNode.java b/bundles/sirix-core/src/main/java/io/sirix/node/json/AbstractNumberNode.java index b01af5161..70b87eb03 100644 --- a/bundles/sirix-core/src/main/java/io/sirix/node/json/AbstractNumberNode.java +++ b/bundles/sirix-core/src/main/java/io/sirix/node/json/AbstractNumberNode.java @@ -33,8 +33,8 @@ import io.sirix.node.interfaces.immutable.ImmutableJsonNode; import io.sirix.settings.Fixed; import net.openhft.chronicle.bytes.Bytes; -import org.jetbrains.annotations.NotNull; import io.sirix.node.xml.AbstractStructForwardingNode; +import org.checkerframework.checker.nullness.qual.NonNull; import java.math.BigDecimal; import java.math.BigInteger; @@ -121,7 +121,7 @@ protected StructNodeDelegate structDelegate() { } @Override - protected @NotNull NodeDelegate delegate() { + protected @NonNull NodeDelegate delegate() { return structNodeDelegate.getNodeDelegate(); } } diff --git a/bundles/sirix-core/src/main/java/io/sirix/node/json/AbstractStringNode.java b/bundles/sirix-core/src/main/java/io/sirix/node/json/AbstractStringNode.java index f19225734..993661ecb 100644 --- a/bundles/sirix-core/src/main/java/io/sirix/node/json/AbstractStringNode.java +++ b/bundles/sirix-core/src/main/java/io/sirix/node/json/AbstractStringNode.java @@ -35,8 +35,8 @@ import io.sirix.node.interfaces.immutable.ImmutableJsonNode; import io.sirix.settings.Constants; import net.openhft.chronicle.bytes.Bytes; -import org.jetbrains.annotations.NotNull; import io.sirix.node.xml.AbstractStructForwardingNode; +import org.checkerframework.checker.nullness.qual.NonNull; import java.nio.ByteBuffer; @@ -117,7 +117,7 @@ protected StructNodeDelegate structDelegate() { } @Override - protected @NotNull NodeDelegate delegate() { + protected @NonNull NodeDelegate delegate() { return structNodeDelegate.getNodeDelegate(); } } diff --git a/bundles/sirix-core/src/main/java/io/sirix/node/json/ArrayNode.java b/bundles/sirix-core/src/main/java/io/sirix/node/json/ArrayNode.java index 1a9ca0a58..c5b591b6e 100644 --- a/bundles/sirix-core/src/main/java/io/sirix/node/json/ArrayNode.java +++ b/bundles/sirix-core/src/main/java/io/sirix/node/json/ArrayNode.java @@ -38,8 +38,9 @@ import io.sirix.node.interfaces.immutable.ImmutableJsonNode; import io.sirix.settings.Fixed; import net.openhft.chronicle.bytes.Bytes; -import org.jetbrains.annotations.NotNull; + import io.sirix.node.xml.AbstractStructForwardingNode; +import org.checkerframework.checker.nullness.qual.NonNull; import java.nio.ByteBuffer; @@ -127,7 +128,7 @@ public long getHash() { } @Override - protected @NotNull NodeDelegate delegate() { + protected @NonNull NodeDelegate delegate() { return structNodeDelegate.getNodeDelegate(); } @@ -137,7 +138,7 @@ protected StructNodeDelegate structDelegate() { } @Override - public @NotNull String toString() { + public @NonNull String toString() { return MoreObjects.toStringHelper(this).add("structDelegate", structNodeDelegate).toString(); } diff --git a/bundles/sirix-core/src/main/java/io/sirix/node/json/JsonDocumentRootNode.java b/bundles/sirix-core/src/main/java/io/sirix/node/json/JsonDocumentRootNode.java index 8a3533d44..b84d8b369 100644 --- a/bundles/sirix-core/src/main/java/io/sirix/node/json/JsonDocumentRootNode.java +++ b/bundles/sirix-core/src/main/java/io/sirix/node/json/JsonDocumentRootNode.java @@ -34,7 +34,6 @@ import net.openhft.chronicle.bytes.Bytes; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; -import org.jetbrains.annotations.NotNull; import io.sirix.node.xml.AbstractStructForwardingNode; import java.nio.ByteBuffer; @@ -134,12 +133,12 @@ public boolean equals(@Nullable final Object obj) { } @Override - public @NotNull String toString() { + public @NonNull String toString() { return super.toString(); } @Override - protected @NotNull NodeDelegate delegate() { + protected @NonNull NodeDelegate delegate() { return nodeDelegate; } diff --git a/bundles/sirix-core/src/main/java/io/sirix/node/json/NullNode.java b/bundles/sirix-core/src/main/java/io/sirix/node/json/NullNode.java index 3fe43370e..dbb82154c 100644 --- a/bundles/sirix-core/src/main/java/io/sirix/node/json/NullNode.java +++ b/bundles/sirix-core/src/main/java/io/sirix/node/json/NullNode.java @@ -34,7 +34,7 @@ import io.sirix.node.NodeKind; import io.sirix.node.delegates.StructNodeDelegate; import io.sirix.node.immutable.json.ImmutableNullNode; -import org.jetbrains.annotations.NotNull; +import org.checkerframework.checker.nullness.qual.NonNull; /** * @author Johannes Lichtenberger mail @@ -61,7 +61,7 @@ public VisitResult acceptVisitor(final JsonNodeVisitor visitor) { } @Override - public @NotNull String toString() { + public @NonNull String toString() { return MoreObjects.toStringHelper(this).toString(); } diff --git a/bundles/sirix-core/src/main/java/io/sirix/node/json/ObjectKeyNode.java b/bundles/sirix-core/src/main/java/io/sirix/node/json/ObjectKeyNode.java index 2118069b5..afb5470cf 100644 --- a/bundles/sirix-core/src/main/java/io/sirix/node/json/ObjectKeyNode.java +++ b/bundles/sirix-core/src/main/java/io/sirix/node/json/ObjectKeyNode.java @@ -42,8 +42,9 @@ import net.openhft.chronicle.bytes.Bytes; import io.brackit.query.atomic.QNm; import org.checkerframework.checker.index.qual.NonNegative; -import org.jetbrains.annotations.NotNull; + import io.sirix.node.xml.AbstractStructForwardingNode; +import org.checkerframework.checker.nullness.qual.NonNull; import java.nio.ByteBuffer; @@ -161,7 +162,7 @@ public VisitResult acceptVisitor(final JsonNodeVisitor visitor) { } @Override - public @NotNull String toString() { + public @NonNull String toString() { return MoreObjects.toStringHelper(this) .add("name", name) .add("nameKey", nameKey) @@ -183,7 +184,7 @@ public boolean equals(final Object obj) { } @Override - protected @NotNull NodeDelegate delegate() { + protected @NonNull NodeDelegate delegate() { return structNodeDelegate.getNodeDelegate(); } diff --git a/bundles/sirix-core/src/main/java/io/sirix/node/json/ObjectNode.java b/bundles/sirix-core/src/main/java/io/sirix/node/json/ObjectNode.java index c5ca92d98..5beeb1479 100644 --- a/bundles/sirix-core/src/main/java/io/sirix/node/json/ObjectNode.java +++ b/bundles/sirix-core/src/main/java/io/sirix/node/json/ObjectNode.java @@ -39,8 +39,9 @@ import io.sirix.node.interfaces.immutable.ImmutableJsonNode; import io.sirix.settings.Fixed; import net.openhft.chronicle.bytes.Bytes; -import org.jetbrains.annotations.NotNull; + import io.sirix.node.xml.AbstractStructForwardingNode; +import org.checkerframework.checker.nullness.qual.NonNull; import java.nio.ByteBuffer; @@ -124,7 +125,7 @@ public VisitResult acceptVisitor(final JsonNodeVisitor visitor) { } @Override - protected @NotNull NodeDelegate delegate() { + protected @NonNull NodeDelegate delegate() { return structNodeDelegate.getNodeDelegate(); } @@ -134,7 +135,7 @@ protected StructNodeDelegate structDelegate() { } @Override - public @NotNull String toString() { + public @NonNull String toString() { return MoreObjects.toStringHelper(this).add("structDelegate", structNodeDelegate).toString(); } diff --git a/bundles/sirix-core/src/main/java/io/sirix/node/xml/AbstractStructForwardingNode.java b/bundles/sirix-core/src/main/java/io/sirix/node/xml/AbstractStructForwardingNode.java index 881fc9c37..42e48df53 100644 --- a/bundles/sirix-core/src/main/java/io/sirix/node/xml/AbstractStructForwardingNode.java +++ b/bundles/sirix-core/src/main/java/io/sirix/node/xml/AbstractStructForwardingNode.java @@ -33,7 +33,7 @@ import io.sirix.node.delegates.StructNodeDelegate; import io.sirix.node.interfaces.StructNode; import org.checkerframework.checker.index.qual.NonNegative; -import org.jetbrains.annotations.NotNull; +import org.checkerframework.checker.nullness.qual.NonNull; /** * Skeletal implementation of {@link StructNode} interface. @@ -174,7 +174,7 @@ public int getPreviousRevisionNumber() { } @Override - public @NotNull String toString() { + public @NonNull String toString() { return MoreObjects.toStringHelper(this) .add("nodeDelegate", super.toString()) .add("structDelegate", structDelegate().toString()) diff --git a/bundles/sirix-core/src/main/java/io/sirix/node/xml/AttributeNode.java b/bundles/sirix-core/src/main/java/io/sirix/node/xml/AttributeNode.java index 3bb58240c..214d8b42d 100644 --- a/bundles/sirix-core/src/main/java/io/sirix/node/xml/AttributeNode.java +++ b/bundles/sirix-core/src/main/java/io/sirix/node/xml/AttributeNode.java @@ -47,8 +47,8 @@ import net.openhft.chronicle.bytes.Bytes; import io.brackit.query.atomic.QNm; import org.checkerframework.checker.index.qual.NonNegative; +import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; -import org.jetbrains.annotations.NotNull; import java.nio.ByteBuffer; @@ -164,7 +164,7 @@ public VisitResult acceptVisitor(final XmlNodeVisitor visitor) { } @Override - public @NotNull String toString() { + public @NonNull String toString() { return MoreObjects.toStringHelper(this) .add("nameDel", nameNodeDelegate) .add("valDel", valueNodeDelegate) @@ -258,7 +258,7 @@ public ValueNodeDelegate getValNodeDelegate() { } @Override - protected @NotNull NodeDelegate delegate() { + protected @NonNull NodeDelegate delegate() { return nodeDelegate; } diff --git a/bundles/sirix-core/src/main/java/io/sirix/node/xml/CommentNode.java b/bundles/sirix-core/src/main/java/io/sirix/node/xml/CommentNode.java index 491384a77..da3bb8947 100644 --- a/bundles/sirix-core/src/main/java/io/sirix/node/xml/CommentNode.java +++ b/bundles/sirix-core/src/main/java/io/sirix/node/xml/CommentNode.java @@ -44,8 +44,8 @@ import io.sirix.settings.Constants; import io.sirix.settings.Fixed; import net.openhft.chronicle.bytes.Bytes; +import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; -import org.jetbrains.annotations.NotNull; import java.nio.ByteBuffer; @@ -187,7 +187,7 @@ public boolean equals(final @Nullable Object obj) { } @Override - public @NotNull String toString() { + public @NonNull String toString() { return MoreObjects.toStringHelper(this) .add("node delegate", structNodeDelegate.getNodeDelegate()) .add("value delegate", valueNodeDelegate) @@ -199,7 +199,7 @@ public ValueNodeDelegate getValNodeDelegate() { } @Override - protected @NotNull NodeDelegate delegate() { + protected @NonNull NodeDelegate delegate() { return structNodeDelegate.getNodeDelegate(); } diff --git a/bundles/sirix-core/src/main/java/io/sirix/node/xml/ElementNode.java b/bundles/sirix-core/src/main/java/io/sirix/node/xml/ElementNode.java index c09fe47f9..f801e0e13 100644 --- a/bundles/sirix-core/src/main/java/io/sirix/node/xml/ElementNode.java +++ b/bundles/sirix-core/src/main/java/io/sirix/node/xml/ElementNode.java @@ -30,23 +30,22 @@ import com.google.common.base.MoreObjects; import com.google.common.base.Objects; -import io.sirix.node.NodeKind; -import io.sirix.node.SirixDeweyID; -import io.sirix.node.interfaces.NameNode; -import it.unimi.dsi.fastutil.longs.LongList; -import net.openhft.chronicle.bytes.Bytes; import io.brackit.query.atomic.QNm; -import org.checkerframework.checker.index.qual.NonNegative; -import org.checkerframework.checker.nullness.qual.NonNull; -import org.jetbrains.annotations.NotNull; import io.sirix.api.visitor.VisitResult; import io.sirix.api.visitor.XmlNodeVisitor; +import io.sirix.node.NodeKind; +import io.sirix.node.SirixDeweyID; import io.sirix.node.delegates.NameNodeDelegate; import io.sirix.node.delegates.NodeDelegate; import io.sirix.node.delegates.StructNodeDelegate; import io.sirix.node.immutable.xml.ImmutableElement; +import io.sirix.node.interfaces.NameNode; import io.sirix.node.interfaces.immutable.ImmutableXmlNode; import io.sirix.settings.Fixed; +import it.unimi.dsi.fastutil.longs.LongList; +import net.openhft.chronicle.bytes.Bytes; +import org.checkerframework.checker.index.qual.NonNegative; +import org.checkerframework.checker.nullness.qual.NonNull; import java.nio.ByteBuffer; import java.util.Collections; @@ -249,7 +248,7 @@ public NodeKind getKind() { } @Override - public @NotNull String toString() { + public @NonNull String toString() { return MoreObjects.toStringHelper(this) .add("nameDelegate", nameNodeDelegate) .add("nameSpaceKeys", namespaceKeys) @@ -337,7 +336,7 @@ public List getNamespaceKeys() { } @Override - protected @NotNull NodeDelegate delegate() { + protected @NonNull NodeDelegate delegate() { return structNodeDelegate.getNodeDelegate(); } diff --git a/bundles/sirix-core/src/main/java/io/sirix/node/xml/NamespaceNode.java b/bundles/sirix-core/src/main/java/io/sirix/node/xml/NamespaceNode.java index 90cbf0c05..6e38c0fb7 100644 --- a/bundles/sirix-core/src/main/java/io/sirix/node/xml/NamespaceNode.java +++ b/bundles/sirix-core/src/main/java/io/sirix/node/xml/NamespaceNode.java @@ -44,7 +44,7 @@ import io.brackit.query.atomic.QNm; import org.checkerframework.checker.index.qual.NonNegative; import org.checkerframework.checker.nullness.qual.Nullable; -import org.jetbrains.annotations.NotNull; +import org.checkerframework.checker.nullness.qual.NonNull; import java.nio.ByteBuffer; @@ -181,7 +181,7 @@ public boolean equals(final @Nullable Object obj) { } @Override - public @NotNull String toString() { + public @NonNull String toString() { return MoreObjects.toStringHelper(this).add("nodeDel", nodeDelegate).add("nameDel", nameNodeDelegate).toString(); } @@ -205,7 +205,7 @@ public NameNodeDelegate getNameNodeDelegate() { } @Override - protected @NotNull NodeDelegate delegate() { + protected @NonNull NodeDelegate delegate() { return nodeDelegate; } diff --git a/bundles/sirix-core/src/main/java/io/sirix/node/xml/PINode.java b/bundles/sirix-core/src/main/java/io/sirix/node/xml/PINode.java index 503219e84..db314af6b 100644 --- a/bundles/sirix-core/src/main/java/io/sirix/node/xml/PINode.java +++ b/bundles/sirix-core/src/main/java/io/sirix/node/xml/PINode.java @@ -33,8 +33,9 @@ import net.openhft.chronicle.bytes.Bytes; import io.brackit.query.atomic.QNm; import org.checkerframework.checker.index.qual.NonNegative; +import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; -import org.jetbrains.annotations.NotNull; + import io.sirix.api.PageReadOnlyTrx; import io.sirix.api.visitor.VisitResult; import io.sirix.api.visitor.XmlNodeVisitor; @@ -170,7 +171,7 @@ public VisitResult acceptVisitor(final XmlNodeVisitor visitor) { } @Override - public @NotNull String toString() { + public @NonNull String toString() { return MoreObjects.toStringHelper(this) .add("structDel", structNodeDelegate) .add("nameDel", nameNodeDelegate) @@ -265,7 +266,7 @@ public ValueNodeDelegate getValNodeDelegate() { } @Override - protected @NotNull NodeDelegate delegate() { + protected @NonNull NodeDelegate delegate() { return structNodeDelegate.getNodeDelegate(); } diff --git a/bundles/sirix-core/src/main/java/io/sirix/node/xml/TextNode.java b/bundles/sirix-core/src/main/java/io/sirix/node/xml/TextNode.java index dcd7f4451..f868bfb4a 100644 --- a/bundles/sirix-core/src/main/java/io/sirix/node/xml/TextNode.java +++ b/bundles/sirix-core/src/main/java/io/sirix/node/xml/TextNode.java @@ -44,8 +44,8 @@ import io.sirix.settings.Constants; import io.sirix.settings.Fixed; import net.openhft.chronicle.bytes.Bytes; +import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; -import org.jetbrains.annotations.NotNull; import java.nio.ByteBuffer; @@ -211,7 +211,7 @@ public boolean equals(final @Nullable Object obj) { } @Override - public @NotNull String toString() { + public @NonNull String toString() { return MoreObjects.toStringHelper(this) .add("node delegate", structNodeDelegate.getNodeDelegate()) .add("struct delegate", structNodeDelegate) @@ -224,7 +224,7 @@ public ValueNodeDelegate getValNodeDelegate() { } @Override - protected @NotNull NodeDelegate delegate() { + protected @NonNull NodeDelegate delegate() { return structNodeDelegate.getNodeDelegate(); } diff --git a/bundles/sirix-core/src/main/java/io/sirix/node/xml/XmlDocumentRootNode.java b/bundles/sirix-core/src/main/java/io/sirix/node/xml/XmlDocumentRootNode.java index a9cf6d2a2..b1fae2d92 100644 --- a/bundles/sirix-core/src/main/java/io/sirix/node/xml/XmlDocumentRootNode.java +++ b/bundles/sirix-core/src/main/java/io/sirix/node/xml/XmlDocumentRootNode.java @@ -42,7 +42,6 @@ import net.openhft.chronicle.bytes.Bytes; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; -import org.jetbrains.annotations.NotNull; import java.nio.ByteBuffer; @@ -138,12 +137,12 @@ public boolean equals(@Nullable final Object obj) { } @Override - public @NotNull String toString() { + public @NonNull String toString() { return super.toString(); } @Override - protected @NotNull NodeDelegate delegate() { + protected @NonNull NodeDelegate delegate() { return nodeDelegate; } diff --git a/bundles/sirix-core/src/main/java/io/sirix/page/DeweyIDPage.java b/bundles/sirix-core/src/main/java/io/sirix/page/DeweyIDPage.java index b97d39f81..c4881ae9a 100644 --- a/bundles/sirix-core/src/main/java/io/sirix/page/DeweyIDPage.java +++ b/bundles/sirix-core/src/main/java/io/sirix/page/DeweyIDPage.java @@ -28,7 +28,6 @@ import io.sirix.node.DeweyIDNode; import io.sirix.node.NodeKind; import io.sirix.node.SirixDeweyID; -import net.openhft.chronicle.map.ChronicleMap; import org.checkerframework.checker.nullness.qual.NonNull; import io.sirix.api.PageReadOnlyTrx; import io.sirix.api.PageTrx; @@ -36,6 +35,7 @@ import io.sirix.page.interfaces.Page; import io.sirix.settings.Constants; +import java.util.Map; public final class DeweyIDPage extends AbstractForwardingPage { @@ -59,7 +59,7 @@ public final class DeweyIDPage extends AbstractForwardingPage { */ private int currentMaxLevelOfIndirectPages; - private ChronicleMap deweyIDsToNodeKeys; + private Map deweyIDsToNodeKeys; /** * Create dewey-ID page. @@ -183,16 +183,16 @@ public SirixDeweyID getDeweyIdForNodeKey(final long nodeKey, final PageReadOnlyT public long getNodeKeyForDeweyId(final SirixDeweyID deweyId, final PageReadOnlyTrx pageReadOnlyTrx) { if (deweyIDsToNodeKeys == null) { - deweyIDsToNodeKeys = - ChronicleMap.of(SirixDeweyID.class, Long.class).name("deweyIDsToNodeKeysMap").entries(maxNodeKey).create(); - for (long i = 1, l = maxNodeKey; i < l; i += 2) { - final long nodeKeyOfNode = i; - final var deweyIDNode = pageReadOnlyTrx.getRecord(nodeKeyOfNode, IndexType.DEWEYID_TO_RECORDID, 0); - - if (deweyIDNode != null && deweyIDNode.getKind() != NodeKind.DELETE) { - deweyIDsToNodeKeys.put(deweyIDNode.getDeweyID(), nodeKeyOfNode); - } - } +// deweyIDsToNodeKeys = +// ChronicleMap.of(SirixDeweyID.class, Long.class).name("deweyIDsToNodeKeysMap").entries(maxNodeKey).create(); +// for (long i = 1, l = maxNodeKey; i < l; i += 2) { +// final long nodeKeyOfNode = i; +// final var deweyIDNode = pageReadOnlyTrx.getRecord(nodeKeyOfNode, IndexType.DEWEYID_TO_RECORDID, 0); +// +// if (deweyIDNode != null && deweyIDNode.getKind() != NodeKind.DELETE) { +// deweyIDsToNodeKeys.put(deweyIDNode.getDeweyID(), nodeKeyOfNode); +// } +// } } return deweyIDsToNodeKeys.get(deweyId); } diff --git a/bundles/sirix-core/src/main/java/io/sirix/page/OverflowPage.java b/bundles/sirix-core/src/main/java/io/sirix/page/OverflowPage.java index 704656e26..8265bf6dc 100644 --- a/bundles/sirix-core/src/main/java/io/sirix/page/OverflowPage.java +++ b/bundles/sirix-core/src/main/java/io/sirix/page/OverflowPage.java @@ -1,8 +1,9 @@ package io.sirix.page; -import org.jetbrains.annotations.NotNull; + import io.sirix.api.PageTrx; import io.sirix.page.interfaces.Page; +import org.checkerframework.checker.nullness.qual.NonNull; import java.util.List; @@ -39,7 +40,7 @@ public List getReferences() { } @Override - public void commit(@NotNull PageTrx pageWriteTrx) { + public void commit(@NonNull PageTrx pageWriteTrx) { } @Override diff --git a/bundles/sirix-core/src/main/java/io/sirix/page/UberPage.java b/bundles/sirix-core/src/main/java/io/sirix/page/UberPage.java index 95c99444d..047e3c46f 100644 --- a/bundles/sirix-core/src/main/java/io/sirix/page/UberPage.java +++ b/bundles/sirix-core/src/main/java/io/sirix/page/UberPage.java @@ -29,14 +29,14 @@ package io.sirix.page; import com.google.common.base.MoreObjects; -import org.checkerframework.checker.index.qual.NonNegative; -import org.jetbrains.annotations.NotNull; import io.sirix.api.PageTrx; import io.sirix.cache.PageContainer; import io.sirix.cache.TransactionIntentLog; import io.sirix.index.IndexType; import io.sirix.page.interfaces.Page; import io.sirix.settings.Constants; +import org.checkerframework.checker.index.qual.NonNegative; +import org.checkerframework.checker.nullness.qual.NonNull; import java.util.List; @@ -193,7 +193,7 @@ public int[] getPageCountExp(final IndexType indexType) { } @Override - public void commit(final @NotNull PageTrx pageWriteTrx) { + public void commit(final @NonNull PageTrx pageWriteTrx) { pageWriteTrx.commit(rootPageReference); } diff --git a/bundles/sirix-core/src/main/java/io/sirix/service/json/serialize/JsonMaxLevelMaxNodesMaxChildNodesVisitor.java b/bundles/sirix-core/src/main/java/io/sirix/service/json/serialize/JsonMaxLevelMaxNodesMaxChildNodesVisitor.java index 465749af7..547f4451e 100644 --- a/bundles/sirix-core/src/main/java/io/sirix/service/json/serialize/JsonMaxLevelMaxNodesMaxChildNodesVisitor.java +++ b/bundles/sirix-core/src/main/java/io/sirix/service/json/serialize/JsonMaxLevelMaxNodesMaxChildNodesVisitor.java @@ -8,7 +8,7 @@ import io.sirix.node.NodeKind; import io.sirix.node.immutable.json.*; import io.sirix.node.interfaces.immutable.ImmutableStructNode; -import org.jetbrains.annotations.NotNull; +import org.checkerframework.checker.nullness.qual.NonNull; import java.util.ArrayDeque; import java.util.Deque; @@ -312,7 +312,7 @@ private VisitResultType determineAndGetVisitResultType(ImmutableStructNode node) return VisitResultType.CONTINUE; } - @NotNull + @NonNull private VisitResultType adaptCurrentChildNodesAndLevelAndReturnSkipSiblingsResultType(ImmutableStructNode node) { final var nodeKey = rtx.getNodeKey(); if (!(rtx.getParentKind() == NodeKind.OBJECT_KEY && rtx.moveToParent() && rtx.hasRightSibling())) { diff --git a/bundles/sirix-core/src/test/java/io/sirix/access/trx/page/NodePageReadOnlyTrxTest.java b/bundles/sirix-core/src/test/java/io/sirix/access/trx/page/NodePageReadOnlyTrxTest.java index 4abdff49a..cd035f013 100644 --- a/bundles/sirix-core/src/test/java/io/sirix/access/trx/page/NodePageReadOnlyTrxTest.java +++ b/bundles/sirix-core/src/test/java/io/sirix/access/trx/page/NodePageReadOnlyTrxTest.java @@ -7,7 +7,8 @@ import io.sirix.cache.TransactionIntentLog; import io.sirix.index.IndexType; import io.sirix.page.UberPage; -import org.jetbrains.annotations.NotNull; + +import org.checkerframework.checker.nullness.qual.NonNull; import org.junit.Assert; import org.junit.Test; import io.sirix.io.Reader; @@ -45,7 +46,7 @@ public void testRecordPageOffset() { assertEquals(Constants.NDP_NODE_COUNT - 1, PageReadOnlyTrx.recordPageOffset(1023)); } - @NotNull + @NonNull private InternalResourceSession createResourceManagerMock() { final var resourceManagerMock = mock(InternalResourceSession.class); when(resourceManagerMock.getResourceConfig()).thenReturn(new ResourceConfiguration.Builder("foobar").build()); diff --git a/bundles/sirix-core/src/test/java/io/sirix/service/json/shredder/JsonShredderTest.java b/bundles/sirix-core/src/test/java/io/sirix/service/json/shredder/JsonShredderTest.java index b7a5d600b..ad33db1f4 100644 --- a/bundles/sirix-core/src/test/java/io/sirix/service/json/shredder/JsonShredderTest.java +++ b/bundles/sirix-core/src/test/java/io/sirix/service/json/shredder/JsonShredderTest.java @@ -64,7 +64,6 @@ public void test() throws IOException { } } - @Disabled @Test public void testChicagoDescendantAxis() { final var database = JsonTestHelper.getDatabase(PATHS.PATH1.getFile()); @@ -145,7 +144,7 @@ private void createResource(Path jsonPath, Database databas .storeChildCount(true) .hashKind(HashType.ROLLING) .useTextCompression(false) - .storageType(StorageType.FILE_CHANNEL) + .storageType(StorageType.IO_URING) .useDeweyIDs(false) .byteHandlerPipeline(new ByteHandlerPipeline(new LZ4Compressor())) .build()); diff --git a/bundles/sirix-examples/src/main/java/io/sirix/tutorial/json/SerializeVersionedJsonResource.java b/bundles/sirix-examples/src/main/java/io/sirix/tutorial/json/SerializeVersionedJsonResource.java index 294c7cd48..4e64d37be 100644 --- a/bundles/sirix-examples/src/main/java/io/sirix/tutorial/json/SerializeVersionedJsonResource.java +++ b/bundles/sirix-examples/src/main/java/io/sirix/tutorial/json/SerializeVersionedJsonResource.java @@ -12,9 +12,8 @@ public class SerializeVersionedJsonResource { public static void main(String[] args) { CreateVersionedJsonResource.createJsonDatabaseWithVersionedResource(); - final var database = Databases.openJsonDatabase(Constants.SIRIX_DATA_LOCATION.resolve("json-database-versioned")); - - try (final var session = database.beginResourceSession("resource")) { + try (final var database = Databases.openJsonDatabase(Constants.SIRIX_DATA_LOCATION.resolve("json-database-versioned")); + final var session = database.beginResourceSession("resource")) { serializeRevisionOneAndTwo(session); serializeMostRecentRevision(session); diff --git a/bundles/sirix-kotlin-api/build.gradle b/bundles/sirix-kotlin-api/build.gradle index 4e9957790..a0d25951f 100644 --- a/bundles/sirix-kotlin-api/build.gradle +++ b/bundles/sirix-kotlin-api/build.gradle @@ -4,7 +4,6 @@ buildscript { repositories { mavenCentral() } - dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.20" } @@ -35,9 +34,6 @@ dependencies { description = 'Kotlin API for SirixDB.' -compileKotlin { - kotlinOptions.jvmTarget = '20' -} -compileTestKotlin { - kotlinOptions.jvmTarget = '20' -} +kotlin { + jvmToolchain(21) +} \ No newline at end of file diff --git a/bundles/sirix-kotlin-cli/build.gradle b/bundles/sirix-kotlin-cli/build.gradle index 31a0050fd..7cda27069 100644 --- a/bundles/sirix-kotlin-cli/build.gradle +++ b/bundles/sirix-kotlin-cli/build.gradle @@ -1,3 +1,5 @@ +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + description = 'Sirix CLI.' apply plugin: 'kotlin' @@ -7,9 +9,8 @@ test { } -tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all { +tasks.withType(KotlinCompile).all { kotlinOptions { - jvmTarget = "20" freeCompilerArgs += ["-Xopt-in=kotlin.RequiresOptIn"] } } @@ -28,4 +29,4 @@ dependencies { testImplementation testLibraries.junitJupiterApi testImplementation testLibraries.junitJupiterParams testImplementation testLibraries.jsonassert -} +} \ No newline at end of file diff --git a/bundles/sirix-query/src/main/java/io/sirix/query/compiler/optimizer/walker/json/AbstractJsonPathWalker.java b/bundles/sirix-query/src/main/java/io/sirix/query/compiler/optimizer/walker/json/AbstractJsonPathWalker.java index 183ad9448..ccc1e79da 100644 --- a/bundles/sirix-query/src/main/java/io/sirix/query/compiler/optimizer/walker/json/AbstractJsonPathWalker.java +++ b/bundles/sirix-query/src/main/java/io/sirix/query/compiler/optimizer/walker/json/AbstractJsonPathWalker.java @@ -11,7 +11,7 @@ import io.brackit.query.jdm.Type; import io.brackit.query.util.Cfg; import io.brackit.query.util.path.Path; -import org.jetbrains.annotations.NotNull; + import io.sirix.access.trx.node.IndexController; import io.sirix.api.json.JsonNodeReadOnlyTrx; import io.sirix.api.json.JsonNodeTrx; @@ -19,6 +19,7 @@ import io.sirix.index.IndexDef; import io.sirix.index.path.summary.PathSummaryReader; import io.sirix.node.NodeKind; +import org.checkerframework.checker.nullness.qual.NonNull; import java.util.*; import java.util.function.Function; @@ -132,7 +133,7 @@ protected AST replaceAstIfIndexApplicable(AST astNode, AST predicateNode, Type t return null; } - @NotNull + @NonNull private static AST replaceAstNodeWithEmptySequenceAstNode(AST astNode) { // no path node keys found: replace with empty sequence node final var parentASTNode = astNode.getParent(); diff --git a/bundles/sirix-query/src/main/java/io/sirix/query/compiler/translator/DerefDescendantExpr.java b/bundles/sirix-query/src/main/java/io/sirix/query/compiler/translator/DerefDescendantExpr.java index 25e7bea4e..5e6d75652 100644 --- a/bundles/sirix-query/src/main/java/io/sirix/query/compiler/translator/DerefDescendantExpr.java +++ b/bundles/sirix-query/src/main/java/io/sirix/query/compiler/translator/DerefDescendantExpr.java @@ -19,7 +19,8 @@ import io.brackit.query.sequence.LazySequence; import io.brackit.query.util.ExprUtil; import org.checkerframework.checker.index.qual.NonNegative; -import org.jetbrains.annotations.NotNull; + +import org.checkerframework.checker.nullness.qual.NonNull; import org.jetbrains.annotations.Nullable; import io.sirix.api.ResourceSession; import io.sirix.api.json.JsonNodeReadOnlyTrx; @@ -327,7 +328,7 @@ private static Deque getPathSegments(final @NonNegative int matchLe return pathSegments; } - @NotNull + @NonNull private SirixJsonLazySequence getLazySequence(final SirixJsonStream stream) { return new SirixJsonLazySequence(stream); } diff --git a/bundles/sirix-query/src/main/java/io/sirix/query/function/jn/diff/Diff.java b/bundles/sirix-query/src/main/java/io/sirix/query/function/jn/diff/Diff.java index 57aa95f8a..3547242a2 100644 --- a/bundles/sirix-query/src/main/java/io/sirix/query/function/jn/diff/Diff.java +++ b/bundles/sirix-query/src/main/java/io/sirix/query/function/jn/diff/Diff.java @@ -39,12 +39,13 @@ import io.brackit.query.jdm.Signature; import io.brackit.query.module.StaticContext; import io.brackit.query.util.annotation.FunctionAnnotation; -import org.jetbrains.annotations.NotNull; + import io.sirix.api.JsonDiff; import io.sirix.api.json.JsonResourceSession; import io.sirix.service.json.BasicJsonDiff; import io.sirix.query.function.FunUtil; import io.sirix.query.json.JsonDBCollection; +import org.checkerframework.checker.nullness.qual.NonNull; /** *

@@ -113,7 +114,7 @@ public Sequence execute(final StaticContext sctx, final QueryContext ctx, final return new Str(jsonDiff.generateDiff(doc.getResourceSession(), oldRevision, newRevision, startNodeKey, maxLevel)); } - @NotNull + @NonNull private Str readDiffFromFileAndCalculateViaDeweyIDs(String dbName, String expResName, int oldRevision, int newRevision, int startNodeKey, int maxLevel, JsonResourceSession resourceMgr) { // Fast track... just read the info from a file and use dewey IDs to determine changes in the desired subtree. diff --git a/bundles/sirix-rest-api/build.gradle b/bundles/sirix-rest-api/build.gradle index e10e634e0..f6b5dfe79 100644 --- a/bundles/sirix-rest-api/build.gradle +++ b/bundles/sirix-rest-api/build.gradle @@ -61,14 +61,6 @@ jar { finalizedBy shadowJar } -compileKotlin { - kotlinOptions.jvmTarget = '20' -} - -compileTestKotlin { - kotlinOptions.jvmTarget = '20' -} - test { jvmArgs "-Duser.home=${buildDir}" } diff --git a/bundles/sirix-rest-api/src/main/kotlin/io/sirix/rest/crud/json/JsonGet.kt b/bundles/sirix-rest-api/src/main/kotlin/io/sirix/rest/crud/json/JsonGet.kt index cb62e70fb..11bf3d7d8 100644 --- a/bundles/sirix-rest-api/src/main/kotlin/io/sirix/rest/crud/json/JsonGet.kt +++ b/bundles/sirix-rest-api/src/main/kotlin/io/sirix/rest/crud/json/JsonGet.kt @@ -1,26 +1,18 @@ package io.sirix.rest.crud.json -import io.brackit.query.jdm.StructuredItemCollection -import io.brackit.query.jdm.node.TemporalNodeCollection import io.vertx.core.Context import io.vertx.core.Promise import io.vertx.core.http.HttpHeaders -import io.vertx.core.json.JsonObject -import io.vertx.ext.auth.User import io.vertx.ext.auth.authorization.AuthorizationProvider import io.vertx.ext.auth.oauth2.OAuth2Auth -import io.vertx.ext.web.Route import io.vertx.ext.web.RoutingContext import io.vertx.kotlin.coroutines.await import io.sirix.access.Databases import io.sirix.api.Database import io.sirix.api.json.JsonNodeReadOnlyTrx -import io.sirix.api.json.JsonNodeTrx import io.sirix.api.json.JsonResourceSession -import io.sirix.api.xml.XmlResourceSession import io.sirix.rest.crud.PermissionCheckingQuery import io.sirix.rest.crud.QuerySerializer -import io.sirix.rest.crud.Revisions import io.sirix.rest.crud.xml.XmlSessionDBStore import io.sirix.service.json.serialize.JsonRecordSerializer import io.sirix.service.json.serialize.JsonSerializer @@ -29,9 +21,6 @@ import io.sirix.query.SirixCompileChain import io.sirix.rest.crud.AbstractGetHandler import io.sirix.query.SirixQueryContext import io.sirix.query.json.* -import io.sirix.query.node.BasicXmlDBStore -import io.sirix.query.node.XmlDBCollection -import io.vertx.core.json.Json import java.io.StringWriter import java.nio.file.Path @@ -286,12 +275,12 @@ class JsonGet(private val location: Path, private val keycloak: OAuth2Auth, priv return JsonDBCollection(databaseName, database) } - override fun handleQueryExtra(rtx: JsonNodeReadOnlyTrx, dbCollection: JsonDBCollection, queryCtx: SirixQueryContext, jsonDBStore: JsonSessionDBStore) { + override fun handleQueryExtra(rtx: JsonNodeReadOnlyTrx, dbCollection: JsonDBCollection, queryContext: SirixQueryContext, jsonDBStore: JsonSessionDBStore) { val jsonItem = JsonItemFactory() .getSequence(rtx, dbCollection) if (jsonItem != null) { - queryCtx.contextItem = jsonItem + queryContext.contextItem = jsonItem when (jsonItem) { is AbstractJsonDBArray<*> -> { diff --git a/bundles/sirix-rest-api/src/main/kotlin/io/sirix/rest/crud/xml/XmlGet.kt b/bundles/sirix-rest-api/src/main/kotlin/io/sirix/rest/crud/xml/XmlGet.kt index 558280740..47496ce61 100644 --- a/bundles/sirix-rest-api/src/main/kotlin/io/sirix/rest/crud/xml/XmlGet.kt +++ b/bundles/sirix-rest-api/src/main/kotlin/io/sirix/rest/crud/xml/XmlGet.kt @@ -1,35 +1,22 @@ package io.sirix.rest.crud.xml -import io.brackit.query.jdm.StructuredItemCollection -import io.brackit.query.jdm.node.TemporalNodeCollection import io.vertx.core.Context -import io.vertx.core.Promise import io.vertx.core.http.HttpHeaders -import io.vertx.core.json.JsonObject -import io.vertx.ext.auth.User import io.vertx.ext.auth.authorization.AuthorizationProvider import io.vertx.ext.auth.oauth2.OAuth2Auth -import io.vertx.ext.web.Route import io.vertx.ext.web.RoutingContext -import io.vertx.kotlin.coroutines.await -import io.vertx.kotlin.coroutines.dispatcher -import kotlinx.coroutines.withContext import io.sirix.access.Databases import io.sirix.api.Database -import io.sirix.api.json.JsonNodeReadOnlyTrx import io.sirix.api.xml.XmlNodeReadOnlyTrx import io.sirix.api.xml.XmlResourceSession import io.sirix.rest.crud.PermissionCheckingQuery import io.sirix.rest.crud.QuerySerializer -import io.sirix.rest.crud.Revisions import io.sirix.rest.crud.json.JsonSessionDBStore import io.sirix.service.xml.serialize.XmlSerializer import io.sirix.query.SirixCompileChain import io.sirix.query.SirixQueryContext import io.sirix.query.XmlDBSerializer -import io.sirix.query.json.* import io.sirix.rest.crud.AbstractGetHandler -import io.sirix.query.node.BasicXmlDBStore import io.sirix.query.node.XmlDBCollection import io.sirix.query.node.XmlDBNode import java.io.ByteArrayOutputStream @@ -207,10 +194,10 @@ class XmlGet(private val location: Path, private val keycloak: OAuth2Auth, priva return XmlSerializeHelper().serializeXml(serializer, out, ctx, manager, nodeId) } - override fun handleQueryExtra(rtx: XmlNodeReadOnlyTrx, dbCollection: XmlDBCollection, queryCtx: SirixQueryContext, jsonDBStore: JsonSessionDBStore) { + override fun handleQueryExtra(rtx: XmlNodeReadOnlyTrx, dbCollection: XmlDBCollection, queryContext: SirixQueryContext, jsonDBStore: JsonSessionDBStore) { val dbNode = XmlDBNode(rtx, dbCollection) - queryCtx.contextItem = dbNode + queryContext.contextItem = dbNode } diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 62d4c053550b91381bbd28b1afc82d634bf73a8a..7f93135c49b765f8051ef9d0a6055ff8e46073d8 100644 GIT binary patch delta 44733 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

Ca%uA05UTpm-fb`()QYj+OI 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 b7hw`Bw4~VJY{0;{1OBXmt|7YjKmPh31Up)j diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index db9a6b825..3fa8f862f 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip +networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index fbd7c5158..0adc8e1a5 100755 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ -#!/usr/bin/env sh +#!/bin/sh # -# Copyright 2015 the original author or authors. +# Copyright © 2015-2021 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -17,67 +17,99 @@ # ############################################################################## -## -## Gradle start up script for UN*X -## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# ############################################################################## # Attempt to set APP_HOME + # Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +MAX_FD=maximum warn () { echo "$*" -} +} >&2 die () { echo echo "$*" echo exit 1 -} +} >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar @@ -87,9 +119,9 @@ CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -98,88 +130,120 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac fi -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. # For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) fi - i=`expr $i + 1` + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac fi -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=`save "$@"` -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index 5093609d5..93e3f59f1 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -14,7 +14,7 @@ @rem limitations under the License. @rem -@if "%DEBUG%" == "" @echo off +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -25,7 +25,8 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @@ -40,7 +41,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init +if %ERRORLEVEL% equ 0 goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -54,7 +55,7 @@ goto fail set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe -if exist "%JAVA_EXE%" goto init +if exist "%JAVA_EXE%" goto execute echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% @@ -64,21 +65,6 @@ echo location of your Java installation. goto fail -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - :execute @rem Setup the command line @@ -86,17 +72,19 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +if %ERRORLEVEL% equ 0 goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal diff --git a/libraries.gradle b/libraries.gradle index 784600f86..66a0db419 100644 --- a/libraries.gradle +++ b/libraries.gradle @@ -5,7 +5,6 @@ ext { } implLibraries = [ - chronicleMap : 'net.openhft:chronicle-map:3.22ea6', jcommander : 'com.beust:jcommander:1.69', aspectjrt : 'org.aspectj:aspectjrt:1.8.10', slf4jApi : 'org.slf4j:slf4j-api:1.7.25', @@ -23,8 +22,8 @@ implLibraries = [ lz4 : 'org.lz4:lz4-java:1.8.0', browniesCollections : 'org.magicwerk:brownies-collections:0.9.14', tink : 'com.google.crypto.tink:tink:1.2.1', - kotlinStdlib : 'org.jetbrains.kotlin:kotlin-stdlib:1.7.22', - kotlinxCoroutinesCore : 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4', + kotlinStdlib : 'org.jetbrains.kotlin:kotlin-stdlib:1.9.20', + kotlinxCoroutinesCore : 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3', vertxCore : "io.vertx:vertx-core:$vertxVersion", vertxWeb : "io.vertx:vertx-web:$vertxVersion", vertxLangKotlin : "io.vertx:vertx-lang-kotlin:$vertxVersion", @@ -38,7 +37,7 @@ implLibraries = [ integercompression : 'me.lemire.integercompression:JavaFastPFOR:0.1.12', dagger : 'com.google.dagger:dagger:2.32', daggerCompiler : 'com.google.dagger:dagger-compiler:2.32', - chronicleBytes : 'net.openhft:chronicle-bytes:2.24ea16', + chronicleBytes : 'net.openhft:chronicle-bytes:2.24ea20', fastUtil : 'it.unimi.dsi:fastutil:8.5.12', amazonCorettoCryptoProvider : 'software.amazon.cryptools:AmazonCorrettoCryptoProvider:1.6.1:linux-x86_64', iouring : 'one.jasyncfio:jasyncfio:0.0.7:linux-amd64', @@ -55,8 +54,8 @@ testLibraries = [ junitVintageEngine : 'org.junit.vintage:junit-vintage-engine:5.8.1', junitPlatformLauncher : 'org.junit.platform:junit-platform-launcher:1.8.1', junitPlatformRunner : 'org.junit.platform:junit-platform-runner:1.8.1', - mockitoCore : 'org.mockito:mockito-core:5.4.0', - byteBuddy : 'net.bytebuddy:byte-buddy:1.14.5', + mockitoCore : 'org.mockito:mockito-core:5.5.0', + byteBuddy : 'net.bytebuddy:byte-buddy:1.14.8', brackit : 'io.sirix:brackit:0.3-SNAPSHOT:tests', kotlinTestJunit : 'org.jetbrains.kotlin:kotlin-test-junit:1.5.31', junit : 'junit:junit:4.13.2',