11 #include <SimoxUtility/algorithm/string/string_tools.h>
25 _latestDirectory = QString::fromStdString(
"/tmp/MemoryExport");
27 _loadFromDiskButton =
new QPushButton(
" Load Query from Disk into WM",
this);
28 _loadFromDiskButton->setIcon(QIcon(
":/icons/document-open.svg"));
29 _storeOnDiskButton =
new QPushButton(
" Store shown Data on Disk",
this);
30 _storeOnDiskButton->setIcon(QIcon(
":/icons/document-save.svg"));
33 std::vector<QPushButton*> buttons{_storeOnDiskButton, _loadFromDiskButton};
34 for (QPushButton* button : buttons)
36 button->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Fixed);
39 this->setSizePolicy(QSizePolicy::Policy::Preferred, QSizePolicy::Policy::Fixed);
41 QHBoxLayout* layout =
new QHBoxLayout();
42 this->setLayout(layout);
45 layout->setContentsMargins(margin, margin, margin, margin);
47 layout->addWidget(_loadFromDiskButton);
48 layout->addWidget(_storeOnDiskButton);
53 connect(_loadFromDiskButton,
54 &QPushButton::pressed,
57 QString directory = chooseDirectoryDialog();
58 if (directory.size() > 0)
63 connect(_storeOnDiskButton,
64 &QPushButton::pressed,
67 QString directory = chooseDirectoryDialog();
68 if (directory.size() > 0)
75 static const std::string&
76 handleSingular(
int num,
const std::string& singular,
const std::string& plural)
78 return num == 1 ? singular : plural;
83 const std::vector<wm::Memory> memoryData,
84 std::string* outStatus)
86 std::filesystem::path path(directory.toUtf8().constData());
90 if (std::filesystem::is_regular_file(path))
92 status <<
"Could not export memories contents to " << path
93 <<
": Cannot overwrite existing file.";
98 for (
const auto&
data : memoryData)
100 std::string name =
data.id().memoryName;
101 if (std::filesystem::is_regular_file(path / name))
103 status <<
"Could not export memory '" << name <<
"' to " << path
104 <<
": Cannot overwrite existing file.\n";
108 std::string defaultIdent =
"DefaultDisk";
109 std::string exportName =
"MemoryExport";
110 std::shared_ptr<armem::server::ltm::persistence::DiskPersistence>
112 std::make_shared<armem::server::ltm::persistence::DiskPersistence>(
113 defaultIdent, exportName, path);
117 if (
memory.getPersistenceStrategy())
119 memory.getPersistenceStrategy()->addStrategy(diskPersistence);
128 memory.setPersistenceStrategy(redundantPersistence);
129 memory.getPersistenceStrategy()->addStrategy(diskPersistence);
137 status <<
"Exported " << numStored <<
" "
138 << handleSingular(numStored,
"memory",
"memories") <<
" to " << path <<
".";
143 *outStatus =
status.str();
147 std::map<std::filesystem::path, wm::Memory>
150 std::string* outStatus)
152 std::filesystem::path path(directory.toUtf8().constData());
154 std::map<std::filesystem::path, wm::Memory> memoryData;
156 auto setStatus = [&](
const std::string&
s)
164 if (not std::filesystem::is_directory(path))
166 setStatus(
"Could not import a memory from " + path.string() +
167 ". It is not a directory. Skipping import.");
175 bool isSingleMemory =
false;
176 for (
auto i = std::filesystem::recursive_directory_iterator(path);
177 i != std::filesystem::recursive_directory_iterator();
184 setStatus(
"Could not import a memory from " + path.string() +
185 ". Data files were not found until max-depth 7. Skipping import.");
192 if (std::filesystem::is_regular_file(dir.path()) &&
208 auto loadMemory = [&](
const std::filesystem::path& p)
210 if (std::filesystem::is_directory(p))
212 std::string defaultIdent =
"DefaultDisk";
213 std::string exportName =
215 std::shared_ptr<armem::server::ltm::persistence::DiskPersistence> diskPersistence =
216 std::make_shared<armem::server::ltm::persistence::DiskPersistence>(
217 defaultIdent, exportName, p.parent_path().parent_path());
226 std::shared_ptr<armem::server::ltm::persistence::RedundantPersistenceStrategy>
236 memoryData[p] = std::move(
memory);
249 for (
const auto& dir : std::filesystem::directory_iterator(path))
251 loadMemory(dir.path());
256 handleSingular(numLoaded,
"memory",
"memories") +
" from " + path.string() +
".");
261 ControlWidget::chooseDirectoryDialog()
263 _latestDirectory = QFileDialog::getExistingDirectory(
this,
266 QFileDialog::ShowDirsOnly |
267 QFileDialog::DontResolveSymlinks);
269 return _latestDirectory;