All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Rule.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/Rule.cpp
22 
23  \brief Support for Rule serialization.
24 */
25 
26 // TerraLib
27 #include "../../se/Rule.h"
28 #include "../../xml/Reader.h"
29 #include "../../xml/Writer.h"
30 #include "../fe/Filter.h"
31 #include "Description.h"
32 #include "Graphic.h"
33 #include "Rule.h"
34 #include "Symbolizer.h"
35 #include "Utils.h"
36 
37 // STL
38 #include <cassert>
39 #include <limits>
40 #include <memory>
41 
43 {
44  assert(reader.getNodeType() == te::xml::START_ELEMENT);
45  assert(reader.getElementLocalName() == "Rule");
46 
47  reader.next();
48 
49  std::auto_ptr<te::se::Rule> rule(new te::se::Rule);
50 
51  // Name
52  if(reader.getElementLocalName() == "Name")
53  {
54  reader.next();
55  assert(reader.getNodeType() == te::xml::VALUE);
56  rule->setName(new std::string(reader.getElementValue()));
57  reader.next();
58 
59  assert(reader.getNodeType() == te::xml::END_ELEMENT);
60  reader.next();
61  }
62 
63  // Description
64  if(reader.getElementLocalName() == "Description")
65  rule->setDescription(ReadDescription(reader));
66 
67  // LegendGraphic
68  if(reader.getElementLocalName() == "LegendGraphic")
69  {
70  reader.next();
71  rule->setLegendGraphic(ReadGraphic(reader));
72 
73  assert(reader.getNodeType() == te::xml::END_ELEMENT);
74  reader.next();
75  }
76 
77  // Filter / ElseFilter
78  if(reader.getElementLocalName() == "Filter")
79  rule->setFilter(ReadFilter(reader));
80  else if(reader.getElementLocalName() == "ElseFilter")
81  {
82  rule->enableElseFilter();
83  reader.next();
84  assert(reader.getNodeType() == te::xml::END_ELEMENT);
85  reader.next();
86  }
87 
88  // MinScaleDenominator
89  if(reader.getElementLocalName() == "MinScaleDenominator")
90  {
91  reader.next();
92  assert(reader.getNodeType() == te::xml::VALUE);
93  double minScale = reader.getElementValueAsDouble();
94  rule->setMinScaleDenominator(minScale);
95  reader.next();
96 
97  assert(reader.getNodeType() == te::xml::END_ELEMENT);
98  reader.next();
99  }
100 
101  // MaxScaleDenominator
102  if(reader.getElementLocalName() == "MaxScaleDenominator")
103  {
104  reader.next();
105  assert(reader.getNodeType() == te::xml::VALUE);
106  double maxScale = reader.getElementValueAsDouble();
107  rule->setMaxScaleDenominator(maxScale);
108  reader.next();
109 
110  assert(reader.getNodeType() == te::xml::END_ELEMENT);
111  reader.next();
112  }
113 
114  // Symbolizers
115  while(reader.getNodeType() == te::xml::START_ELEMENT &&
116  reader.getElementLocalName().find("Symbolizer") != std::string::npos) // TODO: For while using find("Symbolizer")... Actually, I would like to search by the registered names of symbolizer.
117  rule->push_back(te::serialize::Symbolizer::getInstance().read(reader));
118 
119  assert(reader.getNodeType() == te::xml::END_ELEMENT);
120  reader.next();
121 
122  return rule.release();
123 }
124 
126 {
127  if(rule == 0)
128  return;
129 
130  writer.writeStartElement("se:Rule");
131 
132  WriteStringPtrHelper("se:Name", rule->getName(), writer);
133  Save(rule->getDescription(), writer);
134 
135  const te::se::Graphic* legendGraphic = rule->getLegendGraphic();
136  if(legendGraphic)
137  {
138  writer.writeStartElement("se:LegendGraphic");
139  Save(rule->getLegendGraphic(), writer);
140  writer.writeEndElement("se:LegendGraphic");
141  }
142 
143  if(rule->getFilter())
144  Save(rule->getFilter(), writer);
145  else if(rule->hasElseFilter())
146  writer.writeElement("se:ElseFilter", "");
147 
148  if(rule->getMinScaleDenominator() != 0.0)
149  writer.writeElement("se:MinScaleDenominator", rule->getMinScaleDenominator());
150 
151  if(rule->getMaxScaleDenominator() != std::numeric_limits<double>::infinity())
152  writer.writeElement("se:MaxScaleDenominator", rule->getMaxScaleDenominator());
153 
154  const std::vector<te::se::Symbolizer*>& symbs = rule->getSymbolizers();
155  for(std::size_t i = 0; i < symbs.size(); ++i)
156  Symbolizer::getInstance().write(symbs[i], writer);
157 
158  writer.writeEndElement("se:Rule");
159 }
160 
const std::string * getName() const
Definition: Rule.cpp:64
Auxiliary classes and functions to serialize Symbolizer informations from a XML document.
Utility methods for Symbology serialization.
TEDATAACCESSEXPORT void Save(const std::string &fileName)
Definition: Serializer.cpp:191
A Rule is used to attach property/scale conditions to and group the individual symbols used for rende...
This class models a XML reader object.
Definition: Reader.h:55
TESERIALIZATIONEXPORT te::fe::Filter * ReadFilter(te::xml::Reader &reader)
Definition: Filter.cpp:37
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
const std::vector< Symbolizer * > & getSymbolizers() const
Definition: Rule.cpp:152
const Graphic * getLegendGraphic() const
Definition: Rule.cpp:86
virtual double getElementValueAsDouble() const
It returns the element data value in the case of VALUE node.
Definition: Reader.cpp:37
virtual void writeStartElement(const std::string &qName)
Definition: Writer.cpp:44
A Rule is used to attach property/scale conditions to and group the individual symbols used for rende...
Definition: Rule.h:78
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: Rule.cpp:75
Support for Graphic serialization.
Support for Description serialization.
virtual void writeElement(const std::string &qName, const std::string &value)
Definition: Writer.cpp:54
const te::fe::Filter * getFilter() const
Definition: Rule.cpp:97
void WriteStringPtrHelper(const std::string &elementName, const std::string *s, te::xml::Writer &writer)
Definition: Utils.cpp:41
bool hasElseFilter() const
Definition: Rule.cpp:113
TESERIALIZATIONEXPORT te::se::Graphic * ReadGraphic(te::xml::Reader &reader)
Definition: Graphic.cpp:42
const double & getMinScaleDenominator() const
Definition: Rule.cpp:123
static Symbolizer & getInstance()
It returns a reference to the singleton instance.
virtual NodeType getNodeType() const =0
It return the type of node read.
const double & getMaxScaleDenominator() const
Definition: Rule.cpp:133
virtual std::string getElementLocalName() const =0
It returns the local part of the element name in the case of an element node.
A Graphic is a graphic symbol with an inherent shape, color(s), and possibly size.
Definition: Graphic.h:66
TESERIALIZATIONEXPORT te::se::Rule * ReadRule(te::xml::Reader &reader)
Definition: Rule.cpp:42
This class models a XML writer object.
Definition: Writer.h:52