00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
#ifndef OMF_XMIWRITER_HPP
00026
#define OMF_XMIWRITER_HPP
00027
00028
00029
#include <string>
00030
#include <map>
00031
00032
00033
#include <libxml/tree.h>
00034
00035
00036
#include <OMF/ModelIterator.hpp>
00037
00038
namespace OMF
00039 {
00040
00041
class Model;
00042
class ModelObject;
00043
class Property;
00044
00052 class XmiWriter
00053 {
00054
public:
00055
XmiWriter();
00056
~XmiWriter();
00057
00065
bool write(
Model *model,
const char *filename);
00066
00067
private:
00068
00069
void document();
00070
void xmi();
00071
void startAttribs();
00072
void xmiVersion();
00073
void namespaces();
00074
00075
00076
void contentElements();
00077
00078
00079
void objectAsElement();
00080
void tagName();
00081
void objectAttribs();
00082
void identityAttribs();
00083
void typeAttrib();
00084
void featureAttribs();
00085
void dataValueAttrib();
00086
void refValueAttrib();
00087
00088
00089
void referenceElement();
00090
00091
00092
void attributeAsElement();
00093
00094
private:
00095
struct Context
00096 {
00097
typedef std::list<Property *> PropList;
00098
00099 Context() :
00100 previous(0),
00101 object(0),
00102 ref(0),
00103 prop(0),
00104 compAtt(),
00105 compRef(),
00106 attribs(),
00107 node(0),
00108 attr(0)
00109 {}
00110
00111 Context *previous;
00112
ModelObject *object;
00113
ModelObject *ref;
00114
Property *prop;
00115
00116 PropList compAtt;
00117 PropList compRef;
00118 PropList attribs;
00119
00120 xmlNodePtr node;
00121 xmlAttrPtr attr;
00122 };
00123
00124
typedef std::map<std::string, xmlNsPtr> NsMap;
00125
00126
ModelIterator _it;
00127 xmlDocPtr _doc;
00128 xmlNodePtr _xmi;
00129 xmlNsPtr _xmiNs;
00130 NsMap _nsMap;
00131
Model *_model;
00132 Context *_current;
00133 };
00134
00135 }
00136
00137
#endif
00138