From 3150f25b3ab727de733f9d6f9043f7fabeebaf41 Mon Sep 17 00:00:00 2001 From: Stephen Colebourne Date: Mon, 1 Feb 2021 10:39:03 +0000 Subject: [PATCH 1/2] Add a plugin for Position CSV parsing Allow application code to plugin their own products Approach is more standard than the resolver used up to now --- .../csv/EtdFuturePositionCsvPlugin.java | 55 ++++++++++ .../csv/EtdOptionPositionCsvPlugin.java | 55 ++++++++++ .../strata/loader/csv/PositionCsvLoader.java | 95 +++++++---------- .../loader/csv/PositionCsvParserPlugin.java | 100 ++++++++++++++++++ .../loader/csv/SecurityPositionCsvPlugin.java | 55 ++++++++++ .../loader/csv/SmartPositionCsvPlugin.java | 52 +++++++++ .../config/base/PositionCsvParserPlugin.ini | 18 ++++ .../loader/csv/PositionCsvLoaderTest.java | 4 +- 8 files changed, 373 insertions(+), 61 deletions(-) create mode 100644 modules/loader/src/main/java/com/opengamma/strata/loader/csv/EtdFuturePositionCsvPlugin.java create mode 100644 modules/loader/src/main/java/com/opengamma/strata/loader/csv/EtdOptionPositionCsvPlugin.java create mode 100644 modules/loader/src/main/java/com/opengamma/strata/loader/csv/PositionCsvParserPlugin.java create mode 100644 modules/loader/src/main/java/com/opengamma/strata/loader/csv/SecurityPositionCsvPlugin.java create mode 100644 modules/loader/src/main/java/com/opengamma/strata/loader/csv/SmartPositionCsvPlugin.java create mode 100644 modules/loader/src/main/resources/META-INF/com/opengamma/strata/config/base/PositionCsvParserPlugin.ini diff --git a/modules/loader/src/main/java/com/opengamma/strata/loader/csv/EtdFuturePositionCsvPlugin.java b/modules/loader/src/main/java/com/opengamma/strata/loader/csv/EtdFuturePositionCsvPlugin.java new file mode 100644 index 0000000000..a4196f92ec --- /dev/null +++ b/modules/loader/src/main/java/com/opengamma/strata/loader/csv/EtdFuturePositionCsvPlugin.java @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2021 - present by OpenGamma Inc. and the OpenGamma group of companies + * + * Please see distribution for license. + */ +package com.opengamma.strata.loader.csv; + +import java.util.Optional; +import java.util.Set; + +import com.google.common.collect.ImmutableSet; +import com.opengamma.strata.collect.io.CsvRow; +import com.opengamma.strata.product.Position; +import com.opengamma.strata.product.PositionInfo; +import com.opengamma.strata.product.SecurityPosition; +import com.opengamma.strata.product.etd.EtdFuturePosition; + +/** + * Handles the CSV file format for CDS index trades. + */ +final class EtdFuturePositionCsvPlugin implements PositionCsvParserPlugin { + + /** + * The singleton instance of the plugin. + */ + public static final EtdFuturePositionCsvPlugin INSTANCE = new EtdFuturePositionCsvPlugin(); + + //------------------------------------------------------------------------- + @Override + public Set positionTypeNames() { + return ImmutableSet.of("FUT", "FUTURE"); + } + + @Override + public Optional parsePosition( + Class requiredJavaType, + CsvRow row, + PositionInfo info, + PositionCsvInfoResolver resolver) { + + if (requiredJavaType.isAssignableFrom(EtdFuturePosition.class)) { + return Optional.of(resolver.parseEtdFuturePosition(row, info)); + } + if (requiredJavaType.isAssignableFrom(SecurityPosition.class)) { + return Optional.of(resolver.parseEtdFutureSecurityPosition(row, info)); + } + return Optional.empty(); + } + + @Override + public String getName() { + return "EtdFuture"; + } + +} diff --git a/modules/loader/src/main/java/com/opengamma/strata/loader/csv/EtdOptionPositionCsvPlugin.java b/modules/loader/src/main/java/com/opengamma/strata/loader/csv/EtdOptionPositionCsvPlugin.java new file mode 100644 index 0000000000..1c9718a1d1 --- /dev/null +++ b/modules/loader/src/main/java/com/opengamma/strata/loader/csv/EtdOptionPositionCsvPlugin.java @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2021 - present by OpenGamma Inc. and the OpenGamma group of companies + * + * Please see distribution for license. + */ +package com.opengamma.strata.loader.csv; + +import java.util.Optional; +import java.util.Set; + +import com.google.common.collect.ImmutableSet; +import com.opengamma.strata.collect.io.CsvRow; +import com.opengamma.strata.product.Position; +import com.opengamma.strata.product.PositionInfo; +import com.opengamma.strata.product.SecurityPosition; +import com.opengamma.strata.product.etd.EtdOptionPosition; + +/** + * Handles the CSV file format for CDS index trades. + */ +final class EtdOptionPositionCsvPlugin implements PositionCsvParserPlugin { + + /** + * The singleton instance of the plugin. + */ + public static final EtdOptionPositionCsvPlugin INSTANCE = new EtdOptionPositionCsvPlugin(); + + //------------------------------------------------------------------------- + @Override + public Set positionTypeNames() { + return ImmutableSet.of("OPT", "OPTION"); + } + + @Override + public Optional parsePosition( + Class requiredJavaType, + CsvRow row, + PositionInfo info, + PositionCsvInfoResolver resolver) { + + if (requiredJavaType.isAssignableFrom(EtdOptionPosition.class)) { + return Optional.of(resolver.parseEtdOptionPosition(row, info)); + } + if (requiredJavaType.isAssignableFrom(SecurityPosition.class)) { + return Optional.of(resolver.parseEtdOptionSecurityPosition(row, info)); + } + return Optional.empty(); + } + + @Override + public String getName() { + return "EtdOption"; + } + +} diff --git a/modules/loader/src/main/java/com/opengamma/strata/loader/csv/PositionCsvLoader.java b/modules/loader/src/main/java/com/opengamma/strata/loader/csv/PositionCsvLoader.java index c0a84c2884..b74102d578 100644 --- a/modules/loader/src/main/java/com/opengamma/strata/loader/csv/PositionCsvLoader.java +++ b/modules/loader/src/main/java/com/opengamma/strata/loader/csv/PositionCsvLoader.java @@ -12,27 +12,27 @@ import java.util.Collection; import java.util.List; import java.util.Locale; -import java.util.Optional; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; import com.google.common.io.CharSource; import com.opengamma.strata.basics.ReferenceData; import com.opengamma.strata.basics.StandardId; import com.opengamma.strata.basics.StandardSchemes; import com.opengamma.strata.collect.ArgChecker; import com.opengamma.strata.collect.Guavate; +import com.opengamma.strata.collect.MapStream; import com.opengamma.strata.collect.io.CsvIterator; import com.opengamma.strata.collect.io.CsvRow; import com.opengamma.strata.collect.io.ResourceLocator; import com.opengamma.strata.collect.io.UnicodeBom; +import com.opengamma.strata.collect.named.ExtendedEnum; import com.opengamma.strata.collect.result.FailureItem; import com.opengamma.strata.collect.result.FailureReason; import com.opengamma.strata.collect.result.ValueWithFailures; -import com.opengamma.strata.product.GenericSecurityPosition; import com.opengamma.strata.product.Position; import com.opengamma.strata.product.PositionInfo; import com.opengamma.strata.product.PositionInfoBuilder; -import com.opengamma.strata.product.ResolvableSecurityPosition; import com.opengamma.strata.product.SecurityPosition; import com.opengamma.strata.product.etd.EtdContractSpec; import com.opengamma.strata.product.etd.EtdContractSpecId; @@ -40,7 +40,6 @@ import com.opengamma.strata.product.etd.EtdIdUtils; import com.opengamma.strata.product.etd.EtdOptionPosition; import com.opengamma.strata.product.etd.EtdOptionType; -import com.opengamma.strata.product.etd.EtdPosition; import com.opengamma.strata.product.etd.EtdSettlementType; /** @@ -149,6 +148,21 @@ public final class PositionCsvLoader { static final String NAME_FIELD = "Name"; static final String CCP_FIELD = "CCP"; + /** + * The lookup of position parsers. + */ + static final ExtendedEnum ENUM_LOOKUP = ExtendedEnum.of(PositionCsvParserPlugin.class); + /** + * The lookup of position parsers. + */ + private static final ImmutableMap PLUGINS = + MapStream.of(PositionCsvParserPlugin.extendedEnum().lookupAllNormalized().values()) + .flatMapKeys(plugin -> plugin.positionTypeNames().stream()) + .toMap((a, b) -> { + System.err.println("Two plugins declare the same product type: " + a.positionTypeNames()); + return a; + }); + /** * The resolver, providing additional information. */ @@ -323,75 +337,38 @@ private ValueWithFailures> parseFile(CharSource cha } // loads a single CSV file + @SuppressWarnings("unchecked") private ValueWithFailures> parseFile(CsvIterator csv, Class posType) { List positions = new ArrayList<>(); List failures = new ArrayList<>(); - int line = 2; for (CsvRow row : csv.asIterable()) { + String typeRaw = row.findValue(TYPE_FIELD).orElse("SMART"); + String typeUpper = typeRaw.toUpperCase(Locale.ENGLISH); try { PositionInfo info = parsePositionInfo(row); - Optional typeRawOpt = row.findValue(TYPE_FIELD); - if (typeRawOpt.isPresent()) { - // type specified - String type = typeRawOpt.get().toUpperCase(Locale.ENGLISH); - switch (type.toUpperCase(Locale.ENGLISH)) { - case "SEC": - case "SECURITY": - if (posType == SecurityPosition.class || posType == ResolvableSecurityPosition.class) { - positions.add(posType.cast(resolver.parseNonEtdSecurityPosition(row, info))); - } else if (posType == GenericSecurityPosition.class || posType == Position.class) { - Position parsed = resolver.parseNonEtdPosition(row, info); - if (posType.isInstance(parsed)) { - positions.add(posType.cast(parsed)); - } - } - break; - case "FUT": - case "FUTURE": - if (posType == EtdPosition.class || posType == EtdFuturePosition.class || - posType == ResolvableSecurityPosition.class || posType == Position.class) { - positions.add(posType.cast((Position) resolver.parseEtdFuturePosition(row, info))); - } else if (posType == SecurityPosition.class) { - positions.add(posType.cast(resolver.parseEtdFutureSecurityPosition(row, info))); - } - break; - case "OPT": - case "OPTION": - if (posType == EtdPosition.class || posType == EtdOptionPosition.class || - posType == ResolvableSecurityPosition.class || posType == Position.class) { - positions.add(posType.cast(resolver.parseEtdOptionPosition(row, info))); - } else if (posType == SecurityPosition.class) { - positions.add(posType.cast(resolver.parseEtdOptionSecurityPosition(row, info))); - } - break; - default: - failures.add(FailureItem.of( - FailureReason.PARSING, - "CSV file position type '{positionType}' is not known at line {lineNumber}", - typeRawOpt.get(), - line)); - break; - } + // type specified + PositionCsvParserPlugin plugin = PLUGINS.get(typeUpper); + if (plugin != null) { + plugin.parsePosition(posType, row, info, resolver) + .filter(parsed -> posType.isInstance(parsed)) + .ifPresent(parsed -> positions.add((T) parsed)); } else { - // infer type - if (posType == SecurityPosition.class) { - positions.add(posType.cast(SecurityCsvPlugin.parsePositionLightweight(row, info, resolver))); - } else { - Position position = SecurityCsvPlugin.parsePosition(row, info, resolver); - if (posType.isInstance(position)) { - positions.add(posType.cast(position)); - } - } + // failed to find the type + failures.add(FailureItem.of( + FailureReason.PARSING, + "CSV position file type '{tradeType}' is not known at line {lineNumber}", + typeRaw, + row.lineNumber())); } } catch (RuntimeException ex) { failures.add(FailureItem.of( FailureReason.PARSING, ex, - "CSV file position could not be parsed at line {lineNumber}: {exceptionMessage}", - line, + "CSV position file type '{tradeType}' could not be parsed at line {lineNumber}: {exceptionMessage}", + typeRaw, + row.lineNumber(), ex.getMessage())); } - line++; } return ValueWithFailures.of(positions, failures); } diff --git a/modules/loader/src/main/java/com/opengamma/strata/loader/csv/PositionCsvParserPlugin.java b/modules/loader/src/main/java/com/opengamma/strata/loader/csv/PositionCsvParserPlugin.java new file mode 100644 index 0000000000..f232c22889 --- /dev/null +++ b/modules/loader/src/main/java/com/opengamma/strata/loader/csv/PositionCsvParserPlugin.java @@ -0,0 +1,100 @@ +/* + * Copyright (C) 2021 - present by OpenGamma Inc. and the OpenGamma group of companies + * + * Please see distribution for license. + */ +package com.opengamma.strata.loader.csv; + +import java.util.Optional; +import java.util.Set; + +import org.joda.convert.FromString; +import org.joda.convert.ToString; + +import com.opengamma.strata.collect.ArgChecker; +import com.opengamma.strata.collect.io.CsvRow; +import com.opengamma.strata.collect.named.ExtendedEnum; +import com.opengamma.strata.collect.named.Named; +import com.opengamma.strata.product.Position; +import com.opengamma.strata.product.PositionInfo; +import com.opengamma.strata.product.Product; + +/** + * Pluggable CSV position parser. + *

+ * Implementations of this interface parse a CSV file. + *

+ * See {@link PositionCsvLoader} for the main entry point to parsing. + */ +public interface PositionCsvParserPlugin + extends Named { + + /** + * Obtains an instance from the specified unique name. + * + * @param uniqueName the unique name + * @return the parser + * @throws IllegalArgumentException if the name is not known + */ + @FromString + public static PositionCsvParserPlugin of(String uniqueName) { + ArgChecker.notNull(uniqueName, "uniqueName"); + return extendedEnum().lookup(uniqueName); + } + + /** + * Gets the extended enum helper. + *

+ * This helper allows instances of the parser to be looked up. + * It also provides the complete set of available instances. + * + * @return the extended enum helper + */ + public static ExtendedEnum extendedEnum() { + return PositionCsvLoader.ENUM_LOOKUP; + } + + //------------------------------------------------------------------------- + /** + * Returns the upper-case product types that this plugin supports. + *

+ * These are matched against the CSV file type column. + * + * @return the types that this plugin supports + */ + public abstract Set positionTypeNames(); + + /** + * Parses a single CSV format position from the input. + *

+ * This parses a single position from the CSV rows provided. + * The position may exist on multiple rows + * + * @param requiredJavaType the Java type to return + * @param row the row to parse + * @param info the position info + * @param resolver the resolver + * @return the position object, empty if choosing not to parse because the Java type does not match + * @throws RuntimeException if unable to parse + */ + public abstract Optional parsePosition( + Class requiredJavaType, + CsvRow row, + PositionInfo info, + PositionCsvInfoResolver resolver); + + //------------------------------------------------------------------------- + /** + * Gets the name that uniquely identifies this parser. + *

+ * The name should typically be the name of the {@link Product} that can be parsed. + *

+ * This name is used in serialization and can be parsed using {@link #of(String)}. + * + * @return the unique name + */ + @ToString + @Override + public abstract String getName(); + +} diff --git a/modules/loader/src/main/java/com/opengamma/strata/loader/csv/SecurityPositionCsvPlugin.java b/modules/loader/src/main/java/com/opengamma/strata/loader/csv/SecurityPositionCsvPlugin.java new file mode 100644 index 0000000000..dcaeb50a65 --- /dev/null +++ b/modules/loader/src/main/java/com/opengamma/strata/loader/csv/SecurityPositionCsvPlugin.java @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2021 - present by OpenGamma Inc. and the OpenGamma group of companies + * + * Please see distribution for license. + */ +package com.opengamma.strata.loader.csv; + +import java.util.Optional; +import java.util.Set; + +import com.google.common.collect.ImmutableSet; +import com.opengamma.strata.collect.io.CsvRow; +import com.opengamma.strata.product.GenericSecurityPosition; +import com.opengamma.strata.product.Position; +import com.opengamma.strata.product.PositionInfo; +import com.opengamma.strata.product.SecurityPosition; + +/** + * Handles the CSV file format for CDS index trades. + */ +final class SecurityPositionCsvPlugin implements PositionCsvParserPlugin { + + /** + * The singleton instance of the plugin. + */ + public static final SecurityPositionCsvPlugin INSTANCE = new SecurityPositionCsvPlugin(); + + //------------------------------------------------------------------------- + @Override + public Set positionTypeNames() { + return ImmutableSet.of("SEC", "SECURITY"); + } + + @Override + public Optional parsePosition( + Class requiredJavaType, + CsvRow row, + PositionInfo info, + PositionCsvInfoResolver resolver) { + + if (requiredJavaType.isAssignableFrom(GenericSecurityPosition.class)) { + return Optional.of(resolver.parseNonEtdPosition(row, info)); + } + if (requiredJavaType.isAssignableFrom(SecurityPosition.class)) { + return Optional.of(resolver.parseNonEtdSecurityPosition(row, info)); + } + return Optional.empty(); + } + + @Override + public String getName() { + return "Security"; + } + +} diff --git a/modules/loader/src/main/java/com/opengamma/strata/loader/csv/SmartPositionCsvPlugin.java b/modules/loader/src/main/java/com/opengamma/strata/loader/csv/SmartPositionCsvPlugin.java new file mode 100644 index 0000000000..60d1ee3690 --- /dev/null +++ b/modules/loader/src/main/java/com/opengamma/strata/loader/csv/SmartPositionCsvPlugin.java @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2021 - present by OpenGamma Inc. and the OpenGamma group of companies + * + * Please see distribution for license. + */ +package com.opengamma.strata.loader.csv; + +import java.util.Optional; +import java.util.Set; + +import com.google.common.collect.ImmutableSet; +import com.opengamma.strata.collect.io.CsvRow; +import com.opengamma.strata.product.Position; +import com.opengamma.strata.product.PositionInfo; +import com.opengamma.strata.product.SecurityPosition; + +/** + * Handles the CSV file format for CDS index trades. + */ +final class SmartPositionCsvPlugin implements PositionCsvParserPlugin { + + /** + * The singleton instance of the plugin. + */ + public static final SmartPositionCsvPlugin INSTANCE = new SmartPositionCsvPlugin(); + + //------------------------------------------------------------------------- + @Override + public Set positionTypeNames() { + return ImmutableSet.of("SMART"); + } + + @Override + public Optional parsePosition( + Class requiredJavaType, + CsvRow row, + PositionInfo info, + PositionCsvInfoResolver resolver) { + + if (requiredJavaType == SecurityPosition.class) { + return Optional.of(SecurityCsvPlugin.parsePositionLightweight(row, info, resolver)); + } else { + return Optional.of(SecurityCsvPlugin.parsePosition(row, info, resolver)); + } + } + + @Override + public String getName() { + return "Smart"; + } + +} diff --git a/modules/loader/src/main/resources/META-INF/com/opengamma/strata/config/base/PositionCsvParserPlugin.ini b/modules/loader/src/main/resources/META-INF/com/opengamma/strata/config/base/PositionCsvParserPlugin.ini new file mode 100644 index 0000000000..7ae72018c2 --- /dev/null +++ b/modules/loader/src/main/resources/META-INF/com/opengamma/strata/config/base/PositionCsvParserPlugin.ini @@ -0,0 +1,18 @@ +# PositionCsvParserPlugin configuration + +# The providers are the classes that define the enum +# The key is of the form 'provider.full.class.name' +# The value is either +# 'constants', the public static final constants from the class +# 'lookup', the class implements NamedLookup with a no-args constructor +# 'instance', the class has a static field named INSTANCE that is of type NamedLookup +[providers] +com.opengamma.strata.loader.csv.EtdFuturePositionCsvPlugin = constants +com.opengamma.strata.loader.csv.EtdOptionPositionCsvPlugin = constants +com.opengamma.strata.loader.csv.SecurityPositionCsvPlugin = constants +com.opengamma.strata.loader.csv.SmartPositionCsvPlugin = constants + +# The set of alternate names +# The key is the alternate name +# The value is the standard name (loaded by a provider) +[alternates] diff --git a/modules/loader/src/test/java/com/opengamma/strata/loader/csv/PositionCsvLoaderTest.java b/modules/loader/src/test/java/com/opengamma/strata/loader/csv/PositionCsvLoaderTest.java index 3f41f8c4d6..6ba74391fe 100644 --- a/modules/loader/src/test/java/com/opengamma/strata/loader/csv/PositionCsvLoaderTest.java +++ b/modules/loader/src/test/java/com/opengamma/strata/loader/csv/PositionCsvLoaderTest.java @@ -402,7 +402,7 @@ public void test_load_invalidUnknownType() { assertThat(trades.getFailures()).hasSize(1); FailureItem failure = trades.getFailures().get(0); assertThat(failure.getReason()).isEqualTo(FailureReason.PARSING); - assertThat(failure.getMessage()).isEqualTo("CSV file position type 'Foo' is not known at line 2"); + assertThat(failure.getMessage()).isEqualTo("CSV position file type 'Foo' is not known at line 2"); } @Test @@ -425,7 +425,7 @@ public void test_load_invalidNoQuantity() { assertThat(trades.getFailures()).hasSize(1); FailureItem failure = trades.getFailures().get(0); assertThat(failure.getReason()).isEqualTo(FailureReason.PARSING); - assertThat(failure.getMessage()).isEqualTo("CSV file position could not be parsed at line 2: " + + assertThat(failure.getMessage()).isEqualTo("CSV position file type 'FUT' could not be parsed at line 2: " + "Security must contain a quantity column, either 'Quantity' or 'Long Quantity' and 'Short Quantity'"); } From 54c6046547b6643f6665eda10ffb258f442b6597 Mon Sep 17 00:00:00 2001 From: Stephen Colebourne Date: Mon, 1 Feb 2021 14:17:28 +0000 Subject: [PATCH 2/2] Fix Javadoc --- .../opengamma/strata/loader/csv/EtdFuturePositionCsvPlugin.java | 2 +- .../opengamma/strata/loader/csv/EtdOptionPositionCsvPlugin.java | 2 +- .../opengamma/strata/loader/csv/SecurityPositionCsvPlugin.java | 2 +- .../com/opengamma/strata/loader/csv/SmartPositionCsvPlugin.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/loader/src/main/java/com/opengamma/strata/loader/csv/EtdFuturePositionCsvPlugin.java b/modules/loader/src/main/java/com/opengamma/strata/loader/csv/EtdFuturePositionCsvPlugin.java index a4196f92ec..a6318b0838 100644 --- a/modules/loader/src/main/java/com/opengamma/strata/loader/csv/EtdFuturePositionCsvPlugin.java +++ b/modules/loader/src/main/java/com/opengamma/strata/loader/csv/EtdFuturePositionCsvPlugin.java @@ -16,7 +16,7 @@ import com.opengamma.strata.product.etd.EtdFuturePosition; /** - * Handles the CSV file format for CDS index trades. + * Handles the CSV file format for ETD future trades. */ final class EtdFuturePositionCsvPlugin implements PositionCsvParserPlugin { diff --git a/modules/loader/src/main/java/com/opengamma/strata/loader/csv/EtdOptionPositionCsvPlugin.java b/modules/loader/src/main/java/com/opengamma/strata/loader/csv/EtdOptionPositionCsvPlugin.java index 1c9718a1d1..d915c0fff9 100644 --- a/modules/loader/src/main/java/com/opengamma/strata/loader/csv/EtdOptionPositionCsvPlugin.java +++ b/modules/loader/src/main/java/com/opengamma/strata/loader/csv/EtdOptionPositionCsvPlugin.java @@ -16,7 +16,7 @@ import com.opengamma.strata.product.etd.EtdOptionPosition; /** - * Handles the CSV file format for CDS index trades. + * Handles the CSV file format for ETD option trades. */ final class EtdOptionPositionCsvPlugin implements PositionCsvParserPlugin { diff --git a/modules/loader/src/main/java/com/opengamma/strata/loader/csv/SecurityPositionCsvPlugin.java b/modules/loader/src/main/java/com/opengamma/strata/loader/csv/SecurityPositionCsvPlugin.java index dcaeb50a65..12f25967a5 100644 --- a/modules/loader/src/main/java/com/opengamma/strata/loader/csv/SecurityPositionCsvPlugin.java +++ b/modules/loader/src/main/java/com/opengamma/strata/loader/csv/SecurityPositionCsvPlugin.java @@ -16,7 +16,7 @@ import com.opengamma.strata.product.SecurityPosition; /** - * Handles the CSV file format for CDS index trades. + * Handles the CSV file format for security trades. */ final class SecurityPositionCsvPlugin implements PositionCsvParserPlugin { diff --git a/modules/loader/src/main/java/com/opengamma/strata/loader/csv/SmartPositionCsvPlugin.java b/modules/loader/src/main/java/com/opengamma/strata/loader/csv/SmartPositionCsvPlugin.java index 60d1ee3690..6c4605298f 100644 --- a/modules/loader/src/main/java/com/opengamma/strata/loader/csv/SmartPositionCsvPlugin.java +++ b/modules/loader/src/main/java/com/opengamma/strata/loader/csv/SmartPositionCsvPlugin.java @@ -15,7 +15,7 @@ import com.opengamma.strata.product.SecurityPosition; /** - * Handles the CSV file format for CDS index trades. + * Handles the CSV file format for security trades interpretted from the data. */ final class SmartPositionCsvPlugin implements PositionCsvParserPlugin {