|
From: <ma...@us...> - 2011-07-11 11:49:06
|
Revision: 1129
http://scstudio.svn.sourceforge.net/scstudio/?rev=1129&view=rev
Author: madzin
Date: 2011-07-11 11:48:59 +0000 (Mon, 11 Jul 2011)
Log Message:
-----------
Change interface of find flow algorithm.
Modified Paths:
--------------
trunk/src/data/searcher.h
trunk/src/membership/membership_alg.cpp
trunk/src/membership/membership_base.h
trunk/src/view/visio/addon/document.cpp
trunk/tests/diff/diff_test.cpp
trunk/tests/membership/membership_test.cpp
Modified: trunk/src/data/searcher.h
===================================================================
--- trunk/src/data/searcher.h 2011-07-10 20:07:33 UTC (rev 1128)
+++ trunk/src/data/searcher.h 2011-07-11 11:48:59 UTC (rev 1129)
@@ -41,11 +41,11 @@
virtual PreconditionList get_preconditions(MscPtr msc) const = 0;
//! Find the first occurence of needle in haystack.
- virtual MscPtr find(MscPtr haystack, MscPtr needle) = 0;
- virtual MscPtr find(MscPtr msc, std::vector<MscPtr>& bmscs) = 0;
+// virtual std::map<std::wstring, std::vector<MscPtr> > find(MscPtr haystack, MscPtr needle) = 0;
+ virtual std::map<std::wstring, std::vector<MscPtr> > find(MscPtr msc, std::vector<MscPtr>& bmscs) = 0;
//! Make diff between specification and flow
- virtual MscPtr diff(MscPtr specification, std::vector<MscPtr>& flows) = 0;
+// virtual MscPtr diff(MscPtr specification, std::vector<MscPtr>& flows) = 0;
};
typedef boost::shared_ptr<Searcher> SearcherPtr;
Modified: trunk/src/membership/membership_alg.cpp
===================================================================
--- trunk/src/membership/membership_alg.cpp 2011-07-10 20:07:33 UTC (rev 1128)
+++ trunk/src/membership/membership_alg.cpp 2011-07-11 11:48:59 UTC (rev 1129)
@@ -35,9 +35,13 @@
}
/*
- * Tries finding bMsc in Msc
+ * Tries finding bMSC in MSC
+ *
+ * returns the cover of the specification, when the cover is not supposed to be shown it returns NULL.
+ * this occurs when concrete flow does not match the specification or the specification is bMSC.
*/
-MscPtr MembershipAlg::find(MscPtr msc, MscPtr bmsc, std::vector<std::wstring> instances)
+MscPtr MembershipAlg::find_flow(MscPtr msc, MscPtr bmsc, std::vector<std::wstring> instances,
+ std::map<std::wstring, std::vector<MscPtr> >& messages)
{
HMscPtr hmsc = boost::dynamic_pointer_cast<HMsc > (msc);
BMscPtr bmsc_f = boost::dynamic_pointer_cast<BMsc > (bmsc);
@@ -52,57 +56,110 @@
c->set_mem(this);
c->set_focused_instances(instances);
c->set_bmsc(bmsc_f);
+ c->set_result_messages(messages);
MscPtr result = NULL;
+ //the specification is HMSC
if (hmsc != NULL)
+ {
result = search_hmsc(c, hmsc, bmsc_f);
+ delete c;
+
+ if(result == NULL)
+ {
+ print_report(RS_ERROR, L"HMsc specification does not contain \"" + bmsc->get_label() + L"\" flow.");
+ return NULL;
+ }
+ else
+ {
+ print_report(RS_NOTICE, L"Flow \"" + bmsc->get_label() + L"\" meets the specification.");
+ return result;
+ }
+ }
+ //the specification is BMSC
else
{
BMscPtr bmsc = boost::dynamic_pointer_cast<BMsc > (msc);
+
if(bmsc != NULL)
+ {
result = search_bmsc(c, bmsc, bmsc_f);
- else
- {
- print_report(RS_ERROR, L"Find flow algorithm cannot recognize a type of browsed MSC.");
+ delete c;
+
+ if(result != NULL)
+ {
+ print_report(RS_NOTICE, L"Flow \"" + bmsc->get_label() + L"\" meets the specification.");
+ }
+ else
+ {
+ //TODO check the output message whether the message that the flow does not meet the specification is printed.
+ if(!instances.empty())
+ return NULL;
+
+ std::vector<MscPtr> flows;
+ flows.push_back(bmsc_f);
+
+ result = diff(bmsc, flows);
+
+ if(result == NULL)
+ print_report(RS_ERROR, L"Error: Internal Error.");
+ else
+ {
+ std::wstring message;
+ message = L"Msc \"" + bmsc_f->get_label() + L"\" does not meet the specification. Diff: ";
+
+ std::vector<MscPtr> diff_result;
+ diff_result.push_back(result);
+
+ messages.insert(std::make_pair(message, diff_result));
+ }
+ }
+
+ //the NULL value means that the specification cover will not be depicted
return NULL;
}
}
- delete c;
- return result;
+ print_report(RS_ERROR, L"Find flow algorithm cannot recognize a MSC type of specification.");
+ return NULL;
}
-MscPtr MembershipAlg::find(MscPtr msc, MscPtr bmsc)
+std::map<std::wstring, std::vector<MscPtr> > MembershipAlg::find(MscPtr msc, std::vector<MscPtr>& bmscs,
+ std::vector<std::wstring> instances)
{
- std::vector<std::wstring> instances;
- return this->find(msc, bmsc, instances);
-}
-
-MscPtr MembershipAlg::find(MscPtr msc, std::vector<MscPtr>& bmscs)
-{
MscPtr temp;
- bool found = false;
+ bool cover = false;
+ std::map<std::wstring, std::vector<MscPtr> > messages;
for(unsigned int i = 0; i < bmscs.size(); i++)
{
temp = NULL;
- temp = find(msc, bmscs[i]);
+ temp = find_flow(msc, bmscs[i], instances, messages);
- if(temp == NULL)
- print_report(RS_ERROR, L"HMsc specification does not contain \"" + bmscs[i]->get_label() + L"\" flow.");
+ if(temp != NULL)
+ cover = true;
+ }
+
+ if(cover)
+ {
+ std::vector<MscPtr> msc_cover;
+ msc_cover.push_back(msc);
+
+ if(bmscs.size() > 1)
+ messages.insert(std::make_pair(L"Flows coverege of the specification.", msc_cover));
else
- {
- print_report(RS_NOTICE, L"Flow \"" + bmscs[i]->get_label() + L"\" meets the specification.");
- found = true;
- }
+ messages.insert(std::make_pair(L"Flow coverege of the specification.", msc_cover));
}
- if(found)
- return msc;
- else
- return NULL;
+ return messages;
}
+std::map<std::wstring, std::vector<MscPtr> > MembershipAlg::find(MscPtr msc, std::vector<MscPtr>& bmscs)
+{
+ std::vector<std::wstring> instances;
+ return find(msc, bmscs, instances);
+}
+
/*
* Tries to find bMSC in HMSC
*/
Modified: trunk/src/membership/membership_base.h
===================================================================
--- trunk/src/membership/membership_base.h 2011-07-10 20:07:33 UTC (rev 1128)
+++ trunk/src/membership/membership_base.h 2011-07-11 11:48:59 UTC (rev 1129)
@@ -149,6 +149,9 @@
enum DiffType diff_type;
+ std::map<std::wstring, std::vector<MscPtr> > result_messages;
+// bool search_bmsc;
+
public:
MembershipContext()
{
@@ -581,6 +584,32 @@
{
diff_type = type;
}
+
+ void set_result_messages(std::map<std::wstring, std::vector<MscPtr> >& messages)
+ {
+ result_messages = messages;
+ }
+/*
+ std::map<string, std::vector<MscPtr> > get_result_messages()
+ {
+ return result_messages;
+ }
+*/
+ void add_result_message(std::wstring message, std::vector<MscPtr> results)
+ {
+ result_messages.insert(std::make_pair(message, results));
+ }
+/*
+ void set_search_bmsc()
+ {
+ search_bmsc = true;
+ }
+
+ bool get_search_bmsc()
+ {
+ return search_bmsc;
+ }
+*/
};
//! store information about the position of checking algorithm on instance
@@ -1056,6 +1085,10 @@
class SCMEMBERSHIP_EXPORT MembershipAlg: public Searcher
{
+private:
+ MscPtr find_flow(MscPtr msc, MscPtr bmsc, std::vector<std::wstring> instances,
+ std::map<std::wstring, std::vector<MscPtr> >& messages);
+ MscPtr diff(MscPtr specification, std::vector<MscPtr>& flows);
public:
@@ -1080,16 +1113,16 @@
virtual PreconditionList get_preconditions(MscPtr msc) const;
//! Finds the bmsc flow in hmsc specification
- virtual MscPtr find(MscPtr hmsc, MscPtr bmsc);
+// virtual MscPtr find(MscPtr hmsc, MscPtr bmsc);
//! Make diff between specification and flow
- virtual MscPtr diff(MscPtr specification, std::vector<MscPtr>& flows);
//! Finds each bmsc flow from the vector in hmsc specification
- virtual MscPtr find(MscPtr hmsc, std::vector<MscPtr>& bmscs);
+ virtual std::map<std::wstring, std::vector<MscPtr> > find(MscPtr hmsc, std::vector<MscPtr>& bmscs);
//! Finds the bmsc flow in hmsc specification, focusing on specified instances, DO NOT CHECKING TIME CONSTRAINTS
- virtual MscPtr find(MscPtr hmsc, MscPtr bmsc, std::vector<std::wstring> instances);
+// virtual std::map<std::wstring, std::vector<MscPtr> > find(MscPtr hmsc, MscPtr bmsc, std::vector<std::wstring> instances);
+ virtual std::map<std::wstring, std::vector<MscPtr> > find(MscPtr msc, std::vector<MscPtr>& bmscs, std::vector<std::wstring> instances);
MscPtr get_dp_msc(MscPtr msc);
Modified: trunk/src/view/visio/addon/document.cpp
===================================================================
--- trunk/src/view/visio/addon/document.cpp 2011-07-10 20:07:33 UTC (rev 1128)
+++ trunk/src/view/visio/addon/document.cpp 2011-07-11 11:48:59 UTC (rev 1129)
@@ -1157,13 +1157,11 @@
if (msc_haystack == NULL || msc_needles.empty())
return VAORC_FAILURE;
- MscPtr result;
+ std::map<std::wstring, std::vector<MscPtr> > result_messages;
+ std::map<std::wstring, std::vector<MscPtr> >::iterator result_it;
try
{
- if(dlg.m_diffEnabled)
- result = m_membership->diff(msc_haystack, msc_needles);
- else
result = m_membership->find(msc_haystack, msc_needles);
}
catch(std::exception &exc)
@@ -1173,37 +1171,11 @@
return VAORC_FAILURE;
}
- std::wstring flows;
- for(u_int i = 0; i < msc_needles.size(); i++)
+ for(result_it = result_messages.begin(); result_it != result_messages.end(); result_it++)
{
- if(i) flows += _T(", ");
- flows += msc_needles.at(i)->get_label();
- }
+ m_reportView->Print(RS_NOTICE, result_it->first, result_it->second);
+ }
- if (result != NULL)
- {
- if(dlg.m_diffEnabled)
- m_reportView->Print(RS_NOTICE, stringize()
- << "Flow \"" << flows << "\" differs from the speification \"" << msc_haystack->get_label()
- << "\".", result);
- else
- {
- if(msc_needles.size() > 1)
- m_reportView->Print(RS_NOTICE, stringize()
- << "Flows coverege of the specification \"" << msc_haystack->get_label() << "\".", result);
- else
- m_reportView->Print(RS_NOTICE, stringize()
- << "Flow coverege of the specification \"" << msc_haystack->get_label() << "\".", result);
- }
- }
- else
- {
- if(dlg.m_diffEnabled)
- m_reportView->Print(RS_NOTICE, stringize()
- << "Flow \"" << flows << "\" and specification " << msc_haystack->get_label()
- << " are same.");
- }
-
return VAORC_SUCCESS;
}
Modified: trunk/tests/diff/diff_test.cpp
===================================================================
--- trunk/tests/diff/diff_test.cpp 2011-07-10 20:07:33 UTC (rev 1128)
+++ trunk/tests/diff/diff_test.cpp 2011-07-11 11:48:59 UTC (rev 1129)
@@ -100,13 +100,12 @@
MembershipAlg mem;
mem.set_printer(&printer);
- MscPtr result;
+ std::map<std::wstring, std::vector<MscPtr> > result;
- result = mem.diff(msc[0], msc_b);
+ result = mem.find(msc[0], msc_b);
- if(result == NULL)
+ if(result.size() == 0)
{
-std::cerr << "result was null" << std::endl;
if(satisfied)
{
std::cerr << "ERROR: HMSC should contain bMSC" << std::endl;
@@ -129,7 +128,12 @@
try
{
- z120.save_msc(std::cout, L"msc_diff", result);
+ std::map<std::wstring, std::vector<MscPtr> >::iterator result_it;
+ for(result_it = result.begin(); result_it != result.end(); result_it++)
+ {
+ for(unsigned int i = 0; i < result_it->second.size(); i++)
+ z120.save_msc(std::cout, L"msc_diff", result_it->second.at(i));
+ }
}
catch(std::exception& exc)
{
Modified: trunk/tests/membership/membership_test.cpp
===================================================================
--- trunk/tests/membership/membership_test.cpp 2011-07-10 20:07:33 UTC (rev 1128)
+++ trunk/tests/membership/membership_test.cpp 2011-07-11 11:48:59 UTC (rev 1129)
@@ -102,13 +102,16 @@
BMscPtr bmsc = boost::dynamic_pointer_cast<BMsc>(msc_b[0]);
- MscPtr result;
+ std::map<std::wstring, std::vector<MscPtr> > result;
+ std::vector<MscPtr> bmscs;
+ bmscs.push_back(bmsc);
if(focused_instances.empty())
- result = mem.find(msc[0], bmsc);
+ result = mem.find(msc[0], bmscs);
else
- result = mem.find(msc[0], bmsc, focused_instances);
+ result = mem.find(msc[0], bmscs, focused_instances);
+/*
if(result == NULL)
{
std::cerr << "result was null" << std::endl;
@@ -142,6 +145,12 @@
errors = 1;
}
}
+*/
+
+if(result.empty())
+std::cerr << "Result messages are empty" << std::endl;
+else
+std::cerr << "Result messages are NOT empty" << std::endl;
return errors;
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|