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