Example #1
0
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);
}
Example #2
0
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);
}
Example #3
0
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);
  }
}
Example #4
0
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);
}
Example #5
0
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);
  }
}