You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by gi...@apache.org on 2026/09/17 09:34:48 UTC

(groovy-dev-site) branch asf-site updated: 2026/09/17 09:34:44: Generated dev website from groovy-website@0857fc9

This is an automated email from the ASF dual-hosted git repository.

asf-gitbox-commits pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/groovy-dev-site.git


The following commit(s) were added to refs/heads/asf-site by this push:
     new e84cf385 2026/09/17 09:34:44: Generated dev website from groovy-website@0857fc9
e84cf385 is described below

commit e84cf3852a7282d9d5bf37327b8bc5872b3896c9
Author: jenkins <bu...@apache.org>
AuthorDate: Thu Sep 17 09:34:44 2026 +0000

    2026/09/17 09:34:44: Generated dev website from groovy-website@0857fc9
---
 blog/classifying-iris-flowers-with-deep.html |   2 +-
 blog/exploring-gatherers4j.html              | 138 ++++++++++++++++++++++++---
 blog/feed.atom                               |   6 +-
 blog/groovy-gatherers.html                   |  14 ++-
 blog/index.html                              |   4 +-
 blog/parsing-json-with-groovy.html           |   2 +-
 blog/working-with-sql-databases-with.html    |   2 +-
 search/search-index.json                     |  12 +--
 8 files changed, 147 insertions(+), 33 deletions(-)

diff --git a/blog/classifying-iris-flowers-with-deep.html b/blog/classifying-iris-flowers-with-deep.html
index 7b39f5f6..48558cb5 100644
--- a/blog/classifying-iris-flowers-with-deep.html
+++ b/blog/classifying-iris-flowers-with-deep.html
@@ -63,7 +63,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Classifying Iris Flowers with Deep Learning, Groovy&trade; and GraalVM</a></li><li><a href='#_deep_learning' class='anchor-link'>Deep Learning</a></li><li><a href='#_encog' class='anchor-link'>Encog</a></li><li><a href='#_eclipse_deeplearning4j' class='anchor-link'>Eclipse [...]
+                        </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Classifying Iris Flowers with Deep Learning, Groovy&trade; and GraalVM</a></li><li><a href='#_deep_learning' class='anchor-link'>Deep Learning</a></li><li><a href='#_encog' class='anchor-link'>Encog</a></li><li><a href='#_eclipse_deeplearning4j' class='anchor-link'>Eclipse [...]
 <div class="sectionbody">
 <div class="paragraph">
 <p><span class="image right"><img src="./img/iris_flowers.png" alt="iris flowers" width="200"></span>
diff --git a/blog/exploring-gatherers4j.html b/blog/exploring-gatherers4j.html
index 09285993..d690a795 100644
--- a/blog/exploring-gatherers4j.html
+++ b/blog/exploring-gatherers4j.html
@@ -3,7 +3,7 @@
 <!--[if IE 7]>         <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
 <!--[if IE 8]>         <html class="no-js lt-ie9"> <![endif]-->
 <!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]--><head>
-    <meta charset='utf-8'/><meta http-equiv='X-UA-Compatible' content='IE=edge'/><meta name='viewport' content='width=device-width, initial-scale=1'/><meta name='keywords' content='gatherers, jdk24, chop, collate, inject, streams, fold, scan'/><meta name='description' content='This post looks at using Gatherers4J (relies on JDK24 stream gatherer API) with Groovy as well as similar Iterator extension methods.'/><title>The Apache Groovy programming language - Blogs - Exploring Gatherers4J  [...]
+    <meta charset='utf-8'/><meta http-equiv='X-UA-Compatible' content='IE=edge'/><meta name='viewport' content='width=device-width, initial-scale=1'/><meta name='keywords' content='gatherers, jdk24, jdk25, jdk27, gatherers4j, graalvm, native, chop, collate, inject, streams, fold, scan'/><meta name='description' content='This post looks at using Gatherers4J (relies on JDK24 stream gatherer API) with Groovy as well as similar Iterator extension methods.'/><title>The Apache Groovy programmi [...]
 </head><body>
     <div id='fork-me'>
         <a href='https://github.com/apache/groovy'>
@@ -63,7 +63,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Exploring Gatherers4J with Groovy&trade;</a></li><li><a href='#_revisiting_collate_with_gatherers4j' class='anchor-link'>Revisiting Collate with Gatherers4J</a></li><li><a href='#_exploring_gatherers4j_other_functionality' class='anchor-link'>Exploring Gatherers4J other fu [...]
+                        </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Exploring Gatherers4J with Groovy&trade;</a></li><li><a href='#_revisiting_collate_with_gatherers4j' class='anchor-link'>Revisiting Collate with Gatherers4J</a></li><li><a href='#_exploring_gatherers4j_other_functionality' class='anchor-link'>Exploring Gatherers4J other fu [...]
 <div class="sectionbody">
 <table><tr><td style="padding: 0px; padding-left: 20px; padding-right: 20px; font-size: 18pt; line-height: 1.5; margin: 0px">
 <div class="paragraph">
@@ -86,8 +86,8 @@ your own gatherer equivalents for chop, collate and other built-in Groovy functi
 <p>Other folks have also been looking at useful gatherers and libraries
 are starting to emerge.
 <a href="https://tginsberg.github.io/gatherers4j/">Gatherers4J</a>
-is one such library. We&#8217;ll use 0.11.0, Groovy 5 snapshot (pre-release),
-and JDK 24.</p>
+is one such library. We&#8217;ll use 0.14.0, Groovy 6, and JDK 27.
+The gatherers API itself is JDK 24, but Gatherers4J 0.14.0 needs JDK 25 or later.</p>
 </div>
 <div class="paragraph">
 <p>Let&#8217;s now look at numerous other gatherers (and their Groovy iterator equivalents)
@@ -880,19 +880,19 @@ assert ('A'..'G').stream()
 </div>
 <div class="paragraph">
 <p>Groovy doesn&#8217;t have a specific method for taking/dropping the nth element
-but you either use <code>findAllLazy</code> with <code>withIndex</code>, or <code>tapEvery</code>:</p>
+but you either use <code>findingAll</code> with <code>withIndex</code>, or <code>tapEvery</code>:</p>
 </div>
 <div class="listingblock">
 <div class="content">
 <pre class="prettyprint highlight"><code data-lang="groovy"><div style="background-color: #ddddee">
 // drop every 3rd
 assert ('A'..'G').iterator().withIndex()
-    .findAll { next, i -&gt; i % 3 }
+    .findingAll { next, i -&gt; i % 3 }
     *.first == ['B', 'C', 'E', 'F']
 
 // take every 3rd
 assert ('A'..'G').iterator().withIndex()
-    .findAll { next, i -&gt; i % 3 == 0 }
+    .findingAll { next, i -&gt; i % 3 == 0 }
     *.first == ['A', 'D', 'G']
 
 // also take every 3rd
@@ -971,15 +971,15 @@ assert abcde.stream()
 </div>
 </div>
 <div class="paragraph">
-<p>Groovy doesn&#8217;t have an all-in-one equivalent, but you can use <code>withIndex</code> plus <code>findAllLazy</code>:</p>
+<p>Groovy doesn&#8217;t have an all-in-one equivalent, but you can use <code>withIndex</code> plus <code>findingAll</code>:</p>
 </div>
 <div class="listingblock">
 <div class="content">
 <pre class="prettyprint highlight"><code data-lang="groovy"><div style="background-color: #ddddee">
 assert abcde.iterator().withIndex()
-    .findAll { s, n -&gt; n % 2 == 0 }*.first == ['A', 'C', 'E']
+    .findingAll { s, n -&gt; n % 2 == 0 }*.first == ['A', 'C', 'E']
 assert abcde.iterator().withIndex()
-    .findAll { s, n -&gt; n &lt; 2 || s == 'E' }*.first == ['A', 'B', 'E']
+    .findingAll { s, n -&gt; n &lt; 2 || s == 'E' }*.first == ['A', 'B', 'E']
 <br/></div></code></pre>
 </div>
 </div>
@@ -1023,7 +1023,7 @@ assert mixed.stream()
 <div class="paragraph">
 <p>Groovy doesn&#8217;t have an exact equivalent but does have an eager <code>grep</code>
 which lets you do similar things, and other functionality like matching
-regex patterns. You can also use <code>findAllLazy</code> in combination with
+regex patterns. You can also use <code>findingAll</code> in combination with
 <code>getClass()</code> or <code>instanceof</code> as needed:</p>
 </div>
 <div class="listingblock">
@@ -1034,7 +1034,7 @@ assert mixed.iterator().grep(Integer) == [3]
 assert mixed.iterator().grep(Number) == [1, 2, 3, 4, 5.0, 6.0]
 assert mixed.iterator().grep(~/\d/).toString() == '[1, 2, 3, 4, 7]'
 assert mixed.iterator()
-    .findAllLazy{ it.getClass() in [Integer, Short] }
+    .findingAll{ it.getClass() in [Integer, Short] }
     .toList() == [2, 3]
 <br/></div></code></pre>
 </div>
@@ -1142,6 +1142,109 @@ assert ['A', 'B', 'C', 'A'].iterator()
 </div>
 </div>
 <div class="sect1">
+<h2 id="_using_gatherers4j_with_graalvm_native_images">Using Gatherers4J with GraalVM native images</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>Gatherers4J and Groovy both work inside a GraalVM native image, and the
+<a href="https://github.com/paulk-asert/groovy-gatherers">example repo</a> builds every example in this
+post as its own native image. A native image resolves reflection at build time, so it needs to be
+told what will be looked up at run time. For Groovy that is mostly handled already: the
+Groovy jars ship reachability metadata for what the runtime does on its own behalf, and
+<code>native-image</code> picks it up from the jars with no configuration.</p>
+</div>
+<div class="paragraph">
+<p>What is left is what your own code does, recorded with the tracing agent. One thing the
+agent cannot see is worth knowing about when using a library like Gatherers4J. When a
+closure is passed where a functional interface is expected, Groovy coerces it through a
+<code>java.lang.reflect.Proxy</code>, and the agent does not observe that, so the proxy has to be
+registered by hand. Writing the argument as a lambda or a method reference makes no
+difference by itself: in dynamic Groovy <code>Integer::sum</code> is a <code>MethodClosure</code>, and it is
+coerced the same way. The gatherer factories take several such arguments at once, so for
+the examples in this post the list is:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>java.util.function.Function
+java.util.function.BiFunction
+java.util.function.Predicate
+java.util.function.BiPredicate
+java.util.function.Supplier
+java.util.function.Consumer
+java.util.function.BiConsumer
+java.util.function.BinaryOperator
+java.util.function.UnaryOperator
+java.util.Comparator
+com.ginsberg.gatherers4j.IndexedAccumulatorFunction</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>That last one is the library&#8217;s own functional interface, used by its <code>*Indexed</code>
+factories. The <code>java.util.function</code> ones cover the closures the factories take, and the
+four that <code>Gatherer.ofSequential</code> itself takes: a <code>Supplier</code> initialiser, an <code>Integrator</code>,
+a <code>BinaryOperator</code> combiner and a <code>BiConsumer</code> finisher. Writing your own gatherers rather
+than using the library, you would also need <code>java.util.stream.Gatherer$Integrator</code> and
+<code>java.util.stream.Gatherer$Integrator$Greedy</code>.</p>
+</div>
+<div class="paragraph">
+<p>Each becomes a <code>{"type": {"proxy": ["&#8230;&#8203;"]}}</code> entry in <code>reachability-metadata.json</code>.
+You discover them one at a time: the image builds, then fails on the first missing one with
+a <code>MissingReflectionRegistrationError</code> naming the interface. Listing interfaces that turn
+out not to be needed is harmless, so it is reasonable to add the whole signature of the
+factories you use in one go.</p>
+</div>
+<div class="paragraph">
+<p>There is a way to avoid those proxy entries altogether, and it depends on how the code is
+compiled rather than on how the argument is written. The coercion happens because a dynamic
+Groovy closure is not itself an implementation of the target interface. Under
+<code>@CompileStatic</code>, where the target type is known, both a lambda and a method reference
+compile through <code>LambdaMetafactory</code> into a real implementation of that interface, exactly as
+Java would, so no proxy is involved:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code data-lang="groovy"><div style="background-color: #ddeedd">
+@CompileStatic
+class Stat {
+    static void main(String[] args) {
+        var result = (1..5).stream()
+            .gather(Gatherers4j.filterIndexedInteger n, Integer s) -&gt; n % 2 == 0
+            .toList()
+        assert result == [1, 3, 5]
+    }
+}
+<br/></div></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Built as a native image, that version needs no hand-written proxy entries at all: the agent
+records none, and the image builds and runs as is. The same holds for a method reference:
+<code>Arrays.parallelPrefix(nums, Integer::sum)</code> needs a <code>BinaryOperator</code> proxy entry when
+compiled dynamically and none at all under <code>@CompileStatic</code>. So if you are targeting native
+images and are willing to annotate the types, static compilation removes this whole category
+of configuration. The dynamic examples in this post keep their proxy list.</p>
+</div>
+<div class="paragraph">
+<p>Two other things help. Record with <code>-Dgroovy.indy.aot.link=true</code> so the JVM links call sites
+the way the image will, which creates the same metaclasses the image will need. And when
+trimming Groovy&#8217;s own entries out of your recording, drop only what the Groovy jars already
+ship rather than everything in a <code>groovy.*</code> package: a third-party class can live in such a
+package, and a Groovy API class your own dynamic code reaches is yours to record.</p>
+</div>
+<div class="paragraph">
+<p>The payoff is the usual one. For the examples in this post, built with GraalVM for JDK 25, the image is 42 MB and starts in
+well under a tenth of a second against a bit over a second on the JVM, with identical output:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>$ ./native-build.sh --only Gatherers4jExamples
+...
+Finished generating 'Gatherers4jExamples' in 37.6s.
+  OK, output identical to the JVM run</code></pre>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
 <h2 id="_further_information">Further information</h2>
 <div class="sectionbody">
 <div class="ulist">
@@ -1162,12 +1265,15 @@ assert ['A', 'B', 'C', 'A'].iterator()
 <p><a href="https://nipafx.dev/implementing-gatherers/">Implementing New Java Stream Operations</a></p>
 </li>
 <li>
-<p><a href="https://github.com/paulk-asert/groovy-gatherers">Source code on GitHub</a></p>
+<p><a href="https://github.com/paulk-asert/groovy-gatherers">Source code on GitHub</a> (including <code>native-build.sh</code>, which builds each example as a native image)</p>
 </li>
 <li>
 <p><a href="https://tginsberg.github.io/gatherers4j/">Gatherers4J GitHub site</a></p>
 </li>
 <li>
+<p><a href="https://www.graalvm.org/latest/reference-manual/native-image/metadata/">GraalVM reachability metadata</a></p>
+</li>
+<li>
 <p><a href="https://timyates.github.io/groovy-stream/">Groovy-stream GitHub site</a></p>
 </li>
 </ul>
@@ -1185,7 +1291,11 @@ Gatherers4j works well with Groovy, offering additional stream functionality not
 <div class="content">
 <div class="title">Update history</div>
 <div class="paragraph">
-<p><strong>06/May/2025</strong>: Initial version<br></p>
+<p><strong>06/May/2025</strong>: Initial version<br>
+<strong>17/Sep/2026</strong>: Updated for Gatherers4J 0.14.0, Groovy 6 and JDK 27.
+Renamed <code>findAllLazy</code> to <code>findingAll</code>, the name the lazy iterator methods
+shipped under in Groovy 6 (GROOVY-11606).
+Added a section on using Gatherers4J with GraalVM native images.</p>
 </div>
 </div>
 </div>
diff --git a/blog/feed.atom b/blog/feed.atom
index 6c7b3bc3..35ee56c1 100644
--- a/blog/feed.atom
+++ b/blog/feed.atom
@@ -4,7 +4,7 @@
   <link href="http://groovy.apache.org/blog"/>
   <link href="http://groovy.apache.org/blog/feed.atom" rel="self"/>
   <id>http://groovy.apache.org/blog</id>
-  <updated>2026-09-11T20:00:00Z</updated>
+  <updated>2026-09-17T14:00:00Z</updated>
   <entry>
     <id>http://groovy.apache.org/blog/groovy-geaflow</id>
     <author>
@@ -166,7 +166,7 @@
     </author>
     <title type="html">Exploring Gatherers4J with Groovy&amp;trade;</title>
     <link href="http://groovy.apache.org/blog/exploring-gatherers4j"/>
-    <updated>2025-05-06T20:30:00Z</updated>
+    <updated>2026-09-17T14:00:00Z</updated>
     <published>2025-05-06T20:30:00Z</published>
     <summary type="html">This post looks at using Gatherers4J (relies on JDK24 stream gatherer API) with Groovy as well as similar Iterator extension methods.</summary>
   </entry>
@@ -342,7 +342,7 @@
     </author>
     <title type="html">Using Gatherers with Groovy&amp;trade;</title>
     <link href="http://groovy.apache.org/blog/groovy-gatherers"/>
-    <updated>2025-03-19T14:00:00Z</updated>
+    <updated>2026-09-15T14:00:00Z</updated>
     <published>2023-12-09T15:30:00Z</published>
     <summary type="html">This post looks at using Gatherers (JEP 461, JEP 473, JEP 485) with Groovy.</summary>
   </entry>
diff --git a/blog/groovy-gatherers.html b/blog/groovy-gatherers.html
index cfa281c6..f4493b35 100644
--- a/blog/groovy-gatherers.html
+++ b/blog/groovy-gatherers.html
@@ -3,7 +3,7 @@
 <!--[if IE 7]>         <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
 <!--[if IE 8]>         <html class="no-js lt-ie9"> <![endif]-->
 <!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]--><head>
-    <meta charset='utf-8'/><meta http-equiv='X-UA-Compatible' content='IE=edge'/><meta name='viewport' content='width=device-width, initial-scale=1'/><meta name='keywords' content='gatherers, jdk24, chop, collate, inject, ginq, streams, jep461, fold, scan'/><meta name='description' content='This post looks at using Gatherers (JEP 461, JEP 473, JEP 485) with Groovy.'/><title>The Apache Groovy programming language - Blogs - Using Gatherers with Groovy&trade;</title><link href='../img/favic [...]
+    <meta charset='utf-8'/><meta http-equiv='X-UA-Compatible' content='IE=edge'/><meta name='viewport' content='width=device-width, initial-scale=1'/><meta name='keywords' content='gatherers, jdk24, jdk25, chop, collate, inject, ginq, streams, jep461, fold, scan'/><meta name='description' content='This post looks at using Gatherers (JEP 461, JEP 473, JEP 485) with Groovy.'/><title>The Apache Groovy programming language - Blogs - Using Gatherers with Groovy&trade;</title><link href='../im [...]
 </head><body>
     <div id='fork-me'>
         <a href='https://github.com/apache/groovy'>
@@ -63,7 +63,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Using Gatherers with Groovy&trade;</a></li><li><a href='#_understanding_gatherers' class='anchor-link'>Understanding Gatherers</a></li><li><a href='#_accessing_parts_of_a_collection' class='anchor-link'>Accessing parts of a collection</a></li><li><a href='#_collate' class= [...]
+                        </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Using Gatherers with Groovy&trade;</a></li><li><a href='#_understanding_gatherers' class='anchor-link'>Understanding Gatherers</a></li><li><a href='#_accessing_parts_of_a_collection' class='anchor-link'>Accessing parts of a collection</a></li><li><a href='#_collate' class= [...]
 <div class="sectionbody">
 <table><tr><td style="padding: 0px; padding-left: 20px; padding-right: 20px; font-size: 18pt; line-height: 1.5; margin: 0px">
 <div class="paragraph">
@@ -94,7 +94,10 @@ Like many JDK enhancements, Groovy provides automatic gatherer support without n
 any changes.</p>
 </div>
 <div class="paragraph">
-<p>The examples in this blog were tested with Groovy 4.0.26. The Gatherer examples used JDK version 24.0.0, other examples are tested with JDKs 8, 17 and 24.</p>
+<p>The examples in this blog were tested with Groovy 6.0.0 and JDKs 17, 21 and 25.
+The Gatherer examples need JDK 24 or later, where the gatherers API is final.
+The Groovy collection equivalents shown alongside them also work with earlier
+Groovy and JDK versions, including JDK 8 with Groovy 4.</p>
 </div>
 </div>
 </div>
@@ -178,7 +181,7 @@ select specific elements from a collection:</p>
 <pre class="prettyprint highlight"><code data-lang="groovy">assert (1..8)[0..2] == [1, 2, 3]                   // index by closed range
 assert (1..8)[3&lt;..&lt;6] == [5, 6]                    // index by open range
 assert (1..8)[0..2,3..4,5] == [1, 2, 3, 4, 5, 6]   // index by multiple ranges
-assert (1..8)[0..2,3..-1] == 1..8                  // ditto
+assert (1..8)[0..2,3..7] == 1..8                   // ditto
 assert (1..8)[0,2,4,6] == [1,3,5,7]                // select odd numbers
 assert (1..8)[1,3,5,7] == [2,4,6,8]                // select even numbers</code></pre>
 </div>
@@ -849,7 +852,8 @@ likely pick whichever style makes sense.</p>
 <div class="paragraph">
 <p><strong>09/Dec/2023</strong>: Initial version<br>
 <strong>18/Jan/2024</strong>: Updated with a scan/cumulative sum example.<br>
-<strong>19/Mar/2025</strong>: Updated for JDK24.</p>
+<strong>19/Mar/2025</strong>: Updated for JDK24.<br>
+<strong>15/Sep/2026</strong>: Updated for Groovy 6 and JDK 25.</p>
 </div>
 </div>
 </div>
diff --git a/blog/index.html b/blog/index.html
index a2ce87fe..6cbb5020 100644
--- a/blog/index.html
+++ b/blog/index.html
@@ -63,7 +63,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3' id='blog-index'><ul class='nav-sidebar list'><li class='active'><a href='/blog/'>Blogs</a></li><li><a href='groovy6-functional'>Groovy 6 features for Functional Programmers</a></li><li><a href='solving-simple-optimization-problems-with-groovy'>Solving simple optimization problems with Groovy&trade; using Commons Math, Hipparchus, OptaPlanner, and Timefold</a></li>< [...]
+                        </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3' id='blog-index'><ul class='nav-sidebar list'><li class='active'><a href='/blog/'>Blogs</a></li><li><a href='exploring-gatherers4j'>Exploring Gatherers4J with Groovy&trade;</a></li><li><a href='groovy-gatherers'>Using Gatherers with Groovy&trade;</a></li><li><a href='groovy6-functional'>Groovy 6 features for Functional Programmers</a></li><li><a href='solving-simple [...]
                             <div class='row'>
                                 <div class='colset-3-footer'>
                                     <div class='col-1'>
@@ -107,7 +107,7 @@
                     colors: am5.ColorSet.new(root, {})
                 }));
                 wc.data.setAll([
-                { category: "groovy", value: 94 }, { category: "asf", value: 2 }, { category: "apachecon", value: 3 }, { category: "communityovercode", value: 2 }, { category: "natural language processing", value: 2 }, { category: "nlp", value: 1 }, { category: "nlpcraft", value: 1 }, { category: "combinations", value: 1 }, { category: "permutations", value: 1 }, { category: "testing", value: 2 }, { category: "junit", value: 2 }, { category: "spock", value: 2 }, { category: "jqwik", valu [...]
+                { category: "groovy", value: 94 }, { category: "asf", value: 2 }, { category: "apachecon", value: 3 }, { category: "communityovercode", value: 2 }, { category: "natural language processing", value: 2 }, { category: "nlp", value: 1 }, { category: "nlpcraft", value: 1 }, { category: "combinations", value: 1 }, { category: "permutations", value: 1 }, { category: "testing", value: 2 }, { category: "junit", value: 2 }, { category: "spock", value: 2 }, { category: "jqwik", valu [...]
                 ]);
                 wc.labels.template.setAll({
                     paddingTop: 5,
diff --git a/blog/parsing-json-with-groovy.html b/blog/parsing-json-with-groovy.html
index 0fcdca6a..8a2d2517 100644
--- a/blog/parsing-json-with-groovy.html
+++ b/blog/parsing-json-with-groovy.html
@@ -63,7 +63,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Parsing JSON with Groovy&trade;</a></li><li><a href='#_batteries_included_experience' class='anchor-link'>Batteries included experience</a></li><li><a href='#_gradle' class='anchor-link'>Gradle</a></li><li><a href='#_maven' class='anchor-link'>Maven</a></li><li><a href='#_ [...]
+                        </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Parsing JSON with Groovy&trade;</a></li><li><a href='#_batteries_included_experience' class='anchor-link'>Batteries included experience</a></li><li><a href='#_gradle' class='anchor-link'>Gradle</a></li><li><a href='#_maven' class='anchor-link'>Maven</a></li><li><a href='#_ [...]
 <div class="sectionbody">
 <div class="paragraph">
 <p><span class="image right"><img src="./img/json_logo.gif" alt="json logo" width="120"></span>
diff --git a/blog/working-with-sql-databases-with.html b/blog/working-with-sql-databases-with.html
index 8aecb106..b50b966f 100644
--- a/blog/working-with-sql-databases-with.html
+++ b/blog/working-with-sql-databases-with.html
@@ -63,7 +63,7 @@
                                     </ul>
                                 </div>
                             </div>
-                        </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Working with SQL databases with Groovy&trade; and GraalVM</a></li><li><a href='#_native_metadata' class='anchor-link'>Native Metadata</a></li><li><a href='#_working_with_sql_in_groovy' class='anchor-link'>Working with SQL in Groovy</a></li><li><a href='#_configuring_our_na [...]
+                        </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li><a href='./'>Blog index</a></li><li class='active'><a href='#doc'>Working with SQL databases with Groovy&trade; and GraalVM</a></li><li><a href='#_native_metadata' class='anchor-link'>Native Metadata</a></li><li><a href='#_working_with_sql_in_groovy' class='anchor-link'>Working with SQL in Groovy</a></li><li><a href='#_configuring_our_na [...]
 <div class="sectionbody">
 <div class="paragraph">
 <p>During the week, there was an interesting
diff --git a/search/search-index.json b/search/search-index.json
index 09a18dcb..d14fa679 100644
--- a/search/search-index.json
+++ b/search/search-index.json
@@ -163,7 +163,7 @@
     {
         "id": "blog/groovy-gatherers.html",
         "title": "The Apache Groovy programming language - Blogs - Using Gatherers with Groovy&trade;",
-        "content": "The Apache Groovy programming language - Blogs - Using Gatherers with Groovy&trade; Socialize Discuss on the mailing list Groovy on X Groovy on Bluesky Groovy on Mastodon Groovy on LinkedIn Events and conferences Source code on GitHub Report issues in Jira Stack Overflow questions Slack Community You are using an outdated browser. Please upgrade your browser to improve your experience. Apache Groovy&trade; Learn Documentation Download Support Contribute Ecosystem Blog [...]
+        "content": "The Apache Groovy programming language - Blogs - Using Gatherers with Groovy&trade; Socialize Discuss on the mailing list Groovy on X Groovy on Bluesky Groovy on Mastodon Groovy on LinkedIn Events and conferences Source code on GitHub Report issues in Jira Stack Overflow questions Slack Community You are using an outdated browser. Please upgrade your browser to improve your experience. Apache Groovy&trade; Learn Documentation Download Support Contribute Ecosystem Blog [...]
         "url": "blog/groovy-gatherers.html",
         "site": "dev"
     },
@@ -429,7 +429,7 @@
     {
         "id": "blog/working-with-sql-databases-with.html",
         "title": "The Apache Groovy programming language - Blogs - Working with SQL databases with Groovy&trade; and GraalVM",
-        "content": "The Apache Groovy programming language - Blogs - Working with SQL databases with Groovy&trade; and GraalVM Socialize Discuss on the mailing list Groovy on X Groovy on Bluesky Groovy on Mastodon Groovy on LinkedIn Events and conferences Source code on GitHub Report issues in Jira Stack Overflow questions Slack Community You are using an outdated browser. Please upgrade your browser to improve your experience. Apache Groovy&trade; Learn Documentation Download Support Co [...]
+        "content": "The Apache Groovy programming language - Blogs - Working with SQL databases with Groovy&trade; and GraalVM Socialize Discuss on the mailing list Groovy on X Groovy on Bluesky Groovy on Mastodon Groovy on LinkedIn Events and conferences Source code on GitHub Report issues in Jira Stack Overflow questions Slack Community You are using an outdated browser. Please upgrade your browser to improve your experience. Apache Groovy&trade; Learn Documentation Download Support Co [...]
         "url": "blog/working-with-sql-databases-with.html",
         "site": "dev"
     },
@@ -548,7 +548,7 @@
     {
         "id": "blog/exploring-gatherers4j.html",
         "title": "The Apache Groovy programming language - Blogs - Exploring Gatherers4J with Groovy&trade;",
-        "content": "The Apache Groovy programming language - Blogs - Exploring Gatherers4J with Groovy&trade; Socialize Discuss on the mailing list Groovy on X Groovy on Bluesky Groovy on Mastodon Groovy on LinkedIn Events and conferences Source code on GitHub Report issues in Jira Stack Overflow questions Slack Community You are using an outdated browser. Please upgrade your browser to improve your experience. Apache Groovy&trade; Learn Documentation Download Support Contribute Ecosyste [...]
+        "content": "The Apache Groovy programming language - Blogs - Exploring Gatherers4J with Groovy&trade; Socialize Discuss on the mailing list Groovy on X Groovy on Bluesky Groovy on Mastodon Groovy on LinkedIn Events and conferences Source code on GitHub Report issues in Jira Stack Overflow questions Slack Community You are using an outdated browser. Please upgrade your browser to improve your experience. Apache Groovy&trade; Learn Documentation Download Support Contribute Ecosyste [...]
         "url": "blog/exploring-gatherers4j.html",
         "site": "dev"
     },
@@ -569,7 +569,7 @@
     {
         "id": "blog/classifying-iris-flowers-with-deep.html",
         "title": "The Apache Groovy programming language - Blogs - Classifying Iris Flowers with Deep Learning, Groovy&trade; and GraalVM",
-        "content": "The Apache Groovy programming language - Blogs - Classifying Iris Flowers with Deep Learning, Groovy&trade; and GraalVM Socialize Discuss on the mailing list Groovy on X Groovy on Bluesky Groovy on Mastodon Groovy on LinkedIn Events and conferences Source code on GitHub Report issues in Jira Stack Overflow questions Slack Community You are using an outdated browser. Please upgrade your browser to improve your experience. Apache Groovy&trade; Learn Documentation Downlo [...]
+        "content": "The Apache Groovy programming language - Blogs - Classifying Iris Flowers with Deep Learning, Groovy&trade; and GraalVM Socialize Discuss on the mailing list Groovy on X Groovy on Bluesky Groovy on Mastodon Groovy on LinkedIn Events and conferences Source code on GitHub Report issues in Jira Stack Overflow questions Slack Community You are using an outdated browser. Please upgrade your browser to improve your experience. Apache Groovy&trade; Learn Documentation Downlo [...]
         "url": "blog/classifying-iris-flowers-with-deep.html",
         "site": "dev"
     },
@@ -597,7 +597,7 @@
     {
         "id": "blog/parsing-json-with-groovy.html",
         "title": "The Apache Groovy programming language - Blogs - Parsing JSON with Groovy&trade;",
-        "content": "The Apache Groovy programming language - Blogs - Parsing JSON with Groovy&trade; Socialize Discuss on the mailing list Groovy on X Groovy on Bluesky Groovy on Mastodon Groovy on LinkedIn Events and conferences Source code on GitHub Report issues in Jira Stack Overflow questions Slack Community You are using an outdated browser. Please upgrade your browser to improve your experience. Apache Groovy&trade; Learn Documentation Download Support Contribute Ecosystem Blog po [...]
+        "content": "The Apache Groovy programming language - Blogs - Parsing JSON with Groovy&trade; Socialize Discuss on the mailing list Groovy on X Groovy on Bluesky Groovy on Mastodon Groovy on LinkedIn Events and conferences Source code on GitHub Report issues in Jira Stack Overflow questions Slack Community You are using an outdated browser. Please upgrade your browser to improve your experience. Apache Groovy&trade; Learn Documentation Download Support Contribute Ecosystem Blog po [...]
         "url": "blog/parsing-json-with-groovy.html",
         "site": "dev"
     },
@@ -744,7 +744,7 @@
     {
         "id": "blog/index.html",
         "title": "The Apache Groovy programming language - Blogs",
-        "content": "The Apache Groovy programming language - Blogs Socialize Discuss on the mailing list Groovy on X Groovy on Bluesky Groovy on Mastodon Groovy on LinkedIn Events and conferences Source code on GitHub Report issues in Jira Stack Overflow questions Slack Community You are using an outdated browser. Please upgrade your browser to improve your experience. Apache Groovy&trade; Learn Documentation Download Support Contribute Ecosystem Blog posts Socialize Blogs Groovy 6 featu [...]
+        "content": "The Apache Groovy programming language - Blogs Socialize Discuss on the mailing list Groovy on X Groovy on Bluesky Groovy on Mastodon Groovy on LinkedIn Events and conferences Source code on GitHub Report issues in Jira Stack Overflow questions Slack Community You are using an outdated browser. Please upgrade your browser to improve your experience. Apache Groovy&trade; Learn Documentation Download Support Contribute Ecosystem Blog posts Socialize Blogs Exploring Gath [...]
         "url": "blog/index.html",
         "site": "dev"
     },