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