Salome HOME
merge from branch DEV tag mergeto_trunk_04apr08
[modules/yacs.git] / src / engine / VisitorSaveSchema.hxx
1 #ifndef __VISITOR_SAVESCHEMA_HXX__
2 #define __VISITOR_SAVESCHEMA_HXX__
3
4 #include "Visitor.hxx"
5 #include "Exception.hxx"
6
7 #include <fstream>
8 #include <string>
9 #include <map>
10 #include <set>
11
12 namespace YACS
13 {
14   namespace ENGINE
15   {
16     class OutputPort;
17     class OutputDataStreamPort;
18     class InPort;
19     class ComponentInstance;
20
21     struct DataLinkInfo
22     {
23       Node* from;
24       Node* to;
25       OutputPort* outp;
26       InPort* inp;
27       bool toDelete;
28     };
29
30     struct StreamLinkInfo
31     {
32       Node* from;
33       Node* to;
34       OutputDataStreamPort* outp;
35       InPort* inp;
36       bool toDelete;
37     };
38
39     class VisitorSaveSchema: public Visitor
40     {
41     public:
42       VisitorSaveSchema(ComposedNode *root);
43       virtual ~VisitorSaveSchema();
44       void openFileSchema(std::string xmlDump) throw(Exception);
45       void closeFileSchema();
46       virtual void visitBloc(Bloc *node);
47       virtual void visitElementaryNode(ElementaryNode *node);
48       virtual void visitForEachLoop(ForEachLoop *node);
49       virtual void visitForLoop(ForLoop *node);
50       virtual void visitInlineNode(InlineNode *node);
51       virtual void visitInlineFuncNode(InlineFuncNode *node);
52       virtual void visitLoop(Loop *node);
53       virtual void visitProc(Proc *node);
54       virtual void visitServiceNode(ServiceNode *node);
55       virtual void visitServiceInlineNode(ServiceInlineNode *node);
56       virtual void visitSwitch(Switch *node);
57       virtual void visitWhileLoop(WhileLoop *node);
58       virtual void visitPresetNode(DataNode *node);
59       virtual void visitOutNode(DataNode *node);
60       virtual void visitStudyInNode(DataNode *node);
61       virtual void visitStudyOutNode(DataNode *node);
62
63     protected:
64       virtual void writeProperties(Node *node);
65       virtual void dumpTypeCode(TypeCode* type, std::set<std::string>& typeNames,std::map<std::string, TypeCode*>& typeMap,int depth);
66       virtual void writeTypeCodes(Proc *proc);
67       virtual void writeContainers(Proc *proc);
68       virtual void writeInputPorts(Node *node);
69       virtual void writeInputDataStreamPorts(Node *node); // OCC : mkr : add possibility to write input data stream ports
70       virtual void writeOutputPorts(Node *node);
71       virtual void writeOutputDataStreamPorts(Node *node); // OCC : mkr : add possibility to write output data stream ports
72       virtual void writeControls(ComposedNode *node);
73       virtual void writeSimpleDataLinks(ComposedNode *node);
74       virtual void writeSimpleStreamLinks(ComposedNode *node); // OCC : mkr : add possibility to write stream links
75       virtual void writeParameters(Proc *proc);
76       virtual void writeParametersNode(ComposedNode *proc, Node *node);
77       virtual void beginCase(Node* node);
78       virtual void endCase(Node* node);
79       std::set<Node*> getAllNodes(ComposedNode *node);
80       int depthNode(Node* node);
81       inline std::string indent(int val)
82       {std::string white; white.append(3*val,' '); return white;};
83
84       std::ofstream _out;
85       std::map<int, std::string> _nodeStateName;
86       std::map<std::string, Container*> _containerMap;
87       std::map<ComponentInstance*, std::string> _componentInstanceMap;
88       ComposedNode *_root;
89       std::multimap<int, DataLinkInfo> _mapOfDLtoCreate;
90       std::multimap<int, StreamLinkInfo> _mapOfSLtoCreate;
91     };
92
93     class SchemaSave
94     {
95     public:
96       SchemaSave(Proc* proc);
97       virtual void save(std::string xmlSchemaFile);
98     protected:
99       Proc* _p;
100     };
101   }
102 }
103 #endif