Added from_to sequence diagram generator for json
This commit is contained in:
@@ -609,6 +609,52 @@ void generator::generate_diagram(nlohmann::json &parent) const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (const auto &ft : config().from_to()) {
|
||||||
|
// First, find the sequence of activities from 'from' location
|
||||||
|
// to 'to' location
|
||||||
|
assert(ft.size() == 2);
|
||||||
|
|
||||||
|
const auto &from_location = ft.front();
|
||||||
|
const auto &to_location = ft.back();
|
||||||
|
|
||||||
|
auto [from_activity_id, to_activity_id] =
|
||||||
|
model().get_from_to_activity_ids(from_location, to_location);
|
||||||
|
|
||||||
|
if (from_activity_id == 0 || to_activity_id == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
auto message_chains_unique = model().get_all_from_to_message_chains(
|
||||||
|
from_activity_id, to_activity_id);
|
||||||
|
|
||||||
|
nlohmann::json sequence;
|
||||||
|
sequence["from_to"]["from"]["location"] = from_location.location;
|
||||||
|
sequence["from_to"]["from"]["id"] = from_activity_id;
|
||||||
|
sequence["from_to"]["to"]["location"] = to_location.location;
|
||||||
|
sequence["from_to"]["to"]["id"] = to_activity_id;
|
||||||
|
|
||||||
|
block_statements_stack_.push_back(std::ref(sequence));
|
||||||
|
|
||||||
|
sequence["message_chains"] = nlohmann::json::array();
|
||||||
|
|
||||||
|
for (const auto &mc : message_chains_unique) {
|
||||||
|
nlohmann::json message_chain;
|
||||||
|
|
||||||
|
block_statements_stack_.push_back(std::ref(message_chain));
|
||||||
|
|
||||||
|
for (const auto &m : mc) {
|
||||||
|
generate_call(m, current_block_statement());
|
||||||
|
}
|
||||||
|
|
||||||
|
block_statements_stack_.pop_back();
|
||||||
|
|
||||||
|
sequence["message_chains"].push_back(std::move(message_chain));
|
||||||
|
}
|
||||||
|
|
||||||
|
block_statements_stack_.pop_back();
|
||||||
|
|
||||||
|
json_["sequences"].push_back(std::move(sequence));
|
||||||
|
}
|
||||||
|
|
||||||
for (const auto &sf : config().start_from()) {
|
for (const auto &sf : config().start_from()) {
|
||||||
if (sf.location_type == location_t::function) {
|
if (sf.location_type == location_t::function) {
|
||||||
common::model::diagram_element::id_t start_from{0};
|
common::model::diagram_element::id_t start_from{0};
|
||||||
|
|||||||
@@ -416,8 +416,14 @@ void generator::generate_diagram(std::ostream &ostr) const
|
|||||||
const auto &from_location = ft.front();
|
const auto &from_location = ft.front();
|
||||||
const auto &to_location = ft.back();
|
const auto &to_location = ft.back();
|
||||||
|
|
||||||
auto message_chains_unique =
|
auto [from_activity_id, to_activity_id] =
|
||||||
model().get_all_from_to_message_chains(from_location, to_location);
|
model().get_from_to_activity_ids(from_location, to_location);
|
||||||
|
|
||||||
|
if (from_activity_id == 0 || to_activity_id == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
auto message_chains_unique = model().get_all_from_to_message_chains(
|
||||||
|
from_activity_id, to_activity_id);
|
||||||
|
|
||||||
bool first_separator_skipped{false};
|
bool first_separator_skipped{false};
|
||||||
for (const auto &mc : message_chains_unique) {
|
for (const auto &mc : message_chains_unique) {
|
||||||
|
|||||||
@@ -209,14 +209,11 @@ std::vector<std::string> diagram::list_start_from_values() const
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unordered_set<message_chain_t> diagram::get_all_from_to_message_chains(
|
std::pair<common::model::diagram_element::id_t,
|
||||||
const config::source_location &from_location,
|
common::model::diagram_element::id_t>
|
||||||
|
diagram::get_from_to_activity_ids(const config::source_location &from_location,
|
||||||
const config::source_location &to_location) const
|
const config::source_location &to_location) const
|
||||||
{
|
{
|
||||||
std::unordered_set<message_chain_t> message_chains_unique{};
|
|
||||||
|
|
||||||
if ((from_location.location_type == config::location_t::function) &&
|
|
||||||
(to_location.location_type == config::location_t::function)) {
|
|
||||||
common::model::diagram_element::id_t from_activity{0};
|
common::model::diagram_element::id_t from_activity{0};
|
||||||
common::model::diagram_element::id_t to_activity{0};
|
common::model::diagram_element::id_t to_activity{0};
|
||||||
|
|
||||||
@@ -224,8 +221,7 @@ std::unordered_set<message_chain_t> diagram::get_all_from_to_message_chains(
|
|||||||
const auto &caller = *participants().at(v.from());
|
const auto &caller = *participants().at(v.from());
|
||||||
std::string vfrom = caller.full_name(false);
|
std::string vfrom = caller.full_name(false);
|
||||||
if (vfrom == from_location.location) {
|
if (vfrom == from_location.location) {
|
||||||
LOG_DBG(
|
LOG_DBG("Found sequence diagram start point '{}': {}", vfrom, k);
|
||||||
"Found sequence diagram start point '{}': {}", vfrom, k);
|
|
||||||
from_activity = k;
|
from_activity = k;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -235,7 +231,7 @@ std::unordered_set<message_chain_t> diagram::get_all_from_to_message_chains(
|
|||||||
LOG_WARN("Failed to find 'from' participant {} for start_from "
|
LOG_WARN("Failed to find 'from' participant {} for start_from "
|
||||||
"condition",
|
"condition",
|
||||||
from_location.location);
|
from_location.location);
|
||||||
return {};
|
return {from_activity, to_activity};
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const auto &[k, v] : sequences()) {
|
for (const auto &[k, v] : sequences()) {
|
||||||
@@ -245,8 +241,8 @@ std::unordered_set<message_chain_t> diagram::get_all_from_to_message_chains(
|
|||||||
const auto &callee = *participants().at(m.to());
|
const auto &callee = *participants().at(m.to());
|
||||||
std::string vto = callee.full_name(false);
|
std::string vto = callee.full_name(false);
|
||||||
if (vto == to_location.location) {
|
if (vto == to_location.location) {
|
||||||
LOG_DBG("Found sequence diagram end point '{}': {}", vto,
|
LOG_DBG(
|
||||||
m.to());
|
"Found sequence diagram end point '{}': {}", vto, m.to());
|
||||||
to_activity = m.to();
|
to_activity = m.to();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -257,9 +253,18 @@ std::unordered_set<message_chain_t> diagram::get_all_from_to_message_chains(
|
|||||||
LOG_WARN("Failed to find 'to' participant {} for from_to "
|
LOG_WARN("Failed to find 'to' participant {} for from_to "
|
||||||
"condition",
|
"condition",
|
||||||
to_location.location);
|
to_location.location);
|
||||||
return {};
|
return {from_activity, to_activity};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return {from_activity, to_activity};
|
||||||
|
}
|
||||||
|
|
||||||
|
std::unordered_set<message_chain_t> diagram::get_all_from_to_message_chains(
|
||||||
|
const common::model::diagram_element::id_t from_activity,
|
||||||
|
const common::model::diagram_element::id_t to_activity) const
|
||||||
|
{
|
||||||
|
std::unordered_set<message_chain_t> message_chains_unique{};
|
||||||
|
|
||||||
// Message (call) chains matching the specified from_to condition
|
// Message (call) chains matching the specified from_to condition
|
||||||
std::vector<message_chain_t> message_chains;
|
std::vector<message_chain_t> message_chains;
|
||||||
|
|
||||||
@@ -359,7 +364,6 @@ std::unordered_set<message_chain_t> diagram::get_all_from_to_message_chains(
|
|||||||
[from_activity](const message_chain_t &mc) {
|
[from_activity](const message_chain_t &mc) {
|
||||||
return !mc.empty() && (mc.front().from() == from_activity);
|
return !mc.empty() && (mc.front().from() == from_activity);
|
||||||
});
|
});
|
||||||
}
|
|
||||||
|
|
||||||
return message_chains_unique;
|
return message_chains_unique;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -241,11 +241,25 @@ public:
|
|||||||
/**
|
/**
|
||||||
* @brief Generate a list of message chains matching a from_to constraint
|
* @brief Generate a list of message chains matching a from_to constraint
|
||||||
*
|
*
|
||||||
|
* @param from_activity Source activity for from_to message chain
|
||||||
|
* @param to_activity Target activity for from_to message chain
|
||||||
* @return List of message chains
|
* @return List of message chains
|
||||||
*/
|
*/
|
||||||
std::unordered_set<message_chain_t> get_all_from_to_message_chains(
|
std::unordered_set<message_chain_t> get_all_from_to_message_chains(
|
||||||
const config::source_location &from,
|
const common::model::diagram_element::id_t from_activity,
|
||||||
const config::source_location &to) const;
|
const common::model::diagram_element::id_t to_activity) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get ids of from and to activities in from_to constraint
|
||||||
|
*
|
||||||
|
* @param from_activity Source activity for from_to message chain
|
||||||
|
* @param to_activity Target activity for from_to message chain
|
||||||
|
* @return Pair of activity ids (0 if not found)
|
||||||
|
*/
|
||||||
|
std::pair<common::model::diagram_element::id_t,
|
||||||
|
common::model::diagram_element::id_t>
|
||||||
|
get_from_to_activity_ids(const config::source_location &from_activity,
|
||||||
|
const config::source_location &to_activity) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Once the diagram is complete, run any final processing.
|
* @brief Once the diagram is complete, run any final processing.
|
||||||
|
|||||||
@@ -51,12 +51,11 @@ TEST_CASE("t20034", "[test-case][sequence]")
|
|||||||
config.output_directory() + "/" + diagram->name + ".puml", puml);
|
config.output_directory() + "/" + diagram->name + ".puml", puml);
|
||||||
}
|
}
|
||||||
|
|
||||||
// {
|
{
|
||||||
// auto j = generate_sequence_json(diagram, *model);
|
auto j = generate_sequence_json(diagram, *model);
|
||||||
//
|
|
||||||
// using namespace json;
|
using namespace json;
|
||||||
//
|
|
||||||
// save_json(config.output_directory() + "/" + diagram->name +
|
save_json(config.output_directory() + "/" + diagram->name + ".json", j);
|
||||||
// ".json", j);
|
}
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user