1 // Copyright (C) 2006-2016 CEA/DEN, EDF R&D
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 #include "LinkInfo.hxx"
26 using namespace YACS::ENGINE;
28 static const char GLOBAL_MESSAGE1[]="Global report : \n";
30 static const char LINK_REPR[]="link";
32 LinkInfo::LinkInfo(unsigned char level):_levelOfInfo(level),_level(0)
36 void LinkInfo::clearAll()
40 _onlyBackDefined.clear();
41 _uselessLinks.clear();
45 _errorsOnSwitchCases.clear();
48 void LinkInfo::startCollapseTransac()
53 void LinkInfo::endCollapseTransac() throw(YACS::Exception)
57 if(_levelOfInfo==ALL_STOP_ASAP)
58 if(areWarningsOrErrors())
59 throw Exception(getGlobalRepr());
60 else if(_levelOfInfo==WARN_ONLY_DONT_STOP)
61 if(getNumberOfWarnLinksGrp(W_ALL)!=0)
62 throw Exception(getErrRepr());
66 void LinkInfo::setPointOfView(ComposedNode *pov)
71 void LinkInfo::pushInfoLink(OutPort *semStart, InPort *end, InfoReason reason)
73 _infos[reason].push_back(pair<OutPort *, InPort *>(semStart,end));
76 void LinkInfo::pushWarnLink(OutPort *semStart, InPort *end, WarnReason reason)
78 if(_collapse[reason].empty())
79 _collapse[reason].push_back(vector< pair<OutPort *,InPort *> >());
81 if(_collapse[reason].back()[0].second!=end)
82 _collapse[reason].push_back(vector< pair<OutPort *,InPort *> >());
83 _collapse[reason].back().push_back(pair<OutPort *,InPort *>(semStart,end));
86 void LinkInfo::pushErrLink(OutPort *semStart, InPort *end, ErrReason reason) throw(YACS::Exception)
88 if(reason==E_NEVER_SET_INPUTPORT)
89 _unsetInPort.push_back(end);
90 else if(reason==E_ONLY_BACKWARD_DEFINED)
91 _onlyBackDefined.push_back(end);
93 _errors[reason].push_back(pair<OutPort *, InPort *>(semStart,end));
95 if(_levelOfInfo==ALL_STOP_ASAP || _levelOfInfo==WARN_ONLY_DONT_STOP)
96 throw Exception(getErrRepr());
99 void LinkInfo::pushErrSwitch(CollectorSwOutPort *collector) throw(YACS::Exception)
101 _errorsOnSwitchCases.push_back(collector);
103 if(_levelOfInfo==ALL_STOP_ASAP || _levelOfInfo==WARN_ONLY_DONT_STOP)
104 throw Exception(getErrRepr());
107 void LinkInfo::pushUselessCFLink(Node *start, Node *end)
109 _uselessLinks.insert(pair<Node *,Node *>(start,end));
112 void LinkInfo::takeDecision() const throw(YACS::Exception)
115 throw Exception(getErrRepr());
118 std::string LinkInfo::getGlobalRepr() const
120 ostringstream retS; retS << GLOBAL_MESSAGE1;
121 retS << printThereIsAre(getNumberOfErrLinks(E_ALL),"error") << ".\n";
122 retS << printThereIsAre(getNumberOfWarnLinksGrp(W_ALL),"warning") << ".\n";
123 retS << printThereIsAre(getNumberOfInfoLinks(I_ALL),"info") << ".\n";
124 if(getNumberOfErrLinks(E_ALL)>0)
126 retS << "****** ERRORS ******" << endl;
127 retS << getErrRepr() << endl;
129 if(getNumberOfWarnLinksGrp(W_ALL)>0)
131 retS << "****** WARNINGS ******" << endl;
132 retS << getWarnRepr() << endl;
134 if(getNumberOfInfoLinks(I_ALL)>0)
136 retS << "****** INFO ******" << endl;
137 retS << getInfoRepr() << endl;
142 std::string LinkInfo::getInfoRepr() const
144 map<InfoReason, vector< pair<OutPort *,InPort *> > >::const_iterator iter;
145 ostringstream stream;
146 for(iter=_infos.begin();iter!=_infos.end();iter++)
148 for(vector< pair<OutPort *,InPort *> >::const_iterator iter2=(*iter).second.begin();iter2!=(*iter).second.end();iter2++)
150 stream << getStringReprOfI((*iter).first) << " between \"" << _pov->getOutPortName((*iter2).first);
151 stream << "\" and \"" << _pov->getInPortName((*iter2).second) << "\"." << endl;
154 set< pair<Node *, Node *> >::const_iterator iter3;
155 for(iter3=_uselessLinks.begin();iter3!=_uselessLinks.end();iter3++)
157 stream << "Useless CF link between \"" << _pov->getChildName((*iter3).first);
158 stream << "\" and \"" << _pov->getChildName((*iter3).second) << "\"." << endl;
163 std::string LinkInfo::getWarnRepr() const
165 map<WarnReason, vector< vector< pair<OutPort *,InPort *> > > >::const_iterator iter;
166 ostringstream stream;
168 for(iter=_collapse.begin();iter!=_collapse.end();iter++)
170 stream << getStringReprOfW((*iter).first) << " for group containing following group links: ";
171 vector< vector< pair<OutPort *,InPort *> > >::const_iterator iter2=(*iter).second.begin();
172 for(;iter2!=(*iter).second.end();iter2++)
174 stream << " Group # " << i++ << " : " << endl;
175 for(vector< pair<OutPort *,InPort *> >::const_iterator iter3=(*iter2).begin();iter3!=(*iter2).end();iter3++)
176 stream << " \"" << _pov->getOutPortName((*iter3).first) << "\" and \"" << _pov->getInPortName((*iter3).second) << endl;
182 std::string LinkInfo::getErrRepr() const
184 vector<InPort *>::const_iterator iter;
185 ostringstream stream;
186 for(iter=_unsetInPort.begin();iter!=_unsetInPort.end();iter++)
187 stream << getStringReprOfE(E_NEVER_SET_INPUTPORT) << "\"" << _pov->getInPortName(*iter) << "\"." << endl;
188 for(iter=_onlyBackDefined.begin();iter!=_onlyBackDefined.end();iter++)
189 stream << getStringReprOfE(E_ONLY_BACKWARD_DEFINED) << "\"" << _pov->getInPortName(*iter) << "\"." << endl;
190 map<ErrReason, vector< pair<OutPort *,InPort *> > >::const_iterator iter2;
191 for(iter2=_errors.begin();iter2!=_errors.end();iter2++)
192 for(vector< pair<OutPort *,InPort *> >::const_iterator iter3=(*iter2).second.begin();iter3!=(*iter2).second.end();iter3++)
193 stream << getStringReprOfE((*iter2).first) << " between \"" <<_pov->getOutPortName((*iter3).first) << "\" and \"" << _pov->getInPortName((*iter3).second) << endl;
194 for(vector<CollectorSwOutPort *>::const_iterator iter3=_errorsOnSwitchCases.begin();iter3!=_errorsOnSwitchCases.end();iter3++)
195 (*iter3)->getHumanReprOfIncompleteCases(stream);
199 bool LinkInfo::areWarningsOrErrors() const
201 return (getNumberOfWarnLinksGrp(W_ALL)!=0) || (getNumberOfErrLinks(E_ALL)!=0) || !_unsetInPort.empty() || !_onlyBackDefined.empty();
205 * If 'reason'==I_ALL returns nummmber of types of links info whereas it returns number of info per type.
207 unsigned LinkInfo::getNumberOfInfoLinks(InfoReason reason) const
211 map<InfoReason, vector< pair<OutPort *,InPort *> > >::const_iterator iter=_infos.begin();
213 for(;iter!=_infos.end();iter++)
214 val+=(*iter).second.size();
215 return val+_uselessLinks.size();
217 if(reason==I_CF_USELESS)
218 return _uselessLinks.size();
221 map<InfoReason, vector< pair<OutPort *,InPort *> > >::const_iterator iter=_infos.find(reason);
222 if(iter!=_infos.end())
223 return (*iter).second.size();
229 unsigned LinkInfo::getNumberOfWarnLinksGrp(WarnReason reason) const
232 map<WarnReason, vector< vector< pair<OutPort *,InPort *> > > >::const_iterator iter;
235 for(iter=_collapse.begin();iter!=_collapse.end();iter++)
236 ret+=(*iter).second.size();
239 map<WarnReason, vector< vector< pair<OutPort *,InPort *> > > >::const_iterator iter2=_collapse.find(reason);
240 if(iter2!=_collapse.end())
241 return (*iter2).second.size();
246 unsigned LinkInfo::getNumberOfErrLinks(ErrReason reason) const
249 return _errors.size()+_onlyBackDefined.size()+_unsetInPort.size()+_errorsOnSwitchCases.size();
250 else if(reason==E_NEVER_SET_INPUTPORT)
251 return _unsetInPort.size();
252 else if(reason==E_ONLY_BACKWARD_DEFINED)
253 return _onlyBackDefined.size();
254 else if(reason==E_UNCOMPLETE_SW)
255 return _errorsOnSwitchCases.size();
258 map<ErrReason, vector< pair<OutPort *,InPort *> > >::const_iterator iter=_errors.find(reason);
259 if(iter!=_errors.end())
260 return (*iter).second.size();
266 std::set< std::pair<Node *, Node *> > LinkInfo::getInfoUselessLinks() const
268 return _uselessLinks;
271 std::pair<OutPort *, InPort *> LinkInfo::getInfoLink(unsigned id, InfoReason reason) const
273 if(reason==I_CF_USELESS)
274 return pair<OutPort *, InPort *>();
275 map<InfoReason, vector< pair<OutPort *,InPort *> > >::const_iterator iter=_infos.find(reason);
276 if(iter!=_infos.end())
277 return (*iter).second[id];
279 return pair<OutPort *, InPort *>( reinterpret_cast<OutPort *>(0), reinterpret_cast<InPort *>(0) );
282 std::vector< std::pair<OutPort *, InPort *> > LinkInfo::getWarnLink(unsigned id, WarnReason reason) const
284 map<WarnReason, vector< vector< pair<OutPort *,InPort *> > > >::const_iterator iter=_collapse.find(reason);
285 if(iter!=_collapse.end())
286 return (*iter).second[id];
288 return vector< pair<OutPort *, InPort *> >();
291 std::pair<OutPort *, InPort *> LinkInfo::getErrLink(unsigned id, ErrReason reason) const
293 if(reason==E_NEVER_SET_INPUTPORT)
294 return pair<OutPort *, InPort *>( reinterpret_cast<OutPort *>(0), _unsetInPort[id] );
295 else if(reason==E_ONLY_BACKWARD_DEFINED)
296 return pair<OutPort *, InPort *>( reinterpret_cast<OutPort *>(0), _onlyBackDefined[id] );
299 map<ErrReason, vector< pair<OutPort *,InPort *> > >::const_iterator iter=_errors.find(reason);
300 if(iter!=_errors.end())
301 return (*iter).second[id];
303 return pair<OutPort *, InPort *>( reinterpret_cast<OutPort *>(0), reinterpret_cast<InPort *>(0) );
307 std::string LinkInfo::getStringReprOfI(InfoReason reason)
319 ret="Back and useless";
327 ret+=" "; ret+=LINK_REPR;
331 std::string LinkInfo::getStringReprOfW(WarnReason reason)
339 case W_COLLAPSE_AND_USELESS:
340 ret="Collapse and useless";
343 ret="Collapse on ElementaryNode";
345 case W_COLLAPSE_EL_AND_USELESS:
346 ret+="Collapse on ElementaryNode and useless";
348 case W_BACK_COLLAPSE:
349 ret+="Back collapse";
351 case W_BACK_COLLAPSE_AND_USELESS:
352 ret+="Back collapse and useless";
354 case W_BACK_COLLAPSE_EL:
355 ret+="Back collapse on ElementaryNode";
357 case W_BACK_COLLAPSE_EL_AND_USELESS:
358 ret+="Back collapse and useless on ElementaryNode";
360 ret+=" "; ret+=LINK_REPR;
364 std::string LinkInfo::getStringReprOfE(ErrReason reason)
367 if(reason==E_NEVER_SET_INPUTPORT)
368 return "Never set InPort ";
369 if(reason==E_ONLY_BACKWARD_DEFINED)
370 return "Never set InPort only back defined ";
373 case E_DS_LINK_UNESTABLISHABLE:
374 ret="DS unestablishable";
376 case E_COLLAPSE_DFDS:
377 ret="DF/DS collapse";
380 ret="Inter DS collapse";
382 case E_UNPREDICTABLE_FED:
383 ret="Unpredictable fed";
385 ret+=" "; ret+=LINK_REPR;
389 std::string LinkInfo::printThereIsAre(unsigned val, const std::string& other)
398 ret << "are " << val;