/** * Parses one or more CSV format trade files. * <p> * CSV files sometimes contain a Unicode Byte Order Mark. * Callers are responsible for handling this, such as by using {@link UnicodeBom}. * * @param charSources the CSV character sources * @return the loaded trades, all errors are captured in the result */ public ValueWithFailures<List<Trade>> parse(Collection<CharSource> charSources) { return parse(charSources, Trade.class); }
/** * Loads one or more CSV format trade files. * <p> * CSV files sometimes contain a Unicode Byte Order Mark. * This method uses {@link UnicodeBom} to interpret it. * * @param resources the CSV resources * @return the loaded trades, all errors are captured in the result */ public ValueWithFailures<List<Trade>> load(Collection<ResourceLocator> resources) { Collection<CharSource> charSources = resources.stream() .map(r -> UnicodeBom.toCharSource(r.getByteSource())) .collect(toList()); return parse(charSources); }
List<Class<? extends Trade>> tradeTypes) { ValueWithFailures<List<Trade>> parsed = parse(charSources, Trade.class); List<Trade> valid = new ArrayList<>(); List<FailureItem> failures = new ArrayList<>(parsed.getFailures());
public void test_load_filtered() { TradeCsvLoader test = TradeCsvLoader.standard(); ValueWithFailures<List<Trade>> trades = test.parse( ImmutableList.of(FILE.getCharSource()), ImmutableList.of(FraTrade.class, TermDepositTrade.class)); assertEquals(trades.getValue().size(), 6); assertEquals(trades.getFailures().size(), 10); assertEquals(trades.getFailures().get(0).getMessage(), "Trade type not allowed " + SwapTrade.class.getName() + ", only these types are supported: FraTrade, TermDepositTrade"); }
public void test_load_invalidNoHeader() { TradeCsvLoader test = TradeCsvLoader.standard(); ValueWithFailures<List<Trade>> trades = test.parse(ImmutableList.of(CharSource.wrap(""))); assertEquals(trades.getFailures().size(), 1); FailureItem failure = trades.getFailures().get(0); assertEquals(failure.getReason(), FailureReason.PARSING); assertEquals(failure.getMessage().contains("CSV file could not be parsed"), true); }
public void test_load_resolver() { AtomicInteger fraCount = new AtomicInteger(); AtomicInteger termCount = new AtomicInteger(); TradeCsvInfoResolver resolver = new TradeCsvInfoResolver() { @Override public FraTrade completeTrade(CsvRow row, FraTrade trade) { fraCount.incrementAndGet(); return trade; } @Override public TermDepositTrade completeTrade(CsvRow row, TermDepositTrade trade) { termCount.incrementAndGet(); return trade; } @Override public ReferenceData getReferenceData() { return ReferenceData.standard(); } }; TradeCsvLoader test = TradeCsvLoader.of(resolver); test.parse(ImmutableList.of(FILE.getCharSource())); assertEquals(fraCount.get(), 3); assertEquals(termCount.get(), 3); }
public void test_load_invalidNoType() { TradeCsvLoader test = TradeCsvLoader.standard(); ValueWithFailures<List<Trade>> trades = test.parse(ImmutableList.of(CharSource.wrap("Id"))); assertEquals(trades.getFailures().size(), 1); FailureItem failure = trades.getFailures().get(0); assertEquals(failure.getReason(), FailureReason.PARSING); assertEquals(failure.getMessage().contains("CSV file does not contain 'Strata Trade Type' header"), true); }
public void test_load_invalidFra() { TradeCsvLoader test = TradeCsvLoader.standard(); ValueWithFailures<List<Trade>> trades = test.parse(ImmutableList.of(CharSource.wrap("Strata Trade Type,Buy Sell\nFra,Buy"))); assertEquals(trades.getFailures().size(), 1); FailureItem failure = trades.getFailures().get(0); assertEquals(failure.getReason(), FailureReason.PARSING); assertEquals(failure.getMessage(), "CSV file trade could not be parsed at line 2: Header not found: 'Notional'"); }
public void test_load_invalidTermDeposit() { TradeCsvLoader test = TradeCsvLoader.standard(); ValueWithFailures<List<Trade>> trades = test.parse(ImmutableList.of(CharSource.wrap("Strata Trade Type,Buy Sell\nTermDeposit,Buy"))); assertEquals(trades.getFailures().size(), 1); FailureItem failure = trades.getFailures().get(0); assertEquals(failure.getReason(), FailureReason.PARSING); assertEquals(failure.getMessage(), "CSV file trade could not be parsed at line 2: Header not found: 'Notional'"); }
public void test_load_invalidUnknownType() { TradeCsvLoader test = TradeCsvLoader.standard(); ValueWithFailures<List<Trade>> trades = test.parse(ImmutableList.of(CharSource.wrap("Strata Trade Type\nFoo"))); assertEquals(trades.getFailures().size(), 1); FailureItem failure = trades.getFailures().get(0); assertEquals(failure.getReason(), FailureReason.PARSING); assertEquals(failure.getMessage(), "CSV file trade type 'Foo' is not known at line 2"); }
public void test_load_invalidSwap() { TradeCsvLoader test = TradeCsvLoader.standard(); ValueWithFailures<List<Trade>> trades = test.parse(ImmutableList.of(CharSource.wrap("Strata Trade Type,Buy Sell\nSwap,Buy"))); assertEquals(trades.getFailures().size(), 1); FailureItem failure = trades.getFailures().get(0); assertEquals(failure.getReason(), FailureReason.PARSING); assertEquals(failure.getMessage(), "CSV file trade could not be parsed at line 2: Swap trade had invalid combination of fields. " + "Must include either 'Convention' or '" + "Leg 1 Direction'"); }
@Test public void test_load_fx_forwards() throws Exception { TradeCsvLoader standard = TradeCsvLoader.standard(); ResourceLocator locator = ResourceLocator.of("classpath:com/opengamma/strata/loader/csv/fxtrades.csv"); ImmutableList<CharSource> charSources = ImmutableList.of(locator.getCharSource()); ValueWithFailures<List<FxSingleTrade>> loadedData = standard.parse(charSources, FxSingleTrade.class); assertEquals(loadedData.getFailures().size(), 0, loadedData.getFailures().toString()); List<FxSingleTrade> loadedTrades = loadedData.getValue(); assertEquals(loadedTrades.size(), 2); FxSingleTrade expectedTrade1 = FxSingleTrade.builder() .info(TradeInfo.builder() .tradeDate(LocalDate.parse("2016-12-06")) .id(StandardId.of("OG", "tradeId1")) .build()) .product(FxSingle.of(CurrencyAmount.of(USD, -3850000), FxRate.of(USD, INR, 67.40), LocalDate.parse("2016-12-08"))) .build(); assertEquals(loadedTrades.get(0), expectedTrade1); FxSingleTrade expectedTrade2 = FxSingleTrade.builder() .info(TradeInfo.builder() .tradeDate(LocalDate.parse("2016-12-22")) .id(StandardId.of("OG", "tradeId2")) .build()) .product(FxSingle.of(CurrencyAmount.of(EUR, 1920000), FxRate.of(EUR, CZK, 25.62), LocalDate.parse("2016-12-24"))) .build(); assertEquals(loadedTrades.get(1), expectedTrade2); }
public void test_load_fx_swaps_fullFormat() throws Exception { TradeCsvLoader standard = TradeCsvLoader.standard(); ResourceLocator locator = ResourceLocator.of("classpath:com/opengamma/strata/loader/csv/fxtrades2.csv"); ImmutableList<CharSource> charSources = ImmutableList.of(locator.getCharSource()); ValueWithFailures<List<FxSwapTrade>> loadedData = standard.parse(charSources, FxSwapTrade.class); assertEquals(loadedData.getFailures().size(), 0, loadedData.getFailures().toString()); List<FxSwapTrade> loadedTrades = loadedData.getValue(); assertEquals(loadedTrades.size(), 1); FxSingle near1 = FxSingle.of( Payment.of(EUR, 1920000, LocalDate.parse("2018-01-29")), Payment.of(CZK, -12256000, LocalDate.parse("2018-01-30")), BusinessDayAdjustment.of(MODIFIED_FOLLOWING, EUTA.combinedWith(CZPR))); FxSingle far1 = FxSingle.of( Payment.of(EUR, -1920000, LocalDate.parse("2018-04-29")), Payment.of(CZK, 12258000, LocalDate.parse("2018-04-30")), BusinessDayAdjustment.of(MODIFIED_FOLLOWING, EUTA.combinedWith(CZPR))); FxSwapTrade expectedTrade1 = FxSwapTrade.builder() .info(TradeInfo.builder() .tradeDate(LocalDate.parse("2017-01-25")) .id(StandardId.of("OG", "tradeId9")) .build()) .product(FxSwap.of(near1, far1)) .build(); assertBeanEquals(loadedTrades.get(0), expectedTrade1); }
@Test public void test_load_fx_swaps() throws Exception { TradeCsvLoader standard = TradeCsvLoader.standard(); ResourceLocator locator = ResourceLocator.of("classpath:com/opengamma/strata/loader/csv/fxtrades.csv"); ImmutableList<CharSource> charSources = ImmutableList.of(locator.getCharSource()); ValueWithFailures<List<FxSwapTrade>> loadedData = standard.parse(charSources, FxSwapTrade.class); assertEquals(loadedData.getFailures().size(), 0, loadedData.getFailures().toString()); List<FxSwapTrade> loadedTrades = loadedData.getValue(); assertEquals(loadedTrades.size(), 2); FxSingle near1 = FxSingle.of(CurrencyAmount.of(USD, 120000), FxRate.of(USD, CAD, 1.31), LocalDate.parse("2016-12-08")); FxSingle far1 = FxSingle.of(CurrencyAmount.of(USD, -120000), FxRate.of(USD, CAD, 1.34), LocalDate.parse("2017-01-08")); FxSwapTrade expectedTrade1 = FxSwapTrade.builder() .info(TradeInfo.builder() .tradeDate(LocalDate.parse("2016-12-06")) .id(StandardId.of("OG", "tradeId11")) .build()) .product(FxSwap.of(near1, far1)) .build(); assertBeanEquals(loadedTrades.get(0), expectedTrade1); FxSingle near2 = FxSingle.of(CurrencyAmount.of(CAD, -160000), FxRate.of(USD, CAD, 1.32), LocalDate.parse("2016-12-08")); FxSingle far2 = FxSingle.of(CurrencyAmount.of(CAD, 160000), FxRate.of(USD, CAD, 1.34), LocalDate.parse("2017-01-08")); FxSwapTrade expectedTrade2 = FxSwapTrade.builder() .info(TradeInfo.builder() .tradeDate(LocalDate.parse("2016-12-06")) .id(StandardId.of("OG", "tradeId12")) .build()) .product(FxSwap.of(near2, far2)) .build(); assertBeanEquals(loadedTrades.get(1), expectedTrade2); }
ResourceLocator locator = ResourceLocator.of("classpath:com/opengamma/strata/loader/csv/fxtrades2.csv"); ImmutableList<CharSource> charSources = ImmutableList.of(locator.getCharSource()); ValueWithFailures<List<FxSingleTrade>> loadedData = standard.parse(charSources, FxSingleTrade.class); assertEquals(loadedData.getFailures().size(), 0, loadedData.getFailures().toString());