From 6fcabdc2b7d2d5618ba2643dc9cd621e746eabea Mon Sep 17 00:00:00 2001 From: Valentin Blistin <86728723+Delir4um@users.noreply.github.com> Date: Wed, 26 Jan 2022 21:04:56 +0100 Subject: [PATCH] Make ClassLoaderResourceAccessor implement Closable (#2308) * Update ClassLoaderResourceAccessor.java * Log when there are issues closing a ResourceAccessor * Added test for ClassLoaderResourceAccessor.close() Co-authored-by: Nathan Voxland --- .../resource/ClassLoaderResourceAccessor.java | 17 +++++++++++++-- .../ClassLoaderResourceAccessorTest.groovy | 21 +++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/liquibase-core/src/main/java/liquibase/resource/ClassLoaderResourceAccessor.java b/liquibase-core/src/main/java/liquibase/resource/ClassLoaderResourceAccessor.java index 892820a6acc..a07b1e2bb75 100644 --- a/liquibase-core/src/main/java/liquibase/resource/ClassLoaderResourceAccessor.java +++ b/liquibase-core/src/main/java/liquibase/resource/ClassLoaderResourceAccessor.java @@ -24,7 +24,7 @@ * * @see OSGiResourceAccessor for OSGi-based classloaders */ -public class ClassLoaderResourceAccessor extends AbstractResourceAccessor { +public class ClassLoaderResourceAccessor extends AbstractResourceAccessor implements AutoCloseable { private ClassLoader classLoader; protected List rootPaths; @@ -270,7 +270,7 @@ protected SortedSet listFromClassLoader(String path, boolean recursive, try (JarFile jar = new JarFile(URLDecoder.decode(jarPath, StandardCharsets.UTF_8.name()))) { String comparePath = path; if (comparePath.startsWith("/")) { - comparePath = "/"+comparePath; + comparePath = "/" + comparePath; } Enumeration entries = jar.entries(); while (entries.hasMoreElements()) { @@ -355,4 +355,17 @@ public SortedSet describeLocations() { return description; } + + @Override + public void close() throws Exception { + if (rootPaths != null) { + for (final FileSystem rootPath : rootPaths) { + try { + rootPath.close(); + } catch (final Exception e) { + Scope.getCurrentScope().getLog(getClass()).fine("Cannot close path " + e.getMessage(), e); + } + } + } + } } diff --git a/liquibase-core/src/test/groovy/liquibase/resource/ClassLoaderResourceAccessorTest.groovy b/liquibase-core/src/test/groovy/liquibase/resource/ClassLoaderResourceAccessorTest.groovy index ac752a8dac1..9a62aeeaaf1 100644 --- a/liquibase-core/src/test/groovy/liquibase/resource/ClassLoaderResourceAccessorTest.groovy +++ b/liquibase-core/src/test/groovy/liquibase/resource/ClassLoaderResourceAccessorTest.groovy @@ -5,6 +5,8 @@ import liquibase.util.StreamUtil import spock.lang.Specification import spock.lang.Unroll +import java.nio.file.FileSystem + class ClassLoaderResourceAccessorTest extends Specification { def testResourceAccessor = new ClassLoaderResourceAccessor(new URLClassLoader( @@ -153,4 +155,23 @@ class ClassLoaderResourceAccessorTest extends Specification { ], ] } + + def close() { + setup: + FileSystem path1 = Mock() + FileSystem path2 = Mock() + + when: + def testAccessor = new ClassLoaderResourceAccessor(this.getClass().getClassLoader()) + + testAccessor.rootPaths = null; + testAccessor.close() //no errors thrown from close() when rootPaths is null + + testAccessor.rootPaths = [path1, path2] + testAccessor.close() + + then: + 2 * path1.close() + 1 * path2.close() + } }