diff --git a/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/data/RandomAccessDataFile.java b/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/data/RandomAccessDataFile.java index 5ba87dcc850..6014e90fb08 100644 --- a/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/data/RandomAccessDataFile.java +++ b/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/data/RandomAccessDataFile.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2013 the original author or authors. + * Copyright 2012-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -244,17 +244,10 @@ public class RandomAccessDataFile implements RandomAccessData { } public RandomAccessFile acquire() throws IOException { - try { - this.available.acquire(); - RandomAccessFile file = this.files.poll(); - return (file == null - ? new RandomAccessFile(RandomAccessDataFile.this.file, "r") - : file); - } - catch (InterruptedException ex) { - Thread.currentThread().interrupt(); - throw new IOException(ex); - } + this.available.acquireUninterruptibly(); + RandomAccessFile file = this.files.poll(); + return (file == null + ? new RandomAccessFile(RandomAccessDataFile.this.file, "r") : file); } public void release(RandomAccessFile file) { @@ -263,22 +256,16 @@ public class RandomAccessDataFile implements RandomAccessData { } public void close() throws IOException { + this.available.acquireUninterruptibly(this.size); try { - this.available.acquire(this.size); - try { - RandomAccessFile file = this.files.poll(); - while (file != null) { - file.close(); - file = this.files.poll(); - } - } - finally { - this.available.release(this.size); + RandomAccessFile file = this.files.poll(); + while (file != null) { + file.close(); + file = this.files.poll(); } } - catch (InterruptedException ex) { - Thread.currentThread().interrupt(); - throw new IOException(ex); + finally { + this.available.release(this.size); } } diff --git a/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/LaunchedURLClassLoaderTests.java b/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/LaunchedURLClassLoaderTests.java index 498796e7d92..8733a15051a 100644 --- a/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/LaunchedURLClassLoaderTests.java +++ b/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/LaunchedURLClassLoaderTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2014 the original author or authors. + * Copyright 2012-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -36,6 +36,7 @@ import static org.junit.Assert.assertTrue; * * @author Dave Syer * @author Phillip Webb + * @author Andy Wilkinson */ @SuppressWarnings("resource") public class LaunchedURLClassLoaderTests { @@ -101,4 +102,23 @@ public class LaunchedURLClassLoaderTests { assertThat(resource.openConnection().getInputStream().read(), equalTo(3)); } + @Test + public void resolveFromNestedWhileThreadIsInterrupted() throws Exception { + File file = this.temporaryFolder.newFile(); + TestJarCreator.createTestJar(file); + JarFile jarFile = new JarFile(file); + URL url = jarFile.getUrl(); + LaunchedURLClassLoader loader = new LaunchedURLClassLoader(new URL[] { url }, + null); + try { + Thread.currentThread().interrupt(); + URL resource = loader.getResource("nested.jar!/3.dat"); + assertThat(resource.toString(), equalTo(url + "nested.jar!/3.dat")); + assertThat(resource.openConnection().getInputStream().read(), equalTo(3)); + } + finally { + Thread.interrupted(); + } + } + }