All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
Style.cpp
Go to the documentation of this file.
1 /* Copyright (C) 2008 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/se/serialization/xml/Style.cpp
22 
23  \brief Auxiliary classes and functions to serialize style informations from a XML document.
24 */
25 
26 // TerraLib
27 #include "../../../common/Translator.h"
28 #include "../../../xml/AbstractWriter.h"
29 #include "../../../xml/Reader.h"
30 #include "../../../se/CoverageStyle.h"
31 #include "../../../se/FeatureTypeStyle.h"
32 #include "../../Exception.h"
33 //#include "Description.h"
34 //#include "Rule.h"
35 #include "SymbologySerializer.h"
36 #include "Style.h"
37 #include "Utils.h"
38 
39 // STL
40 #include <cassert>
41 
42 // Boost
43 #include <boost/format.hpp>
44 
47 
50 
51 void te::se::serialize::Style::reg(const std::string& styleType, const StyleFnctSerializeType& fncts)
52 {
53  m_fncts[styleType] = fncts;
54 }
55 
57 {
58  std::string styleType = reader.getElementLocalName();
59 
60  StyleFnctIdxType::const_iterator it = m_fncts.find(styleType);
61 
62  if(it == m_fncts.end())
63  throw Exception((boost::format(TE_TR("Could not find a reader for the following style type: %1%.")) % styleType).str());
64 
65  assert(it->second.second);
66 
67  return it->second.first(reader);
68 }
69 
71 {
72  assert(style);
73 
74  StyleFnctIdxType::const_iterator it = m_fncts.find(style->getType());
75 
76  if(it == m_fncts.end())
77  throw Exception((boost::format(TE_TR("Could not find a writer for the following style type: %1%.")) % style->getType()).str());
78 
79  assert(it->second.second);
80 
81  return it->second.second(style, writer);
82 }
83 
85 {
86 }
87 
89 {
90  m_fncts["FeatureTypeStyle"] = std::make_pair(StyleReadFnctType(&FeatureTypeStyleReader), StyleWriteFnctType(&FeatureTypeStyleWriter));
91  m_fncts["CoverageStyle"] = std::make_pair(StyleReadFnctType(&CoverageStyleReader), StyleWriteFnctType(&CoverageStyleWriter));
92 }
93 
95 {
96  std::auto_ptr<te::se::FeatureTypeStyle> fts(new te::se::FeatureTypeStyle);
97 
98  // Version
99  if(reader.getNumberOfAttrs() > 0)
100  {
101  std::string version = reader.getAttr("version");
102  fts->setVersion(version);
103  }
104 
105  reader.next();
106 
107  // Name
108  if(reader.getElementLocalName() == "Name")
109  {
110  reader.next();
111  assert(reader.getNodeType() == te::xml::VALUE);
112  fts->setName(new std::string(reader.getElementValue()));
113  reader.next();
114 
115  assert(reader.getNodeType() == te::xml::END_ELEMENT);
116  reader.next();
117  }
118 
119  // Description
120  if(reader.getElementLocalName() == "Description")
121  fts->setDescription(te::se::serialize::ReadDescription(reader));
122 
123  // FeatureTypeName
124  if(reader.getElementLocalName() == "FeatureTypeName")
125  {
126  reader.next();
127  assert(reader.getNodeType() == te::xml::VALUE);
128  fts->setFeatureTypeName(new std::string(reader.getElementValue()));
129  reader.next();
130 
131  assert(reader.getNodeType() == te::xml::END_ELEMENT);
132  reader.next();
133  }
134 
135  // SemanticTypeIdentifier
136  while(reader.getNodeType() == te::xml::START_ELEMENT &&
137  reader.getElementLocalName() == "SemanticTypeIdentifier")
138  {
139  reader.next();
140  assert(reader.getNodeType() == te::xml::VALUE);
141  fts->push_back(reader.getElementValue());
142  reader.next();
143 
144  assert(reader.getNodeType() == te::xml::END_ELEMENT);
145  reader.next();
146  }
147 
148  // Rules
149  while(reader.getNodeType() == te::xml::START_ELEMENT &&
150  reader.getElementLocalName() == "Rule")
151  fts->push_back(te::se::serialize::ReadRule(reader));
152 
153  assert(reader.getNodeType() == te::xml::END_ELEMENT);
154  assert(reader.getElementLocalName() == "FeatureTypeStyle");
155 
156  reader.next();
157 
158  // TODO: OnlineResource
159 
160  return fts.release();
161 }
162 
164 {
165  std::auto_ptr<te::se::CoverageStyle> cs(new te::se::CoverageStyle);
166 
167  // Version
168  if(reader.getNumberOfAttrs() > 0)
169  {
170  std::string version = reader.getAttr("version");
171  cs->setVersion(version);
172  }
173 
174  reader.next();
175 
176  // Name
177  if(reader.getElementLocalName() == "Name")
178  {
179  reader.next();
180  assert(reader.getNodeType() == te::xml::VALUE);
181  cs->setName(new std::string(reader.getElementValue()));
182  reader.next();
183 
184  assert(reader.getNodeType() == te::xml::END_ELEMENT);
185  reader.next();
186  }
187 
188  // Description
189  if(reader.getElementLocalName() == "Description")
190  cs->setDescription(te::se::serialize::ReadDescription(reader));
191 
192  // CoverageName
193  if(reader.getElementLocalName() == "CoverageName")
194  {
195  reader.next();
196  assert(reader.getNodeType() == te::xml::VALUE);
197  cs->setCoverageName(new std::string(reader.getElementValue()));
198  reader.next();
199 
200  assert(reader.getNodeType() == te::xml::END_ELEMENT);
201  reader.next();
202  }
203 
204  // SemanticTypeIdentifier
205  while(reader.getNodeType() == te::xml::START_ELEMENT &&
206  reader.getElementLocalName() == "SemanticTypeIdentifier")
207  {
208  reader.next();
209  assert(reader.getNodeType() == te::xml::VALUE);
210  cs->push_back(reader.getElementValue());
211  reader.next();
212 
213  assert(reader.getNodeType() == te::xml::END_ELEMENT);
214  reader.next();
215  }
216 
217  // Rules
218  while(reader.getNodeType() == te::xml::START_ELEMENT &&
219  reader.getElementLocalName() == "Rule")
220  cs->push_back(te::se::serialize::ReadRule(reader));
221 
222  assert(reader.getNodeType() == te::xml::END_ELEMENT);
223  assert(reader.getElementLocalName() == "CoverageStyle");
224 
225  reader.next();
226 
227  // TODO: OnlineResource
228 
229  return cs.release();
230 }
231 
233 {
234  const te::se::FeatureTypeStyle* fts = dynamic_cast<const te::se::FeatureTypeStyle*>(style);
235 
236  if(fts == 0)
237  return;
238 
239  writer.writeStartElement("se:FeatureTypeStyle");
240  // Version
241  writer.writeAttribute("version", fts->getVersion());
242  // Namespace
243  //writer.writeAttribute("xmlns:se", "http://www.opengis.net/se");
244  //writer.writeAttribute("xmlns:ogc", "http://www.opengis.net/ogc");
245  // xlink
246  //writer.writeAttribute("xmlns:xlink", "http://www.w3.org/1999/xlink");
247 
248  // Name
249  te::se::serialize::WriteStringPtrHelper("se:Name", fts->getName(), writer);
250  // Description
251  te::se::serialize::Save(fts->getDescription(), writer);
252  // FeatureTypeName
253  te::se::serialize::WriteStringPtrHelper("se:FeatureTypeName", fts->getFeatureTypeName(), writer);
254  // Semantic Type Identifiers
255  const std::vector<std::string>* semantics = fts->getSemanticTypeIdentifiers();
256  if(semantics != 0)
257  {
258  for(std::size_t i = 0; i < semantics->size(); ++i)
259  writer.writeElement("se:SemanticTypeIdentifier", semantics->at(i));
260  }
261 
262  // Rules
263  std::size_t nRules = fts->getRules().size();
264 
265  if(nRules > 0)
266  {
267  for(std::size_t i = 0; i != nRules; ++i)
268  te::se::serialize::Save(fts->getRule(i), writer);
269  }
270  else // OnlineResources
271  {
272  assert(fts->getOnlineResources().size() > 0);
273  for(std::size_t i = 0; i < fts->getOnlineResources().size(); ++i)
275  }
276 
277  writer.writeEndElement("se:FeatureTypeStyle");
278 }
279 
281 {
282  const te::se::CoverageStyle* cs = dynamic_cast<const te::se::CoverageStyle*>(style);
283 
284  if(cs == 0)
285  return;
286 
287  writer.writeStartElement("se:CoverageStyle");
288  // Version
289  writer.writeAttribute("version", cs->getVersion());
290  // Namespace
291  //writer.writeAttribute("xmlns:se", "http://www.opengis.net/se");
292  //writer.writeAttribute("xmlns:ogc", "http://www.opengis.net/ogc");
293  // xlink
294  //writer.writeAttribute("xmlns:xlink", "http://www.w3.org/1999/xlink");
295 
296  // Name
297  te::se::serialize::WriteStringPtrHelper("se:Name", cs->getName(), writer);
298  // Description
300  // CoverageName
301  te::se::serialize::WriteStringPtrHelper("se:CoverageName", cs->getCoverageName(), writer);
302  // Semantic Type Identifiers
303  const std::vector<std::string>* semantics = cs->getSemanticTypeIdentifiers();
304  if(semantics != 0)
305  {
306  for(std::size_t i = 0; i < semantics->size(); ++i)
307  writer.writeElement("se:SemanticTypeIdentifier", semantics->at(i));
308  }
309 
310  // Rules
311  std::size_t nRules = cs->getRules().size();
312 
313  if(nRules > 0)
314  {
315  for(std::size_t i = 0; i != nRules; ++i)
316  te::se::serialize::Save(cs->getRule(i), writer);
317  }
318  else // OnlineResources
319  {
320  assert(cs->getOnlineResources().size() > 0);
321  for(std::size_t i = 0; i < cs->getOnlineResources().size(); ++i)
323  }
324 
325  writer.writeEndElement("se:CoverageStyle");
326 }
const std::string * getFeatureTypeName() const
std::pair< StyleReadFnctType, StyleWriteFnctType > StyleFnctSerializeType
Definition: Style.h:64
Auxiliary classes and functions to serialize style informations from a XML document.
boost::function< void(const te::se::Style *, te::xml::AbstractWriter &)> StyleWriteFnctType
Definition: Style.h:63
The Style defines the styling that is to be applied to a geographic dataset (vector geometries or cov...
Definition: Style.h:65
This class models a XML reader object.
Definition: Reader.h:55
virtual void writeStartElement(const std::string &qName)=0
The CoverageStyle defines the styling that is to be applied to a subset of Coverage data...
Definition: CoverageStyle.h:45
void write(const te::se::Style *style, te::xml::AbstractWriter &writer) const
Definition: Style.cpp:70
const std::string * getCoverageName() const
void CoverageStyleWriter(const te::se::Style *layer, te::xml::AbstractWriter &writer)
Definition: Style.cpp:280
This class models a XML writer object.
#define TE_TR(message)
It marks a string in order to get translated.
Definition: Translator.h:347
te::se::Style * FeatureTypeStyleReader(te::xml::Reader &reader)
Definition: Style.cpp:94
void WriteStringPtrHelper(const std::string &elementName, const std::string *s, te::xml::AbstractWriter &writer)
Definition: Utils.cpp:42
virtual std::string getElementLocalName() const =0
It returns the local part of the element name in the case of an element node.
void FeatureTypeStyleWriter(const te::se::Style *style, te::xml::AbstractWriter &writer)
Definition: Style.cpp:232
Rule * getRule(std::size_t i) const
Definition: Style.cpp:105
const std::vector< Rule * > & getRules() const
Definition: Style.cpp:94
virtual const std::string & getType() const =0
It returns the style type.
virtual void writeElement(const std::string &qName, const std::string &value)=0
boost::function< te::se::Style *(te::xml::Reader &)> StyleReadFnctType
Definition: Style.h:62
The FeatureTypeStyle defines the styling that is to be applied to a dataset that can be viewed as a f...
const std::vector< te::xl::SimpleLink * > & getOnlineResources() const
Definition: Style.cpp:117
virtual std::size_t getNumberOfAttrs() const =0
It returns the number of attributes in the case of an element node.
void reg(const std::string &styleType, const StyleFnctSerializeType &fncts)
Definition: Style.cpp:51
Utility methods for the Symbology serialization.
StyleFnctIdxType m_fncts
Definition: Style.h:81
void WriteOnlineResourceHelper(const te::xl::SimpleLink *link, te::xml::AbstractWriter &writer)
Definition: Utils.cpp:67
virtual std::string getAttr(const std::string &name) const =0
It returns the attribute value in the case of an element node with valid attributes.
TESEEXPORT void Save(const te::se::AnchorPoint *ap, te::xml::AbstractWriter &writer)
te::se::Style * read(te::xml::Reader &reader) const
Definition: Style.cpp:56
Data serialization for the Symbology Encoder module.
virtual void writeAttribute(const std::string &attName, const std::string &value)=0
const std::string * getName() const
Definition: Style.cpp:59
virtual NodeType getNodeType() const =0
It return the type of node read.
const te::xl::SimpleLink * getOnlineResource(std::size_t i) const
Definition: Style.cpp:122
virtual std::string getElementValue() const =0
It returns the element data value in the case of VALUE node.
virtual void writeEndElement(const std::string &qName)=0
TESEEXPORT te::se::Rule * ReadRule(te::xml::Reader &reader)
const std::vector< std::string > * getSemanticTypeIdentifiers() const
Definition: Style.cpp:89
TESEEXPORT te::se::Description * ReadDescription(te::xml::Reader &reader)
virtual bool next()=0
It gets the next event to be read.
const Description * getDescription() const
Definition: Style.cpp:70
te::se::Style * CoverageStyleReader(te::xml::Reader &reader)
Definition: Style.cpp:163
const std::string & getVersion() const
Definition: Style.cpp:133