3 #include "guiObservers.hxx"
4 #include "commandsProc.hxx"
6 #include "ComposedNode.hxx"
9 #include "ElementaryNode.hxx"
10 #include "InlineNode.hxx"
11 #include "ServiceNode.hxx"
12 #include "PythonNode.hxx"
13 #include "CORBANode.hxx"
14 #include "CppNode.hxx"
15 #include "XMLNode.hxx"
16 #include "SalomePythonNode.hxx"
17 #include "DataNode.hxx"
18 #include "PresetNode.hxx"
19 #include "OutNode.hxx"
20 #include "StudyNodes.hxx"
21 #include "ForLoop.hxx"
22 #include "ForEachLoop.hxx"
23 #include "WhileLoop.hxx"
25 #include "OptimizerLoop.hxx"
26 #include "InputPort.hxx"
27 #include "OutputPort.hxx"
28 #include "InputDataStreamPort.hxx"
29 #include "OutputDataStreamPort.hxx"
30 #include "SalomeContainer.hxx"
31 #include "SalomeComponent.hxx"
32 #include "ComponentDefinition.hxx"
33 #include "TypeCode.hxx"
35 #include "guiContext.hxx"
42 #include "YacsTrace.hxx"
47 using namespace YACS::HMI;
48 using namespace YACS::ENGINE;
50 // ----------------------------------------------------------------------------
52 void Subject::erase(Subject* sub)
58 // ----------------------------------------------------------------------------
60 Subject::Subject(Subject *parent) : _parent(parent)
66 * Destructor must only be called by Subject::erase to clean
67 * completely the context (detach observers), before the delete
68 * process itself. Some actions involving dynamic_cast can't be done
73 DEBTRACE("Subject::~Subject " << this << " "<< getName());
77 * Clean process prior to delete is redefined in derived classes: a local clean
78 * treatment relative to the derived class, then a call to the parent class clean
87 * the local clean method of base class of subjects take care of Observers.
88 * Remaining Observers in the list are detached, if an abserver has no more
89 * Subject to observe, it can be deleted.
91 void Subject::localClean()
93 DEBTRACE("Subject::localClean ");
94 set<GuiObserver*>::iterator it;
95 set<GuiObserver*> copySet = _setObs;
96 for (it = copySet.begin(); it != copySet.end(); ++it)
98 GuiObserver* anObs = (*it);
100 int nbsub = anObs->getNbSubjects();
101 DEBTRACE("nbSubjects=" << nbsub);
102 if (nbsub <= 0) delete anObs ;
107 void Subject::attach(GuiObserver *obs)
110 obs->incrementSubjects(this);
113 void Subject::detach(GuiObserver *obs)
115 DEBTRACE("Subject::detach " << obs);
116 obs->decrementSubjects(this);
120 std::string Subject::getName()
125 bool Subject::setName(std::string name)
130 void Subject::select(bool isSelected)
132 DEBTRACE("Subject::select " << isSelected << " " << this);
133 for (set<GuiObserver *>::iterator it = _setObs.begin(); it != _setObs.end(); ++it)
135 GuiObserver* currOb = *it;
136 currOb->select(isSelected);
140 void Subject::update(GuiEvent event,int type, Subject* son)
142 DEBTRACE("Subject::update " << type << "," << event << "," << son);
143 for (set<GuiObserver *>::iterator it = _setObs.begin(); it != _setObs.end(); ++it)
145 DEBTRACE("Subject::update " << *it);
146 (*it)->update(event, type, son);
150 Subject* Subject::getParent()
155 bool Subject::destroy(Subject *son)
157 string toDestroy = son->getName();
158 DEBTRACE("Subject::destroy " << toDestroy);
159 Proc *proc = GuiContext::getCurrent()->getProc();
160 string position = "";
162 if (dynamic_cast<SubjectProc*>(son))
163 position = proc->getName();
166 if (SubjectNode *subNode = dynamic_cast<SubjectNode*>(son))
168 if (subNode->getNode()->getFather() )
169 position = proc->getChildName(subNode->getNode());
171 else if (dynamic_cast<SubjectDataPort*>(son))
173 SubjectNode *subNodep = dynamic_cast<SubjectNode*>(son->getParent());
174 if (dynamic_cast<SubjectProc*>(subNodep))
175 position = proc->getName();
177 position = proc->getChildName(subNodep->getNode());
179 else if (dynamic_cast<SubjectLink*>(son))
181 SubjectNode *subNodep = dynamic_cast<SubjectNode*>(son->getParent());
182 if (dynamic_cast<SubjectProc*>(subNodep))
183 position = proc->getName();
185 position = proc->getChildName(subNodep->getNode());
188 if (son->isDestructible())
190 CommandDestroy* command = new CommandDestroy(position, son);
191 if (command->execute())
193 DEBTRACE("Destruction done: " << toDestroy);
201 void Subject::loadChildren()
205 void Subject::loadLinks()
209 void Subject::addSubjectReference(Subject *ref)
211 DEBTRACE("Subject::addSubjectReference " << getName() << " " << ref->getName());
212 SubjectReference *son = new SubjectReference(ref, this);
213 update(ADDREF, 0, son);
216 // ----------------------------------------------------------------------------
218 GuiObserver::GuiObserver()
220 DEBTRACE("GuiObserver::GuiObserver " << this);
224 GuiObserver::~GuiObserver()
226 DEBTRACE("GuiObserver::~GuiObserver " << this);
229 void GuiObserver::select(bool isSelected)
231 DEBTRACE("GuiObserver::select() " << isSelected);
234 void GuiObserver::update(GuiEvent event, int type, Subject* son)
236 DEBTRACE("GuiObserver::update, event not handled " << event << " " << type );
240 * only called by subject when attach to subject.
241 * @see Subject::attach
243 void GuiObserver::incrementSubjects(Subject *subject)
245 if (_subjectSet.count(subject))
246 DEBTRACE("subject " << subject << " is already a subject of observer " << this << "---------------------------");
247 _subjectSet.insert(subject);
248 //DEBTRACE(this << " " << _subjectSet.size());
252 * only called by subject when detach from subject.
253 * @see Subject::detach
255 void GuiObserver::decrementSubjects(Subject *subject)
257 if (_subjectSet.count(subject))
258 _subjectSet.erase(subject);
260 DEBTRACE("subject " << subject << " is not a subject of observer " << this << "---------------------------");
261 //DEBTRACE(this << " " << _subjectSet.size());
265 * Gets the number of subjects observed.
266 * used by subject. When the subject is erased (Subject::erase),
267 * remaining observers are detached from subjects. If an observer has no
268 * more subject, it can be deleted.
269 * @see Subject::erase Subject::localClean
271 int GuiObserver::getNbSubjects()
273 return _subjectSet.size();
276 // ----------------------------------------------------------------------------
278 SubjectReference::SubjectReference(Subject* ref, Subject *parent)
279 : Subject(parent), _reference(ref)
283 SubjectReference::~SubjectReference()
287 void SubjectReference::clean()
293 void SubjectReference::localClean()
295 DEBTRACE("SubjectReference::localClean ");
298 std::string SubjectReference::getName()
300 std::stringstream name;
301 name << "ref-->" << _reference->getName();
305 Subject* SubjectReference::getReference() const
310 // ----------------------------------------------------------------------------
312 SubjectNode::SubjectNode(YACS::ENGINE::Node *node, Subject *parent)
313 : Subject(parent), _node(node)
315 _listSubjectInputPort.clear();
316 _listSubjectOutputPort.clear();
317 _listSubjectIDSPort.clear();
318 _listSubjectODSPort.clear();
319 _listSubjectLink.clear();
320 _listSubjectControlLink.clear();
321 Dispatcher* d=Dispatcher::getDispatcher();
322 d->addObserver(this,node,"status");
326 * all destruction is done in generic class SubjectNode
328 SubjectNode::~SubjectNode()
330 DEBTRACE("SubjectNode::~SubjectNode " << getName());
331 Dispatcher::getDispatcher()->removeObserver(this,_node,"status");
333 ComposedNode* father = _node->getFather();
337 Bloc *bloc = dynamic_cast<Bloc*>(father);
338 if (bloc) bloc->edRemoveChild(_node);
341 Loop *loop = dynamic_cast<Loop*>(father);
342 if (loop) loop->edRemoveChild(_node);
345 ForEachLoop *feloop = dynamic_cast<ForEachLoop*>(father);
346 if (feloop && getName() != ForEachLoop::NAME_OF_SPLITTERNODE) {
347 DEBTRACE("SubjectNode::localClean: remove for each loop body");
348 feloop->edRemoveChild(_node);
352 Switch *aSwitch = dynamic_cast<Switch*>(father);
353 if (aSwitch) aSwitch->edRemoveChild(_node);
358 catch (YACS::Exception &e)
360 DEBTRACE("------------------------------------------------------------------------------");
361 DEBTRACE("SubjectNode::localClean: father->edRemoveChild: YACS exception " << e.what());
362 DEBTRACE("------------------------------------------------------------------------------");
366 void SubjectNode::clean()
372 void SubjectNode::localClean()
374 DEBTRACE("SubjectNode::localClean ");
375 removeExternalLinks();
377 list<SubjectLink*>::iterator its;
378 list<SubjectLink*> cpll = _listSubjectLink;
379 for (its = cpll.begin(); its != cpll.end(); ++its)
383 list<SubjectControlLink*>::iterator its;
384 list<SubjectControlLink*> cplcl = _listSubjectControlLink;
385 for (its = cplcl.begin(); its != cplcl.end(); ++its)
389 list<SubjectInputPort*>::iterator iti;
390 list<SubjectInputPort*> cpli = _listSubjectInputPort;
391 for(iti = cpli.begin(); iti != cpli.end(); ++iti)
395 list<SubjectOutputPort*>::iterator ito;
396 list<SubjectOutputPort*> cplo = _listSubjectOutputPort;
397 for(ito = cplo.begin(); ito != cplo.end(); ++ito)
401 list<SubjectInputDataStreamPort*>::iterator itid;
402 list<SubjectInputDataStreamPort*> cplid = _listSubjectIDSPort;
403 for(itid = cplid.begin(); itid != cplid.end(); ++itid)
407 list<SubjectOutputDataStreamPort*>::iterator itod;
408 list<SubjectOutputDataStreamPort*> cplod = _listSubjectODSPort;
409 for(itod = cplod.begin(); itod != cplod.end(); ++itod)
414 if( SubjectBloc* sb = dynamic_cast<SubjectBloc*>(_parent) )
415 sb->removeNode(this);
416 else if( SubjectForLoop* sfl = dynamic_cast<SubjectForLoop*>(_parent) )
417 sfl->completeChildrenSubjectList( 0 );
418 else if( SubjectWhileLoop* swl = dynamic_cast<SubjectWhileLoop*>(_parent) )
419 swl->completeChildrenSubjectList( 0 );
420 else if( SubjectForEachLoop* sfel = dynamic_cast<SubjectForEachLoop*>(_parent) )
421 sfel->completeChildrenSubjectList( 0 );
425 void SubjectNode::reparent(Subject* parent)
427 // remove this node from children list of an old parent
430 if( SubjectBloc* sb = dynamic_cast<SubjectBloc*>(_parent) )
431 sb->removeNode(this);
437 // add this node into the children list of a new parent
440 if( SubjectBloc* sb = dynamic_cast<SubjectBloc*>(_parent) )
441 sb->completeChildrenSubjectList(this);
442 else if( SubjectSwitch* ss = dynamic_cast<SubjectSwitch*>(_parent) )
443 ss->completeChildrenSubjectList(this);
447 std::string SubjectNode::getName()
449 return _node->getName();
452 YACS::ENGINE::Node* SubjectNode::getNode()
457 bool SubjectNode::setName(std::string name)
459 DEBTRACE("SubjectNode::setName " << name);
460 Proc *proc = GuiContext::getCurrent()->getProc();
461 string position = "";
462 if (proc != dynamic_cast<Proc*>(_node))
463 position = proc->getChildName(_node);
465 position = _node->getName();
466 CommandRenameNode* command = new CommandRenameNode(position, name);
467 if (command->execute())
469 GuiContext::getCurrent()->getInvoc()->add(command);
470 update(RENAME, 0, this);
476 void SubjectNode::notifyObserver(Node* object,const std::string& event)
478 DEBTRACE("SubjectNode::notifyObserver " << object->getName() << " " << event);
479 TypeOfElem ntyp = ProcInvoc::getTypeOfNode(object);
480 update(UPDATE, ntyp , 0 );
483 SubjectInputPort* SubjectNode::addSubjectInputPort(YACS::ENGINE::InputPort *port,
486 string theName = name;
487 if (name.empty()) theName =port->getName();
488 DEBTRACE("SubjectNode::addSubjectInputPort "<< theName);
489 SubjectInputPort *son = new SubjectInputPort(port, this);
490 GuiContext::getCurrent()->_mapOfSubjectDataPort[static_cast<DataPort*>(port)] = son;
491 _listSubjectInputPort.push_back(son);
492 if (!name.empty()) son->setName(name);
493 update(ADD, INPUTPORT ,son);
494 YACS::ENGINE::TypeCode *typcod = port->edGetType();
495 GuiContext::getCurrent()->getSubjectProc()->addSubjectDataType(typcod);
499 void SubjectNode::update( GuiEvent event, int type, Subject* son )
501 Subject::update( event, type, son );
503 // remove subject data type if necessary
504 YACS::HMI::SubjectDataPort* aSPort = dynamic_cast< YACS::HMI::SubjectDataPort* >( son );
505 if ( aSPort && event == REMOVE )
507 YACS::ENGINE::DataPort* aEPort = aSPort->getPort();
510 YACS::ENGINE::TypeCode* aTypeCode = aEPort->edGetType();
512 GuiContext::getCurrent()->getSubjectProc()->removeSubjectDataType( aTypeCode );
517 SubjectOutputPort* SubjectNode::addSubjectOutputPort(YACS::ENGINE::OutputPort *port,
520 string theName = name;
521 if (name.empty()) theName =port->getName();
522 DEBTRACE("SubjectNode::addSubjectOutputPort "<< theName);
523 SubjectOutputPort *son = new SubjectOutputPort(port, this);
524 GuiContext::getCurrent()->_mapOfSubjectDataPort[static_cast<DataPort*>(port)] = son;
525 _listSubjectOutputPort.push_back(son);
526 if (!name.empty()) son->setName(name);
527 update(ADD, OUTPUTPORT ,son);
528 YACS::ENGINE::TypeCode *typcod = port->edGetType();
529 GuiContext::getCurrent()->getSubjectProc()->addSubjectDataType(typcod);
533 SubjectInputDataStreamPort* SubjectNode::addSubjectIDSPort(YACS::ENGINE::InputDataStreamPort *port,
536 string theName = name;
537 if (name.empty()) theName =port->getName();
538 DEBTRACE("SubjectNode::addSubjectIDSPort "<< theName);
539 SubjectInputDataStreamPort *son = new SubjectInputDataStreamPort(port, this);
540 GuiContext::getCurrent()->_mapOfSubjectDataPort[static_cast<DataPort*>(port)] = son;
541 _listSubjectIDSPort.push_back(son);
542 if (!name.empty()) son->setName(name);
543 update(ADD, INPUTDATASTREAMPORT ,son);
544 YACS::ENGINE::TypeCode *typcod = port->edGetType();
545 GuiContext::getCurrent()->getSubjectProc()->addSubjectDataType(typcod);
550 SubjectOutputDataStreamPort* SubjectNode::addSubjectODSPort(YACS::ENGINE::OutputDataStreamPort *port,
553 string theName = name;
554 if (name.empty()) theName =port->getName();
555 DEBTRACE("SubjectNode::addSubjectODSPort "<< theName);
556 SubjectOutputDataStreamPort *son = new SubjectOutputDataStreamPort(port, this);
557 GuiContext::getCurrent()->_mapOfSubjectDataPort[static_cast<DataPort*>(port)] = son;
558 _listSubjectODSPort.push_back(son);
559 if (!name.empty()) son->setName(name);
560 update(ADD, OUTPUTDATASTREAMPORT ,son);
561 YACS::ENGINE::TypeCode *typcod = port->edGetType();
562 GuiContext::getCurrent()->getSubjectProc()->addSubjectDataType(typcod);
566 bool SubjectNode::tryCreateLink(SubjectNode *subOutNode, SubjectNode *subInNode)
568 DEBTRACE("SubjectNode::tryCreateLink " << subOutNode->getName() << " " << subInNode->getName());
569 Proc *proc = GuiContext::getCurrent()->getProc();
570 Node *outNode = subOutNode->getNode();
571 string outNodePos = proc->getChildName(outNode);
572 Node *inNode = subInNode->getNode();
573 string inNodePos = proc->getChildName(inNode);
574 CommandAddControlLink *command = new CommandAddControlLink(outNodePos, inNodePos);
575 if (command->execute())
577 GuiContext::getCurrent()->getInvoc()->add(command);
578 ComposedNode *cla = ComposedNode::getLowestCommonAncestor(outNode->getFather(),
579 inNode->getFather());
580 SubjectComposedNode *scla = dynamic_cast<SubjectComposedNode*>(subOutNode->getParent());
581 ComposedNode *ancestor = outNode->getFather();
582 while (ancestor && ancestor != cla)
584 ancestor = ancestor->getFather();
585 scla = dynamic_cast<SubjectComposedNode*>(scla->getParent());
588 DEBTRACE(scla->getName());
589 scla->addSubjectControlLink(subOutNode,subInNode);
599 void SubjectNode::removeExternalLinks()
601 DEBTRACE("SubjectNode::removeExternalLinks " << getName());
602 std::vector< std::pair<OutPort *, InPort *> > listLeaving = getNode()->getSetOfLinksLeavingCurrentScope();
603 std::vector< std::pair<InPort *, OutPort *> > listIncoming = getNode()->getSetOfLinksComingInCurrentScope();
604 std::vector< std::pair<OutPort *, InPort *> > globalList = listLeaving;
605 std::vector< std::pair<InPort *, OutPort *> >::iterator it1;
606 for (it1 = listIncoming.begin(); it1 != listIncoming.end(); ++it1)
608 std::pair<OutPort *, InPort *> outin = std::pair<OutPort *, InPort *>((*it1).second, (*it1).first);
609 globalList.push_back(outin);
611 std::vector< std::pair<OutPort *, InPort *> >::iterator it2;
612 for (it2 = globalList.begin(); it2 != globalList.end(); ++it2)
614 SubjectLink* subject = 0;
615 if (GuiContext::getCurrent()->_mapOfSubjectLink.count(*it2))
617 subject = GuiContext::getCurrent()->_mapOfSubjectLink[*it2];
619 DEBTRACE("link to remove " << subject->getName());
621 GuiContext::getCurrent()->_mapOfSubjectLink.erase(*it2);
625 DEBTRACE("------------------------------------------------------------------------------");
626 DEBTRACE("SubjectNode::removeExternalLinks(): an external link not in map...");
627 DEBTRACE("------------------------------------------------------------------------------");
633 // ----------------------------------------------------------------------------
635 SubjectComposedNode::SubjectComposedNode(YACS::ENGINE::ComposedNode *composedNode,
637 : SubjectNode(composedNode, parent), _composedNode(composedNode)
642 * all generic destruction is done in generic class SubjectNode
644 SubjectComposedNode::~SubjectComposedNode()
646 DEBTRACE("SubjectComposedNode::~SubjectComposedNode " << getName());
649 void SubjectComposedNode::clean()
652 SubjectNode::clean();
655 void SubjectComposedNode::localClean()
657 DEBTRACE("SubjectComposedNode::localClean ");
660 SubjectNode* SubjectComposedNode::addNode(YACS::ENGINE::Catalog *catalog,
665 DEBTRACE("SubjectComposedNode::addNode("<<catalog<<","<<compo<<","<<type<<","<<name<<")");
666 SubjectNode* body = 0;
670 SubjectNode *SubjectComposedNode::createNode(YACS::ENGINE::Catalog *catalog,
676 Proc *proc = GuiContext::getCurrent()->getProc();
677 string position = "";
678 if (proc != dynamic_cast<Proc*>(_node)) position = proc->getChildName(_node);
679 CommandAddNodeFromCatalog *command = new CommandAddNodeFromCatalog(catalog,
685 if (command->execute())
687 GuiContext::getCurrent()->getInvoc()->add(command);
688 Node * node = command->getNode();
689 SubjectNode *son = addSubjectNode(node,"",catalog,compo,type);
698 SubjectNode *SubjectComposedNode::addSubjectNode(YACS::ENGINE::Node * node,
700 YACS::ENGINE::Catalog *catalog,
704 string theName = name;
705 if (name.empty()) theName =node->getName();
706 DEBTRACE("SubjectComposedNode::addSubjectNode "<< theName);
707 TypeOfElem ntyp = ProcInvoc::getTypeOfNode(node);
708 DEBTRACE("TypeOfNode: " << ntyp);
709 SubjectNode *son = 0;
713 son = new SubjectBloc(dynamic_cast<YACS::ENGINE::Bloc*>(node), this);
716 son = new SubjectPythonNode(dynamic_cast<YACS::ENGINE::PythonNode*>(node), this);
719 son = new SubjectPyFuncNode(dynamic_cast<YACS::ENGINE::PyFuncNode*>(node), this);
722 son = new SubjectCORBANode(dynamic_cast<YACS::ENGINE::CORBANode*>(node), this);
725 son = new SubjectCppNode(dynamic_cast<YACS::ENGINE::CppNode*>(node), this);
728 son = new SubjectSalomeNode(dynamic_cast<YACS::ENGINE::SalomeNode*>(node), this);
730 case SALOMEPYTHONNODE:
731 son = new SubjectSalomePythonNode(dynamic_cast<YACS::ENGINE::SalomePythonNode*>(node), this);
734 son = new SubjectXmlNode(dynamic_cast<YACS::ENGINE::XmlNode*>(node), this);
737 son = new SubjectSplitterNode(dynamic_cast<YACS::ENGINE::SplitterNode*>(node), this);
740 son = new SubjectPresetNode(dynamic_cast<YACS::ENGINE::PresetNode*>(node), this);
743 son = new SubjectOutNode(dynamic_cast<YACS::ENGINE::OutNode*>(node), this);
746 son = new SubjectStudyInNode(dynamic_cast<YACS::ENGINE::StudyInNode*>(node), this);
749 son = new SubjectStudyOutNode(dynamic_cast<YACS::ENGINE::StudyOutNode*>(node), this);
752 son = new SubjectForLoop(dynamic_cast<YACS::ENGINE::ForLoop*>(node), this);
755 son = new SubjectWhileLoop(dynamic_cast<YACS::ENGINE::WhileLoop*>(node), this);
758 son = new SubjectSwitch(dynamic_cast<YACS::ENGINE::Switch*>(node), this);
761 son = new SubjectForEachLoop(dynamic_cast<YACS::ENGINE::ForEachLoop*>(node), this);
764 son = new SubjectOptimizerLoop(dynamic_cast<YACS::ENGINE::OptimizerLoop*>(node), this);
767 throw YACS::Exception("Not implemented");
771 GuiContext::getCurrent()->_mapOfSubjectNode[static_cast<Node*>(node)] = son;
772 if (!name.empty()) son->setName(name);
773 completeChildrenSubjectList(son);
774 update(ADD, ntyp ,son);
775 if (SubjectServiceNode *service = dynamic_cast<SubjectServiceNode*>(son))
776 if (catalog && !compo.empty() && !type.empty()) // --- clone from catalog: set component
777 service->setComponentFromCatalog(catalog,compo,type);
779 service->setComponent();
783 void SubjectComposedNode::completeChildrenSubjectList(SubjectNode *son)
787 void SubjectComposedNode::loadChildren()
789 list<Node *> setOfNode= _composedNode->edGetDirectDescendants();
790 if (ForEachLoop *feloop = dynamic_cast<ForEachLoop*>(_composedNode))
792 Node *node2Insert=feloop->getChildByName(ForEachLoop::NAME_OF_SPLITTERNODE);
793 if(find(setOfNode.begin(),setOfNode.end(),node2Insert)==setOfNode.end())
794 setOfNode.push_back(node2Insert);
796 for(list<Node *>::iterator iter=setOfNode.begin();iter!=setOfNode.end();iter++)
800 SubjectNode * son = addSubjectNode(*iter);
803 catch(YACS::Exception& ex)
805 std::cerr << "Unknown type of node" << std::endl;
808 list<InputPort*> listInputPorts = _composedNode->getLocalInputPorts();
809 list<OutputPort*> listOutputPorts = _composedNode->getLocalOutputPorts();
810 list<InputDataStreamPort*> listIDSPorts = _composedNode->getSetOfInputDataStreamPort();
811 list<OutputDataStreamPort*> listODSPorts = _composedNode->getSetOfOutputDataStreamPort();
812 list<InputPort*>::const_iterator iti;
813 for (iti = listInputPorts.begin(); iti != listInputPorts.end(); ++iti)
814 addSubjectInputPort(*iti);
815 list<OutputPort*>::const_iterator ito;
816 for (ito = listOutputPorts.begin(); ito != listOutputPorts.end(); ++ito)
817 addSubjectOutputPort(*ito);
820 SubjectLink* SubjectComposedNode::addSubjectLink(SubjectNode *sno,
821 SubjectDataPort *spo,
823 SubjectDataPort *spi)
825 DEBTRACE("SubjectComposedNode::addSubjectLink");
826 SubjectLink *son = new SubjectLink(sno, spo, sni, spi, this);
827 OutPort *outp = sno->getNode()->getOutPort(spo->getName());
828 InPort *inp = sni->getNode()->getInPort(spi->getName());
829 pair<OutPort*,InPort*> keyLink(outp,inp);
830 GuiContext::getCurrent()->_mapOfSubjectLink[keyLink] = son;
831 _listSubjectLink.push_back(son);
832 spo->addSubjectLink(son);
833 spi->addSubjectLink(son);
834 update(ADDLINK, DATALINK, son);
835 DEBTRACE("addSubjectLink: " << getName() << " " << son->getName());
839 void SubjectComposedNode::removeLink(SubjectLink* link)
841 DEBTRACE("removeSubjectLink: " << getName());
842 link->getSubjectOutPort()->removeSubjectLink(link);
843 link->getSubjectInPort()->removeSubjectLink(link);
844 _listSubjectLink.remove(link);
847 SubjectControlLink* SubjectComposedNode::addSubjectControlLink(SubjectNode *sno,
850 SubjectControlLink *son = new SubjectControlLink(sno, sni, this);
851 Node *outn = sno->getNode();
852 Node *inn = sni->getNode();
853 pair<Node*,Node*> keyLink(outn,inn);
855 GuiContext::getCurrent()->_mapOfSubjectControlLink[keyLink] = son;
856 _listSubjectControlLink.push_back(son);
857 sno->addSubjectControlLink(son);
858 sni->addSubjectControlLink(son);
859 update(ADDCONTROLLINK, CONTROLLINK, son);
860 DEBTRACE("addSubjectControlLink: " << getName() << " " << son->getName());
864 void SubjectComposedNode::removeControlLink(SubjectControlLink* link)
866 DEBTRACE("removeSubjectControlLink: " << getName());
867 link->getSubjectOutNode()->removeSubjectControlLink(link);
868 link->getSubjectInNode()->removeSubjectControlLink(link);
869 _listSubjectControlLink.remove(link);
873 * loadLinks is used when an existing scheme has been loaded in memory, to create gui representation.
874 * Gui representation of links is done after node representation (loadChildren).
875 * Proc is explored recursively to find the composedNodes and create the corresponding links
876 * representation, from bottom to top.
877 * For each composedNode, data links representation are created first and stored in a map to avoid
878 * double represention. Then control links representation are created.
880 void SubjectComposedNode::loadLinks()
882 list<Node *> setOfNode= _composedNode->edGetDirectDescendants();
883 for(list<Node *>::iterator iter=setOfNode.begin();iter!=setOfNode.end();iter++)
885 ComposedNode *cnSon = dynamic_cast<ComposedNode*>(*iter);
888 SubjectNode *subSon = GuiContext::getCurrent()->_mapOfSubjectNode[static_cast<Node*>(*iter)];
890 SubjectComposedNode *subCnSon = dynamic_cast<SubjectComposedNode*>(subSon);
892 subCnSon->loadLinks();
896 std::vector<std::pair<OutPort*,InPort*> > setOfLinks = _composedNode->getSetOfInternalLinks();
897 std::vector<std::pair<OutPort*,InPort*> >::iterator itp;
898 for (itp = setOfLinks.begin(); itp != setOfLinks.end(); ++itp)
899 if (!GuiContext::getCurrent()->_mapOfSubjectLink.count(*itp))
901 OutPort *outp = (*itp).first;
902 InPort *inp = (*itp).second;
903 Node *outn = outp->getNode();
904 Node *inn = inp->getNode();
905 DEBTRACE(outn->getName()<<"."<<outp->getName()<<"->"<<inn->getName()<<"."<<inp->getName());
906 SubjectNode *sno = GuiContext::getCurrent()->_mapOfSubjectNode[static_cast<Node*>(outn)];
907 SubjectNode *sni = GuiContext::getCurrent()->_mapOfSubjectNode[static_cast<Node*>(inn)];
908 SubjectDataPort *spo = GuiContext::getCurrent()->_mapOfSubjectDataPort[static_cast<DataPort*>(outp)];
909 SubjectDataPort *spi = GuiContext::getCurrent()->_mapOfSubjectDataPort[static_cast<DataPort*>(inp)];
910 addSubjectLink(sno,spo,sni,spi);
913 std::list<Node*> setOfNodes = _composedNode->edGetDirectDescendants();
914 std::list<Node*>::const_iterator itn;
915 for(itn = setOfNodes.begin(); itn != setOfNodes.end(); ++itn)
917 SubjectNode* sno = GuiContext::getCurrent()->_mapOfSubjectNode[*itn];
918 OutGate* outgate = (*itn)->getOutGate();
919 std::set<InGate*> setIngate = outgate->edSetInGate();
920 std::set<InGate*>::const_iterator itg;
921 for(itg = setIngate.begin(); itg != setIngate.end(); ++itg)
923 Node* inNode = (*itg)->getNode();
924 SubjectNode* sni = GuiContext::getCurrent()->_mapOfSubjectNode[inNode];
925 addSubjectControlLink(sno,sni);
930 //! Retrieves the lowest common ancestor of 2 nodes
933 * \note Retrieves the lowest common ancestor of 'node1' AND 'node2'.
934 * If 'node1' or 'node2' are both or indiscriminately instances of ComposedNode and that
935 * 'node1' is in descendance of 'node2' (resp. 'node2' in descendance of 'node1')
936 * 'node2' is returned (resp. 'node1').
937 * \exception Exception : if 'node1' and 'node2' do not share the same genealogy.
938 * \return The lowest common ancestor if it exists.
941 SubjectComposedNode* SubjectComposedNode::getLowestCommonAncestor(SubjectNode* snode1, SubjectNode* snode2)
943 Node* node1 = snode1->getNode();
944 Node* node2 = snode2->getNode();
946 ComposedNode *node = ComposedNode::getLowestCommonAncestor(node1->getFather(), node2->getFather());
947 SubjectComposedNode* snode = dynamic_cast<SubjectComposedNode*>( GuiContext::getCurrent()->_mapOfSubjectNode[node] );
951 // ----------------------------------------------------------------------------
953 SubjectBloc::SubjectBloc(YACS::ENGINE::Bloc *bloc, Subject *parent)
954 : SubjectComposedNode(bloc, parent), _bloc(bloc)
960 * all generic destruction is done in generic class SubjectNode
962 SubjectBloc::~SubjectBloc()
964 DEBTRACE("SubjectBloc::~SubjectBloc " << getName());
967 void SubjectBloc::clean()
970 SubjectComposedNode::clean();
973 void SubjectBloc::localClean()
975 DEBTRACE("SubjectBloc::localClean ");
976 set<SubjectNode*>::iterator it;
977 set<SubjectNode*> copyChildren = _children;
978 for (it = copyChildren.begin(); it !=copyChildren.end(); ++it)
982 SubjectNode* SubjectBloc::addNode(YACS::ENGINE::Catalog *catalog,
987 DEBTRACE("SubjectBloc::addNode( " << catalog << ", " << compo << ", " << type << ", " << name << " )");
988 SubjectNode* child = createNode(catalog, compo, type, name);
992 void SubjectBloc::completeChildrenSubjectList(SubjectNode *son)
994 _children.insert(son);
997 void SubjectBloc::removeNode(SubjectNode* child)
999 _children.erase(child);
1002 SubjectNode* SubjectBloc::getChild(YACS::ENGINE::Node* node) const
1004 SubjectNode* aChild = 0;
1008 set<SubjectNode*>::iterator it = _children.begin();
1009 for ( ; it != _children.end(); it++ )
1010 if ( (*it)->getNode() == node )
1020 // ----------------------------------------------------------------------------
1022 SubjectProc::SubjectProc(YACS::ENGINE::Proc *proc, Subject *parent)
1023 : SubjectBloc(proc, parent), _proc(proc)
1027 SubjectProc::~SubjectProc()
1029 DEBTRACE("SubjectProc::~SubjectProc " << getName());
1032 void SubjectProc::clean()
1035 SubjectBloc::clean();
1038 void SubjectProc::localClean()
1040 DEBTRACE("SubjectProc::localClean ");
1043 void SubjectProc::loadProc()
1045 DEBTRACE("SubjectProc::loadProc " << getName());
1053 * loadComponents is used when an existing scheme has been loaded in memory,
1054 * to create subjects for components stored in the schema file, but are not
1055 * associated with any service nodes. Note, that if such component is associated
1056 * to any container, the subject for this container is also created, if it is not
1059 void SubjectProc::loadComponents()
1061 Proc* aProc = GuiContext::getCurrent()->getProc();
1062 for (map<pair<string,int>, ComponentInstance*>::const_iterator itComp = aProc->componentInstanceMap.begin();
1063 itComp != aProc->componentInstanceMap.end(); ++itComp)
1064 if ( GuiContext::getCurrent()->_mapOfSubjectComponent.find((*itComp).second)
1066 GuiContext::getCurrent()->_mapOfSubjectComponent.end() )
1067 { // engine object for component already exists => add only a subject for it
1068 addSubjectComponent((*itComp).second);
1073 * loadContainers is used when an existing scheme has been loaded in memory,
1074 * to create subjects for containers stored in the schema file, but are not
1075 * associated with components.
1077 void SubjectProc::loadContainers()
1079 Proc* aProc = GuiContext::getCurrent()->getProc();
1080 for (map<string, Container*>::const_iterator itCont = aProc->containerMap.begin();
1081 itCont != aProc->containerMap.end(); ++itCont)
1082 if ( GuiContext::getCurrent()->_mapOfSubjectContainer.find((*itCont).second)
1084 GuiContext::getCurrent()->_mapOfSubjectContainer.end() )
1085 // engine object for container already exists => add only a subject for it
1086 addSubjectContainer((*itCont).second, (*itCont).second->getName());
1089 SubjectComponent* SubjectProc::addComponent(std::string name)
1091 DEBTRACE("SubjectProc::addComponent " << name);
1092 CommandAddComponentInstance *command = new CommandAddComponentInstance(name);
1093 if (command->execute())
1095 GuiContext::getCurrent()->getInvoc()->add(command);
1096 ComponentInstance *compo = command->getComponentInstance();
1097 SubjectComponent *son = addSubjectComponent(compo);
1100 else delete command;
1104 SubjectContainer* SubjectProc::addContainer(std::string name, std::string ref)
1106 DEBTRACE("SubjectProc::addContainer " << name << " " << ref);
1107 if (! GuiContext::getCurrent()->getProc()->containerMap.count(name))
1109 CommandAddContainer *command = new CommandAddContainer(name,ref);
1110 if (command->execute())
1112 GuiContext::getCurrent()->getInvoc()->add(command);
1113 Container *cont = command->getContainer();
1114 SubjectContainer *son = addSubjectContainer(cont, name);
1115 GuiContext::getCurrent()->getProc()->containerMap[name] = cont;
1121 else GuiContext::getCurrent()->_lastErrorMessage = "There is already a container with that name";
1125 SubjectDataType* SubjectProc::addDataType(YACS::ENGINE::Catalog* catalog, std::string typeName)
1127 DEBTRACE("SubjectProc::addDataType " << typeName);
1128 CommandAddDataTypeFromCatalog *command = new CommandAddDataTypeFromCatalog(catalog, typeName);
1129 if (command->execute())
1131 DEBTRACE("new datatype " << typeName);
1132 GuiContext::getCurrent()->getInvoc()->add(command);
1133 SubjectDataType *son = addSubjectDataType(command->getTypeCode());
1136 else delete command;
1140 SubjectComponent* SubjectProc::addSubjectComponent(YACS::ENGINE::ComponentInstance* compo)
1142 DEBTRACE("SubjectProc::addSubjectComponent " << compo->getInstanceName());
1143 SubjectComponent *son = new SubjectComponent(compo, this);
1144 GuiContext::getCurrent()->_mapOfSubjectComponent[compo] = son;
1145 update(ADD, COMPONENT, son);
1146 son->setContainer();
1150 SubjectContainer* SubjectProc::addSubjectContainer(YACS::ENGINE::Container* cont,
1153 DEBTRACE("SubjectProc::addSubjectContainer " << name);
1154 SubjectContainer *son = new SubjectContainer(cont, this);
1155 GuiContext::getCurrent()->_mapOfSubjectContainer[cont] = son;
1156 update(ADD, CONTAINER, son);
1160 SubjectDataType* SubjectProc::addSubjectDataType(YACS::ENGINE::TypeCode *type)
1162 string typeName = type->name();
1163 DEBTRACE("SubjectProc::addSubjectDataType " << typeName);
1164 Proc* proc = GuiContext::getCurrent()->getProc();
1165 SubjectDataType* son = 0;
1166 if (! proc->typeMap.count(typeName))
1167 proc->typeMap[ typeName ] = type->clone();
1169 proc->typeMap[ typeName ]->incrRef();
1170 if (! GuiContext::getCurrent()->_mapOfSubjectDataType.count(typeName))
1172 son = new SubjectDataType(type, this);
1173 GuiContext::getCurrent()->_mapOfSubjectDataType[typeName] = son;
1174 update(ADD, DATATYPE, son);
1177 GuiContext::getCurrent()->_lastErrorMessage = "Typecode " + typeName + " already had added in proc";
1181 void SubjectProc::removeSubjectDataType( YACS::ENGINE::TypeCode* theType )
1186 YACS::HMI::GuiContext* aContext = GuiContext::getCurrent();
1190 YACS::ENGINE::Proc* aProc = aContext->getProc();
1194 string typeName = theType->name();
1195 if ( !aProc->typeMap.count( typeName ) )
1198 YACS::ENGINE::TypeCode* aTypeCode = aProc->typeMap[ typeName ];
1202 if ( !aContext->_mapOfSubjectDataType.count( typeName ) )
1205 YACS::HMI::SubjectDataType* aSDataType = aContext->_mapOfSubjectDataType[ typeName ];
1209 unsigned int aRefCnt = aTypeCode->getRefCnt();
1212 update( REMOVE, DATATYPE, aSDataType );
1213 aContext->_mapOfSubjectDataType.erase( typeName );
1214 aProc->typeMap.erase( typeName );
1217 aTypeCode->decrRef();
1220 // ----------------------------------------------------------------------------
1222 SubjectElementaryNode::SubjectElementaryNode(YACS::ENGINE::ElementaryNode *elementaryNode,
1224 : SubjectNode(elementaryNode, parent), _elementaryNode(elementaryNode)
1229 * all generic destruction is done in generic class SubjectNode
1231 SubjectElementaryNode::~SubjectElementaryNode()
1233 DEBTRACE("SubjectElementaryNode::~SubjectElementaryNode " << getName());
1236 void SubjectElementaryNode::clean()
1239 SubjectNode::clean();
1242 void SubjectElementaryNode::localClean()
1244 DEBTRACE("SubjectElementaryNode::localClean ");
1248 SubjectDataPort* SubjectElementaryNode::addInputPort(YACS::ENGINE::Catalog *catalog, std::string type, std::string name)
1250 DEBTRACE("SubjectElementaryNode::addInputPort( " << catalog << ", " << type << ", " << name << " )");
1251 Proc *proc = GuiContext::getCurrent()->getProc();
1252 string position = "";
1253 if (proc != dynamic_cast<Proc*>(_node)) position = proc->getChildName(_node);
1255 CommandAddInputPortFromCatalog *command = new CommandAddInputPortFromCatalog(catalog,
1259 if (command->execute())
1261 GuiContext::getCurrent()->getInvoc()->add(command);
1262 InputPort * port = command->getInputPort();
1263 SubjectInputPort *son = addSubjectInputPort(port, name);
1266 else delete command;
1270 SubjectDataPort* SubjectElementaryNode::addOutputPort(YACS::ENGINE::Catalog *catalog, std::string type, std::string name)
1272 DEBTRACE("SubjectElementaryNode::addOutputPort( " << catalog << ", " << type << ", " << name << " )");
1273 Proc *proc = GuiContext::getCurrent()->getProc();
1274 string position = "";
1275 if (proc != dynamic_cast<Proc*>(_node)) position = proc->getChildName(_node);
1277 CommandAddOutputPortFromCatalog *command = new CommandAddOutputPortFromCatalog(catalog,
1281 if (command->execute())
1283 GuiContext::getCurrent()->getInvoc()->add(command);
1284 OutputPort * port = command->getOutputPort();
1285 SubjectOutputPort *son = addSubjectOutputPort(port, name);
1288 else delete command;
1292 SubjectDataPort* SubjectElementaryNode::addIDSPort(YACS::ENGINE::Catalog *catalog, std::string type, std::string name)
1294 DEBTRACE("SubjectElementaryNode::addIDSPort( " << catalog << ", " << type << ", " << name << " )");
1295 Proc *proc = GuiContext::getCurrent()->getProc();
1296 string position = "";
1297 if (proc != dynamic_cast<Proc*>(_node)) position = proc->getChildName(_node);
1299 CommandAddIDSPortFromCatalog *command = new CommandAddIDSPortFromCatalog(catalog,
1303 if (command->execute())
1305 GuiContext::getCurrent()->getInvoc()->add(command);
1306 InputDataStreamPort * port = command->getIDSPort();
1307 SubjectInputDataStreamPort *son = addSubjectIDSPort(port, name);
1310 else delete command;
1314 SubjectDataPort* SubjectElementaryNode::addODSPort(YACS::ENGINE::Catalog *catalog, std::string type, std::string name)
1316 DEBTRACE("SubjectElementaryNode::addODSPort( " << catalog << ", " << type << ", " << name << " )");
1317 Proc *proc = GuiContext::getCurrent()->getProc();
1318 string position = "";
1319 if (proc != dynamic_cast<Proc*>(_node)) position = proc->getChildName(_node);
1321 CommandAddODSPortFromCatalog *command = new CommandAddODSPortFromCatalog(catalog,
1325 if (command->execute())
1327 GuiContext::getCurrent()->getInvoc()->add(command);
1328 OutputDataStreamPort * port = command->getODSPort();
1329 SubjectOutputDataStreamPort *son = addSubjectODSPort(port, name);
1332 else delete command;
1336 void SubjectElementaryNode::removePort(SubjectDataPort* port)
1338 DEBTRACE("SubjectElementaryNode::removePort " << port->getName());
1339 if (SubjectInputPort* inp = dynamic_cast<SubjectInputPort*>(port))
1342 _listSubjectInputPort.remove(inp);
1344 else if(SubjectOutputPort* outp = dynamic_cast<SubjectOutputPort*>(port))
1347 _listSubjectOutputPort.remove(outp);
1349 if (SubjectInputDataStreamPort* idsp = dynamic_cast<SubjectInputDataStreamPort*>(port))
1352 _listSubjectIDSPort.remove(idsp);
1354 else if(SubjectOutputDataStreamPort* odsp = dynamic_cast<SubjectOutputDataStreamPort*>(port))
1357 _listSubjectODSPort.remove(odsp);
1361 void SubjectElementaryNode::loadChildren()
1363 list<InputPort*> listInputPorts = _elementaryNode->getLocalInputPorts();
1364 list<OutputPort*> listOutputPorts = _elementaryNode->getLocalOutputPorts();
1365 list<InputDataStreamPort*> listIDSPorts = _elementaryNode->getSetOfInputDataStreamPort();
1366 list<OutputDataStreamPort*> listODSPorts = _elementaryNode->getSetOfOutputDataStreamPort();
1367 if (SplitterNode *splitterNode = dynamic_cast<SplitterNode*>(_elementaryNode))
1368 listInputPorts.push_back(splitterNode->getFather()->getInputPort("SmplsCollection"));
1369 list<InputPort*>::const_iterator iti;
1370 for (iti = listInputPorts.begin(); iti != listInputPorts.end(); ++iti)
1371 addSubjectInputPort(*iti);
1372 list<OutputPort*>::const_iterator ito;
1373 for (ito = listOutputPorts.begin(); ito != listOutputPorts.end(); ++ito)
1374 addSubjectOutputPort(*ito);
1375 list<InputDataStreamPort*>::const_iterator itids;
1376 for (itids = listIDSPorts.begin(); itids != listIDSPorts.end(); ++itids)
1377 addSubjectIDSPort(*itids);
1378 list<OutputDataStreamPort*>::const_iterator itods;
1379 for (itods = listODSPorts.begin(); itods != listODSPorts.end(); ++itods)
1380 addSubjectODSPort(*itods);
1383 // ----------------------------------------------------------------------------
1386 SubjectInlineNode::SubjectInlineNode(YACS::ENGINE::InlineNode *inlineNode, Subject *parent)
1387 : SubjectElementaryNode(inlineNode, parent), _inlineNode(inlineNode)
1391 SubjectInlineNode::~SubjectInlineNode()
1393 DEBTRACE("SubjectInlineNode::~SubjectInlineNode " << getName());
1396 bool SubjectInlineNode::setScript(std::string script)
1398 Proc *proc = GuiContext::getCurrent()->getProc();
1399 CommandSetInlineNodeScript *command =
1400 new CommandSetInlineNodeScript(proc->getChildName(_node), script);
1401 if (command->execute())
1403 GuiContext::getCurrent()->getInvoc()->add(command);
1406 else delete command;
1410 std::string SubjectInlineNode::getScript()
1412 return _inlineNode->getScript();
1415 void SubjectInlineNode::clean()
1418 SubjectElementaryNode::clean();
1421 void SubjectInlineNode::localClean()
1423 DEBTRACE("SubjectInlineNode::localClean ");
1427 // ----------------------------------------------------------------------------
1429 SubjectServiceNode::SubjectServiceNode(YACS::ENGINE::ServiceNode *serviceNode, Subject *parent)
1430 : SubjectElementaryNode(serviceNode, parent), _serviceNode(serviceNode)
1432 _subjectReference=0;
1435 SubjectServiceNode::~SubjectServiceNode()
1437 DEBTRACE("SubjectServiceNode::~SubjectServiceNode " << getName());
1440 void SubjectServiceNode::clean()
1443 SubjectElementaryNode::clean();
1446 void SubjectServiceNode::localClean()
1448 DEBTRACE("SubjectServiceNode::localClean ");
1449 if (_subjectReference)
1451 update( REMOVE, REFERENCE, _subjectReference );
1452 erase( _subjectReference );
1453 _subjectReference = 0;
1459 * When cloning a service node from a catalog, create the component associated to the node,
1460 * if not already existing, and create the corresponding subject.
1462 void SubjectServiceNode::setComponentFromCatalog(YACS::ENGINE::Catalog *catalog,
1464 std::string service)
1466 DEBTRACE("SubjectServiceNode::setComponent " << compo);
1467 if (catalog->_componentMap.count(compo))
1469 YACS::ENGINE::ComponentDefinition* compodef = catalog->_componentMap[compo];
1470 if (compodef->_serviceMap.count(service))
1472 Proc* proc = GuiContext::getCurrent()->getProc();
1473 ComponentInstance *instance = 0;
1474 instance = new SalomeComponent(compo);
1475 pair<string,int> key = pair<string,int>(compo, instance->getNumId());
1476 proc->componentInstanceMap[key] = instance;
1477 SubjectComponent* subCompo = GuiContext::getCurrent()->getSubjectProc()->addSubjectComponent(instance);
1479 addSubjectReference(subCompo);
1480 _serviceNode->setComponent(instance);
1486 * When loading scheme from file, get the component associated to the node, if any,
1487 * and create the corresponding subject.
1489 void SubjectServiceNode::setComponent()
1491 ComponentInstance *instance = _serviceNode->getComponent();
1494 Proc* proc = GuiContext::getCurrent()->getProc();
1495 string compo = instance->getCompoName();
1496 SubjectComponent* subCompo = 0;
1497 if (! GuiContext::getCurrent()->_mapOfSubjectComponent.count(instance))
1499 DEBTRACE("SubjectServiceNode::setComponent : create subject for compo = " << compo.c_str());
1500 pair<string,int> key = pair<string,int>(compo, instance->getNumId());
1501 proc->componentInstanceMap[key] = instance;
1503 GuiContext::getCurrent()->getSubjectProc()->addSubjectComponent(instance);
1507 DEBTRACE("SubjectServiceNode::setComponent : get already created subject for compo = " <<compo.c_str());
1508 subCompo = GuiContext::getCurrent()->_mapOfSubjectComponent[instance];
1511 addSubjectReference(subCompo);
1515 void SubjectServiceNode::associateToComponent(SubjectComponent *subcomp)
1517 DEBTRACE("SubjectServiceNode::associateToComponent " << getName() << " " << subcomp->getName());
1518 SubjectReference* oldSReference = _subjectReference;
1519 string aName = GuiContext::getCurrent()->getProc()->getChildName(_serviceNode);
1520 CommandAssociateServiceToComponent *command =
1521 new CommandAssociateServiceToComponent(aName, subcomp->getKey());
1522 if (command->execute())
1524 if (oldSReference) removeSubjectReference(oldSReference);
1525 GuiContext::getCurrent()->getInvoc()->add(command);
1526 addSubjectReference(subcomp);
1528 else delete command;
1531 void SubjectServiceNode::removeSubjectReference(Subject *ref)
1533 DEBTRACE("Subject::removeSubjectReference " << getName() << " " << ref->getName());
1534 update( REMOVE, REFERENCE, ref );
1538 void SubjectServiceNode::addSubjectReference(Subject *ref)
1540 DEBTRACE("Subject::addSubjectReference " << getName() << " " << ref->getName());
1541 SubjectReference *son = new SubjectReference(ref, this);
1542 _subjectReference = son;
1543 update(ADDREF, 0, son);
1546 SubjectReference* SubjectServiceNode::getSubjectReference()
1548 return _subjectReference;
1551 // ----------------------------------------------------------------------------
1553 SubjectPythonNode::SubjectPythonNode(YACS::ENGINE::PythonNode *pythonNode, Subject *parent)
1554 : SubjectInlineNode(pythonNode, parent), _pythonNode(pythonNode)
1558 SubjectPythonNode::~SubjectPythonNode()
1560 DEBTRACE("SubjectPythonNode::~SubjectPythonNode " << getName());
1563 void SubjectPythonNode::clean()
1566 SubjectInlineNode::clean();
1569 void SubjectPythonNode::localClean()
1571 DEBTRACE("SubjectPythonNode::localClean ");
1575 // ----------------------------------------------------------------------------
1577 SubjectPyFuncNode::SubjectPyFuncNode(YACS::ENGINE::PyFuncNode *pyFuncNode, Subject *parent)
1578 : SubjectInlineNode(pyFuncNode, parent), _pyFuncNode(pyFuncNode)
1582 SubjectPyFuncNode::~SubjectPyFuncNode()
1584 DEBTRACE("SubjectPyFuncNode::~SubjectPyFuncNode " << getName());
1587 bool SubjectPyFuncNode::setFunctionName(std::string funcName)
1589 Proc *proc = GuiContext::getCurrent()->getProc();
1590 CommandSetFuncNodeFunctionName *command =
1591 new CommandSetFuncNodeFunctionName(proc->getChildName(_node), funcName);
1592 if (command->execute())
1594 GuiContext::getCurrent()->getInvoc()->add(command);
1597 else delete command;
1601 void SubjectPyFuncNode::clean()
1604 SubjectInlineNode::clean();
1607 void SubjectPyFuncNode::localClean()
1609 DEBTRACE("SubjectPyFuncNode::localClean ");
1613 // ----------------------------------------------------------------------------
1615 SubjectCORBANode::SubjectCORBANode(YACS::ENGINE::CORBANode *corbaNode, Subject *parent)
1616 : SubjectServiceNode(corbaNode, parent), _corbaNode(corbaNode)
1620 SubjectCORBANode::~SubjectCORBANode()
1622 DEBTRACE("SubjectCORBANode::~SubjectCORBANode " << getName());
1625 void SubjectCORBANode::clean()
1628 SubjectServiceNode::clean();
1631 void SubjectCORBANode::localClean()
1633 DEBTRACE("SubjectCORBANode::localClean ");
1637 // ----------------------------------------------------------------------------
1639 SubjectCppNode::SubjectCppNode(YACS::ENGINE::CppNode *cppNode, Subject *parent)
1640 : SubjectServiceNode(cppNode, parent), _cppNode(cppNode)
1644 SubjectCppNode::~SubjectCppNode()
1646 DEBTRACE("SubjectCppNode::~SubjectCppNode " << getName());
1649 void SubjectCppNode::clean()
1652 SubjectServiceNode::clean();
1655 void SubjectCppNode::localClean()
1657 DEBTRACE("SubjectCppNode::localClean ");
1661 // ----------------------------------------------------------------------------
1663 SubjectSalomeNode::SubjectSalomeNode(YACS::ENGINE::SalomeNode *salomeNode, Subject *parent)
1664 : SubjectServiceNode(salomeNode, parent), _salomeNode(salomeNode)
1668 SubjectSalomeNode::~SubjectSalomeNode()
1670 DEBTRACE("SubjectSalomeNode::~SubjectSalomeNode " << getName());
1673 void SubjectSalomeNode::clean()
1676 SubjectServiceNode::clean();
1679 void SubjectSalomeNode::localClean()
1681 DEBTRACE("SubjectSalomeNode::localClean ");
1685 // ----------------------------------------------------------------------------
1687 SubjectSalomePythonNode::SubjectSalomePythonNode(YACS::ENGINE::SalomePythonNode *salomePythonNode,
1689 : SubjectServiceNode(salomePythonNode, parent), _salomePythonNode(salomePythonNode)
1693 SubjectSalomePythonNode::~SubjectSalomePythonNode()
1695 DEBTRACE("SubjectSalomePythonNode::~SubjectSalomePythonNode " << getName());
1698 void SubjectSalomePythonNode::clean()
1701 SubjectServiceNode::clean();
1704 void SubjectSalomePythonNode::localClean()
1706 DEBTRACE("SubjectSalomePythonNode::localClean ");
1710 // ----------------------------------------------------------------------------
1712 SubjectXmlNode::SubjectXmlNode(YACS::ENGINE::XmlNode *xmlNode, Subject *parent)
1713 : SubjectServiceNode(xmlNode, parent), _xmlNode(xmlNode)
1717 SubjectXmlNode::~SubjectXmlNode()
1719 DEBTRACE("SubjectXmlNode::~SubjectXmlNode " << getName());
1722 void SubjectXmlNode::clean()
1725 SubjectServiceNode::clean();
1728 void SubjectXmlNode::localClean()
1730 DEBTRACE("SubjectXmlNode::localClean ");
1734 // ----------------------------------------------------------------------------
1736 SubjectSplitterNode::SubjectSplitterNode(YACS::ENGINE::SplitterNode *splitterNode, Subject *parent)
1737 : SubjectElementaryNode(splitterNode, parent), _splitterNode(splitterNode)
1739 _destructible = false;
1742 SubjectSplitterNode::~SubjectSplitterNode()
1744 DEBTRACE("SubjectSplitterNode::~SubjectSplitterNode " << getName());
1747 void SubjectSplitterNode::clean()
1750 SubjectElementaryNode::clean();
1753 void SubjectSplitterNode::localClean()
1755 DEBTRACE("SubjectSplitterNode::localClean ");
1759 std::string SubjectSplitterNode::getName()
1764 // ----------------------------------------------------------------------------
1766 SubjectDataNode::SubjectDataNode(YACS::ENGINE::DataNode *dataNode, Subject *parent)
1767 : SubjectElementaryNode(dataNode, parent), _dataNode(dataNode)
1769 _destructible = true;
1772 SubjectDataNode::~SubjectDataNode()
1774 DEBTRACE("SubjectDataNode::~SubjectDataNode " << getName());
1777 void SubjectDataNode::clean()
1780 SubjectElementaryNode::clean();
1783 void SubjectDataNode::localClean()
1785 DEBTRACE("SubjectDataNode::localClean ");
1788 // ----------------------------------------------------------------------------
1790 SubjectPresetNode::SubjectPresetNode(YACS::ENGINE::PresetNode *presetNode, Subject *parent)
1791 : SubjectDataNode(presetNode, parent), _presetNode(presetNode)
1793 _destructible = true;
1796 SubjectPresetNode::~SubjectPresetNode()
1798 DEBTRACE("SubjectPresetNode::~SubjectPresetNode " << getName());
1801 void SubjectPresetNode::clean()
1804 SubjectDataNode::clean();
1807 void SubjectPresetNode::localClean()
1809 DEBTRACE("SubjectPresetNode::localClean ");
1812 // ----------------------------------------------------------------------------
1814 SubjectOutNode::SubjectOutNode(YACS::ENGINE::OutNode *outNode, Subject *parent)
1815 : SubjectDataNode(outNode, parent), _outNode(outNode)
1817 _destructible = true;
1820 SubjectOutNode::~SubjectOutNode()
1822 DEBTRACE("SubjectOutNode::~SubjectOutNode " << getName());
1825 void SubjectOutNode::clean()
1828 SubjectDataNode::clean();
1831 void SubjectOutNode::localClean()
1833 DEBTRACE("SubjectOutNode::localClean ");
1836 // ----------------------------------------------------------------------------
1838 SubjectStudyInNode::SubjectStudyInNode(YACS::ENGINE::StudyInNode *studyInNode, Subject *parent)
1839 : SubjectDataNode(studyInNode, parent), _studyInNode(studyInNode)
1841 _destructible = true;
1844 SubjectStudyInNode::~SubjectStudyInNode()
1846 DEBTRACE("SubjectStudyInNode::~SubjectStudyInNode " << getName());
1849 void SubjectStudyInNode::clean()
1852 SubjectDataNode::clean();
1855 void SubjectStudyInNode::localClean()
1857 DEBTRACE("SubjectStudyInNode::localClean ");
1860 // ----------------------------------------------------------------------------
1862 SubjectStudyOutNode::SubjectStudyOutNode(YACS::ENGINE::StudyOutNode *studyOutNode, Subject *parent)
1863 : SubjectDataNode(studyOutNode, parent), _studyOutNode(studyOutNode)
1865 _destructible = true;
1868 SubjectStudyOutNode::~SubjectStudyOutNode()
1870 DEBTRACE("SubjectStudyOutNode::~SubjectStudyOutNode " << getName());
1873 void SubjectStudyOutNode::clean()
1876 SubjectDataNode::clean();
1879 void SubjectStudyOutNode::localClean()
1881 DEBTRACE("SubjectStudyOutNode::localClean ");
1884 // ----------------------------------------------------------------------------
1886 SubjectForLoop::SubjectForLoop(YACS::ENGINE::ForLoop *forLoop, Subject *parent)
1887 : SubjectComposedNode(forLoop, parent), _forLoop(forLoop)
1892 SubjectForLoop::~SubjectForLoop()
1894 DEBTRACE("SubjectForLoop::~SubjectForLoop " << getName());
1897 void SubjectForLoop::clean()
1900 SubjectComposedNode::clean();
1903 void SubjectForLoop::localClean()
1905 DEBTRACE("SubjectForLoop::localClean ");
1911 SubjectNode* SubjectForLoop::addNode(YACS::ENGINE::Catalog *catalog,
1916 DEBTRACE("SubjectForLoop::addNode(catalog, compo, type, name)");
1917 SubjectNode* body = 0;
1918 if (_body) return body;
1919 body = createNode(catalog, compo, type, name);
1923 void SubjectForLoop::completeChildrenSubjectList(SubjectNode *son)
1928 // ----------------------------------------------------------------------------
1930 SubjectWhileLoop::SubjectWhileLoop(YACS::ENGINE::WhileLoop *whileLoop, Subject *parent)
1931 : SubjectComposedNode(whileLoop, parent), _whileLoop(whileLoop)
1936 SubjectWhileLoop::~SubjectWhileLoop()
1938 DEBTRACE("SubjectWhileLoop::~SubjectWhileLoop " << getName());
1941 void SubjectWhileLoop::clean()
1944 SubjectComposedNode::clean();
1947 void SubjectWhileLoop::localClean()
1949 DEBTRACE("SubjectWhileLoop::localClean ");
1954 SubjectNode* SubjectWhileLoop::addNode(YACS::ENGINE::Catalog *catalog,
1959 DEBTRACE("SubjectWhileLoop::addNode(catalog, compo, type, name)");
1960 SubjectNode* body = 0;
1961 if (_body) return body;
1962 body = createNode(catalog, compo, type, name);
1966 void SubjectWhileLoop::completeChildrenSubjectList(SubjectNode *son)
1971 // ----------------------------------------------------------------------------
1973 SubjectSwitch::SubjectSwitch(YACS::ENGINE::Switch *aSwitch, Subject *parent)
1974 : SubjectComposedNode(aSwitch, parent), _switch(aSwitch)
1979 SubjectSwitch::~SubjectSwitch()
1981 DEBTRACE("SubjectSwitch::~SubjectSwitch " << getName());
1984 void SubjectSwitch::clean()
1987 SubjectComposedNode::clean();
1990 void SubjectSwitch::localClean()
1992 DEBTRACE("SubjectSwitch::localClean ");
1993 map<int, SubjectNode*>::iterator it;
1994 for (it = _bodyMap.begin(); it != _bodyMap.end(); ++it)
1995 erase((*it).second);
1998 SubjectNode* SubjectSwitch::addNode(YACS::ENGINE::Catalog *catalog,
2005 DEBTRACE("SubjectSwitch::addNode("<<catalog<<","<<compo<<","<<type<<","<<name<<","<<swCase<<","<<(int)replace<<")");
2006 SubjectNode* body = 0;
2007 if (!replace && _bodyMap.count(swCase)) return body;
2008 body = createNode(catalog, compo, type, name, swCase);
2012 void SubjectSwitch::removeNode(SubjectNode* son)
2014 DEBTRACE("SubjectSwitch::removeNode("<<son->getName()<<")");
2018 bool isFound = false;
2019 map<int, SubjectNode*>::const_iterator it;
2020 for (it = _bodyMap.begin(); it != _bodyMap.end(); ++it)
2022 if ( (*it).second == son )
2031 DEBTRACE("id = "<<id);
2037 std::map<int, SubjectNode*> SubjectSwitch::getBodyMap()
2042 void SubjectSwitch::completeChildrenSubjectList(SubjectNode *son)
2044 _bodyMap[_switch->getRankOfNode(son->getNode())] = son;
2047 SubjectNode* SubjectSwitch::getChild(YACS::ENGINE::Node* node) const
2049 SubjectNode* aChild = 0;
2053 map<int, SubjectNode*>::const_iterator it;
2054 for (it = _bodyMap.begin(); it != _bodyMap.end(); ++it)
2055 if ( (*it).second->getNode() == node )
2057 aChild = (*it).second;
2065 // ----------------------------------------------------------------------------
2067 SubjectForEachLoop::SubjectForEachLoop(YACS::ENGINE::ForEachLoop *forEachLoop, Subject *parent)
2068 : SubjectComposedNode(forEachLoop, parent), _forEachLoop(forEachLoop)
2074 SubjectForEachLoop::~SubjectForEachLoop()
2076 DEBTRACE("SubjectForEachLoop::~SubjectForEachLoop " << getName());
2079 void SubjectForEachLoop::clean()
2081 Node* aSplitterEngine = 0;
2082 if (_splitter) aSplitterEngine = _splitter->getNode();
2085 SubjectComposedNode::clean();
2087 if (_forEachLoop && aSplitterEngine)
2089 DEBTRACE("SubjectForEachLoop::clean: remove for each loop splitter");
2090 _forEachLoop->edRemoveChild(aSplitterEngine);
2094 void SubjectForEachLoop::localClean()
2096 DEBTRACE("SubjectForEachLoop::localClean ");
2099 DEBTRACE(_body->getName());
2104 DEBTRACE(_splitter->getName());
2110 SubjectNode* SubjectForEachLoop::addNode(YACS::ENGINE::Catalog *catalog,
2115 DEBTRACE("SubjectForEachLoop::addNode(catalog, compo, type, name)");
2116 SubjectNode* body = 0;
2117 if (_body) return body;
2118 body = createNode(catalog, compo, type, name);
2122 void SubjectForEachLoop::completeChildrenSubjectList(SubjectNode *son)
2130 string name = son->getName();
2131 DEBTRACE("SubjectForEachLoop::completeChildrenSubjectList " << name);
2132 if (name == ForEachLoop::NAME_OF_SPLITTERNODE)
2139 // ----------------------------------------------------------------------------
2141 SubjectOptimizerLoop::SubjectOptimizerLoop(YACS::ENGINE::OptimizerLoop *optimizerLoop,
2143 : SubjectComposedNode(optimizerLoop, parent), _optimizerLoop(optimizerLoop)
2148 SubjectOptimizerLoop::~SubjectOptimizerLoop()
2150 DEBTRACE("SubjectOptimizerLoop::~SubjectOptimizerLoop " << getName());
2153 void SubjectOptimizerLoop::clean()
2156 SubjectComposedNode::clean();
2159 void SubjectOptimizerLoop::localClean()
2161 DEBTRACE("SubjectOptimizerLoop::localClean ");
2166 SubjectNode* SubjectOptimizerLoop::addNode(YACS::ENGINE::Catalog *catalog,
2171 DEBTRACE("SubjectOptimizerLoop::addNode(catalog, compo, type, name)");
2172 SubjectNode* body = 0;
2173 if (_body) return body;
2174 body = createNode(catalog, compo, type, name);
2178 void SubjectOptimizerLoop::completeChildrenSubjectList(SubjectNode *son)
2183 // ----------------------------------------------------------------------------
2185 SubjectDataPort::SubjectDataPort(YACS::ENGINE::DataPort* port, Subject *parent)
2186 : Subject(parent), _dataPort(port)
2188 _listSubjectLink.clear();
2191 SubjectDataPort::~SubjectDataPort()
2193 DEBTRACE("SubjectDataPort::~SubjectDataPort " << getName());
2194 if (isDestructible())
2196 Node* node = _dataPort->getNode();
2198 ElementaryNode * father = dynamic_cast<ElementaryNode*>(node);
2201 DEBTRACE("father->edRemovePort(_dataPort)");
2204 father->edRemovePort(_dataPort);
2206 catch (YACS::Exception &e)
2208 DEBTRACE("------------------------------------------------------------------------------");
2209 DEBTRACE("SubjectDataPort::~SubjectDataPort: father->edRemovePort: YACS exception " << e.what());
2210 DEBTRACE("------------------------------------------------------------------------------");
2216 void SubjectDataPort::clean()
2222 void SubjectDataPort::localClean()
2224 DEBTRACE("SubjectDataPort::localClean ");
2225 list<SubjectLink*> lsl = getListOfSubjectLink();
2226 for (list<SubjectLink*>::iterator it = lsl.begin(); it != lsl.end(); ++it)
2230 std::string SubjectDataPort::getName()
2232 return _dataPort->getName();
2235 YACS::ENGINE::DataPort* SubjectDataPort::getPort()
2240 bool SubjectDataPort::tryCreateLink(SubjectDataPort *subOutport, SubjectDataPort *subInport)
2242 DEBTRACE("SubjectDataPort::tryCreateLink");
2243 Proc *proc = GuiContext::getCurrent()->getProc();
2245 string outNodePos = "";
2246 SubjectNode *sno = dynamic_cast<SubjectNode*>(subOutport->getParent());
2248 Node *outNode = sno->getNode();
2249 outNodePos = proc->getChildName(outNode);
2250 string outportName = subOutport->getName();
2252 string inNodePos = "";
2253 SubjectNode *sni = dynamic_cast<SubjectNode*>(subInport->getParent());
2255 Node *inNode = sni->getNode();
2256 inNodePos = proc->getChildName(inNode);
2257 string inportName = subInport->getName();
2259 CommandAddLink *command = new CommandAddLink(outNodePos, outportName,
2260 inNodePos, inportName);
2261 if (command->execute())
2263 GuiContext::getCurrent()->getInvoc()->add(command);
2265 ComposedNode *cla = ComposedNode::getLowestCommonAncestor(outNode->getFather(),
2266 inNode->getFather());
2267 SubjectComposedNode *scla = dynamic_cast<SubjectComposedNode*>(sno->getParent());
2268 ComposedNode *ancestor = outNode->getFather();
2269 while (ancestor && ancestor != cla)
2271 ancestor = ancestor->getFather();
2272 scla = dynamic_cast<SubjectComposedNode*>(scla->getParent());
2275 DEBTRACE(scla->getName());
2276 scla->addSubjectLink(sno, subOutport, sni, subInport);
2286 // ----------------------------------------------------------------------------
2288 SubjectInputPort::SubjectInputPort(YACS::ENGINE::InputPort *port, Subject *parent)
2289 : SubjectDataPort(port, parent), _inputPort(port)
2291 Node *node = _inputPort->getNode();
2292 if (ForLoop* forloop = dynamic_cast<ForLoop*>(node))
2294 if (_inputPort->getName() == "nsteps") _destructible = false;
2296 else if (WhileLoop* whileloop = dynamic_cast<WhileLoop*>(node))
2298 if (_inputPort->getName() == "condition") _destructible = false;
2300 else if (Switch* aSwitch = dynamic_cast<Switch*>(node))
2302 if (_inputPort->getName() == "select") _destructible = false;
2304 else if (ForEachLoop* foreach = dynamic_cast<ForEachLoop*>(node))
2306 if (_inputPort->getName() == "nbBranches") _destructible = false;
2308 else if (OptimizerLoop* optil = dynamic_cast<OptimizerLoop*>(node))
2310 if (_inputPort->getName() == "nbBranches") _destructible = false;
2312 else if (SplitterNode* split = dynamic_cast<SplitterNode*>(node))
2314 if (_inputPort->getName() == "SmplsCollection") _destructible = false;
2319 SubjectInputPort::~SubjectInputPort()
2321 DEBTRACE("SubjectInputPort::~SubjectInputPort " << getName());
2324 void SubjectInputPort::clean()
2327 SubjectDataPort::clean();
2330 void SubjectInputPort::localClean()
2332 DEBTRACE("SubjectInputPort::localClean ");
2335 SubjectElementaryNode* elem = dynamic_cast<SubjectElementaryNode*>(_parent);
2336 if (elem) elem->removePort(this);
2340 // ----------------------------------------------------------------------------
2342 SubjectOutputPort::SubjectOutputPort(YACS::ENGINE::OutputPort *port, Subject *parent)
2343 : SubjectDataPort(port, parent), _outputPort(port)
2345 Node *node = _outputPort->getNode();
2346 if (ForEachLoop* foreach = dynamic_cast<ForEachLoop*>(node))
2348 if (_outputPort->getName() == "SmplPrt") _destructible = false;
2350 else if (OptimizerLoop* optil = dynamic_cast<OptimizerLoop*>(node))
2352 if (_outputPort->getName() == "SmplPrt") _destructible = false;
2356 SubjectOutputPort::~SubjectOutputPort()
2358 DEBTRACE("SubjectOutputPort::~SubjectOutputPort " << getName());
2361 void SubjectOutputPort::clean()
2364 SubjectDataPort::clean();
2367 void SubjectOutputPort::localClean()
2369 DEBTRACE("SubjectOutputPort::localClean ");
2372 SubjectElementaryNode* elem = dynamic_cast<SubjectElementaryNode*>(_parent);
2373 if (elem) elem->removePort(this);
2377 // ----------------------------------------------------------------------------
2379 SubjectInputDataStreamPort::SubjectInputDataStreamPort(YACS::ENGINE::InputDataStreamPort *port,
2381 : SubjectDataPort(port, parent), _inputDataStreamPort(port)
2385 SubjectInputDataStreamPort::~SubjectInputDataStreamPort()
2387 DEBTRACE("SubjectInputDataStreamPort::~SubjectInputDataStreamPort " << getName());
2390 std::map<std::string, std::string> SubjectInputDataStreamPort::getProperties()
2392 return _inputDataStreamPort->getPropertyMap();
2395 bool SubjectInputDataStreamPort::setProperties(std::map<std::string, std::string> properties)
2397 Proc *proc = GuiContext::getCurrent()->getProc();
2398 CommandSetDSPortProperties *command =
2399 new CommandSetDSPortProperties(proc->getChildName(getPort()->getNode()), getName(), true, properties);
2400 if (command->execute())
2402 GuiContext::getCurrent()->getInvoc()->add(command);
2405 else delete command;
2409 void SubjectInputDataStreamPort::clean()
2412 SubjectDataPort::clean();
2415 void SubjectInputDataStreamPort::localClean()
2417 DEBTRACE("SubjectInputDataStreamPort::localClean ");
2420 // ----------------------------------------------------------------------------
2422 SubjectOutputDataStreamPort::SubjectOutputDataStreamPort(YACS::ENGINE::OutputDataStreamPort *port,
2424 : SubjectDataPort(port, parent), _outputDataStreamPort(port)
2428 SubjectOutputDataStreamPort::~SubjectOutputDataStreamPort()
2430 DEBTRACE("SubjectOutputDataStreamPort::~SubjectOutputDataStreamPort " << getName());
2433 std::map<std::string, std::string> SubjectOutputDataStreamPort::getProperties()
2435 return _outputDataStreamPort->getPropertyMap();
2438 bool SubjectOutputDataStreamPort::setProperties(std::map<std::string, std::string> properties)
2440 Proc *proc = GuiContext::getCurrent()->getProc();
2441 CommandSetDSPortProperties *command =
2442 new CommandSetDSPortProperties(proc->getChildName(getPort()->getNode()), getName(), false, properties);
2443 if (command->execute())
2445 GuiContext::getCurrent()->getInvoc()->add(command);
2448 else delete command;
2452 void SubjectOutputDataStreamPort::clean()
2455 SubjectDataPort::clean();
2458 void SubjectOutputDataStreamPort::localClean()
2460 DEBTRACE("SubjectOutputDataStreamPort::localClean ");
2463 // ----------------------------------------------------------------------------
2465 SubjectLink::SubjectLink(SubjectNode* subOutNode,
2466 SubjectDataPort* outPort,
2467 SubjectNode* subInNode,
2468 SubjectDataPort* inPort,
2471 _subOutNode(subOutNode), _outPort(outPort), _subInNode(subInNode), _inPort(inPort)
2474 ComposedNode *cla = ComposedNode::getLowestCommonAncestor(_subOutNode->getNode()->getFather(),
2475 _subInNode->getNode()->getFather());
2476 DEBTRACE(_subOutNode->getName() << "." << _outPort->getName());
2477 DEBTRACE(_subInNode->getName() << "." << _inPort->getName());
2478 DEBTRACE(cla->getName());
2479 _name += cla->getChildName(_subOutNode->getNode());
2480 _name += "." + _outPort->getName();
2482 _name += cla->getChildName(_subInNode->getNode());
2483 _name += "." + _inPort->getName();
2484 DEBTRACE("SubjectLink::SubjectLink " << _name);
2487 SubjectLink::~SubjectLink()
2489 DEBTRACE("SubjectLink::~SubjectLink " << getName());
2492 void SubjectLink::clean()
2498 void SubjectLink::localClean()
2500 DEBTRACE("SubjectLink::localClean ");
2503 DEBTRACE("clean link: " << _parent->getName() << " " << getName());
2504 SubjectComposedNode* father = dynamic_cast<SubjectComposedNode*>(_parent);
2506 father->removeLink(this); // --- clean subjects first
2507 _cla = dynamic_cast<ComposedNode*>(father->getNode());
2509 _outp = dynamic_cast<OutPort*>(_outPort->getPort());
2511 _inp = dynamic_cast<InPort*>(_inPort->getPort());
2513 if (isDestructible())
2514 _cla->edRemoveLink(_outp, _inp);
2518 std::string SubjectLink::getName()
2522 // ----------------------------------------------------------------------------
2524 SubjectControlLink::SubjectControlLink(SubjectNode* subOutNode,
2525 SubjectNode* subInNode,
2528 _subOutNode(subOutNode), _subInNode(subInNode)
2531 ComposedNode *cla = ComposedNode::getLowestCommonAncestor(_subOutNode->getNode()->getFather(),
2532 _subInNode->getNode()->getFather());
2533 DEBTRACE(_subOutNode->getName());
2534 DEBTRACE(_subInNode->getName());
2535 DEBTRACE(cla->getName());
2536 _name += cla->getChildName(_subOutNode->getNode());
2538 _name += cla->getChildName(_subInNode->getNode());
2539 DEBTRACE("SubjectControlLink::SubjectControlLink " << _name);
2542 SubjectControlLink::~SubjectControlLink()
2544 DEBTRACE("SubjectControlLink::~SubjectControlLink " << getName());
2545 if (isDestructible())
2550 _cla->edRemoveCFLink(_subOutNode->getNode(), _subInNode->getNode());
2552 catch (YACS::Exception &e)
2554 DEBTRACE("------------------------------------------------------------------------------");
2555 DEBTRACE("SubjectControlLink::~SubjectControlLink: edRemoveLink YACS exception " << e.what());
2556 DEBTRACE("------------------------------------------------------------------------------");
2561 void SubjectControlLink::clean()
2567 void SubjectControlLink::localClean()
2569 DEBTRACE("SubjectControlLink::localClean ");
2572 DEBTRACE("clean control link: " << _parent->getName() << " " << getName());
2573 SubjectComposedNode* father = dynamic_cast<SubjectComposedNode*>(_parent);
2575 father->removeControlLink(this); // --- clean subjects first
2576 _cla = dynamic_cast<ComposedNode*>(father->getNode());
2581 std::string SubjectControlLink::getName()
2586 // ----------------------------------------------------------------------------
2588 SubjectComponent::SubjectComponent(YACS::ENGINE::ComponentInstance* component, Subject *parent)
2589 : Subject(parent), _compoInst(component)
2591 _compoInst->incrRef();
2594 SubjectComponent::~SubjectComponent()
2596 Proc* aProc = GuiContext::getCurrent()->getProc();
2599 pair<string,int> key = pair<string,int>(_compoInst->getCompoName(),_compoInst->getNumId());
2600 aProc->componentInstanceMap.erase(key);
2602 std::map<std::string, ServiceNode*>::iterator it = aProc->serviceMap.begin();
2603 for ( ; it!=aProc->serviceMap.end(); it++ )
2604 if ( (*it).second->getComponent() == _compoInst )
2605 (*it).second->setComponent(0);
2607 GuiContext::getCurrent()->_mapOfSubjectComponent.erase(_compoInst);
2609 //if ( SalomeComponent* aSalomeCompo = static_cast<SalomeComponent*>(_compoInst) )
2610 //delete aSalomeCompo;
2612 _compoInst->decrRef();
2615 void SubjectComponent::clean()
2621 void SubjectComponent::localClean()
2623 DEBTRACE("SubjectComponent::localClean ");
2626 std::string SubjectComponent::getName()
2628 DEBTRACE("SubjectComponent::getName()********************************************************************************");
2629 return _compoInst->getInstanceName();
2632 std::pair<std::string, int> SubjectComponent::getKey()
2634 std::pair<std::string, int> key = std::pair<std::string, int>(_compoInst->getCompoName(), _compoInst->getNumId());
2638 YACS::ENGINE::ComponentInstance* SubjectComponent::getComponent() const
2644 * When loading scheme from file, get the container associated to the component, if any,
2645 * and create the corresponding subject.
2647 void SubjectComponent::setContainer()
2649 DEBTRACE("SubjectComponent::setContainer " << getName());
2650 Container* container = _compoInst->getContainer();
2653 SubjectContainer *subContainer;
2654 if (GuiContext::getCurrent()->_mapOfSubjectContainer.find(container)
2656 GuiContext::getCurrent()->_mapOfSubjectContainer.end())
2658 GuiContext::getCurrent()->getSubjectProc()->addSubjectContainer(container, container->getName());
2660 subContainer = GuiContext::getCurrent()->_mapOfSubjectContainer[container];
2661 addSubjectReference(subContainer);
2665 void SubjectComponent::associateToContainer(SubjectContainer* subcont)
2667 DEBTRACE("SubjectComponent::associateToContainer " << getName() << subcont->getName());
2668 CommandAssociateComponentToContainer *command =
2669 new CommandAssociateComponentToContainer(getKey(), subcont->getName());
2670 if (command->execute())
2672 GuiContext::getCurrent()->getInvoc()->add(command);
2673 addSubjectReference(subcont);
2675 else delete command;
2678 // ----------------------------------------------------------------------------
2680 SubjectContainer::SubjectContainer(YACS::ENGINE::Container* container, Subject *parent)
2681 : Subject(parent), _container(container)
2685 SubjectContainer::~SubjectContainer()
2687 Proc* aProc = GuiContext::getCurrent()->getProc();
2690 aProc->containerMap.erase(_container->getName());
2692 map<ComponentInstance*,SubjectComponent*>::iterator it = GuiContext::getCurrent()->_mapOfSubjectComponent.begin();
2693 for ( ; it!=GuiContext::getCurrent()->_mapOfSubjectComponent.end(); it++ )
2694 if ( (*it).first && (*it).first->getContainer() == _container )
2696 (*it).first->setContainer(0);
2697 GuiContext::getCurrent()->getSubjectProc()->destroy((*it).second);
2700 GuiContext::getCurrent()->_mapOfSubjectContainer.erase(_container);
2704 std::map<std::string, std::string> SubjectContainer::getProperties()
2706 return _container->getProperties();
2709 bool SubjectContainer::setProperties(std::map<std::string, std::string> properties)
2711 CommandSetContainerProperties *command = new CommandSetContainerProperties(getName(), properties);
2712 if (command->execute())
2714 GuiContext::getCurrent()->getInvoc()->add(command);
2717 else delete command;
2721 void SubjectContainer::clean()
2727 void SubjectContainer::localClean()
2729 DEBTRACE("SubjectContainer::localClean ");
2732 std::string SubjectContainer::getName()
2734 return _container->getName();
2737 YACS::ENGINE::Container* SubjectContainer::getContainer() const
2742 // ----------------------------------------------------------------------------
2744 SubjectDataType::SubjectDataType(YACS::ENGINE::TypeCode *typeCode, Subject *parent)
2745 : Subject(parent), _typeCode(typeCode)
2749 SubjectDataType::~SubjectDataType()
2753 void SubjectDataType::clean()
2759 void SubjectDataType::localClean()
2761 DEBTRACE("SubjectDataType::localClean ");
2764 std::string SubjectDataType::getName()
2766 return _typeCode->name();
2769 YACS::ENGINE::TypeCode* SubjectDataType::getTypeCode()
2774 // ----------------------------------------------------------------------------