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

borinquenkid pushed a commit to branch 8.0.x-hibernate7-dev
in repository https://gitbox.apache.org/repos/asf/grails-core.git

commit d960177ba7034bbb5a3b7ba317f311d5c7057b93
Author: Walter Duque de Estrada <[email protected]>
AuthorDate: Tue Mar 10 15:05:01 2026 -0500

    hibernate 7:  added EmbeddedJarPathHandlerSpec
---
 .../liquibase/EmbeddedJarPathHandlerSpec.groovy    | 96 ++++++++++++++++++++++
 1 file changed, 96 insertions(+)

diff --git 
a/grails-data-hibernate7/dbmigration/src/test/groovy/org/grails/plugins/databasemigration/liquibase/EmbeddedJarPathHandlerSpec.groovy
 
b/grails-data-hibernate7/dbmigration/src/test/groovy/org/grails/plugins/databasemigration/liquibase/EmbeddedJarPathHandlerSpec.groovy
new file mode 100644
index 0000000000..d6d5c3a680
--- /dev/null
+++ 
b/grails-data-hibernate7/dbmigration/src/test/groovy/org/grails/plugins/databasemigration/liquibase/EmbeddedJarPathHandlerSpec.groovy
@@ -0,0 +1,96 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    https://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.grails.plugins.databasemigration.liquibase
+
+import liquibase.resource.PathHandler
+import liquibase.resource.ResourceAccessor
+import spock.lang.Specification
+import spock.lang.TempDir
+
+import java.nio.file.Files
+import java.nio.file.Path
+import java.util.jar.JarEntry
+import java.util.jar.JarOutputStream
+
+class EmbeddedJarPathHandlerSpec extends Specification {
+
+    EmbeddedJarPathHandler handler = new EmbeddedJarPathHandler()
+
+    @TempDir
+    Path tempDir
+
+    def "test getPriority"() {
+        expect:
+        handler.getPriority(root) == expectedPriority
+
+        where:
+        root                                                 | expectedPriority
+        "jar:file:/path/to/outer.jar!/inner.jar!/"           | 
PathHandler.PRIORITY_SPECIALIZED
+        "jar:file:/path/to/outer.jar!/nested/inner.jar!/"    | 
PathHandler.PRIORITY_SPECIALIZED
+        "jar:file:/path/to/outer.jar!/"                      | 
PathHandler.PRIORITY_NOT_APPLICABLE
+        "file:/path/to/dir/"                                 | 
PathHandler.PRIORITY_NOT_APPLICABLE
+        "jar:file:/path/to/outer.jar!/some/path"             | 
PathHandler.PRIORITY_NOT_APPLICABLE
+    }
+
+    def "getResourceAccessor handles nested jars"() {
+        given: "A physical jar file on disk"
+        Path outerJar = tempDir.resolve("outer.jar")
+        createJarWithInnerJar(outerJar, "inner.jar")
+
+        String root = "jar:file:${outerJar.toAbsolutePath()}!/inner.jar!/"
+
+        when:
+        ResourceAccessor accessor = handler.getResourceAccessor(root)
+
+        then:
+        accessor instanceof EmbeddedJarResourceAccessor
+        accessor.describeLocations().any { it.contains("inner.jar") }
+
+        cleanup:
+        accessor?.close()
+    }
+
+    def "getResourceAccessor throws IllegalArgumentException for invalid 
paths"() {
+        when:
+        handler.getResourceAccessor("jar:file:/non/existent.jar!/inner.jar!/")
+
+        then:
+        thrown(IllegalArgumentException)
+    }
+
+    /**
+     * Helper to create a JAR file that contains another JAR file.
+     */
+    private void createJarWithInnerJar(Path outerJarPath, String innerJarName) 
{
+        // 1. Create inner jar content in memory
+        ByteArrayOutputStream innerJarByteStream = new ByteArrayOutputStream()
+        JarOutputStream innerJarStream = new 
JarOutputStream(innerJarByteStream)
+        innerJarStream.putNextEntry(new JarEntry("test.txt"))
+        innerJarStream.write("hello".bytes)
+        innerJarStream.closeEntry()
+        innerJarStream.close()
+
+        // 2. Create outer jar on disk
+        JarOutputStream outerJarStream = new 
JarOutputStream(Files.newOutputStream(outerJarPath))
+        outerJarStream.putNextEntry(new JarEntry(innerJarName))
+        outerJarStream.write(innerJarByteStream.toByteArray())
+        outerJarStream.closeEntry()
+        outerJarStream.close()
+    }
+}

Reply via email to