/** * Publish static data (pdm, asm, ism) for THP * $Id$ * $HeadURL$ * $Author$ * Created by Hanna E. Rathje, SLSE, 2016-01-13 */ #include "static_publisher.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace SituationReplay { StaticPublisher::StaticPublisher(const std::shared_ptr &ddsInterface, const QSqlDatabase &db) : m_ddsInterface(ddsInterface) , m_db(db) { auto ddsConnector = ddsInterface->ddsReplay(); m_asmTrainingArea.reset(ddsConnector->createDTS()); m_exmExercise.reset(ddsConnector->createDTS()); m_exmExercisePhase.reset(ddsConnector->createDTS()); m_flmFileContent.reset(ddsConnector->createDTS()); m_flmFileTypeInfo.reset(ddsConnector->createDTS()); m_flmFolder.reset(ddsConnector->createDTS()); m_ismMainFootprint.reset(ddsConnector->createDTS()); m_ismMainStructureElement.reset(ddsConnector->createDTS()); m_ppmType.reset(ddsConnector->createDTS()); m_pdmCanComponentString.reset(ddsConnector->createDTS()); m_pdmChargeType.reset(ddsConnector->createDTS()); m_pdmFirePurpose.reset(ddsConnector->createDTS()); m_pdmGearType.reset(ddsConnector->createDTS()); m_ppmGearTypeChargeType.reset(ddsConnector->createDTS()); m_pdmIgniterType.reset(ddsConnector->createDTS()); m_pdmIgniterFunction.reset(ddsConnector->createDTS()); m_pdmChargeTypeIgniterTypeIgniterFunction.reset(ddsConnector->createDTS()); m_pdmLoadType.reset(ddsConnector->createDTS()); m_pdmChargeTypeLoadType.reset(ddsConnector->createDTS()); m_pdmLanguageHmi.reset(ddsConnector->createDTS()); m_pdmTranslationBlob.reset(ddsConnector->createDTS()); m_pdmVulnerabilityKind.reset(ddsConnector->createDTS()); QTimer::singleShot(0, this, &StaticPublisher::publishData); } StaticPublisher::~StaticPublisher() { m_asmTrainingArea = nullptr; m_exmExercise = nullptr; m_exmExercisePhase = nullptr; m_flmFileContent = nullptr; m_flmFileTypeInfo = nullptr; m_flmFolder = nullptr; m_ismMainFootprint = nullptr; m_ismMainStructureElement = nullptr; m_ppmType = nullptr; m_pdmCanComponentString = nullptr; m_pdmChargeType = nullptr; m_pdmFirePurpose = nullptr; m_pdmGearType = nullptr; m_ppmGearTypeChargeType = nullptr; m_pdmIgniterType = nullptr; m_pdmIgniterFunction = nullptr; m_pdmLoadType = nullptr; m_pdmChargeTypeIgniterTypeIgniterFunction = nullptr; m_pdmChargeTypeLoadType = nullptr; m_pdmLanguageHmi = nullptr; m_pdmTranslationBlob = nullptr; m_pdmVulnerabilityKind = nullptr; m_ddsInterface = nullptr; } void StaticPublisher::publishData() { { auto db = AssetManagement::DatabaseInterface::create(0); db->init(m_db); db->select([this](const AssetManagement::Database::AsmTrainingArea &data) { m_asmTrainingArea->write(AssetManagement::Database::convert(data)); }); } { auto db = ExerciseManagement::DatabaseInterface::create(0); db->init(m_db); db->select([this](const ExerciseManagement::Database::ExmExercise &data) { m_exmExercise->write(ExerciseManagement::Database::convert(data)); }); db->select([this](const ExerciseManagement::Database::ExmExercisePhase &data) { m_exmExercisePhase->write(ExerciseManagement::Database::convert(data)); }); } { auto db = FileManagement::DatabaseInterface::create(0); db->init(m_db); db->select([this](const FileManagement::Database::FlmFileContent &data) { m_flmFileContent->write(FileManagement::Database::convert(data)); emit fileContentAvailable(data); }); db->select([this](const FileManagement::Database::FlmFileTypeInfo &data) { m_flmFileTypeInfo->write(FileManagement::Database::convert(data)); }); db->select([this](const FileManagement::Database::FlmFolder &data) { m_flmFolder->write(FileManagement::Database::convert(data)); }); } { auto db = InfrastructureManagement::DatabaseInterface::create(0); db->init(m_db); publishMainStructureElement(db); } { auto db = ParticipantManagement::DatabaseInterface::create(0); db->init(m_db); db->select([this](const ParticipantManagement::Database::PpmType &data) { m_ppmType->write(ParticipantManagement::Database::convert(data)); }); } { auto db = ProjectDataManagement::DatabaseInterface::create(0); db->init(m_db); db->select([this](const ProjectDataManagement::Database::PdmCanComponentString &data) { m_pdmCanComponentString->write(ProjectDataManagement::Database::convert(data)); }); db->select([this](const ProjectDataManagement::Database::PdmChargeType &data) { m_pdmChargeType->write(ProjectDataManagement::Database::convert(data)); }); db->select([this](const ProjectDataManagement::Database::PdmFirePurpose &data) { m_pdmFirePurpose->write(ProjectDataManagement::Database::convert(data)); }); db->select([this](const ProjectDataManagement::Database::PdmGearType &data) { m_pdmGearType->write(ProjectDataManagement::Database::convert(data)); }); db->select([this](const ProjectDataManagement::Database::PdmGearTypeChargeType &data) { m_ppmGearTypeChargeType->write(ProjectDataManagement::Database::convert(data)); }); db->select([this](const ProjectDataManagement::Database::PdmIgniterType &data) { m_pdmIgniterType->write(ProjectDataManagement::Database::convert(data)); }); db->select([this](const ProjectDataManagement::Database::PdmIgniterFunction &data) { m_pdmIgniterFunction->write(ProjectDataManagement::Database::convert(data)); }); db->select([this](const ProjectDataManagement::Database::PdmChargeTypeIgniterTypeIgniterFunction &data) { m_pdmChargeTypeIgniterTypeIgniterFunction->write(ProjectDataManagement::Database::convert(data)); }); db->select([this](const ProjectDataManagement::Database::PdmLanguage &data) { m_pdmLanguageHmi->write(ProjectDataManagement::Database::convert(data)); }); publishTranslationBlob(db); db->select([this](const ProjectDataManagement::Database::PdmVulnerabilityKind &data) { m_pdmVulnerabilityKind->write(ProjectDataManagement::Database::convert(data)); }); } m_db = QSqlDatabase(); } void StaticPublisher::publishMainStructureElement(const std::shared_ptr &db) { // read all MSE from database QHash mainStructureElements; if (!db->select([&mainStructureElements] (const InfrastructureManagement::Database::IsmMainStructureElement &data) { mainStructureElements[data.id] = data;})) return; // read all SE from database QHash> structureElements; if (!db->select([&structureElements](const InfrastructureManagement::Database::IsmStructureElement &data) { structureElements[data.mainStructureElementId].push_back(data);})) return; QHash seId2mseId; for (const auto &mse : qAsConst(mainStructureElements)) { auto mseDds = InfrastructureManagement::Database::convert(mse); auto itContSe = structureElements.constFind(mse.id); if (itContSe == structureElements.constEnd()) continue; for (const auto &se : itContSe.value()) { // currently only the building, not floors, rooms or mounting points needed // DEDÖÖM we need rooms and floors and every thing else! //if (se.structureElementTypeId != InfrastructureManagement::StructureElementType_def::Building) // continue; mseDds.elements().push_back(InfrastructureManagement::Database::convert(se)); seId2mseId[se.id] = mseDds.id(); // break; } if (mseDds.elements().size() > 0) m_ismMainStructureElement->write(mseDds); } QHash> footprintSorted; auto cb = [&footprintSorted](const InfrastructureManagement::Database::IsmStructureElementFootprint &fp) { footprintSorted[fp.structureElementId][fp.indexNo] = fp; }; if (!db->select(cb)) return; InfrastructureManagement::MainFootprint mf; InfrastructureManagement::FootprintElement elem; for (const QMap &cont : qAsConst(footprintSorted)) { if (cont.empty()) continue; const int structureElementId = cont.first().structureElementId; const int mainStructureElementId = seId2mseId.value(structureElementId); if (!mainStructureElementId) continue; mf.id(mainStructureElementId); mf.structureElementId(structureElementId); mf.name(mainStructureElements.value(mainStructureElementId).name.toStdString()); mf.elements().clear(); mf.elements().reserve(cont.size()); for (const auto &pos : cont) { elem.id(pos.id); elem.relPosition(Core::RelativePosition(pos.relPosition.x(), pos.relPosition.y(), pos.relPosition.z())); mf.elements().push_back(elem); } m_ismMainFootprint->write(mf); } } void StaticPublisher::publishTranslationBlob(const std::shared_ptr &db) { QJsonArray arr; const auto cb = [&arr](const ProjectDataManagement::Database::PdmTranslation &data) { arr += QJsonObject({{QStringLiteral("isoCode"), data.isoCode}, {QStringLiteral("context"), data.context}, {QStringLiteral("key"), data.key}, {QStringLiteral("disambiguation"), data.disambiguation}, {QStringLiteral("translation"), data.translation} }); }; if (!db->select(cb)) return; const QJsonObject jObj{ {QStringLiteral("translations"), arr} }; const QByteArray data = QJsonDocument(jObj).toBinaryData(); const QByteArray compressed = qCompress(data, 9); const QByteArray md5Sum = QCryptographicHash::hash(compressed, QCryptographicHash::Md5).toHex(); m_pdmTranslationBlob->write(ProjectDataManagement::TranslationBlob( 1, LtsUtils::convert>(compressed), md5Sum.data())); } }