From 7fb24fdde385869e054e40ee3880e633fb3b891a Mon Sep 17 00:00:00 2001 From: Sean Date: Tue, 2 Dec 2025 05:41:17 -0500 Subject: [PATCH] buffer --- .../impl/MerchantFeedImportServiceImpl.java | 97 ++++++++++++------- 1 file changed, 63 insertions(+), 34 deletions(-) diff --git a/src/main/java/group/goforward/ballistic/services/impl/MerchantFeedImportServiceImpl.java b/src/main/java/group/goforward/ballistic/services/impl/MerchantFeedImportServiceImpl.java index 5208769..2d8d8e2 100644 --- a/src/main/java/group/goforward/ballistic/services/impl/MerchantFeedImportServiceImpl.java +++ b/src/main/java/group/goforward/ballistic/services/impl/MerchantFeedImportServiceImpl.java @@ -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 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 "