1 #include "LinkInfo.hxx"
2 #include "ComposedNode.hxx"
7 using namespace YACS::ENGINE;
9 static const char GLOBAL_MESSAGE1[]="Global report : \n";
11 static const char LINK_REPR[]="link";
13 LinkInfo::LinkInfo(unsigned char level):_levelOfInfo(level),_level(0)
17 void LinkInfo::clearAll()
21 _onlyBackDefined.clear();
22 _uselessLinks.clear();
28 void LinkInfo::startCollapseTransac()
33 void LinkInfo::endCollapseTransac() throw(Exception)
37 if(_levelOfInfo==ALL_STOP_ASAP or _levelOfInfo==ERR_ONLY_DONT_STOP)
38 throw Exception(getErrRepr());
39 if(_levelOfInfo==ALL_STOP_ASAP)
40 throw Exception(getWarnRepr());
44 void LinkInfo::setPointOfView(ComposedNode *pov)
49 void LinkInfo::pushInfoLink(OutPort *semStart, InPort *end, InfoReason reason)
51 _infos[reason].push_back(pair<OutPort *, InPort *>(semStart,end));
54 void LinkInfo::pushWarnLink(OutPort *semStart, InPort *end, WarnReason reason)
56 if(_collapse[reason].empty())
57 _collapse[reason].push_back(vector< pair<OutPort *,InPort *> >());
59 if(_collapse[reason].back()[0].second!=end)
60 _collapse[reason].push_back(vector< pair<OutPort *,InPort *> >());
61 _collapse[reason].back().push_back(pair<OutPort *,InPort *>(semStart,end));
64 void LinkInfo::pushErrLink(OutPort *semStart, InPort *end, ErrReason reason) throw(Exception)
66 if(reason==E_NEVER_SET_INPUTPORT)
67 _unsetInPort.push_back(end);
68 else if(reason==E_ONLY_BACKWARD_DEFINED)
69 _onlyBackDefined.push_back(end);
71 _errors[reason].push_back(pair<OutPort *, InPort *>(semStart,end));
73 if(_levelOfInfo==ALL_STOP_ASAP or _levelOfInfo==ERR_ONLY_DONT_STOP)
74 throw Exception(getErrRepr());
77 void LinkInfo::pushUselessCFLink(Node *start, Node *end)
79 _uselessLinks.insert(pair<Node *,Node *>(start,end));
82 void LinkInfo::takeDecision() const throw(Exception)
85 throw Exception(getErrRepr());
88 std::string LinkInfo::getGlobalRepr() const
90 ostringstream retS; retS << GLOBAL_MESSAGE1;
91 retS << printThereIsAre(getNumberOfErrLinks(E_ALL),"error") << ".\n";
92 retS << printThereIsAre(getNumberOfWarnLinksGrp(W_ALL),"warning") << ".\n";
93 retS << printThereIsAre(getNumberOfInfoLinks(I_ALL),"info") << ".\n";
94 if(getNumberOfErrLinks(E_ALL)>0)
96 retS << "****** ERRORS ******" << endl;
97 retS << getErrRepr() << endl;
99 if(getNumberOfWarnLinksGrp(W_ALL)>0)
101 retS << "****** WARNINGS ******" << endl;
102 retS << getWarnRepr() << endl;
104 if(getNumberOfInfoLinks(I_ALL)>0)
106 retS << "****** INFO ******" << endl;
107 retS << getInfoRepr() << endl;
112 std::string LinkInfo::getInfoRepr() const
114 map<InfoReason, vector< pair<OutPort *,InPort *> > >::const_iterator iter;
115 ostringstream stream;
116 for(iter=_infos.begin();iter!=_infos.end();iter++)
118 for(vector< pair<OutPort *,InPort *> >::const_iterator iter2=(*iter).second.begin();iter2!=(*iter).second.end();iter2++)
120 stream << getStringReprOfI((*iter).first) << " between \"" << _pov->getOutPortName((*iter2).first);
121 stream << "\" and \"" << _pov->getInPortName((*iter2).second) << "\"." << endl;
124 set< pair<Node *, Node *> >::const_iterator iter3;
125 for(iter3=_uselessLinks.begin();iter3!=_uselessLinks.end();iter3++)
127 stream << getStringReprOfI(I_USELESS) << " between \"" << _pov->getChildName((*iter3).first);
128 stream << "\" and \"" << _pov->getChildName((*iter3).second) << "\"." << endl;
133 std::string LinkInfo::getWarnRepr() const
135 map<WarnReason, vector< vector< pair<OutPort *,InPort *> > > >::const_iterator iter;
136 ostringstream stream;
138 for(iter=_collapse.begin();iter!=_collapse.end();iter++)
140 stream << getStringReprOfW((*iter).first) << " for group containing following group links: ";
141 vector< vector< pair<OutPort *,InPort *> > >::const_iterator iter2=(*iter).second.begin();
142 for(;iter2!=(*iter).second.end();iter2++)
144 stream << " Group # " << i++ << " : " << endl;
145 for(vector< pair<OutPort *,InPort *> >::const_iterator iter3=(*iter2).begin();iter3!=(*iter2).end();iter3++)
146 stream << " \"" << _pov->getOutPortName((*iter3).first) << "\" and \"" << _pov->getInPortName((*iter3).second) << endl;
152 std::string LinkInfo::getErrRepr() const
154 vector<InPort *>::const_iterator iter;
155 ostringstream stream;
156 for(iter=_unsetInPort.begin();iter!=_unsetInPort.end();iter++)
157 stream << getStringReprOfE(E_NEVER_SET_INPUTPORT) << "\"" << _pov->getInPortName(*iter) << "\"." << endl;
158 for(iter=_onlyBackDefined.begin();iter!=_onlyBackDefined.end();iter++)
159 stream << getStringReprOfE(E_ONLY_BACKWARD_DEFINED) << "\"" << _pov->getInPortName(*iter) << "\"." << endl;
160 map<ErrReason, vector< pair<OutPort *,InPort *> > >::const_iterator iter2;
161 for(iter2=_errors.begin();iter2!=_errors.end();iter2++)
162 for(vector< pair<OutPort *,InPort *> >::const_iterator iter3=(*iter2).second.begin();iter3!=(*iter2).second.end();iter3++)
163 stream << getStringReprOfE((*iter2).first) << " between \"" <<_pov->getOutPortName((*iter3).first) << "\" and \"" << _pov->getInPortName((*iter3).second) << endl;
168 * If 'reason'==I_ALL returns nummmber of types of links info whereas it returns number of info per type.
170 unsigned LinkInfo::getNumberOfInfoLinks(InfoReason reason) const
173 return _infos.size()+_uselessLinks.size();
174 if(reason==I_CF_USELESS)
175 return _uselessLinks.size();
178 map<InfoReason, vector< pair<OutPort *,InPort *> > >::const_iterator iter=_infos.find(reason);
179 if(iter!=_infos.end())
180 return (*iter).second.size();
186 unsigned LinkInfo::getNumberOfWarnLinksGrp(WarnReason reason) const
189 map<WarnReason, vector< vector< pair<OutPort *,InPort *> > > >::const_iterator iter;
192 for(iter=_collapse.begin();iter!=_collapse.end();iter++)
193 ret+=(*iter).second.size();
196 map<WarnReason, vector< vector< pair<OutPort *,InPort *> > > >::const_iterator iter2=_collapse.find(reason);
197 if(iter2!=_collapse.end())
198 return (*iter2).second.size();
203 unsigned LinkInfo::getNumberOfErrLinks(ErrReason reason) const
206 return _errors.size()+_onlyBackDefined.size()+_unsetInPort.size();
207 else if(reason==E_NEVER_SET_INPUTPORT)
208 return _unsetInPort.size();
209 else if(reason==E_ONLY_BACKWARD_DEFINED)
210 return _onlyBackDefined.size();
213 map<ErrReason, vector< pair<OutPort *,InPort *> > >::const_iterator iter=_errors.find(reason);
214 if(iter!=_errors.end())
215 return (*iter).second.size();
221 std::set< std::pair<Node *, Node *> > LinkInfo::getInfoUselessLinks() const
223 return _uselessLinks;
226 std::pair<OutPort *, InPort *> LinkInfo::getInfoLink(unsigned id, InfoReason reason) const
228 if(reason==I_CF_USELESS)
229 return pair<OutPort *, InPort *>();
230 map<InfoReason, vector< pair<OutPort *,InPort *> > >::const_iterator iter=_infos.find(reason);
231 if(iter!=_infos.end())
232 return (*iter).second[id];
234 return pair<OutPort *, InPort *>(0,0);
237 std::vector< std::pair<OutPort *, InPort *> > LinkInfo::getWarnLink(unsigned id, WarnReason reason) const
239 map<WarnReason, vector< vector< pair<OutPort *,InPort *> > > >::const_iterator iter=_collapse.find(reason);
240 if(iter!=_collapse.end())
241 return (*iter).second[id];
243 return vector< pair<OutPort *, InPort *> >();
246 std::pair<OutPort *, InPort *> LinkInfo::getErrLink(unsigned id, ErrReason reason) const
248 if(reason==E_NEVER_SET_INPUTPORT)
249 return pair<OutPort *, InPort *>(0,_unsetInPort[id]);
250 else if(reason==E_ONLY_BACKWARD_DEFINED)
251 return pair<OutPort *, InPort *>(0,_onlyBackDefined[id]);
254 map<ErrReason, vector< pair<OutPort *,InPort *> > >::const_iterator iter=_errors.find(reason);
255 if(iter!=_errors.end())
256 return (*iter).second[id];
258 return pair<OutPort *, InPort *>(0,0);
262 std::string LinkInfo::getStringReprOfI(InfoReason reason)
274 ret="Back and useless";
282 ret+=" "; ret+=LINK_REPR;
286 std::string LinkInfo::getStringReprOfW(WarnReason reason)
294 case W_COLLAPSE_AND_USELESS:
295 ret="Collapse and useless";
298 ret="Collapse on ElementaryNode";
300 case W_COLLAPSE_EL_AND_USELESS:
301 ret+="Collapse on ElementaryNode and useless";
303 case W_BACK_COLLAPSE:
304 ret+="Back collapse";
306 case W_BACK_COLLAPSE_AND_USELESS:
307 ret+="Back collapse and useless";
309 case W_BACK_COLLAPSE_EL:
310 ret+="Back collapse on ElementaryNode";
312 case W_BACK_COLLAPSE_EL_AND_USELESS:
313 ret+="Back collapse and useless on ElementaryNode";
315 ret+=" "; ret+=LINK_REPR;
319 std::string LinkInfo::getStringReprOfE(ErrReason reason)
322 if(reason==E_NEVER_SET_INPUTPORT)
323 return "Never set InPort ";
324 if(reason==E_ONLY_BACKWARD_DEFINED)
325 return "Never set InPort only back defined ";
328 case E_DS_LINK_UNESTABLISHABLE:
329 ret="DS unestablishable";
331 case E_COLLAPSE_DFDS:
332 ret="DF/DS collapse";
335 ret="Inter DS collapse";
337 case E_UNPREDICTABLE_FED:
338 ret="Unpredictable fed";
340 ret+=" "; ret+=LINK_REPR;
344 std::string LinkInfo::printThereIsAre(unsigned val, const std::string& other)
353 ret << "are " << val;