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,44 +331,72 @@ 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)) {
for (CSVRecord rec : parser) { // --- Step 1: peek at the first line to detect delimiter ---
MerchantFeedRow row = new MerchantFeedRow( reader.mark(10_000);
rec.get("SKU"), String firstLine = reader.readLine();
rec.get("Manufacturer Id"), reader.reset();
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); 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) { } catch (Exception ex) {
throw new RuntimeException("Failed to read feed for merchant " throw new RuntimeException("Failed to read feed for merchant "