All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Symbol.cpp
Go to the documentation of this file.
1 /* Copyright (C) 2011-2011 National Institute For Space Research (INPE) - Brazil.
2 
3  This file is part of the TerraLib - a Framework for building GIS enabled applications.
4 
5  TerraLib is free software: you can redistribute it and/or modify
6  it under the terms of the GNU Lesser General Public License as published by
7  the Free Software Foundation, either version 3 of the License,
8  or (at your option) any later version.
9 
10  TerraLib is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  GNU Lesser General Public License for more details.
14 
15  You should have received a copy of the GNU Lesser General Public License
16  along with TerraLib. See COPYING. If not, write to
17  TerraLib Team at <terralib-team@terralib.org>.
18  */
19 
20 /*!
21  \file terralib/serialization/qt/Symbol.h
22 
23  \brief Support for SymbolLibrary serialization.
24 */
25 
26 // TerraLib
27 #include "../../../qt/widgets/se/Symbol.h"
28 #include "../../../qt/widgets/se/SymbolLibrary.h"
29 #include "../../../qt/widgets/se/SymbolLibraryManager.h"
30 #include "../../../xml/Reader.h"
31 #include "../../../xml/ReaderFactory.h"
32 #include "../../Exception.h"
33 #include "../../se/Symbolizer.h"
34 #include "Symbol.h"
35 
36 // STL
37 #include <cassert>
38 #include <memory>
39 
40 // Boost
41 #include <boost/format.hpp>
42 
43 void te::serialize::ReadSymbolLibrary(const std::string& symbolLibraryFileName)
44 {
45  std::auto_ptr<te::xml::Reader> reader(te::xml::ReaderFactory::make("XERCES"));
46  reader->read(symbolLibraryFileName);
47 
48  if(!reader->next())
49  throw Exception((boost::format(TR_SERIALIZATION("Could not read symbol library information in file: %1%.")) % symbolLibraryFileName).str());
50 
51  if(reader->getNodeType() != te::xml::START_ELEMENT)
52  throw Exception((boost::format(TR_SERIALIZATION("Error reading the document %1%, the start element wasn't found.")) % symbolLibraryFileName).str());
53 
54  if(reader->getElementLocalName() != "SymbolLibrary")
55  throw Exception((boost::format(TR_SERIALIZATION("The first tag in the document %1% is not 'SymbolLibrary'.")) % symbolLibraryFileName).str());
56 
57  std::string name = reader->getAttr("name");
58 
59  std::auto_ptr<te::qt::widgets::SymbolLibrary> library(new te::qt::widgets::SymbolLibrary(name));
60 
61  reader->next();
62 
63  while((reader->getNodeType() == te::xml::START_ELEMENT) &&
64  (reader->getElementLocalName() == "Symbol"))
65  {
66  te::qt::widgets::Symbol* symbol = ReadSymbol(*reader);
67  library->insert(symbol);
68  }
69 
70  te::qt::widgets::SymbolLibraryManager::getInstance().insert(library.release());
71 
72  assert(reader->getNodeType() == te::xml::END_DOCUMENT);
73 }
74 
76 {
77  std::auto_ptr<te::qt::widgets::Symbol> symbol(new te::qt::widgets::Symbol);
78 
80 
81  // Symbol Id
82  reader.next();
83  assert(reader.getNodeType() == te::xml::START_ELEMENT);
84  assert(reader.getElementLocalName() == "Id");
85  reader.next();
86  info.m_id = reader.getElementValue();
87  reader.next();
88  assert(reader.getNodeType() == te::xml::END_ELEMENT);
89 
90  // Symbol Name
91  reader.next();
92  assert(reader.getNodeType() == te::xml::START_ELEMENT);
93  assert(reader.getElementLocalName() == "Name");
94  reader.next();
95  info.m_name = reader.getElementValue();
96  reader.next();
97 
98  assert(reader.getNodeType() == te::xml::END_ELEMENT);
99  reader.next();
100 
101  // Symbol Author
102  if(reader.getElementLocalName() == "Author")
103  {
104  assert(reader.getNodeType() == te::xml::START_ELEMENT);
105  reader.next();
106  info.m_author = reader.getElementValue();
107  reader.next();
108 
109  assert(reader.getNodeType() == te::xml::END_ELEMENT);
110  reader.next();
111  }
112 
113  // Symbol Tags
114  if(reader.getElementLocalName() == "Tags")
115  {
116  assert(reader.getNodeType() == te::xml::START_ELEMENT);
117  reader.next();
118  info.m_tags = reader.getElementValue();
119  reader.next();
120 
121  assert(reader.getNodeType() == te::xml::END_ELEMENT);
122  reader.next();
123  }
124 
125  // Symbol Description
126  if(reader.getElementLocalName() == "Description")
127  {
128  assert(reader.getNodeType() == te::xml::START_ELEMENT);
129  reader.next();
130  info.m_description = reader.getElementValue();
131  reader.next();
132 
133  assert(reader.getNodeType() == te::xml::END_ELEMENT);
134  reader.next();
135  }
136 
137  symbol->setInfo(info);
138 
139  assert(reader.getNodeType() == te::xml::START_ELEMENT);
140  assert(reader.getElementLocalName().find("Symbolizer") != std::string::npos);
141 
142  while((reader.getNodeType() == te::xml::START_ELEMENT) &&
143  (reader.getElementLocalName().find("Symbolizer") != std::string::npos))
144  symbol->addSymbolizer(te::serialize::Symbolizer::getInstance().read(reader));
145 
146  assert(reader.getNodeType() == te::xml::END_ELEMENT);
147  reader.next();
148 
149  return symbol.release();
150 }
This class models a XML reader object.
Definition: Reader.h:55
static te::xml::Reader * make()
It creates a new XML reader using the dafault implementation.
virtual bool next()=0
It gets the next event to be read.
#define TR_SERIALIZATION(message)
It marks a string in order to get translated. This is a special mark used in the XML module of TerraL...
Definition: Config.h:58
TESERIALIZATIONEXPORT void ReadSymbolLibrary(const std::string &symbolLibraryFileName)
Definition: Symbol.cpp:43
This class represents a symbol. TODO: More description!
Definition: Symbol.h:54
virtual std::string getElementValue() const =0
It returns the element data value in the case of VALUE node.
TESERIALIZATIONEXPORT te::qt::widgets::Symbol * ReadSymbol(te::xml::Reader &reader)
Definition: Symbol.cpp:75
This class represents a library of symbols.
Definition: SymbolLibrary.h:52
This class represents a symbol.
Information about a given Symbol.
Definition: SymbolInfo.h:60
static SymbolLibraryManager & getInstance()
It returns a reference to the singleton instance.
virtual NodeType getNodeType() const =0
It return the type of node read.
virtual std::string getElementLocalName() const =0
It returns the local part of the element name in the case of an element node.