Skip to content

Commit a59236e

Browse files
author
Robin Duda
committed
Free resources in parser when complete: close workbook/mem map.
1 parent 9f1df39 commit a59236e

File tree

5 files changed

+36
-4
lines changed

5 files changed

+36
-4
lines changed

src/main/java/com/codingchili/Controller/CommandLine.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@ private void assertCommandLineValid(String[] args) {
4545
private void importFile(ImportEvent event, String fileName) {
4646
logger.loadingFromFilesystem(fileName);
4747
logger.parsingStarted();
48+
FileParser parser = ParserFactory.getByFilename(fileName);
4849
try {
49-
FileParser parser = ParserFactory.getByFilename(fileName);
5050
parser.setFileData(fileName, 1, fileName);
5151

5252
event.setParser(parser);
@@ -66,6 +66,8 @@ private void importFile(ImportEvent event, String fileName) {
6666
logger.onParseFailed(fileName, e);
6767
} catch (FileNotFoundException e) {
6868
logger.onFileLoadFailed(fileName, e);
69+
} finally {
70+
parser.free();
6971
}
7072
}
7173

src/main/java/com/codingchili/Controller/Website.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,9 +170,9 @@ private Future<Integer> onComplete(RoutingContext context, String fileName) {
170170
*/
171171
private void parse(String uploadedFileName, MultiMap params, String fileName, Future<Integer> future) {
172172
vertx.executeBlocking(blocking -> {
173+
FileParser parser = ParserFactory.getByFilename(fileName);
173174
try {
174175
ImportEvent event = ImportEvent.fromParams(params);
175-
FileParser parser = ParserFactory.getByFilename(fileName);
176176
parser.setFileData(uploadedFileName, event.getOffset(), fileName);
177177

178178
parser.initialize();
@@ -189,6 +189,8 @@ private void parse(String uploadedFileName, MultiMap params, String fileName, Fu
189189
});
190190
} catch (FileNotFoundException | ParserException | NumberFormatException e) {
191191
blocking.fail(e);
192+
} finally {
193+
parser.free();
192194
}
193195
}, false, future);
194196
}

src/main/java/com/codingchili/Model/CSVParser.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.codingchili.Model;
22

3+
import com.codingchili.logging.ApplicationLogger;
34
import io.vertx.core.json.JsonObject;
45
import org.reactivestreams.Subscriber;
56
import org.reactivestreams.Subscription;
@@ -10,6 +11,7 @@
1011
import java.nio.channels.FileChannel;
1112
import java.util.*;
1213
import java.util.concurrent.atomic.AtomicInteger;
14+
import java.util.logging.Level;
1315

1416
/**
1517
* @author Robin Duda
@@ -26,6 +28,7 @@ public class CSVParser implements FileParser {
2628
private static final char TOKEN_QUOTE = '\"';
2729
private static final char TOKEN_SEPARATOR = ',';
2830

31+
private ApplicationLogger logger = new ApplicationLogger(getClass());
2932
private ByteBuffer buffer = ByteBuffer.allocate(MAX_LINE_LENGTH);
3033
private JsonObject headers = new JsonObject();
3134
private Iterator<String> header;
@@ -181,6 +184,15 @@ public int getNumberOfElements() {
181184
return rows;
182185
}
183186

187+
@Override
188+
public void free() {
189+
try {
190+
file.close();
191+
} catch (IOException e) {
192+
logger.onError(e);
193+
}
194+
}
195+
184196
@Override
185197
public void subscribe(Subscriber<? super JsonObject> subscriber) {
186198
map.position(0);

src/main/java/com/codingchili/Model/ExcelParser.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ public class ExcelParser implements FileParser {
2323
private static final String XML97 = ".xls";
2424
private ApplicationLogger logger = new ApplicationLogger(getClass());
2525
private String fileName;
26+
private File file;
27+
private Workbook workbook;
2628
private Sheet sheet;
2729
private int columns;
2830
private int offset;
@@ -32,12 +34,12 @@ public class ExcelParser implements FileParser {
3234
public void setFileData(String localFileName, int offset, String fileName)
3335
throws ParserException, FileNotFoundException {
3436

35-
File file = new File(localFileName);
37+
file = new File(localFileName);
3638
offset -= 1; // convert excel row number to 0-based index.
3739

3840
if (file.exists()) {
3941
try {
40-
Workbook workbook = getWorkbook(file, fileName);
42+
this.workbook = getWorkbook(file, fileName);
4143
this.sheet = workbook.getSheetAt(0);
4244
this.offset = offset;
4345
this.fileName = fileName;
@@ -132,6 +134,15 @@ public void parseRowRange(int begin, int count, Consumer<JsonObject> consumer) {
132134
}
133135

134136

137+
@Override
138+
public void free() {
139+
try {
140+
workbook.close();
141+
} catch (IOException e) {
142+
logger.onError(e);
143+
}
144+
}
145+
135146
@Override
136147
public int getNumberOfElements() {
137148
return rows;

src/main/java/com/codingchili/Model/FileParser.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,9 @@ public interface FileParser extends Publisher<JsonObject> {
3939
*/
4040
int getNumberOfElements();
4141

42+
43+
/**
44+
* Releases any resources associated with the FileParser.
45+
*/
46+
void free();
4247
}

0 commit comments

Comments
 (0)