void terrama2::services::view::core::DataManager::add(terrama2::services::view::core::ViewPtr view) { // Inside a block so the lock is released before emitting the signal { std::lock_guard<std::recursive_mutex> lock(mtx_); if(view->id == terrama2::core::InvalidId()) { QString errMsg = QObject::tr("Can not add a data provider with an invalid id."); TERRAMA2_LOG_ERROR() << errMsg; throw terrama2::InvalidArgumentException() << ErrorDescription(errMsg); } TERRAMA2_LOG_DEBUG() << tr("View %1 added").arg(view->id); view_[view->id] = view; } emit viewAdded(view); }
void terrama2::services::alert::core::DataManager::add(terrama2::services::alert::core::AlertPtr alert) { // Inside a block so the lock is released before emitting the signal { std::lock_guard<std::recursive_mutex> lock(mtx_); if(alert->id == terrama2::core::InvalidId()) { QString errMsg = QObject::tr("Can not add a data provider with an invalid id."); TERRAMA2_LOG_ERROR() << errMsg; throw terrama2::InvalidArgumentException() << ErrorDescription(errMsg); } TERRAMA2_LOG_DEBUG() << tr("Alert added"); alerts_[alert->id] = alert; } emit alertAdded(alert); }
void terrama2::services::view::core::makeView(ViewId viewId, std::shared_ptr< terrama2::services::view::core::ViewLogger > logger, std::weak_ptr<DataManager> weakDataManager) { auto dataManager = weakDataManager.lock(); if(!dataManager.get()) { TERRAMA2_LOG_ERROR() << QObject::tr("Unable to access DataManager"); return; } try { RegisterId logId = 0; if(logger.get()) logId = logger->start(viewId); TERRAMA2_LOG_DEBUG() << QObject::tr("Starting view %1 generation.").arg(viewId); auto lock = dataManager->getLock(); auto viewPtr = dataManager->findView(viewId); if(viewPtr->dataSeriesList.size() != viewPtr->filtersPerDataSeries.size()) { QString message = QObject::tr("View %1 do not have the right number of filters for data.").arg(viewId); if(logger.get()) logger->error(message.toStdString(), viewId); TERRAMA2_LOG_ERROR() << message; throw Exception() << ErrorDescription(message); } std::vector<std::unordered_map<terrama2::core::DataSetPtr, terrama2::core::DataSetSeries>> seriesList; for(auto dataSeriesId : viewPtr->dataSeriesList) { terrama2::core::DataSeriesPtr inputDataSeries = dataManager->findDataSeries(dataSeriesId); terrama2::core::DataProviderPtr inputDataProvider = dataManager->findDataProvider(inputDataSeries->dataProviderId); auto dataAccessor = terrama2::core::DataAccessorFactory::getInstance().make(inputDataProvider, inputDataSeries); terrama2::core::Filter filter(viewPtr->filtersPerDataSeries.at(dataSeriesId)); std::unordered_map<terrama2::core::DataSetPtr, terrama2::core::DataSetSeries > series = dataAccessor->getSeries(filter); seriesList.push_back(series); } lock.unlock(); if(seriesList.size() > 0) { drawSeriesList(viewId, logger, seriesList, viewPtr->resolutionWidth, viewPtr->resolutionHeight, viewPtr->srid); TERRAMA2_LOG_INFO() << QObject::tr("View %1 generated successfully.").arg(viewId); } else { QString message = QObject::tr("View %1 has no associated data to be generated.").arg(viewId); if(logger.get()) logger->info(message.toStdString(), viewId); TERRAMA2_LOG_INFO() << message; } if(logger.get()) logger->done(terrama2::core::TimeUtils::nowUTC(), logId); } catch(const terrama2::Exception& e) { TERRAMA2_LOG_ERROR() << boost::get_error_info<terrama2::ErrorDescription>(e) << std::endl; TERRAMA2_LOG_INFO() << QObject::tr("Build of view %1 finished with error(s).").arg(viewId); } catch(const boost::exception& e) { TERRAMA2_LOG_ERROR() << boost::get_error_info<terrama2::ErrorDescription>(e); TERRAMA2_LOG_INFO() << QObject::tr("Build of view %1 finished with error(s).").arg(viewId); } catch(const std::exception& e) { TERRAMA2_LOG_ERROR() << e.what(); TERRAMA2_LOG_INFO() << QObject::tr("Build of view %1 finished with error(s).").arg(viewId); } catch(...) { TERRAMA2_LOG_ERROR() << QObject::tr("Unkown error."); TERRAMA2_LOG_INFO() << QObject::tr("Build of view %1 finished with error(s).").arg(viewId); } }
void terrama2::services::view::core::Service::viewJob(const terrama2::core::ExecutionPackage& executionPackage, std::shared_ptr<ViewLogger> logger, std::weak_ptr<DataManager> weakDataManager) { auto dataManager = weakDataManager.lock(); if(!dataManager.get()) { TERRAMA2_LOG_ERROR() << QObject::tr("Unable to access DataManager"); notifyWaitQueue(executionPackage.processId); sendProcessFinishedSignal(executionPackage.processId, executionPackage.executionDate, false); return; } RegisterId logId = executionPackage.registerId; ViewId viewId = executionPackage.processId; std::string viewName = ""; QJsonObject jsonAnswer; try { TERRAMA2_LOG_DEBUG() << QObject::tr("Starting view %1 generation.").arg(viewId); auto mapsServer = MapsServerFactory::getInstance().make(mapsServerUri_, "GEOSERVER"); ///////////////////////////////////////////////////////////////////////// // aquiring metadata auto lock = dataManager->getLock(); auto viewPtr = dataManager->findView(viewId); viewName = viewPtr->viewName; terrama2::core::DataSeriesPtr inputDataSeries = dataManager->findDataSeries(viewPtr->dataSeriesID); terrama2::core::DataProviderPtr inputDataProvider = dataManager->findDataProvider(inputDataSeries->dataProviderId); lock.unlock(); ///////////////////////////////////////////////////////////////////////// auto processingStartTime = terrama2::core::TimeUtils::nowUTC(); QJsonObject mapsServerAnswer = mapsServer->generateLayers(viewPtr, inputDataSeries, inputDataProvider, dataManager, logger, logId); TERRAMA2_LOG_INFO() << tr("View %1(%2) generated successfully.").arg(QString::fromStdString(viewName)).arg(viewId); auto processingEndTime = terrama2::core::TimeUtils::nowUTC(); logger->setStartProcessingTime(processingStartTime, executionPackage.registerId); logger->setEndProcessingTime(processingEndTime, executionPackage.registerId); logger->result(ViewLogger::Status::DONE, terrama2::core::TimeUtils::nowUTC(), logId); jsonAnswer = mapsServerAnswer; jsonAnswer.insert("class", QString("RegisteredViews")); jsonAnswer.insert("process_id",static_cast<int32_t>(viewPtr->id)); jsonAnswer.insert("maps_server", QString::fromStdString(mapsServerUri_.uri())); sendProcessFinishedSignal(viewId, executionPackage.executionDate, true, jsonAnswer); notifyWaitQueue(viewId); return; } catch(const terrama2::core::LogException& e) { auto error = boost::get_error_info<terrama2::ErrorDescription>(e); std::string errMsg; if(error) { errMsg = error->toStdString(); TERRAMA2_LOG_ERROR() << errMsg; } else { TERRAMA2_LOG_ERROR() << QObject::tr("Error logging view build error."); } TERRAMA2_LOG_INFO() << QObject::tr("Build of view %1(%2) finished with error(s).").arg(QString::fromStdString(viewName)).arg(viewId); } catch(const terrama2::Exception& e) { auto error = boost::get_error_info<terrama2::ErrorDescription>(e); std::string errMsg; if(error) { errMsg = error->toStdString(); TERRAMA2_LOG_ERROR() << errMsg; } else { TERRAMA2_LOG_ERROR() << QObject::tr("Error logging view build error."); } TERRAMA2_LOG_INFO() << QObject::tr("Build of view %1(%2) finished with error(s).").arg(QString::fromStdString(viewName)).arg(viewId); if(logId != 0) logger->log(ViewLogger::MessageType::ERROR_MESSAGE, errMsg, logId); } catch(const boost::exception& e) { auto error = boost::get_error_info<terrama2::ErrorDescription>(e); std::string errMsg; if(error) { errMsg = error->toStdString(); TERRAMA2_LOG_ERROR() << errMsg; } else { TERRAMA2_LOG_ERROR() << QObject::tr("Error logging view build error."); } TERRAMA2_LOG_INFO() << QObject::tr("Build of view %1(%2) finished with error(s).").arg(QString::fromStdString(viewName)).arg(viewId); if(logId != 0) logger->log(ViewLogger::MessageType::ERROR_MESSAGE, errMsg, logId); } catch(const std::exception& e) { std::string errMsg = e.what(); TERRAMA2_LOG_ERROR() << errMsg; TERRAMA2_LOG_INFO() << QObject::tr("Build of view %1(%2) finished with error(s).").arg(QString::fromStdString(viewName)).arg(viewId); if(logId != 0) logger->log(ViewLogger::MessageType::ERROR_MESSAGE, errMsg, logId); } catch(...) { std::string errMsg = "Unknown error."; TERRAMA2_LOG_ERROR() << QObject::tr("Unknown error."); TERRAMA2_LOG_INFO() << QObject::tr("Build of view %1(%2) finished with error(s).").arg(QString::fromStdString(viewName)).arg(viewId); if(logId != 0) logger->log(ViewLogger::MessageType::ERROR_MESSAGE, errMsg, logId); } if(logId != 0) logger->result(ViewLogger::Status::ERROR, terrama2::core::TimeUtils::nowUTC(), logId); sendProcessFinishedSignal(viewId, executionPackage.executionDate, false); notifyWaitQueue(viewId); }
void terrama2::services::view::core::Service::removeCompleteView(const ViewPtr& viewPtr, DataSeriesId dataSeriesId, bool removeAll) noexcept { ViewId id = viewPtr->id; try { std::lock_guard<std::mutex> lock(mutex_); TERRAMA2_LOG_INFO() << tr("Trying to remove view %1.").arg(id); auto it = timers_.find(id); if(it != timers_.end()) { auto timer = timers_.at(id); timer->disconnect(); timers_.erase(id); } // remove from queue processQueue_.erase(std::remove_if(processQueue_.begin(), processQueue_.end(), [&id](const terrama2::core::ExecutionPackage& executionPackage) { return id == executionPackage.processId; }), processQueue_.end()); if (removeAll) { terrama2::core::DataProviderPtr inputDataProvider; // Locking datamanager { auto dataManager = dataManager_.lock(); auto lock = dataManager->getLock(); terrama2::core::DataSeriesPtr inputDataSeries = dataManager->findDataSeries(dataSeriesId); inputDataProvider = dataManager->findDataProvider(inputDataSeries->dataProviderId); lock.unlock(); } try { // Retrieving Maps server handler MapsServerPtr mapsServer = MapsServerFactory::getInstance().make(mapsServerUri_, "GEOSERVER"); // removing from geoserver mapsServer->cleanup(viewPtr, inputDataProvider, logger_); } catch(const terrama2::services::view::core::NotFoundGeoserverException& e) { // Nothing TERRAMA2_LOG_DEBUG() << tr("There is no workspace in GeoServer"); } catch(const terrama2::services::view::core::ViewGeoserverException&) { // TODO: Improve validation in order to notify WebApp TERRAMA2_LOG_WARNING() << tr("Could not perform clean up in GeoServer and database. Please remove it manually"); } } waitQueue_.erase(id); TERRAMA2_LOG_INFO() << tr("View %1 removed successfully.").arg(id); } catch(const boost::exception& e) { TERRAMA2_LOG_ERROR() << boost::get_error_info<terrama2::ErrorDescription>(e); TERRAMA2_LOG_INFO() << tr("Could not remove view: %1.").arg(id); } catch(const std::exception& e) { TERRAMA2_LOG_ERROR() << e.what(); TERRAMA2_LOG_INFO() << tr("Could not remove view: %1.").arg(id); } catch(...) { TERRAMA2_LOG_ERROR() << tr("Unknown error"); TERRAMA2_LOG_INFO() << tr("Could not remove view: %1.").arg(id); } }