SLING-11407 Upgrade to Groovy 4

test groovy-json (GROOVY-10881)
diff --git a/pom.xml b/pom.xml
index 1043caf..98abf42 100644
--- a/pom.xml
+++ b/pom.xml
@@ -245,6 +245,12 @@
       <version>${groovy.version}</version>
       <scope>provided</scope>
     </dependency>
+    <dependency>
+      <groupId>org.apache.groovy</groupId>
+      <artifactId>groovy-json</artifactId>
+      <version>${groovy.version}</version>
+      <scope>test</scope>
+    </dependency>
     <!-- jsoup -->
     <dependency>
       <groupId>org.jsoup</groupId>
diff --git a/src/test/java/org/apache/sling/scripting/groovy/it/GroovyTestSupport.java b/src/test/java/org/apache/sling/scripting/groovy/it/GroovyTestSupport.java
index 9b3e2fc..163c4f7 100644
--- a/src/test/java/org/apache/sling/scripting/groovy/it/GroovyTestSupport.java
+++ b/src/test/java/org/apache/sling/scripting/groovy/it/GroovyTestSupport.java
@@ -39,6 +39,7 @@
 import static org.apache.sling.testing.paxexam.SlingOptions.slingQuickstartOakTar;
 import static org.apache.sling.testing.paxexam.SlingOptions.slingResourcePresence;
 import static org.apache.sling.testing.paxexam.SlingOptions.slingScripting;
+import static org.apache.sling.testing.paxexam.SlingOptions.spifly;
 import static org.ops4j.pax.exam.CoreOptions.composite;
 import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
 import static org.ops4j.pax.exam.cm.ConfigurationAdminOptions.factoryConfiguration;
@@ -78,6 +79,7 @@
             mavenBundle().groupId("org.apache.groovy").artifactId("groovy").versionAsInProject(),
             mavenBundle().groupId("org.apache.groovy").artifactId("groovy-templates").versionAsInProject(),
             // testing
+            testGroovyJson(),
             slingResourcePresence(),
             factoryConfiguration("org.apache.sling.jcr.repoinit.RepositoryInitializer")
                 .put("scripts", new String[]{"create path (sling:OrderedFolder) /content/groovy\nset ACL for everyone\nallow jcr:read on /content/groovy\nend"})
@@ -94,6 +96,13 @@
         return testProbeBuilder;
     }
 
+    protected Option testGroovyJson() {
+        return composite(
+            mavenBundle().groupId("org.apache.groovy").artifactId("groovy-json").versionAsInProject(),
+            spifly()
+        );
+    }
+
     protected Option quickstart() {
         final int httpPort = findFreePort();
         final String workingDirectory = workingDirectory();
diff --git a/src/test/java/org/apache/sling/scripting/groovy/it/app/Page.java b/src/test/java/org/apache/sling/scripting/groovy/it/app/Page.java
index 03b03d5..3ef96bf 100644
--- a/src/test/java/org/apache/sling/scripting/groovy/it/app/Page.java
+++ b/src/test/java/org/apache/sling/scripting/groovy/it/app/Page.java
@@ -18,6 +18,10 @@
  */
 package org.apache.sling.scripting.groovy.it.app;
 
+import java.util.Collections;
+import java.util.Map;
+
+import groovy.json.JsonBuilder;
 import org.apache.sling.api.SlingHttpServletRequest;
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.models.annotations.Model;
@@ -49,4 +53,10 @@
         return resource.getValueMap().get("title", String.class);
     }
 
+    public String getJson() {
+        final Map<String, String> map = Collections.singletonMap("name", getName());
+        final JsonBuilder jsonBuilder = new JsonBuilder(map);
+        return jsonBuilder.toPrettyString();
+    }
+
 }
diff --git a/src/test/java/org/apache/sling/scripting/groovy/it/tests/AdaptToModelIT.java b/src/test/java/org/apache/sling/scripting/groovy/it/tests/AdaptToModelIT.java
index 3d0be81..1882e9b 100644
--- a/src/test/java/org/apache/sling/scripting/groovy/it/tests/AdaptToModelIT.java
+++ b/src/test/java/org/apache/sling/scripting/groovy/it/tests/AdaptToModelIT.java
@@ -19,9 +19,11 @@
 package org.apache.sling.scripting.groovy.it.tests;
 
 import java.io.IOException;
+import java.util.Map;
 
 import javax.inject.Inject;
 
+import groovy.json.JsonSlurper;
 import org.apache.sling.resource.presence.ResourcePresence;
 import org.apache.sling.scripting.groovy.it.GroovyTestSupport;
 import org.jsoup.Jsoup;
@@ -78,4 +80,12 @@
         assertThat(name.text(), is("adaptto"));
     }
 
+    @Test
+    public void testJson() {
+        final Element name = document.getElementById("json");
+        final JsonSlurper jsonSlurper = new JsonSlurper();
+        final Map<String, String> json = (Map) jsonSlurper.parseText(name.text());
+        assertThat(json.get("name"), is("adaptto"));
+    }
+
 }
diff --git a/src/test/resources/initial-content/apps/groovy/page/adaptto/html.gst b/src/test/resources/initial-content/apps/groovy/page/adaptto/html.gst
index 1be8198..d9a182f 100644
--- a/src/test/resources/initial-content/apps/groovy/page/adaptto/html.gst
+++ b/src/test/resources/initial-content/apps/groovy/page/adaptto/html.gst
@@ -27,5 +27,6 @@
 </head>
 <body>
 <span id="name">$page.name</span>
+<span id="json">$page.json</span>
 </body>
 </html>