This commit is contained in:
2025-12-02 05:41:17 -05:00
parent c4d2adad1a
commit 7fb24fdde3

View File

@@ -7,6 +7,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.HashMap; import java.util.HashMap;
import java.io.Reader; import java.io.Reader;
import java.io.BufferedReader;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.net.URL; import java.net.URL;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
@@ -330,15 +331,42 @@ public class MerchantFeedImportServiceImpl implements MerchantFeedImportService
List<MerchantFeedRow> rows = new ArrayList<>(); List<MerchantFeedRow> rows = new ArrayList<>();
try (Reader reader = (feedUrl.startsWith("http://") || feedUrl.startsWith("https://")) try (Reader baseReader = (feedUrl.startsWith("http://") || feedUrl.startsWith("https://"))
? new InputStreamReader(new URL(feedUrl).openStream(), StandardCharsets.UTF_8) ? new InputStreamReader(new URL(feedUrl).openStream(), StandardCharsets.UTF_8)
: java.nio.file.Files.newBufferedReader(java.nio.file.Paths.get(feedUrl), StandardCharsets.UTF_8); : java.nio.file.Files.newBufferedReader(java.nio.file.Paths.get(feedUrl), StandardCharsets.UTF_8);
CSVParser parser = CSVFormat.DEFAULT BufferedReader reader = new BufferedReader(baseReader)) {
.withFirstRecordAsHeader()
.withIgnoreSurroundingSpaces()
.withTrim()
.parse(reader)) {
// --- Step 1: peek at the first line to detect delimiter ---
reader.mark(10_000);
String firstLine = reader.readLine();
reader.reset();
if (firstLine == null || firstLine.isEmpty()) {
throw new RuntimeException("Empty feed received from " + feedUrl);
}
// --- Step 2: detect delimiter (TSV vs CSV) ---
char delimiter;
if (firstLine.contains("\t")) {
delimiter = '\t'; // TSV (AvantLink-style)
} else if (firstLine.contains(",")) {
delimiter = ','; // CSV
} else {
// Fallback: default to comma
delimiter = ',';
}
// --- Step 3: build CSVFormat with detected delimiter ---
CSVFormat format = CSVFormat.DEFAULT.builder()
.setDelimiter(delimiter)
.setHeader()
.setSkipHeaderRecord(true)
.setIgnoreSurroundingSpaces(true)
.setTrim(true)
.build();
// --- Step 4: parse the rows into MerchantFeedRow records ---
try (CSVParser parser = new CSVParser(reader, format)) {
for (CSVRecord rec : parser) { for (CSVRecord rec : parser) {
MerchantFeedRow row = new MerchantFeedRow( MerchantFeedRow row = new MerchantFeedRow(
rec.get("SKU"), rec.get("SKU"),
@@ -369,6 +397,7 @@ public class MerchantFeedImportServiceImpl implements MerchantFeedImportService
rows.add(row); rows.add(row);
} }
}
} catch (Exception ex) { } catch (Exception ex) {
throw new RuntimeException("Failed to read feed for merchant " throw new RuntimeException("Failed to read feed for merchant "
+ merchant.getName() + " from " + feedUrl, ex); + merchant.getName() + " from " + feedUrl, ex);