source: trunk/source/visualization/HepRep/src/XMLHepRepWriter.cc @ 1202

Last change on this file since 1202 was 834, checked in by garnier, 16 years ago

import all except CVS

File size: 9.4 KB
Line 
1// Copyright FreeHEP, 2005.
2
3#include "cheprep/XMLHepRepWriter.h"
4#include "cheprep/XMLWriter.h"
5#include "cheprep/BHepRepWriter.h"
6
7#include "cheprep/DefaultHepRepInstance.h"
8#include "cheprep/DefaultHepRepAttValue.h"
9
10#define NAMESPACE "heprep"
11
12using namespace std;
13using namespace HEPREP;
14
15/**
16 * @author Mark Donszelmann
17 * @version $Id: XMLHepRepWriter.cc,v 1.15 2005/06/02 21:28:45 duns Exp $
18 */
19namespace cheprep {
20
21XMLHepRepWriter::XMLHepRepWriter(ostream* os, bool randomAccess, bool useCompression) 
22        : out(os),
23          compress(useCompression) {
24           
25    this->nameSpace = NAMESPACE;
26
27    if (randomAccess) {
28        zip = new ZipOutputStream(*os);
29        out = zip;
30        gz = NULL;
31    } else {
32        zip = NULL;
33        if (useCompression) {
34#ifndef CHEPREP_NO_ZLIB
35            gz = new GZIPOutputStream(*os);
36            out = gz;
37#else
38            cerr << "WARNING: the .gz output stream you are creating will be a plain file," << endl;
39            cerr << "since compression support (ZLIB) was not compiled into the library." << endl;
40            cerr << "To add ZLIB support, you need to undefine CHEPREP_NO_ZLIB." << endl; 
41            gz = NULL;           
42#endif
43        } else {
44            gz = NULL;
45        }
46    }
47}
48
49XMLHepRepWriter::~XMLHepRepWriter() {
50    delete gz;
51    delete zip;
52}
53
54bool XMLHepRepWriter::addProperty(std::string key, std::string value) {
55    properties[key] = value;
56    return true;
57}
58
59bool XMLHepRepWriter::close() {
60    if (zip != NULL) {
61        zip->putNextEntry("heprep.properties", true);
62       
63        map<string, string>::iterator i = properties.begin();
64        while (i != properties.end()) {
65            *zip << (*i).first << "=" << (*i).second << endl;
66            i++;
67        }
68        zip->closeEntry();
69        zip->close();
70    }
71
72    if (gz != NULL) {
73        gz->close();
74    }
75    return true;
76}
77
78bool XMLHepRepWriter::write(HepRep* heprep, string name) {
79    if (zip != NULL) {
80        zip->putNextEntry(name, compress);
81    }
82   
83    if (name.rfind(".bheprep") == name.length()-8) {
84       xml = new BHepRepWriter(*out);
85    } else { 
86       xml = new XMLWriter(out, "  ", NAMESPACE);
87    }
88           
89    xml->openDoc();
90    xml->setAttribute("version", (string)"2.0");
91    xml->setAttribute("xmlns", (string)"http://java.freehep.org/schemas/heprep/2.0");
92    xml->setAttribute("xmlns", "xsi", "http://www.w3.org/2001/XMLSchema-instance");
93    xml->setAttribute("xsi", "schemaLocation", "http://java.freehep.org/schemas/heprep/2.0 http://java.freehep.org/schemas/heprep/2.0/HepRep.xsd");
94    xml->openTag(nameSpace, "heprep");
95    write(heprep->getLayerOrder());
96    vector<HepRepTypeTree*> typeTreeSet = heprep->getTypeTreeList();
97    for (vector<HepRepTypeTree*>::iterator i1=typeTreeSet.begin(); i1 != typeTreeSet.end(); i1++) {
98        write(*i1);
99    }
100    vector<HepRepInstanceTree*> instanceTreeSet = heprep->getInstanceTreeList();
101    for (vector<HepRepInstanceTree*>::iterator i2=instanceTreeSet.begin(); i2 != instanceTreeSet.end(); i2++) {
102        write(*i2);
103    }
104    xml->closeTag();
105    xml->closeDoc();
106//    xml->close();
107    delete xml;
108   
109    if (zip != NULL) {
110        zip->closeEntry();
111    }
112
113    return true;
114}
115
116bool XMLHepRepWriter::write(vector<string> layers) {
117    string layerOrder = "";
118    bool comma = false;
119    for (vector<string>::iterator i=layers.begin(); i != layers.end(); i++) {
120        if (comma) {
121            layerOrder.append(", ");
122        }
123        layerOrder.append(*i);
124        comma = true;
125    }
126    xml->setAttribute("order", layerOrder);
127    xml->printTag(nameSpace, "layer");
128    return true;
129}
130
131bool XMLHepRepWriter::write(HepRepTypeTree* typeTree) {
132    xml->setAttribute("name", typeTree->getName());
133    xml->setAttribute("version", typeTree->getVersion());
134    xml->openTag(nameSpace, "typetree");
135
136    vector<HepRepType*> types = typeTree->getTypeList();
137    for (vector<HepRepType*>::iterator i=types.begin(); i != types.end(); i++) {
138        write(*i);
139    }
140   
141    xml->closeTag();
142    return true;
143}
144
145bool XMLHepRepWriter::write(HepRepType* type) {
146    xml->setAttribute("name", type->getName());
147    xml->openTag(nameSpace, "type");
148    write((HepRepDefinition*)type);
149    write((HepRepAttribute*)type);
150   
151    vector<HepRepType*> types = type->getTypeList();
152    for (vector<HepRepType*>::iterator i=types.begin(); i != types.end(); i++) {
153        write(*i);
154    }
155    xml->closeTag();
156    return true;
157}
158
159bool XMLHepRepWriter::write(HepRepTreeID* treeID) {
160    xml->setAttribute("qualifier", treeID->getQualifier());
161    xml->setAttribute("name", treeID->getName());
162    xml->setAttribute("version", treeID->getVersion());
163    xml->printTag(nameSpace, "treeid");
164    return true;
165}
166
167bool XMLHepRepWriter::write(HepRepAction* action) {
168    xml->setAttribute("name", action->getName());
169    xml->setAttribute("expression", action->getExpression());
170    xml->printTag(nameSpace, "action");
171    return true;
172}
173
174bool XMLHepRepWriter::write(HepRepInstanceTree* instanceTree) {
175    xml->setAttribute("name", instanceTree->getName());
176    xml->setAttribute("version", instanceTree->getVersion());
177    xml->setAttribute("typetreename", instanceTree->getTypeTree()->getName());
178    xml->setAttribute("typetreeversion", instanceTree->getTypeTree()->getVersion());
179    xml->openTag(nameSpace, "instancetree");
180    // refs
181    vector<HepRepTreeID*> instanceTreeSet = instanceTree->getInstanceTreeList();
182    for (vector<HepRepTreeID*>::iterator i1=instanceTreeSet.begin(); i1 != instanceTreeSet.end(); i1++) {
183        write(*i1);
184    }
185
186    // instances
187    vector<HepRepInstance*> instanceList = instanceTree->getInstances();
188    for (vector<HepRepInstance*>::iterator i2=instanceList.begin(); i2 != instanceList.end(); i2++) {
189        write(*i2);
190    }
191    xml->closeTag();
192    return true;
193}
194
195bool XMLHepRepWriter::write(HepRepInstance* instance) {
196    // FIXME FREEHEP-356
197    xml->setAttribute("type", instance->getType()->getFullName());
198    xml->openTag(nameSpace, "instance");
199    write((HepRepAttribute*)instance);
200
201    vector<HepRepPoint*> pointList = instance->getPoints();
202    for (vector<HepRepPoint*>::iterator i1=pointList.begin(); i1 != pointList.end(); i1++) {
203        write(*i1);
204    }
205
206    vector<HepRepInstance*> instanceList = instance->getInstances();
207    for (vector<HepRepInstance*>::iterator i2=instanceList.begin(); i2 != instanceList.end(); i2++) {
208        write(*i2);
209    }
210    xml->closeTag();
211    return true;
212}
213
214bool XMLHepRepWriter::write(HepRepPoint* point) {
215    xml->setAttribute("x", point->getX());
216    xml->setAttribute("y", point->getY());
217    xml->setAttribute("z", point->getZ());
218    if (point->getAttValuesFromNode().size() != 0) {
219        xml->openTag(nameSpace, "point");
220        write((HepRepAttribute*)point);
221        xml->closeTag();
222    } else {
223        xml->printTag(nameSpace, "point");
224    }
225    return true;
226}
227
228bool XMLHepRepWriter::write(HepRepAttribute* attribute) {
229    // BUG FIX.  Do something special for layers, because these do not end
230    // up in the normal iteration.
231    HepRepAttValue* layerAtt = attribute->getAttValueFromNode("layer");
232    if (layerAtt != NULL) write(layerAtt);
233
234    set<HepRepAttValue*> attSet = attribute->getAttValuesFromNode();
235    for (set<HepRepAttValue*>::iterator i=attSet.begin(); i != attSet.end(); i++) {
236        write(*i);
237    }
238    return true;
239}
240
241bool XMLHepRepWriter::write(HepRepDefinition* definition) {
242    set<HepRepAttDef*> list = definition->getAttDefsFromNode();
243    for (set<HepRepAttDef*>::iterator i=list.begin(); i != list.end(); i++) {
244        write(*i);
245    }
246    return true;
247}
248
249bool XMLHepRepWriter::write(HepRepAttValue* attValue) {
250    string name = attValue->getName();
251
252    xml->setAttribute("name", name);
253
254    switch(attValue->getType()) {
255        default:                            xml->setAttribute("value", attValue->getAsString());
256                                            break;                           
257        case HepRepConstants::TYPE_STRING:  xml->setAttribute("value", attValue->getString());
258                                            break;
259        case HepRepConstants::TYPE_LONG:    xml->setAttribute("value", attValue->getLong());
260                                            break;
261        case HepRepConstants::TYPE_INT:     xml->setAttribute("value", attValue->getInteger());
262                                            break;
263        case HepRepConstants::TYPE_DOUBLE:  xml->setAttribute("value", attValue->getDouble());
264                                            break;
265        case HepRepConstants::TYPE_BOOLEAN: xml->setAttribute("value", attValue->getBoolean());
266                                            break;
267        case HepRepConstants::TYPE_COLOR:   xml->setAttribute("value", attValue->getColor());
268    }
269
270    if (attValue->showLabel() != HepRepConstants::SHOW_NONE) {
271        xml->setAttribute("showlabel", attValue->showLabel());
272    }
273
274    xml->printTag(nameSpace, "attvalue");
275    return true;
276}
277
278bool XMLHepRepWriter::write(HepRepAttDef* attDef) {
279    xml->setAttribute("name", attDef->getName());
280    xml->setAttribute("desc", attDef->getDescription());
281    xml->setAttribute("category", attDef->getCategory());
282    xml->setAttribute("extra", attDef->getExtra());
283    xml->printTag(nameSpace, "attdef");
284    return true;
285}
286
287} // cheprep
288
Note: See TracBrowser for help on using the repository browser.