/** * @file * * @copyright * @verbatim Copyright @ 2017 Audi Electronics Venture GmbH. All rights reserved. This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/. If it is not possible or desirable to put the notice in a particular file, then You may include the notice in a location (such as a LICENSE file in a relevant directory) where a recipient would be likely to look for such a notice. You may add additional accurate notices of copyright ownership. @endverbatim */ #ifndef HEADER_MAP_CONFIGURATION_H #define HEADER_MAP_CONFIGURATION_H #include #include "a_util/result.h" #include "ddlrepresentation/ddldescription.h" #include "ddlrepresentation/ddldatatype_intf.h" #include "map_header.h" #include "map_source.h" #include "map_transformation.h" #include "map_assignment.h" #include "map_trigger.h" #include "map_target.h" namespace mapping { namespace oo { typedef std::vector MapErrorList; /** * MapConfiguration is the central class of the mapping::oo namespace. * It represents a whole mapping configuration which can be imported from * a mapping configuration file. */ class MapConfiguration { public: // methods /// Mapping import flags (\ref loadFromFile, \ref loadFromDOM) enum MapConfigFlags { // replace the existing configuration mc_load_mapping = 0x1 << 0, // merge any new configuration into the current one // (error on conflicting configuration) mc_merge_mapping = 0x1 << 1 }; /** * CTOR */ MapConfiguration(); /** * CTOR * @param [in] ddl The DDL information base used for type lookup */ MapConfiguration(const ddl::DDLDescription* ddl); /** * DTOR */ ~MapConfiguration(); /** * C-CTOR */ MapConfiguration(const MapConfiguration& other); /** * Assignment operator */ MapConfiguration& operator=(const MapConfiguration& other); /** * Set the reference ddl description * * @param [in] ddl The DDL information base used for type lookup * @note This call implies an internal Reset call, the configuration is reset * @retval a_util::result::SUCCESS Everything went fine */ a_util::result::Result setDescription(const ddl::DDLDescription* ddl); /** * Set the reference ddl description without consistency check * * @param [in] ddl The DDL information base used for type lookup * @retval a_util::result::SUCCESS Everything went fine */ a_util::result::Result setDescriptionWithoutConsistency(const ddl::DDLDescription* ddl); /** * Modify the reference ddl description * Set the new ddl description and check mapping consistency * * @param [in] ddl The DDL information base used for type lookup * @note This call does not imply a internal Reset call * @retval ERR_INVALID_TYPE Configuration is inconsistent with ddl, mapping validity updated * @retval a_util::result::SUCCESS Everything went fine */ a_util::result::Result modifyDescription(const ddl::DDLDescription* ddl); /** * Get the reference ddl description */ const ddl::DDLDescription* getDescription() const; /** * Resets the entire map configuration to its initial, empty state * \note The ddl description remains untouched by this * @returns Nothing but doxygen won't shut up if I dont write anything here */ void reset(); /** * Import mapping configuration from a file * Load file in DOM and call loadFromDOM() * * @param [in] file_path The file path to the configuration file * @param [in] flags Options for loading. See \ref MapConfigFlags * * @retval ERR_INVALID_FILE DOM Import from file failed * (see error list for details) * @retval see loadFromDOM() */ a_util::result::Result loadFromFile(const std::string& file_path, uint32_t flags = mc_load_mapping); /** * Import mapping configuration from a XML dom instance * * @param [in] dom The dom instance from which to import * @param [in] flags Options for loading. See \ref MapConfigFlags * * @retval ERR_INVALID_FLAGS Invalid flag combination * @retval ERR_INVALID_STATE No description found * @retval ERR_FAILED Configuration file is invalid * (see error list for details) * @retval ERR_INVALID_TYPE Configuration uses unknown DDL types * (see error list for details) * @retval a_util::result::SUCCESS Everything went fine */ a_util::result::Result loadFromDOM(a_util::xml::DOM& dom, uint32_t flags = mc_load_mapping); /** * Import mapping configuration from a XML dom instance without checking for DDL consistency * * @param [in] dom The dom instance from which to import * @param [in] flags Options for loading. See \ref MapConfigFlags * * @retval ERR_INVALID_FLAGS Invalid flag combination * @retval ERR_FAILED Configuration file is invalid * (see error list for details) * @retval a_util::result::SUCCESS Everything went fine */ a_util::result::Result loadFromDOMWithoutDDLConsistency(a_util::xml::DOM& dom, uint32_t flags = mc_load_mapping); /** * Import mapping configuration from a file * Load file in DOM and call loadPartiallyFromDOM() * Modell is loaded even if it is not consistent with the DDL description * Each element has a validity flag representing its consistency * * @param [in] file_path The file path to the configuration file * @param [in] flags Options for loading. See \ref MapConfigFlags * * @retval ERR_INVALID_FILE DOM Import from file failed * (see error list for details) * @retval see loadPartiallyFromDOM() */ a_util::result::Result loadPartiallyFromFile(const std::string& file_path, uint32_t flags = mc_load_mapping); /** * Import mapping configuration from a XML dom instance * Modell is laoding even if it is not consistent with the DDL description * Each element has a validity flag representing its consistency * * @param [in] dom The dom instance from which to import * @param [in] flags Options for loading. See \ref MapConfigFlags * * @retval ERR_INVALID_FLAGS Invalid flag combination * @retval ERR_FAILED Configuration file is invalid * (see error list for details) * @retval ERR_INVALID_TYPE Configuration uses unknown DDL types * (see error list for details) * @retval a_util::result::SUCCESS Everything went fine */ a_util::result::Result loadPartiallyFromDOM(a_util::xml::DOM& dom, uint32_t flags = mc_load_mapping); /** * Export mapping configuration to a file * Call writeToDOM() and wirte DOM to file * * @param [in] file_path The file path to the configuration file * @retval ERR_INVALID_FILE Can not write in file * (see error list for details) * @retval see writeToDOM() */ a_util::result::Result writeToFile(const std::string& file_path); /** * Export mapping configuration to a XML dom instance * * @param [in] dom The dom instance from which to import * @retval ERR_INVALID_STATE No description found * @retval ERR_FAILED Configuration is invalid * (see error list for details) * @retval ERR_INVALID_TYPE Configuration uses unknown DDL types * (see error list for details) * @retval a_util::result::SUCCESS Everything went fine */ a_util::result::Result writeToDOM(a_util::xml::DOM& dom); /** * Returns the mapping header of the configuration */ const MapHeader& getHeader() const; /** * Set the description in configuration header * @retval a_util::result::SUCCESS Everything went fine */ a_util::result::Result setHeaderDescription(const std::string& desc); /** * Set the ddl paths attribute in configuration header * @retval a_util::result::SUCCESS Everything went fine */ a_util::result::Result setHeaderDdlPaths(const std::string& ddl_path); /** * Get the ddl paths attribute from configuration header */ const std::string& getHeaderDdlPaths() const; /** * Returns all transformations contained in the configuration */ const MapTransformationList& getTransformationList() const; /** * Returns a specific transformation from the configuration * * @param [in] transformation_name The name of the transformation * * @retval The requested transformation base instance pointer * @retval NULL if no transformation instance was found with that name */ const MapTransformationBase* getTransformation( const std::string& transformation_name) const; /** * Returns a specific transformation from the configuration * * @param [in] transformation_name The name of the transformation * * @retval The requested transformation base instance pointer * @retval NULL if no transformation instance was found with that name */ MapTransformationBase* getTransformation( const std::string& transformation_name); /** * Add a transformation to use in mapping * @param [in] transformation_name The transformation name * @param [in] transformation_type The transformation type * can be "Periodic", "Signal" or "Data" * @retval ERR_INVALID_STATE No description found * @retval ERR_INVALID_TYPE Inconsistency with ddl * @retval a_util::result::SUCCESS Everything went fine */ a_util::result::Result addTransformation(const std::string& transformation_name, const std::string& transformation_type); /** * Remove a transformation * @param [in] transformation_name The transformation name * @retval ERR_NOT_FOUND Transformation not found * @retval a_util::result::SUCCESS Everything went fine */ a_util::result::Result removeTransformation(const std::string& transformation_name); /** * Returns a specific mapping source from the configuration * * @param [in] source_name The name of the source * * @retval The requested source instance pointer * @retval NULL if no source instance was found with that name */ const MapSource* getSource(const std::string& source_name) const; /** * Returns a specific mapping source from the configuration * * @param [in] source_name The name of the source * * @retval The requested source instance pointer * @retval NULL if no source instance was found with that name */ MapSource* getSource(const std::string& source_name); /** * Returns all mapping sources contained in the configuration */ const MapSourceList& getSourceList() const; /** * Add a source signal to use in mapping * @param [in] name The name of the source * @param [in] type The type of the source * @retval ERR_INVALID_STATE No description found * @retval ERR_INVALID_TYPE Inconsistency with ddl * @retval ERR_INVALID_ARG Signal name already used in configuration * @retval a_util::result::SUCCESS Everything went fine */ a_util::result::Result addSource(const std::string& name, const std::string& type); /** * Remove a source signal from the configuration * All connections using this source will be deleted * @param [in] name The name of the target * @retval ERR_NOT_FOUND Source not found * @retval a_util::result::SUCCESS Everything went fine */ a_util::result::Result removeSource(const std::string& name); /** * Returns a specific mapping target from the configuration * * @param [in] target_name The name of the target * * @retval The requested target instance pointer * @retval NULL if no target instance was found with that name */ const MapTarget* getTarget(const std::string& target_name) const; /** * Returns a specific mapping target from the configuration * * @param [in] target_name The name of the target * * @retval The requested target instance pointer * @retval NULL if no target instance was found with that name */ MapTarget* getTarget(const std::string& target_name); /** * Add a target signal to use in mapping * @param [in] name The name of the target * @param [in] type The type of the target * @retval ERR_INVALID_STATE No description found * @retval ERR_INVALID_TYPE Inconsistency with ddl * @retval ERR_INVALID_ARG Signal name already used in configuration * @retval a_util::result::SUCCESS Everything went fine */ a_util::result::Result addTarget(const std::string& name, const std::string& type); /** * Remove a target signal from the configuration * All connections using this source will be deleted * @param [in] name The name of the target * @retval ERR_NOT_FOUND Target not found * @retval a_util::result::SUCCESS Everything went fine */ a_util::result::Result removeTarget(const std::string& name); /** * Returns all mapping targets contained in the configuration */ const MapTargetList& getTargetList() const; /** * Returns the error list, containing human readable error messages. * @note The error list is filled by \ref loadFromFile and \ref loadFromDOM * and is reset on every call * @returns Const reference to the error list */ const MapErrorList& getErrorList() const; /** * Clear error list and verify DDL Description exists * @retval ERR_INVALID_STATE No description found * @retval a_util::result::SUCCESS Everything went fine **/ a_util::result::Result resetErrors(); /** * Append error to error list **/ void appendError(const std::string& error_string) const; /** * Returns bool flag indicating whether consistency of mapping with its DDL was already checked * @return Bool flag indicating whether consistency was checked */ bool isConsistencyChecked(); /** * Returns bool flag indicating consistency of mapping with its DDL * @return Bool flag indicating consistency */ bool isConsistent(); /** * Checks the configuration for consistency with ddl representation * (all types, transformations etc. are known and present & many other problems) * @retval ERR_INVALID_TYPE Configuration is inconsistent with ddl, * error list is populated and validity flags are set * @retval a_util::result::SUCCESS Everything went fine, configuration is consistent */ a_util::result::Result checkDDLConsistency(); private: /** * swap implementation for use in the assignment op */ void swap(MapConfiguration& other); /** * Set reference to new configuration * @param [in] config The configuration to reference */ void repairConfigReferences(MapConfiguration& config); /** * Import mapping configuration from a XML dom instance * * @param [in] dom The dom instance from which to import * @param [out] tmp_config The temporary configuration to create * @retval ERR_INVALID_ARG DOM does not contains a valid mapping * @retval a_util::result::SUCCESS Everything went fine **/ static a_util::result::Result loadMappingFromDOM(a_util::xml::DOM& dom, MapConfiguration& tmp_config); /** * Add a target signal to configuration * @param [in] target The target signal * @retval ERR_INVALID_ARG Signal name already used in configuration * @retval a_util::result::SUCCESS Everything went fine */ a_util::result::Result addTarget(const MapTarget& target); /** * Add a source signal to configuration * @param [in] source The source signal * @retval ERR_INVALID_ARG Signal name already used in configuration * @retval a_util::result::SUCCESS Everything went fine */ a_util::result::Result addSource(const MapSource& source); /** * Checks the mapping for consistency * All referenced Sources and Transformations must exist in Mapping * @retval ERR_INVALID_ARG Unknown source or transformation is used * @retval a_util::result::SUCCESS Everything went fine, configuration is consistent */ a_util::result::Result checkMappingConsistency(); /** * merge another configuration into this one * @param [in] other The other instance to be merged * @retval ERR_INVALID_ARG Type conflict * @retval a_util::result::SUCCESS Everything went fine */ a_util::result::Result merge(const MapConfiguration& other); /** * find a DDL data type within a struct given a path to the element * * @param [in] struct_name Name of the struct type * @param [in] path Path to be found * @param [out] type Destination type parameter * @param [out] array_size Destination array size parameter * @retval ERR_NOT_FOUND The path is invalid or the type was not found * @retval ERR_INVALID_TYPE Uses dynamic type * @retval a_util::result::SUCCESS The type was found, type and array_size are filled */ a_util::result::Result findTypeObject(const std::string& struct_name, const std::string& path, const ddl::IDDLDataType*& type, int& array_size) const; /** * @overload */ a_util::result::Result findTypeObject(const ddl::DDLComplex& struct_name, const std::string& path, const ddl::IDDLDataType*& type, int& array_size) const; /** * Checks whether the target datatype is compatible with the source datatype * @param [in] source Datatype 1 * @param [in] source_array_size Arraysize 1 * @param [in] target Datatype 2 * @param [in] target_array_size Arraysize 2 * @retval true or false */ bool checkTypeCompatibility(const ddl::IDDLDataType& source, int source_array_size, const ddl::IDDLDataType& target, int target_array_size) const; /** * Checks the configuration for consistency of a new signal * @param [in] name The signal name * @retval ERR_INVALID_ARG Signal name already used in configuration * @retval a_util::result::SUCCESS Everything went fine */ a_util::result::Result checkSignalName(const std::string& name) const; /** * Checks the configuration for consistency of a new signal * @param [in] type The type of the signal * @retval ERR_INVALID_TYPE Type not found in DDL * @retval a_util::result::SUCCESS Everything went fine */ a_util::result::Result checkSignalType(const std::string& type) const; /** * Checks the configuration for consistency of a new assignment * @param [in] assignment The assignment to check * @retval ERR_INVALID_ARG Reference not found in Configuration * @retval a_util::result::SUCCESS Everything went fine */ a_util::result::Result checkAssignmentReferences(const MapAssignment& assignment) const; /** * Checks the configuration for consistency of a new assignment * @param [in] signal_name The name of the target signal (for error list) * @param [in] signal_struct The ddl structure for the signal * @param [in] assignment The assignment to check * @retval ERR_INVALID_TYPE Definition is inconsistent with ddl * @retval a_util::result::SUCCESS Everything went fine */ a_util::result::Result checkAssignmentType(const std::string& signal_name, const ddl::DDLComplex& signal_struct, const MapAssignment& assignment) const; /** * Checks the configuration for consistency of a new trigger * @param [in] trigger The trigger to check * @retval ERR_INVALID_TYPE Definition is inconsistent with ddl * @retval a_util::result::SUCCESS Everything went fine */ a_util::result::Result checkTriggerType(const MapTriggerBase* trigger) const; private: /// @cond nodoc friend class MapSource; friend class MapTarget; friend class MapTriggerBase; friend class MapDataTrigger; MapHeader _header; MapSourceList _sources; MapTargetList _targets; MapTransformationList _transforms; // mutable because its not part of the object state mutable MapErrorList _errors; const ddl::DDLDescription* _ddl_ref; bool _checked_for_consistency; bool _is_consistent; /// @endcond }; } // namespace oo } // namespace mapping #endif // HEADER_MAP_CONFIGURATION_H