#include "read_file.h" #include #include #include #include #include "support/xerces_string_guard.h" #include "support/dom/result_node_facade.h" namespace { inline bool isXmlFile(const boost::filesystem::path& filePath) { return filePath.extension() == ".xml" || filePath.extension() == ".xsl"; } boost::optional readXmlFile( const boost::filesystem::path& filePath, xercesc::DOMDocument* const domDocument ) { const xercesc::LocalFileInputSource file( *InputXSLT::XercesStringGuard(filePath.string()) ); xercesc::XercesDOMParser parser; parser.setDoNamespaces(true); parser.parse(file); if ( parser.getErrorCount() == 0 ) { return boost::make_optional( domDocument->importNode( parser.getDocument()->getDocumentElement(), true ) ); } else { return boost::optional(); } } boost::optional readPlainFile( const boost::filesystem::path& filePath) { boost::filesystem::ifstream file(filePath); if ( file.is_open() ) { return boost::make_optional( std::string( (std::istreambuf_iterator(file)), (std::istreambuf_iterator()) ) ); } else { return boost::optional(); } } } namespace InputXSLT { DomDocumentCache::document_ptr FunctionReadFile::constructDocument( const FilesystemContext&, boost::filesystem::path filePath ) const { DomDocumentCache::document_ptr domDocument( DomDocumentCache::createDocument("content") ); ResultNodeFacade result(domDocument.get(), "file"); result.setAttribute("name", filePath.filename().string()); result.setAttribute("base", filePath.parent_path().string()); if ( boost::filesystem::is_regular_file(filePath) ) { try { if ( isXmlFile(filePath) ) { result.setAttribute("type", "xml"); if ( auto importedNode = readXmlFile( filePath, domDocument.get()) ) { result.setContent(*importedNode); result.setAttribute("result", "success"); } else { result.setAttribute("result", "error"); } } else { result.setAttribute("type", "plain"); if ( auto plainContent = readPlainFile(filePath) ) { result.setContent(*plainContent); result.setAttribute("result", "success"); } else { result.setAttribute("result", "error"); } result.setAttribute("result", "success"); } } catch ( const xercesc::DOMException& exception ) { result.setAttribute("result", "error"); result.setValueNode( "error", *XercesStringGuard(exception.msg) ); } } else { result.setAttribute("result", "error"); } return domDocument; } }