Version: 9.16.0
VisitorSaveState.cxx
Go to the documentation of this file.
1// Copyright (C) 2006-2026 CEA, EDF
2//
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.
7//
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.
12//
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
16//
17// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18//
19
20#include "ElementaryNode.hxx"
21#include "Bloc.hxx"
22#include "Proc.hxx"
23#include "ForEachLoop.hxx"
24#include "OptimizerLoop.hxx"
25#include "Loop.hxx"
26#include "ForLoop.hxx"
27#include "WhileLoop.hxx"
28#include "Switch.hxx"
29#include "InputPort.hxx"
30#include "InlineNode.hxx"
31#include "ServiceNode.hxx"
32#include "ServerNode.hxx"
33#include "ServiceInlineNode.hxx"
34#include "DataNode.hxx"
35
36#include "VisitorSaveState.hxx"
37
38#include <iostream>
39#include <string>
40
41using namespace YACS::ENGINE;
42using namespace std;
43
44//#define _DEVDEBUG_
45#include "YacsTrace.hxx"
46
47VisitorSaveState::VisitorSaveState(ComposedNode *root): Visitor(root)
48{
52 _nodeStateName[YACS::TOACTIVATE] ="TOACTIVATE";
53 _nodeStateName[YACS::ACTIVATED] ="ACTIVATED";
54 _nodeStateName[YACS::DESACTIVATED] ="DESACTIVATED";
56 _nodeStateName[YACS::SUSPENDED] ="SUSPENDED";
57 _nodeStateName[YACS::LOADFAILED] ="LOADFAILED";
58 _nodeStateName[YACS::EXECFAILED] ="EXECFAILED";
60 _nodeStateName[YACS::INTERNALERR] ="INTERNALERR";
61 _nodeStateName[YACS::DISABLED] ="DISABLED";
64}
65
67{
68 if (_out)
69 {
70 _out << "</graphState>" << endl;
71 _out.close();
72 }
73}
74
75void VisitorSaveState::openFileDump(const std::string& xmlDump)
76{
77 _out.open(xmlDump.c_str(), ios::out);
78 if (!_out)
79 {
80 string what = "Impossible to open file for writing: " + xmlDump;
81 throw Exception(what);
82 }
83 _out << "<?xml version='1.0'?>" << endl;
84 _out << "<graphState>" << endl;
85}
86
88{
89 if (!_out) throw Exception("No file open for dump state");
90 _out << "</graphState>" << endl;
91 _out.close();
92}
93
95{
96 if (!_out) throw Exception("No file open for dump state");
97 string name = _root->getChildName(node);
98 DEBTRACE("VisitorSaveState::visitElementaryNode --- " << name);
99 _out << " <node type='elementaryNode'>" << endl;
100 _out << " <name>" << name << "</name>" << endl;
101 int nodeState = node->getState();
102 _out << " <state>" << _nodeStateName[nodeState] << "</state>" << endl;
103
104 list<InputPort *> setOfInputPort = node->getSetOfInputPort();
105 list<InputPort *>::iterator iter;
106 for(iter = setOfInputPort.begin(); iter != setOfInputPort.end(); iter++)
107 {
108 _out << " <inputPort>" << endl;
109 _out << " <name>" << (*iter)->getName() << "</name>" << endl;
110 try
111 {
112 _out << " ";
113 _out << (*iter)->dump();
114 }
115 catch (YACS::Exception &e)
116 {
117 DEBTRACE("caught YACS:Exception: " << e.what());
118 _out << "<value><error><![CDATA[" << e.what() << "]]></error></value>" << endl;
119 }
120 _out << " </inputPort>" << endl;
121 }
122
123 list<OutputPort *> setOfOutputPort = node->getSetOfOutputPort();
124 list<OutputPort *>::iterator oiter;
125 for(oiter = setOfOutputPort.begin(); oiter != setOfOutputPort.end(); oiter++)
126 {
127 _out << " <outputPort>" << endl;
128 _out << " <name>" << (*oiter)->getName() << "</name>" << endl;
129 try
130 {
131 _out << " ";
132 _out << (*oiter)->dump();
133 }
134 catch (YACS::Exception &e)
135 {
136 DEBTRACE("caught YACS:Exception: " << e.what());
137 _out << "<value><error><![CDATA[" << e.what() << "]]></error></value>" << endl;
138 }
139 _out << " </outputPort>" << endl;
140 }
141
142 _out << " </node>" << endl;
143}
144
146{
147 node->ComposedNode::accept(this);
148 if (!_out) throw Exception("No file open for dump state");
149 string name = _root->getName();
150 if (static_cast<ComposedNode*>(node) != _root) name = _root->getChildName(node);
151 DEBTRACE("VisitorSaveState::visitBloc ------------- " << name);
152 _out << " <node type='bloc'>" << endl;
153 _out << " <name>" << name << "</name>" << endl;
154 _out << " <state>" << _nodeStateName[node->getState()] << "</state>" << endl;
155
156 _out << " </node>" << endl;
157}
158
160{
161 node->ComposedNode::accept(this);
162 if (!_out) throw Exception("No file open for dump state");
163 string name = _root->getName();
164 if (static_cast<ComposedNode*>(node) != _root) name = _root->getChildName(node);
165 DEBTRACE("VisitorSaveState::visitProc ------------- " << name);
166 _out << " <node type='proc'>" << endl;
167 _out << " <name>" << name << "</name>" << endl;
168 _out << " <state>" << _nodeStateName[node->getState()] << "</state>" << endl;
169
170 _out << " </node>" << endl;
171}
172
174{
175 node->ComposedNode::accept(this);
176 if (!_out) throw Exception("No file open for dump state");
177 string name = _root->getName();
178 if (static_cast<ComposedNode*>(node) != _root) name = _root->getChildName(node);
179 DEBTRACE("VisitorSaveState::visitForEachLoop ------ " << name);
180 _out << " <node type='forEachLoop'>" << endl;
181 _out << " <name>" << name << "</name>" << endl;
182 _out << " <state>" << _nodeStateName[node->getState()] << "</state>" << endl;
183
184 _out << " </node>" << endl;
185}
186
188{
189 node->ComposedNode::accept(this);
190 if (!_out) throw Exception("No file open for dump state");
191 string name = _root->getName();
192 if (static_cast<ComposedNode*>(node) != _root) name = _root->getChildName(node);
193 DEBTRACE("VisitorSaveState::visitForEachLoopDyn ------ " << name);
194 _out << " <node type='forEachLoopDyn'>" << endl;
195 _out << " <name>" << name << "</name>" << endl;
196 _out << " <state>" << _nodeStateName[node->getState()] << "</state>" << endl;
197 _out << " </node>" << endl;
198}
199
201{
202 node->ComposedNode::accept(this);
203 if (!_out) throw Exception("No file open for dump state");
204 string name = _root->getName();
205 if (static_cast<ComposedNode*>(node) != _root) name = _root->getChildName(node);
206 DEBTRACE("VisitorSaveState::visitOptimizerLoop ------ " << name);
207 _out << " <node type='optimizerLoop'>" << endl;
208 _out << " <name>" << name << "</name>" << endl;
209 _out << " <state>" << _nodeStateName[node->getState()] << "</state>" << endl;
210
211 _out << " </node>" << endl;
212}
213
215{
216 node->ComposedNode::accept(this);
217}
218
220{
221 node->ComposedNode::accept(this);
222 if (!_out) throw Exception("No file open for dump state");
223 string name = _root->getName();
224 if (static_cast<ComposedNode*>(node) != _root) name = _root->getChildName(node);
225 DEBTRACE("VisitorSaveState::visitLoop ------------- " << name);
226 _out << " <node type ='loop'>" << endl;
227 _out << " <name>" << name << "</name>" << endl;
228 _out << " <state>" << _nodeStateName[node->getState()] << "</state>" << endl;
229 _out << " <nbdone>" << node->getNbOfTurns() << "</nbdone>" << endl;
230
231 _out << " </node>" << endl;
232}
233
235{
236 node->ComposedNode::accept(this);
237 if (!_out) throw Exception("No file open for dump state");
238 string name = _root->getName();
239 if (static_cast<ComposedNode*>(node) != _root) name = _root->getChildName(node);
240 DEBTRACE("VisitorSaveState::visitForLoop ---------- " << name);
241 _out << " <node type='forLoop'>" << endl;
242 _out << " <name>" << name << "</name>" << endl;
243 _out << " <state>" << _nodeStateName[node->getState()] << "</state>" << endl;
244 _out << " <nbdone>" << node->getNbOfTurns() << "</nbdone>" << endl;
245 InputPort * ip = node->edGetNbOfTimesInputPort();
246 if (ip->isEmpty())
247 throw Exception("NbOfTimesInputPort in forLoop empty, case not handled yet...");
248 Any *val = static_cast<Any*>(ip->get());
249 int nsteps = val->getIntValue();
250 _out << " <nsteps>" << nsteps << "</nsteps>" << endl;
251
252 _out << " </node>" << endl;
253}
254
256{
257 node->ComposedNode::accept(this);
258 if (!_out) throw Exception("No file open for dump state");
259 string name = _root->getName();
260 if (static_cast<ComposedNode*>(node) != _root) name = _root->getChildName(node);
261 DEBTRACE("VisitorSaveState::visitWhileLoop -------- " << name);
262 _out << " <node type='whileLoop'>" << endl;
263 _out << " <name>" << name << "</name>" << endl;
264 _out << " <state>" << _nodeStateName[node->getState()] << "</state>" << endl;
265 _out << " <nbdone>" << node->getNbOfTurns() << "</nbdone>" << endl;
266 InputPort * ip = node->edGetConditionPort();
267 if (ip->isEmpty())
268 throw Exception("condition in WhileLoop empty, case not handled yet...");
269 if ( ConditionInputPort* cip = dynamic_cast<ConditionInputPort*>(ip) )
270 {
271 bool condition = cip->getValue();
272 _out << " <condition>" << condition << "</condition>" << endl;
273 }
274
275 _out << " </node>" << endl;
276}
277
279{
280 node->ComposedNode::accept(this);
281 if (!_out) throw Exception("No file open for dump state");
282 string name = _root->getName();
283 if (static_cast<ComposedNode*>(node) != _root) name = _root->getChildName(node);
284 DEBTRACE("VisitorSaveState::visitSwitch ----------- " << name);
285 _out << " <node type='switch'>" << endl;
286 _out << " <name>" << name << "</name>" << endl;
287 _out << " <state>" << _nodeStateName[node->getState()] << "</state>" << endl;
288 InputPort * ip = node->edGetConditionPort();
289 if (ip->isEmpty())
290 throw Exception("condition in switch empty, case not handled yet...");
291 Any *val = static_cast<Any*>(ip->get());
292 int condition = val->getIntValue();
293 _out << " <condition>" << condition << "</condition>" << endl;
294
295 _out << " </node>" << endl;
296}
297
299{
301}
302
304{
306}
307
309{
311}
312
314{
316}
317
319{
321}
322
324{
326}
327
329{
331}
332
334{
336}
337
339{
341}
#define DEBTRACE(msg)
Definition: YacsTrace.hxx:31
: Interface for management of storage of data formated dynamically in its TypeCode....
Definition: Any.hxx:79
virtual int getIntValue() const =0
Composed node to group elementary and composed nodes.
Definition: Bloc.hxx:36
Base class for all composed nodes.
std::string getChildName(const Node *node) const
std::string getName() const
Class for data parameters specification.
Definition: DataNode.hxx:38
Base class for dynamically (fully or semifully) built graphs.
Definition: DynParaLoop.hxx:41
Base class for all calculation nodes.
std::list< OutputPort * > getSetOfOutputPort() const
YACS::StatesForNode getState() const
std::list< InputPort * > getSetOfInputPort() const
Loop node for parametric calculation.
Class for for loop node.
Definition: ForLoop.hxx:33
InputPort * edGetNbOfTimesInputPort()
Definition: ForLoop.hxx:45
Class for calculation node (function) inlined (and executed) in the schema.
Definition: InlineNode.hxx:93
Class for calculation node (script) inlined (and executed) in the schema.
Definition: InlineNode.hxx:44
Base class for Input Ports.
Definition: InputPort.hxx:44
virtual void * get() const =0
virtual bool isEmpty()
Definition: InputPort.cxx:70
Base class for loop node.
Definition: Loop.hxx:147
int getNbOfTurns() const
Definition: Loop.hxx:162
virtual YACS::StatesForNode getState() const
Definition: Node.hxx:118
class to build optimization loops
Base class for all schema objects.
Definition: Proc.hxx:44
Class for calculation node associated with a component service.
Definition: ServiceNode.hxx:35
Control node that emulates the C switch.
Definition: Switch.hxx:85
InputPort * edGetConditionPort()
Definition: Switch.hxx:115
virtual void visitOptimizerLoop(OptimizerLoop *node)
std::map< int, std::string > _nodeStateName
virtual void visitStudyInNode(DataNode *node)
void visitForEachLoop(ForEachLoop *node) override
virtual void visitServiceInlineNode(ServiceInlineNode *node)
virtual void visitDynParaLoop(DynParaLoop *node)
virtual void visitWhileLoop(WhileLoop *node)
virtual void visitSwitch(Switch *node)
virtual void visitOutNode(DataNode *node)
virtual void visitInlineFuncNode(InlineFuncNode *node)
virtual void visitElementaryNode(ElementaryNode *node)
virtual void visitServiceNode(ServiceNode *node)
void visitForEachLoopDyn(ForEachLoopDyn *node) override
virtual void visitServerNode(ServerNode *node)
virtual void visitBloc(Bloc *node)
virtual void visitLoop(Loop *node)
virtual void visitProc(Proc *node)
virtual void visitStudyOutNode(DataNode *node)
void openFileDump(const std::string &xmlDump)
virtual void visitInlineNode(InlineNode *node)
virtual void visitForLoop(ForLoop *node)
virtual void visitPresetNode(DataNode *node)
ComposedNode * _root
Definition: Visitor.hxx:85
Class for a while loop.
Definition: WhileLoop.hxx:39
InputPort * edGetConditionPort()
Definition: WhileLoop.hxx:48
const char * what(void) const noexcept
Definition: Exception.cxx:50
@ FAILED
Definition: define.hxx:51
@ DESACTIVATED
Definition: define.hxx:42
@ EXECFAILED
Definition: define.hxx:46
@ TOLOAD
Definition: define.hxx:38
@ LOADED
Definition: define.hxx:39
@ READY
Definition: define.hxx:37
@ ACTIVATED
Definition: define.hxx:41
@ INTERNALERR
Definition: define.hxx:49
@ DONE
Definition: define.hxx:43
@ TOACTIVATE
Definition: define.hxx:40
@ SUSPENDED
Definition: define.hxx:44
@ PAUSE
Definition: define.hxx:47
@ DISABLED
Definition: define.hxx:50
@ LOADFAILED
Definition: define.hxx:45
@ ERROR
Definition: define.hxx:52