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.HashMap;
import java.io.Reader;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.nio.charset.StandardCharsets;
@@ -330,44 +331,72 @@ public class MerchantFeedImportServiceImpl implements MerchantFeedImportService
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)
: java.nio.file.Files.newBufferedReader(java.nio.file.Paths.get(feedUrl), StandardCharsets.UTF_8);
CSVParser parser = CSVFormat.DEFAULT
.withFirstRecordAsHeader()
.withIgnoreSurroundingSpaces()
.withTrim()
.parse(reader)) {
BufferedReader reader = new BufferedReader(baseReader)) {
for (CSVRecord rec : parser) {
MerchantFeedRow row = new MerchantFeedRow(
rec.get("SKU"),
rec.get("Manufacturer Id"),
rec.get("Brand Name"),
rec.get("Product Name"),
rec.get("Long Description"),
rec.get("Short Description"),
rec.get("Department"),
rec.get("Category"),
rec.get("SubCategory"),
rec.get("Thumb URL"),
rec.get("Image URL"),
rec.get("Buy Link"),
rec.get("Keywords"),
rec.get("Reviews"),
parseBigDecimal(rec.get("Retail Price")),
parseBigDecimal(rec.get("Sale Price")),
rec.get("Brand Page Link"),
rec.get("Brand Logo Image"),
rec.get("Product Page View Tracking"),
rec.get("Variants XML"),
rec.get("Medium Image URL"),
rec.get("Product Content Widget"),
rec.get("Google Categorization"),
rec.get("Item Based Commission")
);
// --- Step 1: peek at the first line to detect delimiter ---
reader.mark(10_000);
String firstLine = reader.readLine();
reader.reset();
rows.add(row);
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) {
MerchantFeedRow row = new MerchantFeedRow(
rec.get("SKU"),
rec.get("Manufacturer Id"),
rec.get("Brand Name"),
rec.get("Product Name"),
rec.get("Long Description"),
rec.get("Short Description"),
rec.get("Department"),
rec.get("Category"),
rec.get("SubCategory"),
rec.get("Thumb URL"),
rec.get("Image URL"),
rec.get("Buy Link"),
rec.get("Keywords"),
rec.get("Reviews"),
parseBigDecimal(rec.get("Retail Price")),
parseBigDecimal(rec.get("Sale Price")),
rec.get("Brand Page Link"),
rec.get("Brand Logo Image"),
rec.get("Product Page View Tracking"),
rec.get("Variants XML"),
rec.get("Medium Image URL"),
rec.get("Product Content Widget"),
rec.get("Google Categorization"),
rec.get("Item Based Commission")
);
rows.add(row);
}
}
} catch (Exception ex) {
throw new RuntimeException("Failed to read feed for merchant "