11 #include <SimoxUtility/algorithm/string/string_tools.h>
26 _latestDirectory = QString::fromStdString(
"/tmp/MemoryExport");
28 _loadFromDiskButton =
new QPushButton(
" Load Query from Disk into WM",
this);
29 _loadFromDiskButton->setIcon(QIcon(
":/icons/document-open.svg"));
30 _storeOnDiskButton =
new QPushButton(
" Store shown Data on Disk",
this);
31 _storeOnDiskButton->setIcon(QIcon(
":/icons/document-save.svg"));
34 std::vector<QPushButton*> buttons{_storeOnDiskButton, _loadFromDiskButton};
35 for (QPushButton* button : buttons)
37 button->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Fixed);
40 this->setSizePolicy(QSizePolicy::Policy::Preferred, QSizePolicy::Policy::Fixed);
42 QHBoxLayout* layout =
new QHBoxLayout();
43 this->setLayout(layout);
46 layout->setContentsMargins(margin, margin, margin, margin);
48 layout->addWidget(_loadFromDiskButton);
49 layout->addWidget(_storeOnDiskButton);
54 connect(_loadFromDiskButton,
55 &QPushButton::pressed,
58 QString directory = chooseDirectoryDialog();
59 if (directory.size() > 0)
64 connect(_storeOnDiskButton,
65 &QPushButton::pressed,
68 QString directory = chooseDirectoryDialog();
69 if (directory.size() > 0)
76 static const std::string&
77 handleSingular(
int num,
const std::string& singular,
const std::string& plural)
79 return num == 1 ? singular : plural;
84 const std::vector<wm::Memory> memoryData,
85 std::string* outStatus)
87 std::filesystem::path path(directory.toUtf8().constData());
91 if (std::filesystem::is_regular_file(path))
93 status <<
"Could not export memories contents to " << path
94 <<
": Cannot overwrite existing file.";
99 for (
const auto&
data : memoryData)
101 std::string name =
data.id().memoryName;
102 if (std::filesystem::is_regular_file(path / name))
104 status <<
"Could not export memory '" << name <<
"' to " << path
105 <<
": Cannot overwrite existing file.\n";
109 std::string defaultIdent =
"DefaultDisk";
110 std::string exportName =
"MemoryExport";
111 std::shared_ptr<armem::server::ltm::persistence::DiskPersistence> diskPersistence = std::make_shared<armem::server::ltm::persistence::DiskPersistence>(defaultIdent, exportName, path);
115 if (
memory.getPersistenceStrategy())
117 memory.getPersistenceStrategy()->addStrategy(diskPersistence);
121 std::shared_ptr<armem::server::ltm::persistence::RedundantPersistenceStrategy> redundantPersistence = std::make_shared<armem::server::ltm::persistence::RedundantPersistenceStrategy>();
123 memory.setPersistenceStrategy(redundantPersistence);
124 memory.getPersistenceStrategy()->addStrategy(diskPersistence);
132 status <<
"Exported " << numStored <<
" "
133 << handleSingular(numStored,
"memory",
"memories") <<
" to " << path <<
".";
138 *outStatus =
status.str();
142 std::map<std::filesystem::path, wm::Memory>
145 std::string* outStatus)
147 std::filesystem::path path(directory.toUtf8().constData());
149 std::map<std::filesystem::path, wm::Memory> memoryData;
151 auto setStatus = [&](
const std::string&
s)
159 if (not std::filesystem::is_directory(path))
161 setStatus(
"Could not import a memory from " + path.string() +
162 ". It is not a directory. Skipping import.");
168 bool isSingleMemory =
false;
169 for (
auto i = std::filesystem::recursive_directory_iterator(path);
170 i != std::filesystem::recursive_directory_iterator();
176 setStatus(
"Could not import a memory from " + path.string() +
177 ". Data files were not found until max-depth 7. Skipping import.");
184 if (std::filesystem::is_regular_file(dir.path()) &&
199 auto loadMemory = [&](
const std::filesystem::path& p)
201 if (std::filesystem::is_directory(p))
203 std::string defaultIdent =
"DefaultDisk";
204 std::string exportName =
"MemoryExport";
205 std::shared_ptr<armem::server::ltm::persistence::DiskPersistence> diskPersistence = std::make_shared<armem::server::ltm::persistence::DiskPersistence>(defaultIdent, exportName, p.parent_path().parent_path());
214 std::shared_ptr<armem::server::ltm::persistence::RedundantPersistenceStrategy> redundantPersistence = std::make_shared<armem::server::ltm::persistence::RedundantPersistenceStrategy>();
222 memoryData[p] = std::move(
memory);
235 for (
const auto& dir : std::filesystem::directory_iterator(path))
237 loadMemory(dir.path());
242 handleSingular(numLoaded,
"memory",
"memories") +
" from " + path.string() +
".");
247 ControlWidget::chooseDirectoryDialog()
249 _latestDirectory = QFileDialog::getExistingDirectory(
this,
252 QFileDialog::ShowDirsOnly |
253 QFileDialog::DontResolveSymlinks);
255 return _latestDirectory;