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); }