@@ -528,8 +528,21 @@ oms_status_enu_t oms::System::importFromSSD(const pugi::xml_node& node, const st
528528 }
529529 else
530530 {
531- // store the ssv files and process it later while handling the connection, so all the components are loaded
532- ssvFileSources.push_back (ssvFileSource);
531+ // store the ssv and ssm files and process it later while handling the connection, so all the components are loaded
532+ pugi::xml_node parameterMapping = parameterBindingNode.child (oms::ssp::Version1_0::ssd::parameter_mapping);
533+
534+ // check for parameterMapping (e.g) <ssd:ParameterMapping>
535+ if (parameterMapping)
536+ {
537+ // parameterMapping provided
538+ std::string ssmFileSource = parameterMapping.attribute (" source" ).as_string ();
539+ startValuesFileSources[ssvFileSource] = ssmFileSource;
540+ }
541+ else
542+ {
543+ // no parameterMapping
544+ startValuesFileSources[ssvFileSource] = " " ;
545+ }
533546 }
534547 }
535548 }
@@ -718,8 +731,8 @@ oms_status_enu_t oms::System::importFromSSD(const pugi::xml_node& node, const st
718731 return logError (" wrong xml schema detected: " + name);
719732 }
720733
721- // check for ssvFileSource exist and set the values before the connections
722- if (!ssvFileSources .empty ())
734+ // check for ssv FileSource exist and set the values before the connections
735+ if (!startValuesFileSources .empty ())
723736 {
724737 importStartValuesFromSSV ();
725738 }
@@ -2343,57 +2356,157 @@ oms_status_enu_t oms::System::importBusConnectorGeometry(const pugi::xml_node& n
23432356
23442357oms_status_enu_t oms::System::importStartValuesFromSSV ()
23452358{
2346- for (const auto & ssvFileSource : ssvFileSources )
2359+ for (const auto & file : startValuesFileSources )
23472360 {
2348- std::string tempdir = getModel ()->getTempDirectory ();
2349- filesystem::path temp_root (tempdir);
2350- pugi::xml_document ssvdoc;
2351- pugi::xml_parse_result result = ssvdoc.load_file ((temp_root / ssvFileSource).string ().c_str ());
2352- pugi::xml_node parameterSet, parameters;
2361+ // mapping between a parameter in the source and a parameter of the system or component being parametrized
2362+ std::multimap<ComRef, ComRef> mappedEntry;
23532363
2354- if (result) // check from ssv file
2355- {
2356- parameterSet = ssvdoc.document_element (); // ssv:ParameterSet
2357- parameters = parameterSet.child (oms::ssp::Version1_0::ssv::parameters);
2358- }
2359- else if (getModel ()->getSnapshot ().child (oms::ssp::Version1_0::ssv_file)) // check in memory oms:ssv_file
2364+ // check for parameter mapping file ".ssm file"
2365+ if (!file.second .empty ())
23602366 {
2361- parameterSet = getModel ()-> getSnapshot (). child (oms::ssp::Version1_0::ssv_file). child (oms::ssp::Version1_0::ssv::parameter_set); // ssv:ParameterSet
2362- parameters = parameterSet. child (oms::ssp::Version1_0::ssv::parameters );
2367+ importParamterMappingFromSSM (file. second , mappedEntry);
2368+ importStartValuesFromSSVHelper (file. first , mappedEntry );
23632369 }
23642370 else
23652371 {
2366- return logError (" loading \" " + std::string (ssvFileSource) + " \" failed (" + std::string (result.description ()) + " )" );
2372+ // no mapping file provided, apply the values from ssv file
2373+ importStartValuesFromSSVHelper (file.first , mappedEntry);
23672374 }
2375+ }
23682376
2369- if (parameters)
2377+ return oms_status_ok;
2378+ }
2379+
2380+ oms_status_enu_t oms::System::importStartValuesFromSSVHelper (std::string fileName, std::multimap<ComRef, ComRef> &mappedEntry)
2381+ {
2382+ std::string tempdir = getModel ()->getTempDirectory ();
2383+ filesystem::path temp_root (tempdir);
2384+ pugi::xml_document ssvdoc;
2385+ pugi::xml_parse_result result = ssvdoc.load_file ((temp_root / fileName).string ().c_str ());
2386+ pugi::xml_node parameterSet, parameters;
2387+
2388+ if (result) // check from ssv file
2389+ {
2390+ parameterSet = ssvdoc.document_element (); // ssv:ParameterSet
2391+ parameters = parameterSet.child (oms::ssp::Version1_0::ssv::parameters);
2392+ }
2393+ else if (getModel ()->getSnapshot ().child (oms::ssp::Version1_0::ssv_file)) // check in memory oms:ssv_file
2394+ {
2395+ parameterSet = getModel ()->getSnapshot ().child (oms::ssp::Version1_0::ssv_file).child (oms::ssp::Version1_0::ssv::parameter_set); // ssv:ParameterSet
2396+ parameters = parameterSet.child (oms::ssp::Version1_0::ssv::parameters);
2397+ }
2398+ else
2399+ {
2400+ return logError (" loading \" " + std::string (fileName) + " \" failed (" + std::string (result.description ()) + " )" );
2401+ }
2402+
2403+ if (parameters)
2404+ {
2405+ for (pugi::xml_node_iterator itparameters = parameters.begin (); itparameters != parameters.end (); ++itparameters)
23702406 {
2371- for (pugi::xml_node_iterator itparameters = parameters.begin (); itparameters != parameters.end (); ++itparameters)
2407+ std::string name = itparameters->name ();
2408+ std::vector<ComRef> mappedcrefs;
2409+ if (name == oms::ssp::Version1_0::ssv::parameter)
23722410 {
2373- std::string name = itparameters->name ();
2374- if (name == oms::ssp::Version1_0::ssv::parameter)
2411+ ComRef cref = ComRef (itparameters->attribute (" name" ).as_string ());
2412+ // check cref has any mapping entry
2413+ if (!mappedEntry.empty ())
23752414 {
2376- ComRef cref = ComRef (itparameters-> attribute ( " name " ). as_string () );
2377- if (itparameters-> child (oms::ssp::Version1_0::ssv::real_type) )
2415+ auto mapfind = mappedEntry. equal_range (cref );
2416+ for ( auto it = mapfind. first ; it != mapfind. second ; ++it )
23782417 {
2379- double value = itparameters->child (oms::ssp::Version1_0::ssv::real_type).attribute (" value" ).as_double ();
2418+ mappedcrefs.push_back (it->second );
2419+ }
2420+ }
2421+
2422+ if (itparameters->child (oms::ssp::Version1_0::ssv::real_type))
2423+ {
2424+ double value = itparameters->child (oms::ssp::Version1_0::ssv::real_type).attribute (" value" ).as_double ();
2425+ if (!mappedcrefs.empty ())
2426+ {
2427+ for (const auto &mappedcref : mappedcrefs)
2428+ {
2429+ setReal (mappedcref, value);
2430+ }
2431+ }
2432+ else
2433+ {
2434+ // no mapping entry found, apply the default cref found in ssv file
23802435 setReal (cref, value);
23812436 }
2382- else if (itparameters->child (oms::ssp::Version1_0::ssv::integer_type))
2437+ }
2438+ else if (itparameters->child (oms::ssp::Version1_0::ssv::integer_type))
2439+ {
2440+ int value = itparameters->child (oms::ssp::Version1_0::ssv::integer_type).attribute (" value" ).as_int ();
2441+ if (!mappedcrefs.empty ())
23832442 {
2384- int value = itparameters->child (oms::ssp::Version1_0::ssv::integer_type).attribute (" value" ).as_int ();
2443+ for (const auto &mappedcref : mappedcrefs)
2444+ {
2445+ setInteger (mappedcref, value);
2446+ }
2447+ }
2448+ else
2449+ {
2450+ // no mapping entry found, apply the default cref found in ssv file
23852451 setInteger (cref, value);
23862452 }
2387- else if (itparameters->child (oms::ssp::Version1_0::ssv::boolean_type))
2453+ }
2454+ else if (itparameters->child (oms::ssp::Version1_0::ssv::boolean_type))
2455+ {
2456+ bool value = itparameters->child (oms::ssp::Version1_0::ssv::boolean_type).attribute (" value" ).as_bool ();
2457+ if (!mappedcrefs.empty ())
23882458 {
2389- bool value = itparameters->child (oms::ssp::Version1_0::ssv::boolean_type).attribute (" value" ).as_bool ();
2390- setBoolean (cref, value);
2459+ for (const auto &mappedcref : mappedcrefs)
2460+ {
2461+ setBoolean (mappedcref, value);
2462+ }
23912463 }
23922464 else
23932465 {
2394- logError (" Failed to import " + std::string (oms::ssp::Version1_0::ssv::parameter) + " :Unknown ParameterBinding-type" );
2466+ // no mapping entry found, apply the default cref found in ssv file
2467+ setBoolean (cref, value);
23952468 }
23962469 }
2470+ else
2471+ {
2472+ logError (" Failed to import " + std::string (oms::ssp::Version1_0::ssv::parameter) + " :Unknown ParameterBinding-type" );
2473+ }
2474+ }
2475+ }
2476+ }
2477+
2478+ return oms_status_ok;
2479+ }
2480+
2481+ oms_status_enu_t oms::System::importParamterMappingFromSSM (std::string fileName, std::multimap<ComRef, ComRef> &mappedEntry)
2482+ {
2483+ std::string tempdir = getModel ()->getTempDirectory ();
2484+ filesystem::path temp_root (tempdir);
2485+ pugi::xml_document ssmdoc;
2486+ pugi::xml_parse_result result = ssmdoc.load_file ((temp_root / fileName).string ().c_str ());
2487+ pugi::xml_node parameterMapping;
2488+
2489+ if (result) // check from ssm file
2490+ {
2491+ parameterMapping = ssmdoc.document_element (); // ssm:ParameterMapping
2492+ }
2493+
2494+ if (parameterMapping)
2495+ {
2496+ for (pugi::xml_node_iterator itparametermapping = parameterMapping.begin (); itparametermapping != parameterMapping.end (); ++itparametermapping)
2497+ {
2498+ std::string name = itparametermapping->name ();
2499+ if (name == oms::ssp::Version1_0::ssm::parameter_mapping_entry)
2500+ {
2501+ ComRef source = itparametermapping->attribute (" source" ).as_string ();
2502+ if (!source.isEmpty ())
2503+ {
2504+ mappedEntry.insert (std::make_pair (source, itparametermapping->attribute (" target" ).as_string ()));
2505+ }
2506+ else
2507+ {
2508+ // default value will be applied
2509+ }
23972510 }
23982511 }
23992512 }
0 commit comments