From 324ee305488fbcf4cfa22d9d1050a6063e6d7d3a Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Sat, 7 Oct 2017 22:41:28 +0200 Subject: [PATCH] redesign xml abstraction --- alib2cli/src/ast/params/FileParam.h | 10 ++- .../ast/statements/ContainerFileStatement.cpp | 10 ++- alib2cli/src/ast/statements/FileStatement.cpp | 9 ++- .../src/ast/statements/ResultFileStatement.h | 11 ++- alib2data/src/common/PrimitiveRegistrator.cpp | 17 +++-- .../src/abstraction/PrimitiveRegistrator.cpp | 28 +++---- .../abstraction/XmlComposerAbstraction.hpp | 5 +- ...try.cpp => XmlContainerParserRegistry.cpp} | 22 +++--- ...try.hpp => XmlContainerParserRegistry.hpp} | 15 ++-- .../abstraction/XmlFileWriterAbstraction.hpp | 36 --------- .../src/abstraction/XmlFileWriterRegistry.cpp | 39 ---------- .../src/abstraction/XmlFileWriterRegistry.hpp | 75 ------------------- .../src/abstraction/XmlParserAbstraction.hpp | 13 +--- .../src/abstraction/XmlParserRegistry.cpp | 4 +- .../src/abstraction/XmlParserRegistry.hpp | 10 +-- alib2xml/src/abstraction/XmlRegistry.cpp | 48 ++++++++---- alib2xml/src/abstraction/XmlRegistry.h | 14 +++- .../XmlTokensComposerAbstraction.hpp | 28 +++++++ .../XmlTokensParserAbstraction.hpp | 30 ++++++++ alib2xml/src/registration/XmlRegistration.hpp | 2 - 20 files changed, 187 insertions(+), 239 deletions(-) rename alib2xml/src/abstraction/{XmlContainerRegistry.cpp => XmlContainerParserRegistry.cpp} (64%) rename alib2xml/src/abstraction/{XmlContainerRegistry.hpp => XmlContainerParserRegistry.hpp} (83%) delete mode 100644 alib2xml/src/abstraction/XmlFileWriterAbstraction.hpp delete mode 100644 alib2xml/src/abstraction/XmlFileWriterRegistry.cpp delete mode 100644 alib2xml/src/abstraction/XmlFileWriterRegistry.hpp create mode 100644 alib2xml/src/abstraction/XmlTokensComposerAbstraction.hpp create mode 100644 alib2xml/src/abstraction/XmlTokensParserAbstraction.hpp diff --git a/alib2cli/src/ast/params/FileParam.h b/alib2cli/src/ast/params/FileParam.h index c73b20b324..567888adda 100644 --- a/alib2cli/src/ast/params/FileParam.h +++ b/alib2cli/src/ast/params/FileParam.h @@ -16,9 +16,13 @@ public: } virtual std::shared_ptr < abstraction::OperationAbstraction > translateAndEval ( const std::shared_ptr < abstraction::OperationAbstraction > &, Environment & environment ) const override { - ext::deque < sax::Token > tokens = sax::FromXMLParserHelper::parseInput ( m_arg->eval ( environment ) ); - std::string type = tokens [ 0 ].getData ( ); - std::shared_ptr < abstraction::OperationAbstraction > res = abstraction::XmlRegistry::getXmlParserAbstraction ( type, tokens ); + std::shared_ptr < abstraction::UnaryOperationAbstraction < ext::deque < sax::Token >, const std::string & > > tokens = abstraction::XmlRegistry::fileToTokensAbstraction ( m_arg->eval ( environment )); + tokens->eval ( ); + + std::string type = std::dynamic_pointer_cast < abstraction::ValueProvider < const ext::deque < sax::Token > & > > ( tokens )->getValue ( false ) [ 0 ].getData ( ); + + std::shared_ptr < abstraction::OperationAbstraction > res = abstraction::XmlRegistry::getXmlParserAbstraction ( type ); + res->attachInput ( tokens, 0, true ); res->eval ( ); return res; } diff --git a/alib2cli/src/ast/statements/ContainerFileStatement.cpp b/alib2cli/src/ast/statements/ContainerFileStatement.cpp index 01c1d1b2a0..190933b10c 100644 --- a/alib2cli/src/ast/statements/ContainerFileStatement.cpp +++ b/alib2cli/src/ast/statements/ContainerFileStatement.cpp @@ -2,7 +2,9 @@ #include <ast/Statement.h> #include <ast/Option.h> #include <ast/Arg.h> + #include <abstraction/XmlRegistry.h> +#include <abstraction/ImmediateValueAbstraction.hpp> namespace cli { @@ -10,7 +12,13 @@ ContainerFileStatement::ContainerFileStatement ( std::string container, std::uni } std::shared_ptr < abstraction::OperationAbstraction > ContainerFileStatement::translateAndEval ( const std::shared_ptr < abstraction::OperationAbstraction > &, Environment & environment ) const { - return abstraction::XmlRegistry::getXmlContainerAbstraction ( m_container, m_type->getType ( ), m_file->eval ( environment ) ); + 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 ( m_container, m_type->getType ( ) ); + res->attachInput ( tokens, 0, true ); + res->eval ( ); + return res; } } /* namespace cli */ diff --git a/alib2cli/src/ast/statements/FileStatement.cpp b/alib2cli/src/ast/statements/FileStatement.cpp index b9652ba422..f3f98964b2 100644 --- a/alib2cli/src/ast/statements/FileStatement.cpp +++ b/alib2cli/src/ast/statements/FileStatement.cpp @@ -3,6 +3,7 @@ #include <ast/Option.h> #include <ast/Arg.h> #include <abstraction/XmlRegistry.h> +#include <abstraction/ImmediateValueAbstraction.hpp> #include <sax/FromXMLParserHelper.h> @@ -12,15 +13,17 @@ FileStatement::FileStatement ( std::unique_ptr < TypeOption > type, std::unique_ } std::shared_ptr < abstraction::OperationAbstraction > FileStatement::translateAndEval ( const std::shared_ptr < abstraction::OperationAbstraction > &, Environment & environment ) const { - ext::deque < sax::Token > tokens = sax::FromXMLParserHelper::parseInput ( m_file->eval ( environment ) ); + std::shared_ptr < abstraction::UnaryOperationAbstraction < ext::deque < sax::Token >, const std::string & > > tokens = abstraction::XmlRegistry::fileToTokensAbstraction ( m_file->eval ( environment )); + tokens->eval ( ); std::string type = ""; if ( m_type ) type = m_type->getType ( ); if ( type == "" ) - type = tokens [ 0 ].getData ( ); + type = std::dynamic_pointer_cast < abstraction::ValueProvider < const ext::deque < sax::Token > & > > ( tokens )->getValue ( false ) [ 0 ].getData ( ); - std::shared_ptr < abstraction::OperationAbstraction > res = abstraction::XmlRegistry::getXmlParserAbstraction ( type, std::move ( tokens ) ); + std::shared_ptr < abstraction::OperationAbstraction > res = abstraction::XmlRegistry::getXmlParserAbstraction ( type ); + res->attachInput ( tokens, 0, true ); res->eval ( ); return res; } diff --git a/alib2cli/src/ast/statements/ResultFileStatement.h b/alib2cli/src/ast/statements/ResultFileStatement.h index 3ed61f80aa..7c7bed2a09 100644 --- a/alib2cli/src/ast/statements/ResultFileStatement.h +++ b/alib2cli/src/ast/statements/ResultFileStatement.h @@ -14,11 +14,16 @@ public: } virtual std::shared_ptr < abstraction::OperationAbstraction > translateAndEval ( const std::shared_ptr < abstraction::OperationAbstraction > & prev, Environment & environment ) const override { - std::shared_ptr < abstraction::OperationAbstraction > res = abstraction::XmlRegistry::getXmlFileWriterAbstraction ( prev->getReturnType ( ), m_file->eval ( environment ) ); - if ( ! res->attachInput ( prev, 0, false ) ) + std::shared_ptr < abstraction::OperationAbstraction > tokens = abstraction::XmlRegistry::getXmlComposerAbstraction ( prev->getReturnType ( ) ); + if ( ! tokens->attachInput ( prev, 0, false ) ) throw exception::CommonException ( "Can't connect param at 0 of result file statement with result of type " + prev->getReturnType ( ) + "." ); - if ( ! res->eval ( ) ) + if ( ! tokens->eval ( ) ) throw exception::CommonException ( "Eval of result file statement failed." ); + + std::shared_ptr < abstraction::OperationAbstraction > res = abstraction::XmlRegistry::tokensToFileAbstraction ( m_file->eval ( environment ) ); + res->attachInput ( tokens, 0, true ); + res->eval ( ); + return res; } diff --git a/alib2data/src/common/PrimitiveRegistrator.cpp b/alib2data/src/common/PrimitiveRegistrator.cpp index 8d2aa54fd1..f00bb241b8 100644 --- a/alib2data/src/common/PrimitiveRegistrator.cpp +++ b/alib2data/src/common/PrimitiveRegistrator.cpp @@ -6,13 +6,14 @@ */ #include <abstraction/CastRegistry.hpp> -#include <abstraction/XmlFileWriterRegistry.hpp> -#include <abstraction/XmlParserRegistry.hpp> #include <abstraction/NormalizeRegistry.hpp> #include <abstraction/ValuePrinterRegistry.hpp> #include <abstraction/ImmediateRegistry.hpp> #include <abstraction/ContainerRegistry.hpp> -#include <abstraction/XmlContainerRegistry.hpp> + +#include <abstraction/XmlComposerRegistry.hpp> +#include <abstraction/XmlParserRegistry.hpp> +#include <abstraction/XmlContainerParserRegistry.hpp> #include <primitive/xml/Double.h> #include <primitive/xml/Integer.h> @@ -46,15 +47,15 @@ public: PrimitiveRegistrator ( ) { abstraction::ContainerRegistry::registerSet < common::ranked_symbol < DefaultSymbolType, DefaultRankType > > ( "ranked_symbol" ); - abstraction::XmlFileWriterRegistry::registerXmlFileWriter < ext::map < DefaultSymbolType, size_t > > ( ); - abstraction::XmlFileWriterRegistry::registerXmlFileWriter < ext::map < common::ranked_symbol < DefaultSymbolType, DefaultRankType >, size_t > > ( ); + abstraction::XmlComposerRegistry::registerXmlComposer < ext::map < DefaultSymbolType, size_t > > ( ); + abstraction::XmlComposerRegistry::registerXmlComposer < ext::map < common::ranked_symbol < DefaultSymbolType, DefaultRankType >, size_t > > ( ); - abstraction::XmlContainerRegistry::registerSet < common::ranked_symbol < DefaultSymbolType, DefaultRankType > > ( "ranked_symbol" ); + abstraction::XmlContainerParserRegistry::registerSet < common::ranked_symbol < DefaultSymbolType, DefaultRankType > > ( "ranked_symbol" ); abstraction::XmlParserRegistry::registerXmlParser < common::ranked_symbol < DefaultSymbolType, DefaultRankType > > ( "ranked_symbol" ); abstraction::XmlParserRegistry::registerXmlParser < DefaultStateType > ( "DefaultStateType" ); - abstraction::XmlFileWriterRegistry::registerXmlFileWriter < DefaultStateType > ( ); - abstraction::XmlFileWriterRegistry::registerXmlFileWriter < ext::set < string::LinearString < > > > ( ); + abstraction::XmlComposerRegistry::registerXmlComposer < DefaultStateType > ( ); + abstraction::XmlComposerRegistry::registerXmlComposer < ext::set < string::LinearString < > > > ( ); alib::xmlApi < alib::Object >::template registerXmlWriter < alib::AnyObject < ext::variant < alphabet::BottomOfTheStackSymbol, ext::set < common::ranked_symbol < alib::Object, primitive::Unsigned > > > > > ( ); alib::xmlApi < alib::Object >::template registerXmlWriter < alib::AnyObject < ext::set < ext::pair < alib::Object, alib::Object > > > > ( ); diff --git a/alib2xml/src/abstraction/PrimitiveRegistrator.cpp b/alib2xml/src/abstraction/PrimitiveRegistrator.cpp index cbc6dd852b..d859a83833 100644 --- a/alib2xml/src/abstraction/PrimitiveRegistrator.cpp +++ b/alib2xml/src/abstraction/PrimitiveRegistrator.cpp @@ -5,9 +5,9 @@ * Author: Jan Travnicek */ -#include <abstraction/XmlFileWriterRegistry.hpp> +#include <abstraction/XmlComposerRegistry.hpp> #include <abstraction/XmlParserRegistry.hpp> -#include <abstraction/XmlContainerRegistry.hpp> +#include <abstraction/XmlContainerParserRegistry.hpp> #include <primitive/xml/Double.h> #include <primitive/xml/Integer.h> @@ -24,20 +24,20 @@ namespace { class PrimitiveRegistrator { public: PrimitiveRegistrator ( ) { - abstraction::XmlContainerRegistry::registerSet < int > ( ); + abstraction::XmlContainerParserRegistry::registerSet < int > ( ); abstraction::XmlParserRegistry::registerXmlParser < int > ( "int" ); - abstraction::XmlFileWriterRegistry::registerXmlFileWriter < bool > ( ); - abstraction::XmlFileWriterRegistry::registerXmlFileWriter < int > ( ); - abstraction::XmlFileWriterRegistry::registerXmlFileWriter < double > ( ); - abstraction::XmlFileWriterRegistry::registerXmlFileWriter < std::string > ( ); - - abstraction::XmlFileWriterRegistry::registerXmlFileWriter < ext::vector < size_t > > ( ); - abstraction::XmlFileWriterRegistry::registerXmlFileWriter < ext::vector < unsigned > > ( ); - abstraction::XmlFileWriterRegistry::registerXmlFileWriter < ext::vector < int > > ( ); - abstraction::XmlFileWriterRegistry::registerXmlFileWriter < ext::set < size_t > > ( ); - abstraction::XmlFileWriterRegistry::registerXmlFileWriter < ext::set < unsigned > > ( ); - abstraction::XmlFileWriterRegistry::registerXmlFileWriter < ext::set < int > > ( ); + abstraction::XmlComposerRegistry::registerXmlComposer < bool > ( ); + abstraction::XmlComposerRegistry::registerXmlComposer < int > ( ); + abstraction::XmlComposerRegistry::registerXmlComposer < double > ( ); + abstraction::XmlComposerRegistry::registerXmlComposer < std::string > ( ); + + abstraction::XmlComposerRegistry::registerXmlComposer < ext::vector < size_t > > ( ); + abstraction::XmlComposerRegistry::registerXmlComposer < ext::vector < unsigned > > ( ); + abstraction::XmlComposerRegistry::registerXmlComposer < ext::vector < int > > ( ); + abstraction::XmlComposerRegistry::registerXmlComposer < ext::set < size_t > > ( ); + abstraction::XmlComposerRegistry::registerXmlComposer < ext::set < unsigned > > ( ); + abstraction::XmlComposerRegistry::registerXmlComposer < ext::set < int > > ( ); } }; diff --git a/alib2xml/src/abstraction/XmlComposerAbstraction.hpp b/alib2xml/src/abstraction/XmlComposerAbstraction.hpp index 4ed85b7e32..604af3be51 100644 --- a/alib2xml/src/abstraction/XmlComposerAbstraction.hpp +++ b/alib2xml/src/abstraction/XmlComposerAbstraction.hpp @@ -9,19 +9,18 @@ #define _XML_COMPOSER_ABSTRACTION_HPP_ #include <abstraction/UnaryOperationAbstraction.hpp> -#include <tuple> #include <factory/XmlDataFactory.hpp> namespace abstraction { template < class ParamType > -class XmlComposerAbstraction : public UnaryOperationAbstraction < std::string, ParamType > { +class XmlComposerAbstraction : public UnaryOperationAbstraction < ext::deque < sax::Token >, ParamType > { public: virtual bool run ( ) override { if ( ! this->inputsReady ( ) ) return false; - this->m_data = alib::XmlDataFactory::toString ( std::get < 0 > ( this->m_params )->getConstValueReference ( ) ); + this->m_data = alib::XmlDataFactory::toTokens ( std::get < 0 > ( this->m_params )->getConstValueReference ( ) ); return true; } }; diff --git a/alib2xml/src/abstraction/XmlContainerRegistry.cpp b/alib2xml/src/abstraction/XmlContainerParserRegistry.cpp similarity index 64% rename from alib2xml/src/abstraction/XmlContainerRegistry.cpp rename to alib2xml/src/abstraction/XmlContainerParserRegistry.cpp index beb3778386..4ae4f2f308 100644 --- a/alib2xml/src/abstraction/XmlContainerRegistry.cpp +++ b/alib2xml/src/abstraction/XmlContainerParserRegistry.cpp @@ -1,25 +1,25 @@ /* - * XmlContainerRegistry.cpp + * XmlContainerParserRegistry.cpp * * Created on: 19. 8. 2017 * Author: Jan Travnicek */ -#include <abstraction/XmlContainerRegistry.hpp> +#include <abstraction/XmlContainerParserRegistry.hpp> #include <foreach> namespace abstraction { -bool XmlContainerRegistry::hasAbstraction ( const std::string & container ) { +bool XmlContainerParserRegistry::hasAbstraction ( const std::string & container ) { return getEntries ( ).count ( container ); } -std::shared_ptr < abstraction::OperationAbstraction > XmlContainerRegistry::getAbstraction ( const std::string & container, const std::string & paramType, const std::string & filename ) { +std::shared_ptr < abstraction::OperationAbstraction > XmlContainerParserRegistry::getAbstraction ( const std::string & container, const std::string & type ) { std::set < std::string > paramTypes; - if ( alib::namingApi::hasTypes ( paramType ) ) - paramTypes = ext::transform < std::string > ( alib::namingApi::getTypes ( paramType ), [ ] ( const ext::type_index & type ) { return ext::to_string ( type ); } ); + if ( alib::namingApi::hasTypes ( type ) ) + paramTypes = ext::transform < std::string > ( alib::namingApi::getTypes ( type ), [ ] ( const ext::type_index & type ) { return ext::to_string ( type ); } ); else - paramTypes.insert ( paramType ); + paramTypes.insert ( type ); auto group = getEntries ( ).find ( container ); if ( group == getEntries ( ).end ( ) ) @@ -27,12 +27,12 @@ std::shared_ptr < abstraction::OperationAbstraction > XmlContainerRegistry::getA for ( const ext::pair < std::string, std::shared_ptr < Entry > > & entry : group->second ) if ( paramTypes.count ( entry.first ) ) - return entry.second->getAbstraction ( filename ); + return entry.second->getAbstraction ( ); - throw exception::CommonException ( "Entry for " + container + " parametrized with " + paramType + " not available." ); + throw exception::CommonException ( "Entry for " + container + " parametrized with " + type + " not available." ); } -ext::set < std::string > XmlContainerRegistry::listOverloads ( const std::string & container ) { +ext::set < std::string > XmlContainerParserRegistry::listOverloads ( const std::string & container ) { auto group = getEntries ( ).find ( container ); if ( group == getEntries ( ).end ( ) ) throw exception::CommonException ( "Entry " + container + " not available" ); @@ -44,7 +44,7 @@ ext::set < std::string > XmlContainerRegistry::listOverloads ( const std::string return res; } -ext::set < std::string > XmlContainerRegistry::list ( ) { +ext::set < std::string > XmlContainerParserRegistry::list ( ) { ext::set < std::string > res; for ( const std::pair < const std::string, ext::vector < ext::pair < std::string, std::shared_ptr < Entry > > > > & groups : getEntries ( ) ) diff --git a/alib2xml/src/abstraction/XmlContainerRegistry.hpp b/alib2xml/src/abstraction/XmlContainerParserRegistry.hpp similarity index 83% rename from alib2xml/src/abstraction/XmlContainerRegistry.hpp rename to alib2xml/src/abstraction/XmlContainerParserRegistry.hpp index e89d9e9438..a3dcd1e722 100644 --- a/alib2xml/src/abstraction/XmlContainerRegistry.hpp +++ b/alib2xml/src/abstraction/XmlContainerParserRegistry.hpp @@ -1,5 +1,5 @@ /* - * XmlContainerRegistry.hpp + * XmlContainerParserRegistry.hpp * * Created on: 11. 7. 2017 * Author: Jan Travnicek @@ -21,16 +21,16 @@ namespace abstraction { -class XmlContainerRegistry { +class XmlContainerParserRegistry { class Entry { public: - virtual std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( const std::string & filename ) const = 0; + virtual std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( ) const = 0; }; template < class Params > class SetEntryImpl : public Entry { public: - virtual std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( const std::string & filename ) const override; + virtual std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( ) const override; }; static ext::map < std::string, ext::vector < ext::pair < std::string, std::shared_ptr < Entry > > > > & getEntries ( ) { @@ -60,7 +60,7 @@ public: static bool hasAbstraction ( const std::string & container ); - static std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( const std::string & container, const std::string & paramType, const std::string & filename ); + static std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( const std::string & container, const std::string & type ); static ext::set < std::string > listOverloads ( const std::string & algorithm ); @@ -74,9 +74,8 @@ public: namespace abstraction { template < class Param > -std::shared_ptr < abstraction::OperationAbstraction > XmlContainerRegistry::SetEntryImpl < Param >::getAbstraction ( const std::string & filename ) const { - ext::deque < sax::Token > tokens = sax::FromXMLParserHelper::parseInput ( filename ); - return std::make_shared < abstraction::XmlParserAbstraction < ext::set < Param > > > ( std::move ( tokens ) ); +std::shared_ptr < abstraction::OperationAbstraction > XmlContainerParserRegistry::SetEntryImpl < Param >::getAbstraction ( ) const { + return std::make_shared < abstraction::XmlParserAbstraction < ext::set < Param > > > ( ); } } /* namespace abstraction */ diff --git a/alib2xml/src/abstraction/XmlFileWriterAbstraction.hpp b/alib2xml/src/abstraction/XmlFileWriterAbstraction.hpp deleted file mode 100644 index 07a4f47f9a..0000000000 --- a/alib2xml/src/abstraction/XmlFileWriterAbstraction.hpp +++ /dev/null @@ -1,36 +0,0 @@ -/* - * XmlFileWriterAbstraction.hpp - * - * Created on: 11. 7. 2017 - * Author: Jan Travnicek - */ - -#ifndef _XML_FILE_WRITER_ABSTRACTION_HPP_ -#define _XML_FILE_WRITER_ABSTRACTION_HPP_ - -#include <abstraction/UnaryOperationAbstraction.hpp> -#include <tuple> -#include <factory/XmlDataFactory.hpp> - -namespace abstraction { - -template < class ParamType > -class XmlFileWriterAbstraction : public UnaryOperationAbstraction < void, ParamType > { - std::string m_filename; - -public: - XmlFileWriterAbstraction ( std::string filename ) : m_filename ( filename ) { - } - - virtual bool run ( ) override { - if ( ! this->inputsReady ( ) ) - return false; - - alib::XmlDataFactory::toFile ( std::get < 0 > ( this->m_params )->getConstValueReference ( ), m_filename ); - return true; - } -}; - -} /* namespace abstraction */ - -#endif /* _XML_FILE_WRITER_ABSTRACTION_HPP_ */ diff --git a/alib2xml/src/abstraction/XmlFileWriterRegistry.cpp b/alib2xml/src/abstraction/XmlFileWriterRegistry.cpp deleted file mode 100644 index c11c841e35..0000000000 --- a/alib2xml/src/abstraction/XmlFileWriterRegistry.cpp +++ /dev/null @@ -1,39 +0,0 @@ -/* - * XmlFileWriterRegistry.cpp - * - * Created on: 21. 8. 2017 - * Author: Jan Travnicek - */ - -#include <abstraction/XmlFileWriterRegistry.hpp> - -namespace abstraction { - -std::shared_ptr < abstraction::OperationAbstraction > XmlFileWriterRegistry::getAbstraction ( const std::string & param, std::string filename ) { - auto res = getEntries ( ).find ( param ); - if ( res == getEntries ( ).end ( ) ) - throw exception::CommonException ( "Entry " + param + " not available." ); - - return res->second->getAbstraction ( std::move ( filename ) ); -} - -ext::set < std::string > XmlFileWriterRegistry::listGroup ( const std::string & group ) { - ext::set < std::string > res; - - for ( const std::pair < const std::string, std::unique_ptr < Entry > > & entry : getEntries ( ) ) - if ( entry.first.find ( group ) == 0 ) //found at the begining - res.insert ( entry.first ); - - return res; -} - -ext::set < std::string > XmlFileWriterRegistry::list ( ) { - ext::set < std::string > res; - - for ( const std::pair < const std::string, std::unique_ptr < Entry > > & entry : getEntries ( ) ) - res.insert ( entry.first ); - - return res; -} - -} /* namespace abstraction */ diff --git a/alib2xml/src/abstraction/XmlFileWriterRegistry.hpp b/alib2xml/src/abstraction/XmlFileWriterRegistry.hpp deleted file mode 100644 index 3bf2a05406..0000000000 --- a/alib2xml/src/abstraction/XmlFileWriterRegistry.hpp +++ /dev/null @@ -1,75 +0,0 @@ -/* - * XmlFileWriterRegistry.hpp - * - * Created on: 11. 7. 2017 - * Author: Jan Travnicek - */ - -#ifndef _XML_FILE_WRITER_REGISTRY_HPP_ -#define _XML_FILE_WRITER_REGISTRY_HPP_ - -#include <memory> -#include <string> -#include <set> -#include <map> - -#include <exception/CommonException.h> -#include <abstraction/OperationAbstraction.hpp> - -namespace abstraction { - -class XmlFileWriterRegistry { - class Entry { - public: - virtual std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( std::string filename ) const = 0; - - }; - - template < class Param > - class EntryImpl : public Entry { - public: - EntryImpl ( ) { - } - - virtual std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( std::string filename ) const override; - }; - - static ext::map < std::string, std::unique_ptr < Entry > > & getEntries ( ) { - static ext::map < std::string, std::unique_ptr < Entry > > fileWriters; - return fileWriters; - } - -public: - template < class ParamType > - static void registerXmlFileWriter ( std::string param ) { - getEntries ( ).insert ( std::make_pair ( param, std::unique_ptr < Entry > ( new EntryImpl < ParamType > ( ) ) ) ); - } - - template < class ParamType > - static void registerXmlFileWriter ( ) { - std::string param = ext::to_string < ParamType > ( ); - registerXmlFileWriter < ParamType > ( std::move ( param ) ); - } - - static std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( const std::string & param, std::string filename ); - - static ext::set < std::string > listGroup ( const std::string & group ); - - static ext::set < std::string > list ( ); -}; - -} /* namespace abstraction */ - -#include <abstraction/XmlFileWriterAbstraction.hpp> - -namespace abstraction { - -template < class Param > -std::shared_ptr < abstraction::OperationAbstraction > XmlFileWriterRegistry::EntryImpl < Param >::getAbstraction ( std::string filename ) const { - return std::make_shared < abstraction::XmlFileWriterAbstraction < const Param & > > ( std::move ( filename ) ); -} - - -} /* namespace abstraction */ - -#endif /* _XML_FILE_WRITER_REGISTRY_HPP_ */ diff --git a/alib2xml/src/abstraction/XmlParserAbstraction.hpp b/alib2xml/src/abstraction/XmlParserAbstraction.hpp index 90db4e5263..5eb1a1442c 100644 --- a/alib2xml/src/abstraction/XmlParserAbstraction.hpp +++ b/alib2xml/src/abstraction/XmlParserAbstraction.hpp @@ -8,26 +8,21 @@ #ifndef _XML_PARSER_ABSTRACTION_HPP_ #define _XML_PARSER_ABSTRACTION_HPP_ -#include <abstraction/NullaryOperationAbstraction.hpp> -#include <tuple> +#include <abstraction/UnaryOperationAbstraction.hpp> #include <exception/CommonException.h> #include <factory/XmlDataFactory.hpp> namespace abstraction { template < class ReturnType > -class XmlParserAbstraction : public NullaryOperationAbstraction < ReturnType > { - ext::deque < sax::Token > m_tokens; +class XmlParserAbstraction : public UnaryOperationAbstraction < ReturnType, ext::deque < sax::Token > && > { public: - XmlParserAbstraction ( ext::deque < sax::Token > tokens ) : m_tokens ( std::move ( tokens ) ) { - } - virtual bool run ( ) override { if ( this->isReady ( ) ) return true; - ReturnType res = alib::XmlDataFactory::fromTokens ( std::move ( m_tokens ) ); + ReturnType res = alib::XmlDataFactory::fromTokens ( std::get < 0 > ( this->m_params )->getRValueReference ( ) ); this->m_data = std::move ( res ); return true; } @@ -35,7 +30,7 @@ public: template < > inline bool XmlParserAbstraction < exception::CommonException >::run ( ) { - exception::CommonException ex = alib::XmlDataFactory::fromTokens ( std::move ( m_tokens ) ); + exception::CommonException ex = alib::XmlDataFactory::fromTokens ( std::get < 0 > ( this->m_params )->getRValueReference ( ) ); throw ex; } diff --git a/alib2xml/src/abstraction/XmlParserRegistry.cpp b/alib2xml/src/abstraction/XmlParserRegistry.cpp index 0c5a2f12c5..cd5f0e6f1a 100644 --- a/alib2xml/src/abstraction/XmlParserRegistry.cpp +++ b/alib2xml/src/abstraction/XmlParserRegistry.cpp @@ -9,12 +9,12 @@ namespace abstraction { -std::shared_ptr < abstraction::OperationAbstraction > XmlParserRegistry::getAbstraction ( const std::string & typeName, ext::deque < sax::Token > tokens ) { +std::shared_ptr < abstraction::OperationAbstraction > XmlParserRegistry::getAbstraction ( const std::string & typeName ) { auto type = getEntries ( ).find ( typeName ); if ( type == getEntries ( ).end ( ) ) throw exception::CommonException ( "Entry " + typeName + " not available." ); - return type->second->getAbstraction ( std::move ( tokens ) ); + return type->second->getAbstraction ( ); } } /* namespace abstraction */ diff --git a/alib2xml/src/abstraction/XmlParserRegistry.hpp b/alib2xml/src/abstraction/XmlParserRegistry.hpp index cce9aaf60b..46f9a2538e 100644 --- a/alib2xml/src/abstraction/XmlParserRegistry.hpp +++ b/alib2xml/src/abstraction/XmlParserRegistry.hpp @@ -21,7 +21,7 @@ namespace abstraction { class XmlParserRegistry { class Entry { public: - virtual std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( ext::deque < sax::Token > data ) const = 0; + virtual std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( ) const = 0; }; @@ -31,7 +31,7 @@ class XmlParserRegistry { EntryImpl ( ) { } - virtual std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( ext::deque < sax::Token > data ) const override; + virtual std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( ) const override; }; static ext::map < std::string, std::unique_ptr < Entry > > & getEntries ( ) { @@ -51,7 +51,7 @@ public: registerXmlParser < ReturnType > ( ret ); } - static std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( const std::string & typeName, ext::deque < sax::Token > tokens ); + static std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( const std::string & typeName ); }; } /* namespace abstraction */ @@ -61,8 +61,8 @@ public: namespace abstraction { template < class Return > -std::shared_ptr < abstraction::OperationAbstraction > XmlParserRegistry::EntryImpl < Return >::getAbstraction ( ext::deque < sax::Token > data ) const { - return std::make_shared < abstraction::XmlParserAbstraction < Return > > ( std::move ( data ) ); +std::shared_ptr < abstraction::OperationAbstraction > XmlParserRegistry::EntryImpl < Return >::getAbstraction ( ) const { + return std::make_shared < abstraction::XmlParserAbstraction < Return > > ( ); } } /* namespace abstraction */ diff --git a/alib2xml/src/abstraction/XmlRegistry.cpp b/alib2xml/src/abstraction/XmlRegistry.cpp index 4acd41fa23..9ed877748f 100644 --- a/alib2xml/src/abstraction/XmlRegistry.cpp +++ b/alib2xml/src/abstraction/XmlRegistry.cpp @@ -7,37 +7,59 @@ #include <abstraction/XmlRegistry.h> -#include <abstraction/XmlParserRegistry.hpp> -#include <abstraction/XmlFileWriterRegistry.hpp> #include <abstraction/XmlComposerRegistry.hpp> -#include <abstraction/XmlContainerRegistry.hpp> +#include <abstraction/XmlParserRegistry.hpp> + +#include <abstraction/XmlContainerParserRegistry.hpp> +#include <abstraction/ImmediateValueAbstraction.hpp> + +#include <abstraction/XmlTokensComposerAbstraction.hpp> +#include <abstraction/XmlTokensParserAbstraction.hpp> #include <core/namingApi.hpp> namespace abstraction { ext::set < std::string > XmlRegistry::listDataTypes ( ) { - return XmlFileWriterRegistry::list ( ); + return XmlComposerRegistry::list ( ); } ext::set < std::string > XmlRegistry::listDataTypeGroup ( const std::string & group ) { - return XmlFileWriterRegistry::listGroup ( group ); + return XmlComposerRegistry::listGroup ( group ); } -std::shared_ptr < abstraction::OperationAbstraction > XmlRegistry::getXmlContainerAbstraction ( const std::string & container, const std::string & type, const std::string & filename ) { - return XmlContainerRegistry::getAbstraction ( container, type, filename ); +std::shared_ptr < abstraction::OperationAbstraction > XmlRegistry::getXmlComposerAbstraction ( const std::string & param ) { + return XmlComposerRegistry::getAbstraction ( param ); } -std::shared_ptr < abstraction::OperationAbstraction > XmlRegistry::getXmlFileWriterAbstraction ( const std::string & param, std::string filename ) { - return XmlFileWriterRegistry::getAbstraction ( param, std::move ( filename ) ); +std::shared_ptr < abstraction::OperationAbstraction > XmlRegistry::getXmlParserAbstraction ( const std::string & typeName ) { + return XmlParserRegistry::getAbstraction ( typeName ); } -std::shared_ptr < abstraction::OperationAbstraction > XmlRegistry::getXmlComposerAbstraction ( const std::string & param ) { - return XmlComposerRegistry::getAbstraction ( param ); +std::shared_ptr < abstraction::OperationAbstraction > XmlRegistry::getXmlContainerParserAbstraction ( const std::string & container, const std::string & type ) { + return XmlContainerParserRegistry::getAbstraction ( container, type ); } -std::shared_ptr < abstraction::OperationAbstraction > XmlRegistry::getXmlParserAbstraction ( const std::string & typeName, ext::deque < sax::Token > tokens ) { - return XmlParserRegistry::getAbstraction ( typeName, std::move ( tokens ) ); +std::shared_ptr < abstraction::UnaryOperationAbstraction < ext::deque < sax::Token >, const std::string & > > XmlRegistry::fileToTokensAbstraction ( const std::string & filename ) { + std::shared_ptr < abstraction::ImmediateValueAbstraction < std::string > > file = std::make_shared < abstraction::ImmediateValueAbstraction < std::string > > ( filename ); + + std::shared_ptr < abstraction::UnaryOperationAbstraction < ext::deque < sax::Token >, const std::string & > > res = std::make_shared < abstraction::XmlTokensParserAbstraction > ( ); + std::shared_ptr < abstraction::OperationAbstraction > tmp = res; + + tmp->attachInput ( file, 0, false ); + + return res; } +std::shared_ptr < abstraction::BinaryOperationAbstraction < void, const ext::deque < sax::Token > &, const std::string & > > XmlRegistry::tokensToFileAbstraction ( const std::string & filename ) { + std::shared_ptr < abstraction::ImmediateValueAbstraction < std::string > > file = std::make_shared < abstraction::ImmediateValueAbstraction < std::string > > ( filename ); + + std::shared_ptr < abstraction::BinaryOperationAbstraction < void, const ext::deque < sax::Token > &, const std::string & > > res = std::make_shared < abstraction::XmlTokensComposerAbstraction > ( ); + std::shared_ptr < abstraction::OperationAbstraction > tmp = res; + + tmp->attachInput ( file, 1, false ); + + return res; + +} } /* namespace abstraction */ diff --git a/alib2xml/src/abstraction/XmlRegistry.h b/alib2xml/src/abstraction/XmlRegistry.h index f0dab7ae7a..d7b3be4b88 100644 --- a/alib2xml/src/abstraction/XmlRegistry.h +++ b/alib2xml/src/abstraction/XmlRegistry.h @@ -12,6 +12,9 @@ #include <abstraction/common/ParamQualifiers.hpp> #include <abstraction/common/AlgorithmCategories.hpp> +#include <abstraction/UnaryOperationAbstraction.hpp> +#include <abstraction/BinaryOperationAbstraction.hpp> + #include <deque> #include <sax/Token.h> @@ -22,10 +25,13 @@ public: static ext::set < std::string > listDataTypes ( ); static ext::set < std::string > listDataTypeGroup ( const std::string & group ); - static std::shared_ptr < abstraction::OperationAbstraction > getXmlContainerAbstraction ( const std::string & container, const std::string & type, const std::string & filename ); - static std::shared_ptr < abstraction::OperationAbstraction > getXmlFileWriterAbstraction ( const std::string & param, std::string filename ); - static std::shared_ptr < abstraction::OperationAbstraction > getXmlComposerAbstraction ( const std::string & param ); - static std::shared_ptr < abstraction::OperationAbstraction > getXmlParserAbstraction ( const std::string & typeName, ext::deque < sax::Token > tokens ); + static std::shared_ptr < abstraction::OperationAbstraction > getXmlComposerAbstraction ( const std::string & type ); + static std::shared_ptr < abstraction::OperationAbstraction > getXmlParserAbstraction ( const std::string & type ); + + static std::shared_ptr < abstraction::OperationAbstraction > getXmlContainerParserAbstraction ( const std::string & container, const std::string & type ); + + static std::shared_ptr < abstraction::UnaryOperationAbstraction < ext::deque < sax::Token >, const std::string & > > fileToTokensAbstraction ( const std::string & filename ); + static std::shared_ptr < abstraction::BinaryOperationAbstraction < void, const ext::deque < sax::Token > &, const std::string & > > tokensToFileAbstraction ( const std::string & filename ); }; } /* namespace abstraction */ diff --git a/alib2xml/src/abstraction/XmlTokensComposerAbstraction.hpp b/alib2xml/src/abstraction/XmlTokensComposerAbstraction.hpp new file mode 100644 index 0000000000..0a9eb56a68 --- /dev/null +++ b/alib2xml/src/abstraction/XmlTokensComposerAbstraction.hpp @@ -0,0 +1,28 @@ +/* + * XmlTokensComposerAbstraction.hpp + * + * Created on: 7. 10. 2017 + * Author: Jan Travnicek + */ + +#ifndef _XML_TOKENS_COMPOSER_ABSTRACTION_HPP_ +#define _XML_TOKENS_COMPOSER_ABSTRACTION_HPP_ + +#include <abstraction/BinaryOperationAbstraction.hpp> + +namespace abstraction { + +class XmlTokensComposerAbstraction : public BinaryOperationAbstraction < void, const ext::deque < sax::Token > &, const std::string & > { +public: + virtual bool run ( ) override { + if ( ! this->inputsReady ( ) ) + return false; + + sax::SaxComposeInterface::printFile ( std::get < 1 > ( this->m_params )->getConstValueReference ( ), std::get < 0 > ( this->m_params )->getConstValueReference ( ) ); + return true; + } +}; + +} /* namespace abstraction */ + +#endif /* _XML_TOKENS_COMPOSER_ABSTRACTION_HPP_ */ diff --git a/alib2xml/src/abstraction/XmlTokensParserAbstraction.hpp b/alib2xml/src/abstraction/XmlTokensParserAbstraction.hpp new file mode 100644 index 0000000000..321c555db1 --- /dev/null +++ b/alib2xml/src/abstraction/XmlTokensParserAbstraction.hpp @@ -0,0 +1,30 @@ +/* + * XmlTokensParserAbstraction.hpp + * + * Created on: 7. 10. 2017 + * Author: Jan Travnicek + */ + +#ifndef _XML_TOKENS_PARSER_ABSTRACTION_HPP_ +#define _XML_TOKENS_PARSER_ABSTRACTION_HPP_ + +#include <abstraction/UnaryOperationAbstraction.hpp> + +namespace abstraction { + +class XmlTokensParserAbstraction : public UnaryOperationAbstraction < ext::deque < sax::Token >, const std::string & > { +public: + virtual bool run ( ) override { + if ( ! this->inputsReady ( ) ) + return false; + + ext::deque < sax::Token > tokens; + sax::SaxParseInterface::parseFile ( std::get < 0 > ( this->m_params )->getConstValueReference ( ), tokens ); + this->m_data = tokens; + return true; + } +}; + +} /* namespace abstraction */ + +#endif /* _XML_TOKENS_PARSER_ABSTRACTION_HPP_ */ diff --git a/alib2xml/src/registration/XmlRegistration.hpp b/alib2xml/src/registration/XmlRegistration.hpp index a3c82ddb81..2ae0b0d286 100644 --- a/alib2xml/src/registration/XmlRegistration.hpp +++ b/alib2xml/src/registration/XmlRegistration.hpp @@ -3,7 +3,6 @@ #include <core/xmlApi.hpp> -#include <abstraction/XmlFileWriterRegistry.hpp> #include <abstraction/XmlComposerRegistry.hpp> #include <abstraction/XmlParserRegistry.hpp> @@ -25,7 +24,6 @@ public: XmlWriterRegister ( ) { alib::xmlApi < Group >::template registerXmlWriter < Type > ( ); - abstraction::XmlFileWriterRegistry::registerXmlFileWriter < Type > ( ); abstraction::XmlComposerRegistry::registerXmlComposer < Type > ( ); } }; -- GitLab