Using try-with-resource

This commit is contained in:
Papick Garcia Taboada committed 2016-09-13 17:00:10 +02:00
1 parent c5311cad7c
commit 85a75da5ef
6 files changed
+252 -198

No files matched your search

@@ -63,12 +63,6 @@ public class SensorDataImportServlet extends AbstractFileUploadServlet {
for (Pair<String, FileItem> file : files) {
final String requestedImporterName = file.getA();
final FileItem fi = file.getB();
BufferedInputStream in = new BufferedInputStream(fi.getInputStream()) {
@Override
public void close() throws IOException {
// prevent importers from closing this stream
}
};
DoubleVectorFixImporter importerToUse = null;
for (DoubleVectorFixImporter candidate : availableImporters) {
if (candidate.getType().equals(requestedImporterName)) {
@@ -77,43 +71,37 @@ public class SensorDataImportServlet extends AbstractFileUploadServlet {
}
}
if (importerToUse == null) {
in.close();
throw new RuntimeException("Sensor importer not found");
}
in.mark(READ_BUFFER_SIZE);
try {
in.reset();
} catch (IOException e1) {
logger.log(Level.SEVERE, "Could not reset stream", e1);
}
logger.log(Level.INFO,
"Going to import sensor data file with importer " + importerToUse.getClass().getSimpleName());
try {
importerToUse.importFixes(in, new DoubleVectorFixImporter.Callback() {
@Override
public void addFixes(Iterable<DoubleVectorFix> fixes, TrackFileImportDeviceIdentifier device) {
deviceIds.add(device);
storeFixes(fixes, device);
TimePoint earliestFixSoFarFromCurrentDevice = from.get(device);
TimePoint latestFixSoFarFromCurrentDevice = to.get(device);
for (DoubleVectorFix fix : fixes) {
if (earliestFixSoFarFromCurrentDevice == null
|| earliestFixSoFarFromCurrentDevice.after(fix.getTimePoint())) {
earliestFixSoFarFromCurrentDevice = fix.getTimePoint();
from.put(device, earliestFixSoFarFromCurrentDevice);
}
if (latestFixSoFarFromCurrentDevice == null
|| latestFixSoFarFromCurrentDevice.before(fix.getTimePoint())) {
latestFixSoFarFromCurrentDevice = fix.getTimePoint();
to.put(device, latestFixSoFarFromCurrentDevice);
try (BufferedInputStream in = new BufferedInputStream(fi.getInputStream())) {
try {
importerToUse.importFixes(in, new DoubleVectorFixImporter.Callback() {
@Override
public void addFixes(Iterable<DoubleVectorFix> fixes, TrackFileImportDeviceIdentifier device) {
deviceIds.add(device);
storeFixes(fixes, device);
TimePoint earliestFixSoFarFromCurrentDevice = from.get(device);
TimePoint latestFixSoFarFromCurrentDevice = to.get(device);
for (DoubleVectorFix fix : fixes) {
if (earliestFixSoFarFromCurrentDevice == null
|| earliestFixSoFarFromCurrentDevice.after(fix.getTimePoint())) {
earliestFixSoFarFromCurrentDevice = fix.getTimePoint();
from.put(device, earliestFixSoFarFromCurrentDevice);
}
if (latestFixSoFarFromCurrentDevice == null
|| latestFixSoFarFromCurrentDevice.before(fix.getTimePoint())) {
latestFixSoFarFromCurrentDevice = fix.getTimePoint();
to.put(device, latestFixSoFarFromCurrentDevice);
}
}
}
}
}, fi.getName(), requestedImporterName);
logger.log(Level.INFO, "Successfully imported file " + requestedImporterName);
} catch (FormatNotSupportedException e) {
logger.log(Level.INFO, "Failed to import file " + requestedImporterName);
}, fi.getName(), requestedImporterName);
logger.log(Level.INFO, "Successfully imported file " + requestedImporterName);
} catch (FormatNotSupportedException e) {
logger.log(Level.INFO, "Failed to import file " + requestedImporterName);
}
}
}
return deviceIds;
@@ -2,18 +2,17 @@ package com.sap.sailing.server.gateway.trackfiles.impl;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.stream.Collectors;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@@ -42,7 +41,8 @@ import com.sap.sse.common.Util.Pair;
* The available importers are tried one by one in the following order, until the first one is found that does not fail
* with an {@link FormatNotSupportedException}:
* <ul>
* <li>If the type of a {@link #PREFERRED_IMPORTER preferred importer} is transmitted, this is the first that is used.</li>
* <li>If the type of a {@link #PREFERRED_IMPORTER preferred importer} is transmitted, this is the first that is used.
* </li>
* <li>Then the importers registered for a matching {@link GPSFixImporter#FILE_EXTENSION_PROPERTY file extension} are
* used.</li>
* <li>If all this fails, all other available importers are used.</li>
@@ -55,8 +55,6 @@ public class TrackFilesImportServlet extends AbstractFileUploadServlet {
public static final String PREFERRED_IMPORTER = "preferredImporter";
private static final long serialVersionUID = 1120226743039934620L;
private static final Logger logger = Logger.getLogger(TrackFilesImportServlet.class.getName());
private static final int READ_BUFFER_SIZE = 1024 * 1024 * 1024;
public void storeFix(GPSFix fix, DeviceIdentifier deviceIdentifier) {
try {
@@ -84,69 +82,67 @@ public class TrackFilesImportServlet extends AbstractFileUploadServlet {
}
return result;
}
Iterable<TrackFileImportDeviceIdentifier> importFiles(Iterable<Pair<String, InputStream>> files, GPSFixImporter preferredImporter)
throws IOException {
protected Iterable<TrackFileImportDeviceIdentifier> importFiles(Iterable<Pair<String, FileItem>> files,
GPSFixImporter preferredImporter) throws IOException {
final Set<TrackFileImportDeviceIdentifier> deviceIds = new HashSet<>();
final Map<DeviceIdentifier, TimePoint> from = new HashMap<>();
final Map<DeviceIdentifier, TimePoint> to = new HashMap<>();
for (Pair<String, InputStream> file : files) {
final String fileName = file.getA();
for (Pair<String, FileItem> pair : files) {
final String fileName = pair.getA();
final FileItem fileItem = pair.getB();
String fileExt = null;
if (fileName.contains(".")) {
fileExt = fileName.substring(fileName.lastIndexOf(".") + 1);
}
Collection<GPSFixImporter> importersToTry = new LinkedHashSet<>();
Set<GPSFixImporter> importersToTry = new LinkedHashSet<>();
if (preferredImporter != null) {
importersToTry.add(preferredImporter);
}
importersToTry.addAll(getGPSFixImporters(fileExt));
importersToTry.addAll(getGPSFixImporters(null));
BufferedInputStream in = new BufferedInputStream(file.getB()) {
@Override
public void close() throws IOException {
//prevent importers from closing this stream
}
};
in.mark(READ_BUFFER_SIZE);
boolean done = false;
Iterator<GPSFixImporter> iter = importersToTry.iterator();
while (iter.hasNext() && ! done) {
try {
in.reset();
} catch (IOException e1) {
e1.printStackTrace();
}
boolean failed = false;
GPSFixImporter importer = iter.next();
logger.log(Level.INFO, "Trying to import file " + fileName + " with importer " + importer.getType());
try {
importer.importFixes(in, new Callback() {
@Override
public void addFix(GPSFix fix, TrackFileImportDeviceIdentifier device) {
deviceIds.add(device);
storeFix(fix, device);
TimePoint earliestFixSoFarFromCurrentDevice = from.get(device);
if (earliestFixSoFarFromCurrentDevice == null || earliestFixSoFarFromCurrentDevice.after(fix.getTimePoint())) {
earliestFixSoFarFromCurrentDevice = fix.getTimePoint();
from.put(device, earliestFixSoFarFromCurrentDevice);
}
TimePoint latestFixSoFarFromCurrentDevice = to.get(device);
if (latestFixSoFarFromCurrentDevice == null || latestFixSoFarFromCurrentDevice.before(fix.getTimePoint())) {
latestFixSoFarFromCurrentDevice = fix.getTimePoint();
to.put(device, latestFixSoFarFromCurrentDevice);
}
}
}, true, fileName);
} catch (FormatNotSupportedException e) {
failed = true;
logger.log(Level.INFO,
"System knows " +
importersToTry.size() +
" importers: "+
importersToTry.stream().map(i -> i.getType()).collect(Collectors.joining(", "))
);
parsersLoop: for (GPSFixImporter importer : importersToTry) {
boolean succeeded = false;
logger.log(Level.INFO, "Trying to import file " + fileName + " with importer " + importer.getType());
try (BufferedInputStream in = new BufferedInputStream(fileItem.getInputStream())) {
try {
importer.importFixes(in, new Callback() {
@Override
public void addFix(GPSFix fix, TrackFileImportDeviceIdentifier device) {
deviceIds.add(device);
storeFix(fix, device);
TimePoint earliestFixSoFarFromCurrentDevice = from.get(device);
if (earliestFixSoFarFromCurrentDevice == null
|| earliestFixSoFarFromCurrentDevice.after(fix.getTimePoint())) {
earliestFixSoFarFromCurrentDevice = fix.getTimePoint();
from.put(device, earliestFixSoFarFromCurrentDevice);
}
TimePoint latestFixSoFarFromCurrentDevice = to.get(device);
if (latestFixSoFarFromCurrentDevice == null
|| latestFixSoFarFromCurrentDevice.before(fix.getTimePoint())) {
latestFixSoFarFromCurrentDevice = fix.getTimePoint();
to.put(device, latestFixSoFarFromCurrentDevice);
}
}
}, true, fileName);
succeeded = true;
} catch (Exception e) {
logger.log(Level.INFO, "Failed with " + e.getClass().getSimpleName()
+ " while importing file using " + importer.getType());
}
}
if (! failed) {
done = true;
logger.log(Level.INFO, "Successfully imported file " + fileName);
if (succeeded) {
logger.log(Level.INFO, "Successfully imported file " + fileName + " using " + importer.getType());
break parsersLoop;
}
}
}
@@ -156,10 +152,10 @@ public class TrackFilesImportServlet extends AbstractFileUploadServlet {
@Override
protected void process(List<FileItem> fileItems, HttpServletRequest req, HttpServletResponse resp) throws IOException {
String prefImporterType = null;
List<Pair<String, InputStream>> files = new ArrayList<>();
List<Pair<String, FileItem>> files = new ArrayList<>();
for (FileItem item : fileItems) {
if (!item.isFormField())
files.add(new Pair<String, InputStream>(item.getName(), item.getInputStream()));
files.add(new Pair<String, FileItem>(item.getName(), item));
else {
if (item.getFieldName() != null && item.getFieldName().equals(PREFERRED_IMPORTER)) {
prefImporterType = item.getString();
@@ -167,18 +163,15 @@ public class TrackFilesImportServlet extends AbstractFileUploadServlet {
}
}
GPSFixImporter preferredImporter = null;
if (prefImporterType != null && ! prefImporterType.isEmpty()) {
preferredImporter = getServiceFinderFactory().createServiceFinder(GPSFixImporter.class).
findService(prefImporterType);
if (prefImporterType != null && !prefImporterType.isEmpty()) {
preferredImporter = getServiceFinderFactory().createServiceFinder(GPSFixImporter.class)
.findService(prefImporterType);
}
final Iterable<TrackFileImportDeviceIdentifier> mappingList = importFiles(files, preferredImporter);
//setJsonResponseHeader(resp);
//DO NOT set a JSON response header. This causes the browser to wrap the response in a
//<pre> tag when uploading from GWT, as this is an AJAX-request inside an iFrame.
// setJsonResponseHeader(resp);
// DO NOT set a JSON response header. This causes the browser to wrap the response in a
// <pre> tag when uploading from GWT, as this is an AJAX-request inside an iFrame.
resp.setContentType("text/html");
for (TrackFileImportDeviceIdentifier mapping : mappingList) {
String stringRep = mapping.getId().toString();
resp.getWriter().println(stringRep);