Skip to content

Commit b597d30

Browse files
authored
Merge pull request #514 from metafacture/closeResources
Close resources.
2 parents a99fba9 + 478cc73 commit b597d30

File tree

8 files changed

+79
-110
lines changed

8 files changed

+79
-110
lines changed

metafacture-commons/src/main/java/org/metafacture/commons/ResourceUtil.java

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import java.nio.charset.Charset;
3131
import java.util.List;
3232
import java.util.Properties;
33+
import java.util.function.Consumer;
3334

3435
/**
3536
* Various utility methods for working with files, resources and streams.
@@ -201,7 +202,9 @@ public static URL getUrl(final File file) throws MalformedURLException {
201202
*/
202203
public static Properties loadProperties(final String location)
203204
throws IOException {
204-
return loadProperties(getStream(location));
205+
try (InputStream stream = getStream(location)) {
206+
return loadProperties(stream);
207+
}
205208
}
206209

207210
/**
@@ -239,14 +242,7 @@ public static Properties loadProperties(final URL url) throws IOException {
239242
*/
240243
public static String loadTextFile(final String location) throws IOException {
241244
final StringBuilder builder = new StringBuilder();
242-
final BufferedReader reader = new BufferedReader(getReader(location));
243-
244-
String line = reader.readLine();
245-
while (line != null) {
246-
builder.append(line);
247-
line = reader.readLine();
248-
}
249-
245+
loadTextFile(location, builder::append);
250246
return builder.toString();
251247
}
252248

@@ -258,17 +254,19 @@ public static String loadTextFile(final String location) throws IOException {
258254
* @return the List of Strings with the lines of the file appended
259255
* @throws IOException if an I/O error occurs
260256
*/
261-
public static List<String> loadTextFile(final String location,
262-
final List<String> list) throws IOException {
263-
final BufferedReader reader = new BufferedReader(getReader(location));
257+
public static List<String> loadTextFile(final String location, final List<String> list) throws IOException {
258+
loadTextFile(location, list::add);
259+
return list;
260+
}
264261

265-
String line = reader.readLine();
266-
while (line != null) {
267-
list.add(line);
268-
line = reader.readLine();
262+
private static void loadTextFile(final String location, final Consumer<String> consumer) throws IOException {
263+
try (BufferedReader reader = new BufferedReader(getReader(location))) {
264+
String line = reader.readLine();
265+
while (line != null) {
266+
consumer.accept(line);
267+
line = reader.readLine();
268+
}
269269
}
270-
271-
return list;
272270
}
273271

274272
/**

metafacture-io/src/main/java/org/metafacture/io/FileOpener.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -154,8 +154,8 @@ public Reader open(final InputStream stream) throws IOException {
154154

155155
@Override
156156
public void process(final String file) {
157-
try {
158-
getReceiver().process(open(file));
157+
try (Reader reader = open(file)) {
158+
getReceiver().process(reader);
159159
}
160160
catch (final IOException e) {
161161
throw new MetafactureException(e);

metafacture-io/src/main/java/org/metafacture/io/ResourceOpener.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,8 @@ public void setEncoding(final String encoding) {
6868

6969
@Override
7070
public void process(final String file) {
71-
try {
72-
getReceiver().process(ResourceUtil.getReader(file, encoding));
71+
try (Reader reader = ResourceUtil.getReader(file, encoding)) {
72+
getReceiver().process(reader);
7373
}
7474
catch (final IOException e) {
7575
throw new MetafactureException(e);

metafacture-io/src/test/java/org/metafacture/io/FileOpenerCompressionTest.java

Lines changed: 13 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -16,31 +16,26 @@
1616

1717
package org.metafacture.io;
1818

19-
import static org.junit.Assert.assertEquals;
20-
import static org.mockito.Mockito.verify;
21-
22-
import java.io.File;
23-
import java.io.IOException;
24-
import java.io.InputStream;
25-
import java.io.Reader;
26-
import java.nio.file.Files;
27-
import java.nio.file.StandardCopyOption;
28-
import java.util.Arrays;
19+
import org.metafacture.framework.ObjectReceiver;
2920

30-
import org.junit.Before;
3121
import org.junit.Rule;
3222
import org.junit.Test;
3323
import org.junit.rules.TemporaryFolder;
3424
import org.junit.runner.RunWith;
3525
import org.junit.runners.Parameterized;
3626
import org.junit.runners.Parameterized.Parameters;
37-
import org.metafacture.commons.ResourceUtil;
38-
import org.metafacture.framework.ObjectReceiver;
39-
import org.mockito.ArgumentCaptor;
4027
import org.mockito.Mock;
4128
import org.mockito.junit.MockitoJUnit;
4229
import org.mockito.junit.MockitoRule;
4330

31+
import java.io.File;
32+
import java.io.IOException;
33+
import java.io.InputStream;
34+
import java.io.Reader;
35+
import java.nio.file.Files;
36+
import java.nio.file.StandardCopyOption;
37+
import java.util.Arrays;
38+
4439
/**
4540
* Tests for file compression in class {@link FileOpener}.
4641
*
@@ -62,13 +57,10 @@ public final class FileOpenerCompressionTest {
6257
@Mock
6358
private ObjectReceiver<Reader> receiver;
6459

65-
private FileOpener fileOpener;
66-
6760
private final String resourcePath;
6861
private final FileCompression compression;
6962

70-
public FileOpenerCompressionTest(final String resourcePath,
71-
final FileCompression compression) {
63+
public FileOpenerCompressionTest(final String resourcePath, final FileCompression compression) {
7264
this.resourcePath = resourcePath;
7365
this.compression = compression;
7466
}
@@ -93,35 +85,15 @@ public static Iterable<Object[]> data() {
9385
});
9486
}
9587

96-
@Before
97-
public void setup() {
98-
fileOpener = new FileOpener();
99-
fileOpener.setReceiver(receiver);
100-
}
101-
10288
@Test
10389
public void testOpenCompressedFiles() throws IOException {
104-
final File file = copyResourceToTempFile();
105-
106-
fileOpener.setCompression(compression);
107-
fileOpener.process(file.getAbsolutePath());
108-
109-
final ArgumentCaptor<Reader> readerCaptor =
110-
ArgumentCaptor.forClass(Reader.class);
111-
verify(receiver).process(readerCaptor.capture());
112-
final String charsFromFile;
113-
try (Reader reader = readerCaptor.getValue()) {
114-
charsFromFile = ResourceUtil.readAll(reader);
115-
}
116-
assertEquals(DATA, charsFromFile);
117-
}
118-
119-
private File copyResourceToTempFile() throws IOException {
12090
final File file = tempFolder.newFile();
91+
12192
try (InputStream in = getClass().getResourceAsStream(resourcePath)) {
12293
Files.copy(in, file.toPath(), StandardCopyOption.REPLACE_EXISTING);
12394
}
124-
return file;
95+
96+
FileOpenerTest.assertData(receiver, DATA, file, o -> o.setCompression(compression));
12597
}
12698

12799
}

metafacture-io/src/test/java/org/metafacture/io/FileOpenerTest.java

Lines changed: 31 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,18 @@
1616

1717
package org.metafacture.io;
1818

19-
import static org.junit.Assert.assertEquals;
20-
import static org.junit.Assert.assertTrue;
21-
import static org.junit.Assume.assumeFalse;
22-
import static org.mockito.Mockito.verify;
19+
import org.metafacture.commons.ResourceUtil;
20+
import org.metafacture.framework.ObjectReceiver;
21+
22+
import org.junit.Assert;
23+
import org.junit.Assume;
24+
import org.junit.Rule;
25+
import org.junit.Test;
26+
import org.junit.rules.TemporaryFolder;
27+
import org.mockito.Mock;
28+
import org.mockito.Mockito;
29+
import org.mockito.junit.MockitoJUnit;
30+
import org.mockito.junit.MockitoRule;
2331

2432
import java.io.File;
2533
import java.io.FileOutputStream;
@@ -32,17 +40,7 @@
3240
import java.nio.charset.StandardCharsets;
3341
import java.nio.file.Files;
3442
import java.nio.file.StandardCopyOption;
35-
36-
import org.junit.Rule;
37-
import org.junit.Test;
38-
import org.junit.rules.TemporaryFolder;
39-
import org.metafacture.commons.ResourceUtil;
40-
import org.metafacture.framework.ObjectReceiver;
41-
import org.mockito.ArgumentCaptor;
42-
import org.mockito.Captor;
43-
import org.mockito.Mock;
44-
import org.mockito.junit.MockitoJUnit;
45-
import org.mockito.junit.MockitoRule;
43+
import java.util.function.Consumer;
4644

4745
/**
4846
* Tests for class {@link FileOpener}.
@@ -63,24 +61,12 @@ public final class FileOpenerTest {
6361
@Mock
6462
private ObjectReceiver<Reader> receiver;
6563

66-
@Captor
67-
private ArgumentCaptor<Reader> processedObject;
68-
6964
@Test
7065
public void testUtf8IsDefaultEncoding() throws IOException {
71-
assumeFalse("Default encoding is UTF-8: It is not possible to test whether " +
72-
"FileOpener sets the encoding to UTF-8 correctly.",
73-
StandardCharsets.UTF_8.equals(Charset.defaultCharset()));
74-
75-
final File testFile = createTestFile();
76-
77-
final FileOpener opener = new FileOpener();
78-
opener.setReceiver(receiver);
79-
opener.process(testFile.getAbsolutePath());
80-
opener.closeStream();
66+
Assume.assumeFalse("Default encoding is UTF-8: It is not possible to test whether FileOpener sets " +
67+
"the encoding to UTF-8 correctly.", StandardCharsets.UTF_8.equals(Charset.defaultCharset()));
8168

82-
verify(receiver).process(processedObject.capture());
83-
assertEquals(DATA, ResourceUtil.readAll(processedObject.getValue()));
69+
assertData(receiver, DATA, createTestFile(), null);
8470
}
8571

8672
@Test
@@ -105,19 +91,27 @@ private void testDecompressConcatenated(final boolean decompressConcatenated) th
10591
}
10692

10793
final String data = sb.toString();
108-
assertTrue(data.length() + " > " + maxBytes, data.length() > maxBytes);
94+
Assert.assertTrue(data.length() + " > " + maxBytes, data.length() > maxBytes);
10995

110-
final File testFile = copyResourceToTempFile("compressed-large.txt.bgzf");
96+
assertData(receiver, decompressConcatenated ? data : data.substring(0, maxBytes),
97+
copyResourceToTempFile("compressed-large.txt.bgzf"), o -> o.setDecompressConcatenated(decompressConcatenated));
98+
}
99+
100+
/*package-private*/ static void assertData(final ObjectReceiver<Reader> receiver, final String expected, final File file, final Consumer<FileOpener> consumer) {
101+
final StringBuilder sb = new StringBuilder();
102+
Mockito.doAnswer(i -> sb.append(ResourceUtil.readAll(i.getArgument(0)))).when(receiver).process(Mockito.any(Reader.class));
111103

112104
final FileOpener opener = new FileOpener();
113-
opener.setDecompressConcatenated(decompressConcatenated);
105+
if (consumer != null) {
106+
consumer.accept(opener);
107+
}
108+
114109
opener.setReceiver(receiver);
115-
opener.process(testFile.getAbsolutePath());
110+
opener.process(file.getAbsolutePath());
116111
opener.closeStream();
117112

118-
verify(receiver).process(processedObject.capture());
119-
assertEquals(decompressConcatenated ? data : data.substring(0, maxBytes),
120-
ResourceUtil.readAll(processedObject.getValue()));
113+
Mockito.verify(receiver).process(Mockito.any(Reader.class));
114+
Assert.assertEquals(expected, sb.toString());
121115
}
122116

123117
private File createTestFile() throws IOException {

metafacture-runner/src/main/java/org/metafacture/runner/Flux.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525

2626
import java.io.File;
2727
import java.io.IOException;
28+
import java.io.InputStream;
2829
import java.util.HashMap;
2930
import java.util.Map;
3031
import java.util.regex.Matcher;
@@ -82,7 +83,9 @@ public static void main(final String[] args) throws IOException, RecognitionExce
8283
}
8384

8485
// run parser and builder
85-
FluxCompiler.compile(ResourceUtil.getStream(fluxFile), vars).start();
86+
try (InputStream inputStream = ResourceUtil.getStream(fluxFile)) {
87+
FluxCompiler.compile(inputStream, vars).start();
88+
}
8689
}
8790
}
8891

metafacture-scripting/src/main/java/org/metafacture/scripting/JScriptObjectPipe.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@
2525
import org.metafacture.framework.annotations.Out;
2626
import org.metafacture.framework.helpers.DefaultObjectPipe;
2727

28-
import java.io.FileNotFoundException;
28+
import java.io.IOException;
29+
import java.io.Reader;
2930
import javax.script.Invocable;
3031
import javax.script.ScriptEngine;
3132
import javax.script.ScriptEngineManager;
@@ -70,14 +71,14 @@ private void setScript(final String file) {
7071

7172
final ScriptEngineManager manager = new ScriptEngineManager();
7273
final ScriptEngine engine = manager.getEngineByName("JavaScript");
73-
try {
74+
try (Reader reader = ResourceUtil.getReader(file)) {
7475
// LOG.info("loading code from '" + file + "'");
75-
engine.eval(ResourceUtil.getReader(file));
76+
engine.eval(reader);
7677
}
7778
catch (final ScriptException e) {
7879
throw new MetafactureException("Error in script", e);
7980
}
80-
catch (final FileNotFoundException e) {
81+
catch (final IOException e) {
8182
throw new MetafactureException("Error loading script '" + file + "'", e);
8283
}
8384
invocable = (Invocable) engine;

metamorph/src/main/java/org/metafacture/metamorph/functions/Script.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@
2121
import org.metafacture.metamorph.api.MorphExecutionException;
2222
import org.metafacture.metamorph.api.helpers.AbstractSimpleStatelessFunction;
2323

24-
import java.io.FileNotFoundException;
24+
import java.io.IOException;
25+
import java.io.Reader;
2526
import javax.script.Invocable;
2627
import javax.script.ScriptEngine;
2728
import javax.script.ScriptEngineManager;
@@ -60,14 +61,14 @@ public void setInvoke(final String invoke) {
6061
public void setFile(final String file) {
6162
final ScriptEngineManager manager = new ScriptEngineManager();
6263
final ScriptEngine engine = manager.getEngineByName("JavaScript");
63-
try {
64-
// TODO: The script file should be loaded relatively to the base URI
65-
engine.eval(ResourceUtil.getReader(file));
64+
// TODO: The script file should be loaded relatively to the base URI
65+
try (Reader reader = ResourceUtil.getReader(file)) {
66+
engine.eval(reader);
6667
}
6768
catch (final ScriptException e) {
6869
throw new MorphBuildException("Error in script", e);
6970
}
70-
catch (final FileNotFoundException e) {
71+
catch (final IOException e) {
7172
throw new MorphBuildException("Error loading script '" + file + "'", e);
7273
}
7374
invocable = (Invocable) engine;

0 commit comments

Comments
 (0)