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 #ifndef __ELEMENTARYNODE_HXX__
21 #define __ELEMENTARYNODE_HXX__
23 #include "YACSlibEngineExport.hxx"
40 class InputDataStreamPort;
41 class OutputDataStreamPort;
43 class YACSLIBENGINE_EXPORT ElementaryNode : public Node, public Task
45 friend class ComposedNode;
47 std::list<InputPort *> _setOfInputPort;
48 std::list<OutputPort *> _setOfOutputPort;
49 std::list<InputDataStreamPort *> _setOfInputDataStreamPort;
50 std::list<OutputDataStreamPort *> _setOfOutputDataStreamPort;
52 // Management of multi property
53 bool _createDatastreamPorts;
54 bool _multi_port_node;
56 ElementaryNode(const std::string& name);
57 ElementaryNode(const ElementaryNode& other, ComposedNode *father);
58 void performDuplicationOfPlacement(const Node& other);
59 void performShallowDuplicationOfPlacement(const Node& other);
61 virtual ~ElementaryNode();
63 void init(bool start=true);
64 bool isDeployable() const;
65 ComponentInstance *getComponent();
66 const ComponentInstance *getComponent() const;
67 Container *getContainer();
68 YACS::StatesForNode getState() const;
69 void getReadyTasks(std::vector<Task *>& tasks);
70 void edRemovePort(Port *port) throw(Exception);
71 std::list<ElementaryNode *> getRecursiveConstituents() const;
72 std::list<ProgressWeight> getProgressWeight() const;
73 Node *getChildByName(const std::string& name) const throw(Exception);
74 virtual void checkBasicConsistency() const throw(Exception);
75 ComposedNode *getDynClonerIfExists(const ComposedNode *levelToStop) const;
76 int getNumberOfInputPorts() const;
77 int getNumberOfOutputPorts() const;
78 std::string getInPortName(const InPort *) const throw (Exception);
79 std::string getOutPortName(const OutPort *) const throw (Exception);
80 InputPort *getInputPort(const std::string& name) const throw(Exception);
81 OutputPort *getOutputPort(const std::string& name) const throw(Exception);
82 std::list<InputPort *> getSetOfInputPort() const { return _setOfInputPort; }
83 std::list<OutputPort *> getSetOfOutputPort() const { return _setOfOutputPort; }
84 std::list<InputPort *> getLocalInputPorts() const { return _setOfInputPort; }
85 std::list<OutputPort *> getLocalOutputPorts() const { return _setOfOutputPort; }
86 std::set<OutPort *> getAllOutPortsLeavingCurrentScope() const;
87 std::set<InPort *> getAllInPortsComingFromOutsideOfCurrentScope() const;
88 virtual std::vector< std::pair<OutPort *, InPort *> > getSetOfLinksLeavingCurrentScope() const;
89 virtual std::vector< std::pair<InPort *, OutPort *> > getSetOfLinksComingInCurrentScope() const;
90 std::list<InputDataStreamPort *> getSetOfInputDataStreamPort() const { return _setOfInputDataStreamPort; }
91 std::list<OutputDataStreamPort *> getSetOfOutputDataStreamPort() const { return _setOfOutputDataStreamPort; }
92 InputDataStreamPort *getInputDataStreamPort(const std::string& name) const throw(Exception);
93 OutputDataStreamPort *getOutputDataStreamPort(const std::string& name) const throw(Exception);
94 virtual InputPort *createInputPort(const std::string& inputPortName, TypeCode* type);
95 virtual OutputPort *createOutputPort(const std::string& outputPortName, TypeCode* type);
96 virtual InputDataStreamPort *createInputDataStreamPort(const std::string& inputPortDSName, TypeCode* type);
97 virtual OutputDataStreamPort *createOutputDataStreamPort(const std::string& outputPortDSName, TypeCode* type);
98 virtual InputPort *edAddInputPort(const std::string& inputPortName, TypeCode* type) throw(Exception);
99 virtual OutputPort *edAddOutputPort(const std::string& outputPortName, TypeCode* type) throw(Exception);
100 virtual InputDataStreamPort *edAddInputDataStreamPort(const std::string& inputPortDSName, TypeCode* type) throw(Exception);
101 virtual OutputDataStreamPort *edAddOutputDataStreamPort(const std::string& outputPortDSName, TypeCode* type) throw(Exception);
102 virtual void edOrderInputPorts(const std::list<InputPort*>& ports);
103 virtual void edOrderOutputPorts(const std::list<OutputPort*>& ports);
105 virtual std::string typeName() {return "YACS__ENGINE__ElementaryNode";}
106 virtual void edUpdateState();
107 virtual void ensureLoading();
109 int getMaxLevelOfParallelism() const { return 1; }
110 double getWeightRegardingDPL() const { return 0.; }
111 void partitionRegardingDPL(const PartDefinition *pd, std::map<ComposedNode *, YACS::BASES::AutoRefCnt<PartDefinition> >& zeMap) { }
120 virtual std::string getErrorDetails();
121 virtual void initService() { }
122 virtual void connectService() { }
123 virtual void disconnectService() { }
124 virtual void load() { }
125 virtual void getCoupledTasks(std::set<Task*>& coupledSet);
126 virtual void getCoupledNodes(std::set<Task*>& coupledSet);
127 void accept(Visitor *visitor);
129 // Used for runtime nodes that need
130 // to configure their services for the multi property
131 virtual void addDatastreamPortToInitMultiService(const std::string & port_name,
134 void initCommonPartWithoutStateManagement(bool start);
135 // Management of multi property
136 virtual void createMultiDatastreamPorts();
138 void edDisconnectAllLinksWithMe();
139 bool areAllInputPortsValid() const;
141 PORT *getPort(const std::string& name, const std::list<PORT *>& setOfPorts) const throw(Exception);
142 template<class PORT, class ENUMTYPE>
143 PORT *edAddPort(const std::string& portName, std::list<PORT *>& setOfPorts, ENUMTYPE type) throw(Exception);
144 template<class PORT, class ENUMTYPE>
145 bool edCheckAddPort(const std::string& portName, std::list<PORT *>& setOfPorts, ENUMTYPE type) throw(Exception);
147 static void edRemovePortTypedFromSet(PORT *port, std::list<PORT *>& setOfPorts) throw(Exception);
149 static bool isPortNameAlreadyExist(const std::string& portName, const std::list<PORT *>& setOfPorts);
153 * protected: get a port in a list given it's name
157 PORT *ElementaryNode::getPort(const std::string& name, const std::list<PORT *>& setOfPorts) const throw(Exception)
159 for(typename std::list<PORT *>::const_iterator iter=setOfPorts.begin();iter!=setOfPorts.end();iter++)
161 if((*iter)->getName()==name)
164 std::string what="ElementaryNode::getPort : unexisting "; what+=PORT::NAME;
167 throw Exception(what);
171 * protected: add a port given it's name and type, in a given list of ports
172 * WHY TEMPLATE PARAMETER ENUMTYPE?
175 template<class PORT, class ENUMTYPE>
176 PORT *ElementaryNode::edAddPort(const std::string& portName, std::list<PORT *>& setOfPorts, ENUMTYPE type) throw(Exception)
178 checkValidityOfPortName(portName);
179 if(isPortNameAlreadyExist<PORT>(portName, setOfPorts))
181 std::string what="Port of type "; what+=PORT::NAME; what += " with name : "; what+=portName; what+=" already exists";
182 throw Exception(what);
184 PORT *ret=new PORT(portName,this,type);
185 setOfPorts.push_back(ret);
189 template<class PORT, class ENUMTYPE>
190 bool ElementaryNode::edCheckAddPort(const std::string& portName, std::list<PORT *>& setOfPorts, ENUMTYPE type) throw(Exception)
192 checkValidityOfPortName(portName);
193 if(isPortNameAlreadyExist<PORT>(portName, setOfPorts))
195 std::string what="Port of type "; what+=PORT::NAME; what += " with name : "; what+=portName; what+=" already exists";
196 throw Exception(what);
202 * protected: remove a port from a given list
206 void ElementaryNode::edRemovePortTypedFromSet(PORT *port, std::list<PORT *>& setOfPorts) throw(Exception)
208 if(!isPortNameAlreadyExist<PORT>(port->getName(), setOfPorts))
209 throw Exception("Port is not part of the list : unable to remove it");
210 typename std::list<PORT *>::iterator iter=std::find(setOfPorts.begin(),setOfPorts.end(),port);
211 if(iter!=setOfPorts.end())
213 (*iter)->edRemoveAllLinksLinkedWithMe();
214 setOfPorts.erase(iter);
219 * protected: checks existence of a port, given it's name, in a list
223 bool ElementaryNode::isPortNameAlreadyExist(const std::string& portName, const std::list<PORT *>& setOfPorts)
225 for(typename std::list<PORT *>::const_iterator iter=setOfPorts.begin();iter!=setOfPorts.end();iter++)
227 if((*iter)->getName()==portName)