diff --git a/ameasure2/src/ameasure.cpp b/ameasure2/src/ameasure.cpp index 092a51eeb5fa4556bef70e9c31f717d31c6f7770..3bae884909cd12b021ddc21929b979c03b208f0a 100644 --- a/ameasure2/src/ameasure.cpp +++ b/ameasure2/src/ameasure.cpp @@ -4,6 +4,7 @@ #include <tclap/CmdLine.h> #include "factory/XmlDataFactory.hpp" +#include "provisioner/MeasurementProvisionerXmlFactory.hpp" #include "provisioner/MeasurementProvisioner.hpp" int main ( int argc, char * * argv ) { @@ -23,10 +24,11 @@ int main ( int argc, char * * argv ) { else sax::SaxParseInterface::parseFile ( input.getValue ( ), tokens ); - auto configuration = provisioner::MeasurementProvisioner::parse_configuration ( tokens ); - auto results = provisioner::MeasurementProvisioner::run_configuration ( configuration ); + auto configuration = provisioner::MeasurementProvisionerXmlFactory::configurationFromTokens ( tokens ); + provisioner::MeasurementProvisioner::runConfiguration ( configuration ); - std::cout << results << std::endl; + // auto results = + // std::cout << results << std::endl; return 0; diff --git a/ameasure2/src/provisioner/MeasurementProvisioner.cpp b/ameasure2/src/provisioner/MeasurementProvisioner.cpp index 9b0aba985799f4a90988fb4e36088b12024686af..a96bda47122aafee6a2bf312f9650e9e041fe608 100644 --- a/ameasure2/src/provisioner/MeasurementProvisioner.cpp +++ b/ameasure2/src/provisioner/MeasurementProvisioner.cpp @@ -6,13 +6,7 @@ namespace provisioner { -MeasurementProvisionerConfiguration MeasurementProvisioner::parse_configuration ( std::deque < sax::Token > ) { - MeasurementProvisionerConfiguration configuration; - - return configuration; -} - -MeasurementProvisionerResults MeasurementProvisioner::run_configuration ( const MeasurementProvisionerConfiguration & ) { +MeasurementProvisionerResults MeasurementProvisioner::runConfiguration ( const MeasurementProvisionerConfiguration & ) { MeasurementProvisionerResults results; return results; diff --git a/ameasure2/src/provisioner/MeasurementProvisioner.hpp b/ameasure2/src/provisioner/MeasurementProvisioner.hpp index 28c9c01cc7f7b8523583e83877be3c3100ba690f..f76a3a9b9dd994a4f4a2d0153bcad07080f92de4 100644 --- a/ameasure2/src/provisioner/MeasurementProvisioner.hpp +++ b/ameasure2/src/provisioner/MeasurementProvisioner.hpp @@ -5,18 +5,14 @@ #ifndef MEASUREMENT_PROVISIONER_HPP_ #define MEASUREMENT_PROVISIONER_HPP_ -#include "sax/Token.h" -#include <deque> #include "MeasurementProvisionerConfiguration.hpp" #include "MeasurementProvisionerResults.hpp" namespace provisioner { class MeasurementProvisioner { - public: - static MeasurementProvisionerConfiguration parse_configuration ( std::deque < sax::Token > ); - static MeasurementProvisionerResults run_configuration ( const MeasurementProvisionerConfiguration & ); + static MeasurementProvisionerResults runConfiguration ( const MeasurementProvisionerConfiguration & ); }; } diff --git a/ameasure2/src/provisioner/MeasurementProvisionerConfiguration.hpp b/ameasure2/src/provisioner/MeasurementProvisionerConfiguration.hpp index 45f2b57ff63c0275dfb42c63e541548b81fa200d..497b4e2315c655ca12098f5640e802579837aad8 100644 --- a/ameasure2/src/provisioner/MeasurementProvisionerConfiguration.hpp +++ b/ameasure2/src/provisioner/MeasurementProvisionerConfiguration.hpp @@ -5,9 +5,27 @@ #ifndef MEASUREMENT_PROVISIONER_CONFIGURATION_HPP_ #define MEASUREMENT_PROVISIONER_CONFIGURATION_HPP_ +#include <vector> +#include <string> + namespace provisioner { +struct MeasurementConfiguration { + std::vector < std::string > engines; +}; + +struct MeasurementProvision { + std::vector < std::string > inputDataFiles; + std::vector < std::string > pipeCommands; + MeasurementConfiguration measurementConfiguration; +}; + struct MeasurementProvisionerConfiguration { + std::string workingDirectory; + std::string binariesDirectory; + std::string inputDataDirectory; + + std::vector < MeasurementProvision > measurementProvisions; }; } diff --git a/ameasure2/src/provisioner/MeasurementProvisionerXmlFactory.cpp b/ameasure2/src/provisioner/MeasurementProvisionerXmlFactory.cpp new file mode 100644 index 0000000000000000000000000000000000000000..b082042a0c757ad69bfbf2d1b1b0bb172acc64fb --- /dev/null +++ b/ameasure2/src/provisioner/MeasurementProvisionerXmlFactory.cpp @@ -0,0 +1,183 @@ +/* + * Author: Radovan Cerveny + */ + +#include "sax/FromXMLParserHelper.h" +#include "MeasurementProvisionerXmlFactory.hpp" +#include "exception/AlibException.h" + +using namespace std; +using namespace sax; + +namespace provisioner { + +MeasurementProvisionerConfiguration MeasurementProvisionerXmlFactory::configurationFromTokens ( deque < Token > & tokens ) { + MeasurementProvisionerConfiguration configuration; + + deque < Token >::iterator iter = tokens.begin ( ); + + if ( iter == tokens.end ( ) ) throw exception::AlibException ( "Empty tokens list" ); + + parseMeasurementProvisioner ( configuration, iter ); + + if ( iter != tokens.end ( ) ) throw exception::AlibException ( "Unexpeted tokens at the end of the xml" ); + + return configuration; +} + +void MeasurementProvisionerXmlFactory::parseMeasurementProvisioner ( MeasurementProvisionerConfiguration & mpc, std::deque < sax::Token >::iterator & iter ) { + FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, MEASUREMENT_PROVISIONER_TAG ); + + for ( ; ; ) { + if ( !FromXMLParserHelper::isTokenType ( iter, Token::TokenType::START_ELEMENT ) ) break; + + string data = FromXMLParserHelper::getTokenData ( iter, Token::TokenType::START_ELEMENT ); + + if ( data == DIRECTORIES_TAG ) + parseDirectories ( mpc, iter ); + else if ( data == MEASUREMENT_PROVISIONS_TAG ) + parseMeasurementProvisions ( mpc, iter ); + else + break; + } + + FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, MEASUREMENT_PROVISIONER_TAG ); +} + +void MeasurementProvisionerXmlFactory::parseDirectories ( MeasurementProvisionerConfiguration & mpc, std::deque < sax::Token >::iterator & iter ) { + FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, DIRECTORIES_TAG ); + + for ( ; ; ) { + if ( !FromXMLParserHelper::isTokenType ( iter, Token::TokenType::START_ELEMENT ) ) break; + + string data = FromXMLParserHelper::getTokenData ( iter, Token::TokenType::START_ELEMENT ); + + if ( data == WORKING_DIRECTORY_TAG ) { + FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, WORKING_DIRECTORY_TAG ); + mpc.workingDirectory = FromXMLParserHelper::popTokenData ( iter, Token::TokenType::CHARACTER ); + FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, WORKING_DIRECTORY_TAG ); + } else if ( data == BINARIES_DIRECTORY_TAG ) { + FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, BINARIES_DIRECTORY_TAG ); + mpc.workingDirectory = FromXMLParserHelper::popTokenData ( iter, Token::TokenType::CHARACTER ); + FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, BINARIES_DIRECTORY_TAG ); + } else if ( data == INPUT_DATA_DIRECTORY_TAG ) { + FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, INPUT_DATA_DIRECTORY_TAG ); + mpc.workingDirectory = FromXMLParserHelper::popTokenData ( iter, Token::TokenType::CHARACTER ); + FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, INPUT_DATA_DIRECTORY_TAG ); + } else { + break; + } + } + + FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, DIRECTORIES_TAG ); +} + +void MeasurementProvisionerXmlFactory::parseMeasurementProvisions ( MeasurementProvisionerConfiguration & mpc, std::deque < sax::Token >::iterator & iter ) { + FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, MEASUREMENT_PROVISIONS_TAG ); + + for ( ; ; ) { + if ( !FromXMLParserHelper::isTokenType ( iter, Token::TokenType::START_ELEMENT ) ) break; + + string data = FromXMLParserHelper::getTokenData ( iter, Token::TokenType::START_ELEMENT ); + + if ( data == MEASUREMENT_PROVISION_TAG ) + parseMeasurementProvision ( mpc, iter ); + else + break; + } + + FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, MEASUREMENT_PROVISIONS_TAG ); +} + +void MeasurementProvisionerXmlFactory::parseMeasurementProvision ( MeasurementProvisionerConfiguration & mpc, std::deque < sax::Token >::iterator & iter ) { + FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, MEASUREMENT_PROVISION_TAG ); + + MeasurementProvision mp; + + for ( ; ; ) { + if ( !FromXMLParserHelper::isTokenType ( iter, Token::TokenType::START_ELEMENT ) ) break; + + string data = FromXMLParserHelper::getTokenData ( iter, Token::TokenType::START_ELEMENT ); + + if ( data == INPUT_DATA_FILES_TAG ) + parseInputDataFiles ( mp, iter ); + else if ( data == PIPE_COMMANDS_TAG ) + parsePipeCommands ( mp, iter ); + else if ( data == MEASUREMENT_CONFIGURATION_TAG ) + parseMeasurementConfiguration ( mp, iter ); + else + break; + } + + mpc.measurementProvisions.emplace_back ( std::move ( mp ) ); + + FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, MEASUREMENT_PROVISION_TAG ); +} + +void MeasurementProvisionerXmlFactory::parseInputDataFiles ( MeasurementProvision & mp, std::deque < sax::Token >::iterator & iter ) { + FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, INPUT_DATA_FILES_TAG ); + + for ( ; ; ) { + if ( !FromXMLParserHelper::isTokenType ( iter, Token::TokenType::START_ELEMENT ) ) break; + + string data = FromXMLParserHelper::getTokenData ( iter, Token::TokenType::START_ELEMENT ); + + if ( data == INPUT_DATA_FILE_TAG ) { + FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, INPUT_DATA_FILE_TAG ); + mp.inputDataFiles.emplace_back ( FromXMLParserHelper::popTokenData ( iter, Token::TokenType::CHARACTER ) ); + FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, INPUT_DATA_FILE_TAG ); + } else { + break; + } + } + + FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, INPUT_DATA_FILES_TAG ); +} + +void MeasurementProvisionerXmlFactory::parsePipeCommands ( MeasurementProvision & mp, std::deque < sax::Token >::iterator & iter ) { + FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, PIPE_COMMANDS_TAG ); + + for ( ; ; ) { + if ( !FromXMLParserHelper::isTokenType ( iter, Token::TokenType::START_ELEMENT ) ) break; + + string data = FromXMLParserHelper::getTokenData ( iter, Token::TokenType::START_ELEMENT ); + + if ( data == PIPE_COMMAND_TAG ) { + FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, PIPE_COMMAND_TAG ); + mp.pipeCommands.emplace_back ( FromXMLParserHelper::popTokenData ( iter, Token::TokenType::CHARACTER ) ); + FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, PIPE_COMMAND_TAG ); + } else { + break; + } + } + + FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, PIPE_COMMANDS_TAG ); +} + +void MeasurementProvisionerXmlFactory::parseMeasurementConfiguration ( MeasurementProvision &, std::deque < sax::Token >::iterator & iter ) { + FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, MEASUREMENT_CONFIGURATION_TAG ); + + // skip everything for now + while ( !FromXMLParserHelper::isTokenType ( iter, Token::TokenType::END_ELEMENT ) || FromXMLParserHelper::getTokenData ( iter, Token::TokenType::END_ELEMENT ) != MEASUREMENT_CONFIGURATION_TAG ) ++iter; + + FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, MEASUREMENT_CONFIGURATION_TAG ); +} + +string MeasurementProvisionerXmlFactory::MEASUREMENT_PROVISIONER_TAG = "MeasurementProvisioner"; + +string MeasurementProvisionerXmlFactory::DIRECTORIES_TAG = "Directories"; +string MeasurementProvisionerXmlFactory::WORKING_DIRECTORY_TAG = "WorkingDirectory"; +string MeasurementProvisionerXmlFactory::BINARIES_DIRECTORY_TAG = "BinariesDirectory"; +string MeasurementProvisionerXmlFactory::INPUT_DATA_DIRECTORY_TAG = "InputDataDirectory"; + +string MeasurementProvisionerXmlFactory::MEASUREMENT_PROVISIONS_TAG = "MeasurementProvisions"; +string MeasurementProvisionerXmlFactory::MEASUREMENT_PROVISION_TAG = "MeasurementProvision"; + +string MeasurementProvisionerXmlFactory::INPUT_DATA_FILES_TAG = "InputDataFiles"; +string MeasurementProvisionerXmlFactory::INPUT_DATA_FILE_TAG = "InputDataFile"; + +string MeasurementProvisionerXmlFactory::PIPE_COMMANDS_TAG = "PipeCommands"; +string MeasurementProvisionerXmlFactory::PIPE_COMMAND_TAG = "PipeCommand"; + +string MeasurementProvisionerXmlFactory::MEASUREMENT_CONFIGURATION_TAG = "MeasurementConfiguration"; +} diff --git a/ameasure2/src/provisioner/MeasurementProvisionerXmlFactory.hpp b/ameasure2/src/provisioner/MeasurementProvisionerXmlFactory.hpp new file mode 100644 index 0000000000000000000000000000000000000000..5402443ed62f95b41d92622cb4d063d2e98542e7 --- /dev/null +++ b/ameasure2/src/provisioner/MeasurementProvisionerXmlFactory.hpp @@ -0,0 +1,48 @@ +/* + * Author: Radovan Cerveny + */ + +#ifndef MEASUREMENT_PROVISIONER_XML_FACTORY_HPP_ +#define MEASUREMENT_PROVISIONER_XML_FACTORY_HPP_ + +#include <deque> +#include "sax/Token.h" +#include "MeasurementProvisionerConfiguration.hpp" + +namespace provisioner { + +class MeasurementProvisionerXmlFactory { + static std::string MEASUREMENT_PROVISIONER_TAG; + + static std::string DIRECTORIES_TAG; + static std::string WORKING_DIRECTORY_TAG; + static std::string BINARIES_DIRECTORY_TAG; + static std::string INPUT_DATA_DIRECTORY_TAG; + + static std::string MEASUREMENT_PROVISIONS_TAG; + static std::string MEASUREMENT_PROVISION_TAG; + + static std::string INPUT_DATA_FILES_TAG; + static std::string INPUT_DATA_FILE_TAG; + + static std::string PIPE_COMMANDS_TAG; + static std::string PIPE_COMMAND_TAG; + + static std::string MEASUREMENT_CONFIGURATION_TAG; + + static void parseMeasurementProvisioner ( MeasurementProvisionerConfiguration &, std::deque < sax::Token >::iterator & ); + static void parseDirectories ( MeasurementProvisionerConfiguration &, std::deque < sax::Token >::iterator & ); + static void parseMeasurementProvisions ( MeasurementProvisionerConfiguration &, std::deque < sax::Token >::iterator & ); + + static void parseMeasurementProvision ( MeasurementProvisionerConfiguration &, std::deque < sax::Token >::iterator & ); + static void parseInputDataFiles ( MeasurementProvision &, std::deque < sax::Token >::iterator & ); + static void parsePipeCommands ( MeasurementProvision &, std::deque < sax::Token >::iterator & ); + static void parseMeasurementConfiguration ( MeasurementProvision &, std::deque < sax::Token >::iterator & ); + +public: + static MeasurementProvisionerConfiguration configurationFromTokens ( std::deque < sax::Token > & ); +}; + +} + +#endif /* MEASUREMENT_PROVISIONER_XML_FACTORY_HPP_ */ diff --git a/examples2/measurements/ameasure.xml b/examples2/measurements/ameasure.xml new file mode 100644 index 0000000000000000000000000000000000000000..1b76c4c10a75e58c9953fb9cd3d17c80f6e1e068 --- /dev/null +++ b/examples2/measurements/ameasure.xml @@ -0,0 +1,29 @@ +<?xml version="1.0"?> +<MeasurementProvisioner> + <Directories> + <WorkingDirectory>~/repositories/automata-library</WorkingDirectory> + <BinariesDirectory>bin-debug/</BinariesDirectory> + <InputDataDirectory>examples2/</InputDataDirectory> + </Directories> + + <MeasurementProvisions> + <MeasurementProvision> + <InputDataFiles> + <InputDataFile>../examples2/automaton/NFSM1.xml</InputDataFile> + <InputDataFile>../examples2/automaton/NFSM2.xml</InputDataFile> + </InputDataFiles> + <PipeCommands> + <PipeCommand>./adeterminize2</PipeCommand> + <PipeCommand>./aminimize2</PipeCommand> + <PipeCommand>./astat2 --automaton states -p print</PipeCommand> + </PipeCommands> + <MeasurementConfiguration> + <Engines> + <Engine>TIME</Engine> + <Engine>MEMORY</Engine> + <Engine>COUNTER</Engine> + </Engines> + </MeasurementConfiguration> + </MeasurementProvision> + </MeasurementProvisions> +</MeasurementProvisioner> \ No newline at end of file