1 #include "DesignCache.h"
2 #include "DesignCache.h"
3 #include "ArchiveExtractor.h"
4 #include "DesignCache.h"
9 #include "../FileModel/Design/FileArchive.h"
11 #include "../ProductModel/Design.h"
14 #include <type_traits>
15 #include <StringVector.h>
17 using namespace Utils;
18 using namespace std::filesystem;
20 namespace Odb::Lib::App
22 DesignCache::DesignCache(std::string directory) :
23 m_directory(std::move(directory))
27 DesignCache::~DesignCache()
32 std::shared_ptr<ProductModel::Design> DesignCache::GetDesign(
const std::string& designName)
34 auto findIt = m_designsByName.find(designName);
35 if (findIt == m_designsByName.end())
37 auto pDesign = LoadDesign(designName);
41 return m_designsByName[designName];
44 std::shared_ptr<FileModel::Design::FileArchive> DesignCache::GetFileArchive(
const std::string& designName)
47 ss <<
"Retrieving design \"" << designName <<
"\" from cache... ";
50 auto findIt = m_fileArchivesByName.find(designName);
51 if (findIt == m_fileArchivesByName.end())
53 loginfo(
"Not found in cache, attempting to load from file...");
55 auto pFileArchive = LoadFileArchive(designName);
56 if (pFileArchive ==
nullptr)
58 logwarn(
"Failed loading from file");
62 loginfo(
"Loaded from file");
68 loginfo(
"Found. Returning from cache.");
71 return m_fileArchivesByName[designName];
74 void DesignCache::AddFileArchive(
const std::string& designName, std::shared_ptr<FileModel::Design::FileArchive> fileArchive,
bool save)
76 m_fileArchivesByName[designName] = fileArchive;
79 SaveFileArchive(designName);
83 bool DesignCache::SaveFileArchive(
const std::string& designName)
85 auto fileArchive = GetFileArchive(designName);
86 if (fileArchive !=
nullptr)
88 return fileArchive->SaveFileModel(m_directory);
93 std::vector<std::string> DesignCache::getLoadedDesignNames(
const std::string& filter)
const
95 std::vector<std::string> loadedDesigns;
96 for (
const auto& kv : m_designsByName)
98 loadedDesigns.push_back(kv.first);
100 return loadedDesigns;
103 std::vector<std::string> DesignCache::getLoadedFileArchiveNames(
const std::string& filter)
const
105 std::vector<std::string> loadedFileArchives;
106 for (
const auto& kv : m_fileArchivesByName)
108 loadedFileArchives.push_back(kv.first);
110 return loadedFileArchives;
113 std::vector<std::string> DesignCache::getUnloadedDesignNames(
const std::string& filter)
const
115 std::vector<std::string> unloadedNames;
119 path dir(m_directory);
120 for (
const auto& entry : directory_iterator(dir))
122 if (entry.is_regular_file())
124 unloadedNames.push_back(entry.path().stem().string());
135 return unloadedNames;
138 int DesignCache::loadAllFileArchives(
bool stopOnError)
142 for (
const auto& entry : directory_iterator(m_directory))
144 if (entry.is_regular_file())
146 if (ArchiveExtractor::IsArchiveTypeSupported(entry.path().filename()))
150 auto pFileArchive = LoadFileArchive(entry.path().stem().string());
151 if (pFileArchive !=
nullptr)
156 catch (std::exception& e)
160 if (stopOnError)
throw e;
169 int DesignCache::loadAllDesigns(
bool stopOnError)
173 for (
const auto& entry : directory_iterator(m_directory))
175 if (entry.is_regular_file())
177 if (ArchiveExtractor::IsArchiveTypeSupported(entry.path().filename()))
181 auto pDesign = LoadDesign(entry.path().stem().string());
182 if (pDesign !=
nullptr)
187 catch (std::exception& e)
202 int DesignCache::loadFileArchives(
const StringVector& names)
206 for (
const auto& name : names)
210 auto pFileArchive = LoadFileArchive(name);
211 if (pFileArchive !=
nullptr)
216 catch (std::exception& e)
226 int DesignCache::loadDesigns(
const StringVector& names)
230 for (
const auto& name : names)
234 auto pDesign = LoadDesign(name);
235 if (pDesign !=
nullptr)
240 catch (std::exception& e)
250 void DesignCache::setDirectory(
const std::string& directory)
252 m_directory = directory;
255 const std::string& DesignCache::getDirectory()
const
260 void DesignCache::Clear()
262 m_fileArchivesByName.clear();
263 m_designsByName.clear();
266 std::shared_ptr<ProductModel::Design> DesignCache::LoadDesign(
const std::string& designName)
268 for (
const auto& entry : directory_iterator(m_directory))
270 if (entry.is_regular_file())
272 if (entry.path().stem() == designName)
274 auto pFileModel = GetFileArchive(designName);
275 if (pFileModel !=
nullptr)
277 auto pDesign = std::make_shared<ProductModel::Design>();
278 if (pDesign->Build(pFileModel))
281 m_designsByName[designName] = pDesign;
300 std::shared_ptr<FileModel::Design::FileArchive> DesignCache::LoadFileArchive(
const std::string& designName)
302 auto fileFound =
false;
305 const auto options = directory_options::skip_permission_denied;
306 for (
const auto& entry : directory_iterator(m_directory, options))
308 if (entry.is_regular_file())
310 if (entry.path().stem() == designName)
314 loginfo(
"file found: [" + entry.path().string() +
"], attempting to parse...");
316 auto pFileArchive = std::make_shared<FileModel::Design::FileArchive>(entry.path().string());
317 if (pFileArchive->ParseFileModel())
320 m_fileArchivesByName[designName] = pFileArchive;
333 logwarn(
"Failed to find file for design \"" + designName +
"\"");