From 2aae10eee669e918e80b3a7a57a922a154271c59 Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Mon, 28 May 2018 14:47:42 +0200 Subject: [PATCH] use input output file type registry --- alib2cli/src/ast/statements/FileStatement.cpp | 19 +++++-------------- .../src/ast/statements/ResultFileStatement.h | 6 ++---- .../InputFileTypeRegistration.cpp | 17 +++++++++++++++-- .../InputFileTypeRegistration.hpp | 2 +- .../OutputFileTypeRegistration.cpp | 6 ++++-- .../OutputFileTypeRegistration.hpp | 2 +- alib2cli/src/registry/InputFileRegistry.cpp | 8 ++++---- alib2cli/src/registry/InputFileRegistry.hpp | 12 ++++++------ alib2cli/src/registry/OutputFileRegistry.cpp | 8 ++++---- alib2cli/src/registry/OutputFileRegistry.hpp | 12 ++++++------ 10 files changed, 48 insertions(+), 44 deletions(-) diff --git a/alib2cli/src/ast/statements/FileStatement.cpp b/alib2cli/src/ast/statements/FileStatement.cpp index 8a125feadb..a3bf050a4c 100644 --- a/alib2cli/src/ast/statements/FileStatement.cpp +++ b/alib2cli/src/ast/statements/FileStatement.cpp @@ -3,8 +3,7 @@ #include <ast/Option.h> #include <ast/Arg.h> -#include <common/XmlParserHelper.h> -#include <registry/XmlRegistry.h> +#include <registry/InputFileRegistry.hpp> namespace cli { @@ -16,20 +15,12 @@ std::shared_ptr < abstraction::OperationAbstraction > FileStatement::translateAn if ( m_type ) type = m_type->getType ( ); - if ( type == "set" || type == "Set" ) { - std::shared_ptr < abstraction::UnaryOperationAbstraction < ext::deque < sax::Token >, const std::string & > > tokens = abstraction::XmlRegistry::fileToTokensAbstraction ( m_file->eval ( environment )); - tokens->eval ( ); - - std::shared_ptr < abstraction::OperationAbstraction > res = abstraction::XmlRegistry::getXmlContainerParserAbstraction ( "Set", m_templateParams [ 0 ]->eval ( environment ) ); - res->attachInput ( tokens, 0, true ); - res->eval ( ); - return res; - } else { - std::string file = m_file->eval ( environment ); - - return abstraction::XmlParserHelper::eval ( std::move ( type ), file ); + ext::vector < std::string > templateParams; + for ( const std::unique_ptr < cli::Arg > & param : m_templateParams ) { + templateParams.push_back ( param->eval ( environment ) ); } + return abstraction::InputFileRegistry::getAbstraction ( m_file->eval ( environment ), "xml", type, templateParams ); } } /* namespace cli */ diff --git a/alib2cli/src/ast/statements/ResultFileStatement.h b/alib2cli/src/ast/statements/ResultFileStatement.h index ba0fe867b1..6e85b41083 100644 --- a/alib2cli/src/ast/statements/ResultFileStatement.h +++ b/alib2cli/src/ast/statements/ResultFileStatement.h @@ -3,7 +3,7 @@ #include <ast/Statement.h> -#include <common/XmlComposerHelper.h> +#include <registry/OutputFileRegistry.hpp> namespace cli { @@ -16,9 +16,7 @@ public: } virtual std::shared_ptr < abstraction::OperationAbstraction > translateAndEval ( const std::shared_ptr < abstraction::OperationAbstraction > & prev, Environment & environment ) const override { - std::string file = m_file->eval ( environment ); - - return abstraction::XmlComposerHelper::eval ( prev, file ); + return abstraction::OutputFileRegistry::getAbstraction ( prev, m_file->eval ( environment ), "xml" ); } virtual bool getImplicitMove ( ) const override { diff --git a/alib2cli/src/registration/InputFileTypeRegistration.cpp b/alib2cli/src/registration/InputFileTypeRegistration.cpp index 6088d0df02..099a300933 100644 --- a/alib2cli/src/registration/InputFileTypeRegistration.cpp +++ b/alib2cli/src/registration/InputFileTypeRegistration.cpp @@ -1,9 +1,22 @@ #include "InputFileTypeRegistration.hpp" +#include <common/XmlParserHelper.h> +#include <registry/XmlRegistry.h> + namespace { - std::shared_ptr < abstraction::OperationAbstraction > dummy ( const std::string & /* type */, const ext::vector < std::string > & /* templateParams */ ) { - return nullptr; + std::shared_ptr < abstraction::OperationAbstraction > dummy ( const std::string & file, const std::string & type, const ext::vector < std::string > & templateParams ) { + if ( type == "set" || type == "Set" ) { + std::shared_ptr < abstraction::UnaryOperationAbstraction < ext::deque < sax::Token >, const std::string & > > tokens = abstraction::XmlRegistry::fileToTokensAbstraction ( file ); + tokens->eval ( ); + + std::shared_ptr < abstraction::OperationAbstraction > res = abstraction::XmlRegistry::getXmlContainerParserAbstraction ( "Set", templateParams [ 0 ] ); + res->attachInput ( tokens, 0, true ); + res->eval ( ); + return res; + } else { + return abstraction::XmlParserHelper::eval ( std::move ( type ), file ); + } } auto xmlInputFileHandler = registration::InputFileRegister ( "xml", dummy ); diff --git a/alib2cli/src/registration/InputFileTypeRegistration.hpp b/alib2cli/src/registration/InputFileTypeRegistration.hpp index 28cb35ef38..f9a46e5f23 100644 --- a/alib2cli/src/registration/InputFileTypeRegistration.hpp +++ b/alib2cli/src/registration/InputFileTypeRegistration.hpp @@ -7,7 +7,7 @@ namespace registration { class InputFileRegister { public: - InputFileRegister ( const std::string & fileType, std::shared_ptr < abstraction::OperationAbstraction > ( * callback ) ( const std::string & type, const ext::vector < std::string > & templateParams ) ) { + InputFileRegister ( const std::string & fileType, std::shared_ptr < abstraction::OperationAbstraction > ( * callback ) ( const std::string & file, const std::string & type, const ext::vector < std::string > & templateParams ) ) { abstraction::InputFileRegistry::registerInputFileHandler ( fileType, callback ); } }; diff --git a/alib2cli/src/registration/OutputFileTypeRegistration.cpp b/alib2cli/src/registration/OutputFileTypeRegistration.cpp index 2f1cbca702..af4be6da61 100644 --- a/alib2cli/src/registration/OutputFileTypeRegistration.cpp +++ b/alib2cli/src/registration/OutputFileTypeRegistration.cpp @@ -1,9 +1,11 @@ #include "OutputFileTypeRegistration.hpp" +#include <common/XmlComposerHelper.h> + namespace { - std::shared_ptr < abstraction::OperationAbstraction > dummy ( ) { - return nullptr; + std::shared_ptr < abstraction::OperationAbstraction > dummy ( std::shared_ptr < abstraction::OperationAbstraction > param, const std::string & file ) { + return abstraction::XmlComposerHelper::eval ( param, file ); } auto xmlOutputFileHandler = registration::OutputFileRegister ( "xml", dummy ); diff --git a/alib2cli/src/registration/OutputFileTypeRegistration.hpp b/alib2cli/src/registration/OutputFileTypeRegistration.hpp index 223310fbd9..67f37e653e 100644 --- a/alib2cli/src/registration/OutputFileTypeRegistration.hpp +++ b/alib2cli/src/registration/OutputFileTypeRegistration.hpp @@ -7,7 +7,7 @@ namespace registration { class OutputFileRegister { public: - OutputFileRegister ( const std::string & fileType, std::shared_ptr < abstraction::OperationAbstraction > ( * callback ) ( ) ) { + OutputFileRegister ( const std::string & fileType, std::shared_ptr < abstraction::OperationAbstraction > ( * callback ) ( std::shared_ptr < abstraction::OperationAbstraction > param, const std::string & file ) ) { abstraction::OutputFileRegistry::registerOutputFileHandler ( fileType, callback ); } }; diff --git a/alib2cli/src/registry/InputFileRegistry.cpp b/alib2cli/src/registry/InputFileRegistry.cpp index e06f0be975..43e97d1d58 100644 --- a/alib2cli/src/registry/InputFileRegistry.cpp +++ b/alib2cli/src/registry/InputFileRegistry.cpp @@ -10,16 +10,16 @@ namespace abstraction { -std::shared_ptr < abstraction::OperationAbstraction > InputFileRegistry::getAbstraction ( const std::string & fileType, const std::string & type, const ext::vector < std::string > & templateParams ) { +std::shared_ptr < abstraction::OperationAbstraction > InputFileRegistry::getAbstraction ( const std::string & file, const std::string & fileType, const std::string & type, const ext::vector < std::string > & templateParams ) { auto res = getEntries ( ).find ( fileType ); if ( res == getEntries ( ).end ( ) ) throw exception::CommonException ( "Entry " + fileType + " not available." ); - return res->second->getAbstraction ( type, templateParams ); + return res->second->getAbstraction ( file, type, templateParams ); } -std::shared_ptr < abstraction::OperationAbstraction > InputFileRegistry::EntryImpl::getAbstraction ( const std::string & type, const ext::vector < std::string > & templateParams ) const { - return m_callback ( type, templateParams ); +std::shared_ptr < abstraction::OperationAbstraction > InputFileRegistry::EntryImpl::getAbstraction ( const std::string & file, const std::string & type, const ext::vector < std::string > & templateParams ) const { + return m_callback ( file, type, templateParams ); } } /* namespace abstraction */ diff --git a/alib2cli/src/registry/InputFileRegistry.hpp b/alib2cli/src/registry/InputFileRegistry.hpp index 6ecf007bec..60b3ed90b4 100644 --- a/alib2cli/src/registry/InputFileRegistry.hpp +++ b/alib2cli/src/registry/InputFileRegistry.hpp @@ -21,22 +21,22 @@ namespace abstraction { class InputFileRegistry { class Entry { public: - virtual std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( const std::string & type, const ext::vector < std::string > & templateParams ) const = 0; + virtual std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( const std::string & file, const std::string & type, const ext::vector < std::string > & templateParams ) const = 0; virtual ~Entry ( ) { } }; class EntryImpl : public Entry { - std::function < std::shared_ptr < abstraction::OperationAbstraction > ( const std::string & type, const ext::vector < std::string > & templateParams ) > m_callback; + std::function < std::shared_ptr < abstraction::OperationAbstraction > ( const std::string & file, const std::string & type, const ext::vector < std::string > & templateParams ) > m_callback; public: - EntryImpl ( std::shared_ptr < abstraction::OperationAbstraction > ( * callback ) ( const std::string & type, const ext::vector < std::string > & templateParams ) ) : m_callback ( callback ) { + EntryImpl ( std::shared_ptr < abstraction::OperationAbstraction > ( * callback ) ( const std::string & file, const std::string & type, const ext::vector < std::string > & templateParams ) ) : m_callback ( callback ) { } virtual ~EntryImpl ( ) { } - virtual std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( const std::string & type, const ext::vector < std::string > & templateParams ) const override; + virtual std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( const std::string & file, const std::string & type, const ext::vector < std::string > & templateParams ) const override; }; static ext::map < std::string, std::unique_ptr < Entry > > & getEntries ( ) { @@ -45,11 +45,11 @@ class InputFileRegistry { } public: - static void registerInputFileHandler ( const std::string & fileType, std::shared_ptr < abstraction::OperationAbstraction > ( * callback ) ( const std::string & type, const ext::vector < std::string > & templateParams ) ) { + static void registerInputFileHandler ( const std::string & fileType, std::shared_ptr < abstraction::OperationAbstraction > ( * callback ) ( const std::string & file, const std::string & type, const ext::vector < std::string > & templateParams ) ) { getEntries ( ).insert ( std::make_pair ( fileType, std::unique_ptr < Entry > ( new EntryImpl ( callback ) ) ) ); } - static std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( const std::string & fileType, const std::string & type, const ext::vector < std::string > & templateParams ); + static std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( const std::string & file, const std::string & fileType, const std::string & type, const ext::vector < std::string > & templateParams ); }; } /* namespace abstraction */ diff --git a/alib2cli/src/registry/OutputFileRegistry.cpp b/alib2cli/src/registry/OutputFileRegistry.cpp index 3aa32f1ddb..51f68f7f89 100644 --- a/alib2cli/src/registry/OutputFileRegistry.cpp +++ b/alib2cli/src/registry/OutputFileRegistry.cpp @@ -10,16 +10,16 @@ namespace abstraction { -std::shared_ptr < abstraction::OperationAbstraction > OutputFileRegistry::getAbstraction ( const std::string & fileType ) { +std::shared_ptr < abstraction::OperationAbstraction > OutputFileRegistry::getAbstraction ( std::shared_ptr < abstraction::OperationAbstraction > param, const std::string & file, const std::string & fileType ) { auto res = getEntries ( ).find ( fileType ); if ( res == getEntries ( ).end ( ) ) throw exception::CommonException ( "Entry " + fileType + " not available." ); - return res->second->getAbstraction ( ); + return res->second->getAbstraction ( param, file ); } -std::shared_ptr < abstraction::OperationAbstraction > OutputFileRegistry::EntryImpl::getAbstraction ( ) const { - return m_callback ( ); +std::shared_ptr < abstraction::OperationAbstraction > OutputFileRegistry::EntryImpl::getAbstraction ( std::shared_ptr < abstraction::OperationAbstraction > param, const std::string & file ) const { + return m_callback ( param, file ); } } /* namespace abstraction */ diff --git a/alib2cli/src/registry/OutputFileRegistry.hpp b/alib2cli/src/registry/OutputFileRegistry.hpp index 4d9dd73b52..bae92a5e72 100644 --- a/alib2cli/src/registry/OutputFileRegistry.hpp +++ b/alib2cli/src/registry/OutputFileRegistry.hpp @@ -21,22 +21,22 @@ namespace abstraction { class OutputFileRegistry { class Entry { public: - virtual std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( ) const = 0; + virtual std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( std::shared_ptr < abstraction::OperationAbstraction > param, const std::string & file ) const = 0; virtual ~Entry ( ) { } }; class EntryImpl : public Entry { - std::function < std::shared_ptr < abstraction::OperationAbstraction > ( ) > m_callback; + std::function < std::shared_ptr < abstraction::OperationAbstraction > ( std::shared_ptr < abstraction::OperationAbstraction > param, const std::string & file ) > m_callback; public: - EntryImpl ( std::shared_ptr < abstraction::OperationAbstraction > ( * callback ) ( ) ) : m_callback ( callback ) { + EntryImpl ( std::shared_ptr < abstraction::OperationAbstraction > ( * callback ) ( std::shared_ptr < abstraction::OperationAbstraction > param, const std::string & file ) ) : m_callback ( callback ) { } virtual ~EntryImpl ( ) { } - virtual std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( ) const override; + virtual std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( std::shared_ptr < abstraction::OperationAbstraction > param, const std::string & file ) const override; }; static ext::map < std::string, std::unique_ptr < Entry > > & getEntries ( ) { @@ -45,11 +45,11 @@ class OutputFileRegistry { } public: - static void registerOutputFileHandler ( const std::string & fileType, std::shared_ptr < abstraction::OperationAbstraction > ( * callback ) ( ) ) { + static void registerOutputFileHandler ( const std::string & fileType, std::shared_ptr < abstraction::OperationAbstraction > ( * callback ) ( std::shared_ptr < abstraction::OperationAbstraction > param, const std::string & file ) ) { getEntries ( ).insert ( std::make_pair ( fileType, std::unique_ptr < Entry > ( new EntryImpl ( callback ) ) ) ); } - static std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( const std::string & fileType ); + static std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( std::shared_ptr < abstraction::OperationAbstraction > param, const std::string & file, const std::string & fileType ); }; } /* namespace abstraction */ -- GitLab