private static XmlElement getFpmlRoot(XmlElement el) { if (el.getChildren("party").size() > 0) { if (el.getChildren("trade").size() > 0) { return el; for (XmlElement child : el.getChildren()) { if (child.getChildren("trade").size() > 0) { List<XmlElement> fakeChildren = new ArrayList<>(); fakeChildren.addAll(el.getChildren("party")); fakeChildren.addAll(child.getChildren("trade")); XmlElement fakeRoot = XmlElement.ofChildren(el.getName(), el.getAttributes(), fakeChildren); return fakeRoot; for (XmlElement child : el.getChildren()) { for (XmlElement grandchild : child.getChildren()) { if (grandchild.getChildren("trade").size() > 0) { List<XmlElement> fakeChildren = new ArrayList<>(); fakeChildren.addAll(el.getChildren("party")); fakeChildren.addAll(grandchild.getChildren("trade")); XmlElement fakeRoot = XmlElement.ofChildren(el.getName(), el.getAttributes(), fakeChildren); return fakeRoot;
/** * Converts an FpML 'BusinessDayAdjustments' to a {@code BusinessDayAdjustment}. * * @param baseEl the FpML business centers or reference element to parse * @return the business day adjustment * @throws RuntimeException if unable to parse */ public BusinessDayAdjustment parseBusinessDayAdjustments(XmlElement baseEl) { // FpML content: ('businessDayConvention', 'BusinessCentersOrReference.model?') BusinessDayConvention bdc = convertBusinessDayConvention( baseEl.getChild("businessDayConvention").getContent()); Optional<XmlElement> centersEl = baseEl.findChild("businessCenters"); Optional<XmlElement> centersRefEl = baseEl.findChild("businessCentersReference"); HolidayCalendarId calendar = (centersEl.isPresent() || centersRefEl.isPresent() ? parseBusinessCenters(baseEl) : HolidayCalendarIds.NO_HOLIDAYS); return BusinessDayAdjustment.of(bdc, calendar); }
/** * Obtains an instance with content and no attributes. * <p> * Returns an element representing XML with content, but no children. * * @param name the element name, not empty * @param content the content, empty if the element has no content * @return the element */ public static XmlElement ofContent(String name, String content) { return ofContent(name, ImmutableMap.of(), content); }
/** * Converts an FpML 'FloatingRateIndex' tenor to a {@code Tenor}. * * @param baseEl the FpML floating rate index element to parse * @return the period * @throws RuntimeException if unable to parse */ public Tenor parseIndexTenor(XmlElement baseEl) { // FpML content: ('periodMultiplier', 'period') String multiplier = baseEl.getChild("periodMultiplier").getContent(); String unit = baseEl.getChild("period").getContent(); return convertIndexTenor(multiplier, unit); }
private static List<String> findPartyIds(XmlElement party) { ImmutableList.Builder<String> builder = ImmutableList.builder(); for (XmlElement child : party.getChildren("partyId")) { if (child.hasContent()) { builder.add(child.getContent()); } } return builder.build(); }
public void test_ofChildren_empty() { XmlElement test = XmlElement.ofChildren("test", CHILD_LIST_EMPTY); assertEquals(test.getName(), "test"); assertEquals(test.getAttributes(), ATTR_MAP_EMPTY); assertEquals(test.hasContent(), false); assertEquals(test.getContent(), ""); assertEquals(test.getChildren(), CHILD_LIST_EMPTY); assertThrowsIllegalArg(() -> test.getAttribute("notFound")); assertThrows(() -> test.getChild(0), IndexOutOfBoundsException.class); assertThrowsIllegalArg(() -> test.getChild("notFound")); assertEquals(test.findChild("notFound"), Optional.empty()); assertEquals(test.getChildren("notFound"), ImmutableList.of()); assertEquals(test.toString(), "<test></test>"); }
public void test_of_ByteSource_parsedReferences() { ByteSource source = ByteSource.wrap(SAMPLE.getBytes(StandardCharsets.UTF_8)); XmlFile test = XmlFile.of(source, "key"); XmlElement root = test.getRoot(); assertEquals(root.getName(), "base"); assertEquals(root.getAttributes(), ATTR_MAP_EMPTY); assertEquals(root.getContent(), ""); assertEquals(root.getChildren().size(), 1); XmlElement child = root.getChild(0); assertEquals(child, XmlElement.ofChildren("test", ATTR_MAP, CHILD_LIST_MULTI)); assertEquals(test.getReferences(), ImmutableMap.of("value", root.getChild(0))); }
XmlElement.ofContent(elementName, attrs, content) : XmlElement.ofChildren(elementName, attrs, children); String ref = attrs.get(refAttr); if (ref != null) {
private ListMultimap<String, StandardId> parseAllTradeIds(XmlElement tradeHeaderEl) { // look through each partyTradeIdentifier ListMultimap<String, StandardId> allIds = ArrayListMultimap.create(); List<XmlElement> partyTradeIdentifierEls = tradeHeaderEl.getChildren("partyTradeIdentifier"); for (XmlElement partyTradeIdentifierEl : partyTradeIdentifierEls) { Optional<XmlElement> partyRefOptEl = partyTradeIdentifierEl.findChild("partyReference"); if (partyRefOptEl.isPresent() && partyRefOptEl.get().findAttribute(HREF).isPresent()) { String partyHref = partyRefOptEl.get().findAttribute(HREF).get(); // try to find a tradeId, either in versionedTradeId or as a direct child Optional<XmlElement> vtradeIdOptEl = partyTradeIdentifierEl.findChild("versionedTradeId"); Optional<XmlElement> tradeIdOptEl = vtradeIdOptEl .map(vt -> Optional.of(vt.getChild("tradeId"))) .orElse(partyTradeIdentifierEl.findChild("tradeId")); if (tradeIdOptEl.isPresent() && tradeIdOptEl.get().findAttribute("tradeIdScheme").isPresent()) { XmlElement tradeIdEl = tradeIdOptEl.get(); String scheme = tradeIdEl.getAttribute("tradeIdScheme"); // ignore if there is an empty scheme or value if (!scheme.isEmpty() && !tradeIdEl.getContent().isEmpty()) { allIds.put(partyHref, StandardId.of(StandardId.encodeScheme(scheme), tradeIdEl.getContent())); } } } } return allIds; }
XmlElement relativeToEl = lookupReference(baseEl.getChild("dateRelativeTo")); LocalDate baseDate; if (relativeToEl.hasContent()) { baseDate = parseDate(relativeToEl); } else if (relativeToEl.getName().contains("relative")) { baseDate = parseAdjustedRelativeDateOffset(relativeToEl).getUnadjusted(); } else { throw new FpmlParseException( "Unable to resolve 'dateRelativeTo' to a date: " + baseEl.getChild("dateRelativeTo").getAttribute(HREF)); Optional<XmlElement> dayTypeEl = baseEl.findChild("dayType"); boolean calendarDays = period.isZero() || (dayTypeEl.isPresent() && dayTypeEl.get().getContent().equals("Calendar")); BusinessDayAdjustment bda1 = parseBusinessDayAdjustments(baseEl); BusinessDayAdjustment bda2 = baseEl.findChild("relativeDateAdjustments") .map(el -> parseBusinessDayAdjustments(el)) .orElse(bda1);
XmlElement swapEl = tradeEl.getChild("swap"); ImmutableList<XmlElement> legEls = swapEl.getChildren("swapStream"); ImmutableList.Builder<SwapLeg> legsBuilder = ImmutableList.builder(); for (XmlElement legEl : legEls) { XmlElement calcPeriodAmountEl = legEl.getChild("calculationPeriodAmount"); XmlElement calcEl = calcPeriodAmountEl.findChild("calculation") .orElse(XmlElement.ofChildren("calculation", ImmutableList.of())); PeriodicSchedule accrualSchedule = parseSwapAccrualSchedule(legEl, document); PaymentSchedule paymentSchedule = parseSwapPaymentSchedule(legEl, calcEl, document); Optional<XmlElement> knownAmountOptEl = calcPeriodAmountEl.findChild("knownAmountSchedule"); if (knownAmountOptEl.isPresent()) { XmlElement knownAmountEl = knownAmountOptEl.get(); .paymentSchedule(paymentSchedule) .amount(amountSchedule) .currency(document.parseCurrency(knownAmountEl.getChild("currency"))) .build()); } else {
Trade parseCds(FpmlDocument document, XmlElement tradeEl, TradeInfoBuilder tradeInfoBuilder) { XmlElement cdsEl = tradeEl.getChild("creditDefaultSwap"); XmlElement generalTermsEl = cdsEl.getChild("generalTerms"); XmlElement feeLegEl = cdsEl.getChild("feeLeg"); document.validateNotPresent(generalTermsEl, "basketReferenceInformation"); document.validateNotPresent(feeLegEl, "singlePayment"); AdjustableDate effectiveDate = document.parseAdjustableDate(generalTermsEl.getChild("effectiveDate")); AdjustableDate terminationDate = document.parseAdjustableDate(generalTermsEl.getChild("scheduledTerminationDate")); BusinessDayAdjustment bda = generalTermsEl.findChild("dateAdjustments") .map(el -> document.parseBusinessDayAdjustments(el)) .orElse(BusinessDayAdjustment.NONE); Optional<XmlElement> initialPaymentOptEl = feeLegEl.findChild("initialPayment"); AdjustablePayment upfrontFee = null; if (initialPaymentOptEl.isPresent()) { XmlElement initialPaymentEl = initialPaymentOptEl.get(); PayReceive payRec = document.parsePayerReceiver(initialPaymentEl, tradeInfoBuilder); CurrencyAmount amount = document.parseCurrencyAmount(initialPaymentEl.getChild("paymentAmount")); LocalDate date = initialPaymentEl.findChild("adjustablePaymentDate") .map(el -> document.parseDate(el)) .orElse(effectiveDate.getUnadjusted()); XmlElement periodicPaymentEl = feeLegEl.getChild("periodicPayment"); scheduleBuilder.frequency(periodicPaymentEl.findChild("paymentFrequency") .map(el -> document.parseFrequency(el)) .orElse(Frequency.P3M)); periodicPaymentEl.findChild("firstPaymentDate") .ifPresent(el -> scheduleBuilder.firstRegularStartDate(document.parseDate(el))); periodicPaymentEl.findChild("firstPeriodStartDate")
iborRateBuilder.dayCount(document.parseDayCountFraction(calcEl.getChild("dayCountFraction"))); floatingEl.findChild("floatingRateMultiplierSchedule").ifPresent(el -> { iborRateBuilder.gearing(parseSchedule(el, document)); }); if (floatingEl.getChildren("spreadSchedule").size() > 1) { throw new FpmlParseException("Only one 'spreadSchedule' is supported"); floatingEl.findChild("spreadSchedule").ifPresent(el -> { document.validateNotPresent(el, "type"); iborRateBuilder.spread(parseSchedule(el, document)); }); floatingEl.findChild("initialRate").ifPresent(el -> { iborRateBuilder.firstRegularRate(document.parseDecimal(el)); }); floatingEl.findChild("negativeInterestRateTreatment").ifPresent(el -> { iborRateBuilder.negativeRateMethod(parseNegativeInterestRateTreatment(el)); }); legEl.findChild("resetDates").ifPresent(resetDatesEl -> { document.validateNotPresent(resetDatesEl, "initialFixingDate"); document.validateNotPresent(resetDatesEl, "rateCutOffDaysOffset"); resetDatesEl.findChild("resetRelativeTo").ifPresent(el -> { iborRateBuilder.fixingRelativeTo(parseResetRelativeTo(el)); });
/** * Converts an FpML 'BusinessCentersOrReference.model' to a {@code HolidayCalendar}. * * @param baseEl the FpML business centers or reference element to parse * @return the holiday calendar * @throws RuntimeException if unable to parse */ public HolidayCalendarId parseBusinessCenters(XmlElement baseEl) { // FpML content: ('businessCentersReference' | 'businessCenters') // FpML 'businessCenters' content: ('businessCenter+') // Each 'businessCenter' is a location treated as a holiday calendar Optional<XmlElement> optionalBusinessCentersEl = baseEl.findChild("businessCenters"); XmlElement businessCentersEl = optionalBusinessCentersEl.orElseGet(() -> lookupReference(baseEl.getChild("businessCentersReference"))); HolidayCalendarId calendar = HolidayCalendarIds.NO_HOLIDAYS; for (XmlElement businessCenterEl : businessCentersEl.getChildren("businessCenter")) { calendar = calendar.combinedWith(parseBusinessCenter(businessCenterEl)); } return calendar; }
/** * Converts an FpML 'FloatingRateIndex' with multiple tenors to an {@code Index}. * * @param baseEl the FpML floating rate index element to parse * @return the index * @throws RuntimeException if unable to parse */ public List<Index> parseIndexes(XmlElement baseEl) { XmlElement indexEl = baseEl.getChild("floatingRateIndex"); validateScheme(indexEl, "floatingRateIndexScheme", "http://www.fpml.org/coding-scheme/floating-rate-index"); FloatingRateName floatingName = FloatingRateName.of(indexEl.getContent()); List<XmlElement> tenorEls = baseEl.getChildren("indexTenor"); if (tenorEls.isEmpty()) { return ImmutableList.of(floatingName.toOvernightIndex()); } else { return tenorEls.stream() .map(el -> floatingName.toIborIndex(parseIndexTenor(el))) .collect(toImmutableList()); } }
private Trade parseTrade(FpmlDocument document, XmlElement tradeEl) { // find which trade type it is by comparing children to known parsers for (Entry<String, FpmlParserPlugin> entry : tradeParsers.entrySet()) { Optional<XmlElement> productOptEl = tradeEl.findChild(entry.getKey()); if (productOptEl.isPresent()) { return entry.getValue().parseTrade(document, tradeEl); } } // failed to find a known trade type ImmutableSet<String> childNames = tradeEl.getChildren().stream().map(XmlElement::getName).collect(toImmutableSet()); throw new FpmlParseException("Unknown product type: " + childNames); }
private CashSwaptionSettlementMethod parseCashSettlementMethod(XmlElement cashSettlementEl) { if (cashSettlementEl.findChild("cashPriceAlternateMethod").isPresent()) { return CashSwaptionSettlementMethod.CASH_PRICE; } else if (cashSettlementEl.findChild("parYieldCurveUnadjustedMethod").isPresent() || cashSettlementEl.findChild("parYieldCurveAadjustedMethod").isPresent()) { return CashSwaptionSettlementMethod.PAR_YIELD; } else if (cashSettlementEl.findChild("zeroCouponYieldAdjustedMethod").isPresent()) { return CashSwaptionSettlementMethod.ZERO_COUPON_YIELD; } else { throw new FpmlParseException("Invalid swaption cash settlement method: " + cashSettlementEl); } }
/** * Converts an FpML 'decimal' to a {@code double}. * * @param baseEl the FpML element to parse * @return the double * @throws RuntimeException if unable to parse */ public double parseDecimal(XmlElement baseEl) { return Double.parseDouble(baseEl.getContent()); }
private LocalTime parseExpiryTime(XmlElement expirationTimeEl, FpmlDocument document) { return document.parseTime(expirationTimeEl.getChild("hourMinuteTime")); }