Stage *PipelineReaderXML::parseElement_Writer(const ptree& tree) { Options options; StageParserContext context; std::string filename; map_t attrs; collect_attributes(attrs, tree); std::vector<Stage *> prevStages; for (auto iter = tree.begin(); iter != tree.end(); ++iter) { const std::string& name = iter->first; const ptree& subtree = iter->second; if (name == "<xmlattr>") { // already parsed -- ignore it } else if (name == "Option") { Option option = parseElement_Option(subtree); if (option.getName() == "filename") filename = option.getValue(); options.add(option); } else if (name == "Metadata") { // ignored } else if (name == "Filter" || name == "Reader") { context.addStage(); prevStages.push_back(parseElement_anystage(name, subtree)); } else { context.addUnknown(name); } } std::string type; if (attrs.count("type")) { type = attrs["type"]; context.addType(); } context.validate(); Stage& writer = m_manager.makeWriter(filename, type); for (auto sp : prevStages) writer.setInput(*sp); writer.removeOptions(options); writer.addOptions(options); return &writer; }
Filter* PipelineReader::parseElement_Filter(const ptree& tree) { Options options(m_baseOptions); // Stage* prevStage = NULL; StageParserContext context; map_t attrs; collect_attributes(attrs, tree); std::vector<Stage *> prevStages; for (auto iter = tree.begin(); iter != tree.end(); ++iter) { const std::string& name = iter->first; const ptree& subtree = iter->second; if (name == "<xmlattr>") { // already parsed } else if (name == "Option") { Option option = parseElement_Option(subtree); options.add(option); } else if (name == "Metadata") { // ignored } else if (name == "Filter" || name == "Reader") { context.addStage(); prevStages.push_back(parseElement_anystage(name, subtree)); } else { context.addUnknown(name); } } std::string type; if (attrs.count("type")) { type = attrs["type"]; context.addType(); } Filter* ptr = m_manager.addFilter(type, prevStages); ptr->setOptions(options); if (dynamic_cast<MultiFilter *>(ptr)) context.setCardinality(StageParserContext::Many); context.validate(); return ptr; }
Stage *PipelineReaderXML::parseElement_Reader(const ptree& tree) { Options options; StageParserContext context; std::string filename; context.setCardinality(StageParserContext::None); map_t attrs; collect_attributes(attrs, tree); auto iter = tree.begin(); while (iter != tree.end()) { const std::string& name = iter->first; const ptree& subtree = iter->second; if (name == "<xmlattr>") { // already parsed } else if (name == "Option") { Option option = parseElement_Option(subtree); if (option.getName() == "filename") filename = option.getValue(); options.add(option); } else if (name == "Metadata") { // ignored for now } else { context.addUnknown(name); } ++iter; } std::string type; if (attrs.count("type")) { type = attrs["type"]; } Stage& reader = m_manager.makeReader(filename, type); reader.removeOptions(options); reader.addOptions(options); context.addType(); context.validate(); return &reader; }
Writer* PipelineReader::parseElement_Writer(const ptree& tree) { Options options(m_baseOptions); Stage* prevStage = NULL; StageParserContext context; map_t attrs; collect_attributes(attrs, tree); for (auto iter = tree.begin(); iter != tree.end(); ++iter) { const std::string& name = iter->first; const ptree& subtree = iter->second; if (name == "<xmlattr>") { // already parsed -- ignore it } else if (name == "Option") { Option option = parseElement_Option(subtree); options.add(option); } else if (name == "Metadata") { // ignored } else if (name == "Filter" || name == "Reader") { context.addStage(); prevStage = parseElement_anystage(name, subtree); } else { context.addUnknown(name); } } std::string type; if (attrs.count("type")) { type = attrs["type"]; context.addType(); } context.validate(); Writer* writer = m_manager.addWriter(type, prevStage); writer->setOptions(options); return writer; }
Reader* PipelineReader::parseElement_Reader(const ptree& tree) { Options options(m_baseOptions); StageParserContext context; context.setCardinality(StageParserContext::None); map_t attrs; collect_attributes(attrs, tree); auto iter = tree.begin(); while (iter != tree.end()) { const std::string& name = iter->first; const ptree& subtree = iter->second; if (name == "<xmlattr>") { // already parsed } else if (name == "Option") { Option option = parseElement_Option(subtree); options.add(option); } else if (name == "Metadata") { // ignored for now } else { context.addUnknown(name); } ++iter; } std::string type; if (attrs.count("type")) { type = attrs["type"]; context.addType(); } // If we aren't provided a type, try to infer the type from the filename // #278 if (context.getNumTypes() == 0) { try { const std::string filename = options.getValueOrThrow<std::string>("filename"); type = StageFactory::inferReaderDriver(filename); if (!type.empty()) { context.addType(); } } catch (option_not_found) {} // noop } context.validate(); Reader* reader =m_manager.addReader(type); reader->setOptions(options); return reader; }