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