ServerManager.cpp
Go to the documentation of this file.
1 /*
2  Copyright (C) 2008 National Institute For Space Research (INPE) - Brazil.
3 
4  This file is part of the TerraLib - a Framework for building GIS enabled
5  applications.
6 
7  TerraLib is free software: you can redistribute it and/or modify
8  it under the terms of the GNU Lesser General Public License as published by
9  the Free Software Foundation, either version 3 of the License,
10  or (at your option) any later version.
11 
12  TerraLib is distributed in the hope that it will be useful,
13  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  GNU Lesser General Public License for more details.
16 
17  You should have received a copy of the GNU Lesser General Public License
18  along with TerraLib. See COPYING. If not, write to
19  TerraLib Team at <terralib-team@terralib.org>.
20 */
21 
22 /*!
23  \file terralib/qt/plugins/wtss/ServerManager.cpp
24 
25  \brief Manage the JSON file for services configuration of the Web Time Series
26  Services plugin.
27 
28  \author Matheus Cavassan Zaglia
29  */
30 
31 // Terralib
32 #include "ServerManager.h"
33 #include "Exception.h"
34 #include "../../af/ApplicationController.h"
35 
36 // QT
37 #include <QFile>
38 #include <QJsonArray>
39 #include <QJsonDocument>
40 #include <QJsonObject>
41 #include <QString>
42 #include <QTextStream>
43 
44 // STL
45 #include <string>
46 #include <vector>
47 
48 // Boost
49 #include <boost/format.hpp>
50 
51 // WTSS.CXX
52 #include <wtss-cxx/wtss.hpp>
53 
54 namespace cxx = wtss::cxx;
55 
57 {
58  QString path = te::qt::af::AppCtrlSingleton::getInstance().getUserDataDir() +
59  "/wtss_settings.json";
60  QJsonDocument j_doc;
61  QFile f(path);
62  if(f.exists())
63  {
64  f.open(QIODevice::ReadOnly);
65  QJsonParseError j_parse_error;
66  QString input_data = f.readAll();
67  j_doc = QJsonDocument::fromJson(input_data.toUtf8(), &j_parse_error);
68  f.close();
69  }
70  return j_doc;
71 }
72 
74 {
75  QString path = te::qt::af::AppCtrlSingleton::getInstance().getUserDataDir() +
76  "/wtss_settings.json";
77  QFile f(path);
78  f.open(QIODevice::WriteOnly);
79  QTextStream out(&f);
80  out << j_doc.toJson();
81  f.close();
82 }
83 
84 void te::qt::plugins::wtss::ServerManager::addServer(const QString &server_uri)
85 {
86  QJsonDocument j_doc = loadSettings();
87  QJsonObject j_object = j_doc.object();
88 
89  QJsonObject j_servers = j_object.find("servers").value().toObject();
90 
91  if(!j_servers.contains(server_uri))
92  {
93  QJsonObject j_coverages;
94  QJsonObject j_server;
95 
96  cxx::client remote(server_uri.toStdString());
97  try
98  {
99  std::vector<std::string> result = remote.list_coverages();
100 
101  for(std::string cv_name : result)
102  {
103  cxx::geoarray_t g_array = remote.describe_coverage(cv_name);
104 
105  QJsonObject j_attributes;
106  QJsonObject j_coverage;
107 
108  for(cxx::attribute_t attribute : g_array.attributes)
109  {
110  QJsonObject j_attribute;
111  j_attribute["active"] = QJsonValue(false);
112  j_attribute["scale_factor"] = attribute.scale_factor;
113  j_attribute["missing_value"] = attribute.missing_value;
114  j_attributes[QString::fromStdString(attribute.name)] = j_attribute;
115  }
116  j_coverage["active"] = QJsonValue(false);
117  j_coverage["attributes"] = j_attributes;
118  j_coverages[QString::fromStdString(cv_name)] = j_coverage;
119  }
120 
121  j_server["active"] = QJsonValue(false);
122  j_server["coverages"] = j_coverages;
123  j_servers[server_uri] = j_server;
124 
125  j_object["servers"] = j_servers;
126  j_doc.setObject(j_object);
127  saveSettings(j_doc);
128  }
129  catch(const std::exception &e)
130  {
131  boost::format err_msg(
132  "The server %1% could not be added.\n"
133  "Due to the following error: %2%");
134 
135  throw Exception() << ErrorDescription(
136  (err_msg % server_uri.toUtf8().data() % e.what()).str());
137  }
138  }
139 }
140 
142 {
143  QJsonDocument j_doc = loadSettings();
144  QJsonObject j_object = j_doc.object();
145 
146  QJsonObject j_servers = j_object.find("servers").value().toObject();;
147 
148  if(j_servers.contains(server_uri))
149  {
150  QJsonObject j_coverages;
151  QJsonObject j_server;
152 
153  cxx::client remote(server_uri.toStdString());
154  try
155  {
156  std::vector<std::string> result = remote.list_coverages();
157 
158  for(std::string cv_name : result)
159  {
160  cxx::geoarray_t g_array = remote.describe_coverage(cv_name);
161 
162  QJsonObject j_attributes;
163  QJsonObject j_coverage;
164 
165  for(cxx::attribute_t attribute : g_array.attributes)
166  {
167  QJsonObject j_attribute;
168  j_attribute["active"] = QJsonValue(false);
169  j_attribute["scale_factor"] = attribute.scale_factor;
170  j_attribute["missing_value"] = attribute.missing_value;
171  j_attributes[QString::fromStdString(attribute.name)] = j_attribute;
172  }
173  j_coverage["active"] = QJsonValue(false);
174  j_coverage["attributes"] = j_attributes;
175  j_coverages[QString::fromStdString(cv_name)] = j_coverage;
176  }
177 
178  j_server["active"] = QJsonValue(false);
179  j_server["coverages"] = j_coverages;
180  j_servers[server_uri] = j_server;
181 
182  j_object["servers"] = j_servers;
183  j_doc.setObject(j_object);
184  saveSettings(j_doc);
185  }
186  catch(const std::exception &e)
187  {
188  boost::format err_msg(
189  "The server %1% could not reloaded..\n"
190  "Due to the following error: %2%");
191 
192  throw Exception() << ErrorDescription(
193  (err_msg % server_uri.toUtf8().data() % e.what()).str());
194  }
195  }
196 }
197 
199 {
200  QJsonDocument j_doc = loadSettings();
201  QJsonObject j_object = j_doc.object();
202 
203  QJsonObject j_servers = j_object.find("servers").value().toObject();
204 
205  if(j_servers.contains(server_uri))
206  {
207  j_servers.remove(server_uri);
208  j_object["servers"] = j_servers;
209  j_doc.setObject(j_object);
210  saveSettings(j_doc);
211  }
212 }
213 
215  const QString endDate)
216 {
217  QJsonDocument j_doc = loadSettings();
218  QJsonObject j_object = j_doc.object();
219 
220  QJsonObject j_dateFilter;
221  j_dateFilter["start_date"] = startDate;
222  j_dateFilter["end_date"] = endDate;
223 
224  j_object["date_filter"] = j_dateFilter;
225  j_doc.setObject(j_object);
226  saveSettings(j_doc);
227 }
228 
230 {
231  QJsonDocument j_doc = loadSettings();
232  QJsonObject j_object = j_doc.object();
233 
234  QJsonObject j_dateFilter = j_object.find("date_filter").value().toObject();
235 
236  return j_dateFilter;
237 }
238 
239 QJsonObject te::qt::plugins::wtss::ServerManager::getAttribute(const QString &server_uri,
240  const QString &cv_name,
241  const QString &attribute)
242 {
243  QJsonDocument j_doc = loadSettings();
244  QJsonObject j_object = j_doc.object();
245 
246  QJsonObject j_servers = j_object.find("servers").value().toObject();
247 
248  if(!j_servers.contains(server_uri))
249  {
250  boost::format err_msg("Could not find the server: %1%");
251  throw OutOfRangeException()
252  << ErrorDescription((err_msg % server_uri.toUtf8().data()).str());
253  }
254 
255  QJsonObject j_server = j_servers.find(server_uri).value().toObject();
256 
257  if(!j_server.contains("coverages"))
258  {
259  boost::format err_msg("The server %1% has no coverages");
260  throw OutOfRangeException()
261  << ErrorDescription((err_msg % server_uri.toUtf8().data()).str());
262  }
263 
264  if(!j_server["coverages"].toObject().contains(cv_name))
265  {
266  boost::format err_msg("The server %1% has no coverage named: %2%");
268  (err_msg % server_uri.toUtf8().data() % cv_name.toUtf8().data()).str());
269  }
270 
271  QJsonObject j_coverage =
272  j_server["coverages"].toObject().find(cv_name).value().toObject();
273 
274  if(!j_coverage.contains("attributes"))
275  {
276  boost::format err_msg("The coverage %1% has no attributes.");
277  throw OutOfRangeException()
278  << ErrorDescription((err_msg % cv_name.toUtf8().data()).str());
279  }
280 
281  QJsonObject j_attributes = j_coverage.find("attributes").value().toObject();
282 
283  if(!j_attributes.contains(attribute))
284  {
285  boost::format err_msg("The coverage %1% has no attribute named: %2%.");
287  (err_msg % cv_name.toUtf8().data() % attribute.toUtf8().data()).str());
288  }
289 
290  return j_attributes.find(attribute).value().toObject();
291 }
292 
294 {
295  QJsonDocument j_doc = loadSettings();
296  QJsonObject j_object = j_doc.object();
297 
298  QJsonObject j_servers = j_object.find("servers").value().toObject();
299 
300  if(!j_servers.contains(server_uri))
301  {
302  boost::format err_msg("Could not find the server: %1%");
303  throw OutOfRangeException()
304  << ErrorDescription((err_msg % server_uri.toUtf8().data()).str());
305  }
306 
307  QJsonObject j_server = j_servers.find(server_uri).value().toObject();
308 
309  bool active = j_server.find("active").value().toBool();
310  j_server["active"] = !active;
311 
312  if(!active)
313  {
314  for(QJsonObject::iterator it = j_servers.begin(); it != j_servers.end(); ++it)
315  {
316  if(it.key() != server_uri)
317  {
318  QJsonObject j_sv = it.value().toObject();
319  j_sv["active"] = QJsonValue(false);
320  j_servers[it.key()] = j_sv;
321  }
322  }
323  }
324 
325  j_servers[server_uri] = j_server;
326  j_object["servers"] = j_servers;
327  j_doc.setObject(j_object);
328  saveSettings(j_doc);
329 }
330 
332  const QString &cv_name)
333 {
334  QJsonDocument j_doc = loadSettings();
335  QJsonObject j_object = j_doc.object();
336 
337  QJsonObject j_servers = j_object.find("servers").value().toObject();
338 
339  if(!j_servers.contains(server_uri))
340  {
341  boost::format err_msg("Could not find the server: %1%");
342  throw OutOfRangeException()
343  << ErrorDescription((err_msg % server_uri.toUtf8().data()).str());
344  }
345 
346  QJsonObject j_server = j_servers.find(server_uri).value().toObject();
347 
348  if(!j_server.contains("coverages"))
349  {
350  boost::format err_msg("The server %1% has no coverages");
351  throw OutOfRangeException()
352  << ErrorDescription((err_msg % server_uri.toUtf8().data()).str());
353  }
354 
355  QJsonObject j_coverages = j_server.find("coverages").value().toObject();
356  QJsonObject j_coverage = j_coverages.find(cv_name).value().toObject();
357  bool active = j_coverage.find("active").value().toBool();
358  j_coverage["active"] = !active;
359  if(!active)
360  {
361  for(QJsonObject::iterator it = j_coverages.begin(); it != j_coverages.end();
362  ++it)
363  {
364  if(it.key() != cv_name)
365  {
366  QJsonObject j_cv = it.value().toObject();
367  j_cv["active"] = QJsonValue(false);
368  j_coverages[it.key()] = j_cv;
369  }
370  }
371  }
372  if(!j_coverages.contains(cv_name))
373  {
374  boost::format err_msg("The server %1% has no coverage named: %2%");
376  (err_msg % server_uri.toUtf8().data() % cv_name.toUtf8().data()).str());
377  }
378 
379  j_coverages[cv_name] = j_coverage;
380  j_server["coverages"] = j_coverages;
381  j_servers[server_uri] = j_server;
382 
383  j_object["servers"] = j_servers;
384  j_doc.setObject(j_object);
385 
386  saveSettings(j_doc);
387 }
388 
390  const QString &cv_name,
391  const QString &attribute)
392 {
393  QJsonDocument j_doc = loadSettings();
394  QJsonObject j_object = j_doc.object();
395 
396  QJsonObject j_servers = j_object.find("servers").value().toObject();
397 
398  if(!j_servers.contains(server_uri))
399  {
400  boost::format err_msg("Could not find the server: %1%");
401  throw OutOfRangeException()
402  << ErrorDescription((err_msg % server_uri.toUtf8().data()).str());
403  }
404 
405  QJsonObject j_server = j_servers.find(server_uri).value().toObject();
406 
407  if(!j_server.contains("coverages"))
408  {
409  boost::format err_msg("The server %1% has no coverages");
410  throw OutOfRangeException()
411  << ErrorDescription((err_msg % server_uri.toUtf8().data()).str());
412  }
413 
414  QJsonObject j_coverages = j_server.find("coverages").value().toObject();
415 
416  if(!j_coverages.contains(cv_name))
417  {
418  boost::format err_msg("The server %1% has no coverage named: %2%");
420  (err_msg % server_uri.toUtf8().data() % cv_name.toUtf8().data()).str());
421  }
422 
423  QJsonObject j_coverage = j_coverages.find(cv_name).value().toObject();
424 
425  if(!j_coverage.contains("attributes"))
426  {
427  boost::format err_msg("The coverage %1% has no attributes.");
428  throw OutOfRangeException()
429  << ErrorDescription((err_msg % cv_name.toUtf8().data()).str());
430  }
431 
432  QJsonObject j_attributes = j_coverage.find("attributes").value().toObject();
433 
434  if(!j_attributes.contains(attribute))
435  {
436  boost::format err_msg("The coverage %1% has no attribute named: %2%.");
438  (err_msg % cv_name.toUtf8().data() % attribute.toUtf8().data()).str());
439  }
440 
441  QJsonObject j_attribute = j_attributes.find(attribute).value().toObject();
442 
443  if(!j_attribute.contains("active"))
444  {
445  boost::format err_msg("The coverage %1% has no attribute named: %2%.");
447  (err_msg % cv_name.toUtf8().data() % attribute.toUtf8().data()).str());
448  }
449 
450  j_attribute["active"] = !j_attribute.find("active").value().toBool();
451 
452  j_attributes[attribute] = j_attribute;
453  j_coverage["attributes"] = j_attributes;
454 
455  j_coverages[cv_name] = j_coverage;
456  j_server["coverages"] = j_coverages;
457 
458  j_servers[server_uri] = j_server;
459  j_object["servers"] = j_servers;
460 
461  j_doc.setObject(j_object);
462  saveSettings(j_doc);
463 }
void addServer(const QString &server_uri)
QJsonObject getAttribute(const QString &server_uri, const QString &cv_name, const QString &attribute)
void saveSettings(QJsonDocument j_doc)
Base exception class for plugin module.
void changeStatusAttribute(const QString &server_uri, const QString &cv_name, const QString &attribute)
Base Exception class Exceptions in WTSS.TL.
Manage the JSON file for services configuration of the Web Time Series Services plugin.
boost::error_info< struct tag_error_description, std::string > ErrorDescription
The base type for error report messages.
void removeServer(const QString &server_uri)
static ApplicationController & getInstance()
It returns a reference to the singleton instance.
void changeStatusServer(const QString &server_uri)
void refreshServer(const QString &server_uri)
An exception indicating that a given item was not found in a collection (or range).
void addDateFilter(const QString startDate, const QString endDate)
void changeStatusCoverage(const QString &server_uri, const QString &cv_name)