11 #ifndef smtk_resource_Manager_h
12 #define smtk_resource_Manager_h
14 #include "smtk/CoreExports.h"
17 #include "smtk/SystemConfig.h"
19 #include "smtk/common/Processing.h"
21 #include "smtk/common/UUID.h"
23 #include "smtk/resource/Container.h"
24 #include "smtk/resource/Lock.h"
25 #include "smtk/resource/Metadata.h"
26 #include "smtk/resource/MetadataContainer.h"
27 #include "smtk/resource/Observer.h"
28 #include "smtk/resource/Resource.h"
33 #include <unordered_map>
39 class GarbageCollector;
41 using GarbageCollectorPtr = std::shared_ptr<GarbageCollector>;
60 template<
typename ResourceType>
61 bool registerResource(
63 ResourcePtr(
const std::string&,
const std::shared_ptr<smtk::common::Managers>&)>& read =
65 const std::function<
bool(
const ResourcePtr&,
const std::shared_ptr<smtk::common::Managers>&)>&
75 template<
typename ResourceType>
76 bool unregisterResource();
79 bool unregisterResource(
const std::string&);
82 bool unregisterResource(
const Resource::Index&);
85 template<
typename ResourceType>
86 bool registered()
const;
89 bool registered(
const std::string&)
const;
92 bool registered(
const Resource::Index&)
const;
99 ResourcePtr create(
const std::string&,
const std::shared_ptr<smtk::common::Managers>& =
nullptr);
103 const Resource::Index&,
104 const std::shared_ptr<smtk::common::Managers>& =
nullptr);
107 template<
typename ResourceType>
108 smtk::shared_ptr<ResourceType> create(
const std::shared_ptr<smtk::common::Managers>& =
nullptr);
114 const std::shared_ptr<smtk::common::Managers>& =
nullptr);
118 const Resource::Index&,
120 const std::shared_ptr<smtk::common::Managers>& =
nullptr);
123 template<
typename ResourceType>
124 smtk::shared_ptr<ResourceType> create(
126 const std::shared_ptr<smtk::common::Managers>& =
nullptr);
135 template<
typename ResourceType>
137 template<
typename ResourceType>
147 template<
typename ResourceType>
148 smtk::shared_ptr<ResourceType> get(
const std::string& url);
149 template<
typename ResourceType>
150 smtk::shared_ptr<const ResourceType> get(
const std::string& url)
const;
153 std::set<ResourcePtr> find(
const std::string&
typeName);
160 std::set<ResourcePtr> find(
const Resource::Index& typeIndex,
bool strict =
false);
163 template<
typename ResourceType>
164 std::set<smtk::shared_ptr<ResourceType>> find();
170 const std::shared_ptr<smtk::common::Managers>& =
nullptr);
174 const Resource::Index&,
176 const std::shared_ptr<smtk::common::Managers>& =
nullptr);
179 template<
typename ResourceType>
180 smtk::shared_ptr<ResourceType> read(
182 const std::shared_ptr<smtk::common::Managers>& =
nullptr);
186 bool write(
const ResourcePtr&,
const std::shared_ptr<smtk::common::Managers>& =
nullptr);
193 const std::shared_ptr<smtk::common::Managers>& =
nullptr);
198 bool add(
const Resource::Index&,
const ResourcePtr&);
202 template<
typename ResourceType>
203 bool add(
const smtk::shared_ptr<ResourceType>&);
217 bool addLegacyReader(
const std::string&,
const std::function<
ResourcePtr(
const std::string&)>&);
224 void reviseId(
const Resource::SetId& source,
const Resource::SetId& destination);
233 const Resource::SetLocation& source,
234 const Resource::SetLocation& destination);
251 return m_resources.empty();
261 return m_resources.size();
287 const Observers& observers()
const {
return m_observers; }
319 const std::unordered_map<smtk::string::Token, smtk::string::Token>&
objectTypeLabels()
const
321 return m_objectTypeLabels;
323 std::unordered_map<smtk::string::Token, smtk::string::Token>& objectTypeLabels()
325 return m_objectTypeLabels;
339 Observers m_observers;
342 Metadata::Observers m_metadataObservers;
345 std::map<std::string, std::function<
ResourcePtr(
const std::string&)>> m_legacyReaders;
348 std::unordered_map<smtk::string::Token, smtk::string::Token> m_objectTypeLabels;
351 GarbageCollectorPtr m_garbageCollector;
357 template<
typename ResourceType>
363 template<
typename ResourceType>
366 return this->
registered(std::type_index(
typeid(ResourceType)).hash_code());
369 template<
typename ResourceType>
371 const std::shared_ptr<smtk::common::Managers>& managers)
373 return smtk::static_pointer_cast<ResourceType>(
374 this->
create(std::type_index(
typeid(ResourceType)).hash_code(), managers));
377 template<
typename ResourceType>
380 const std::shared_ptr<smtk::common::Managers>& managers)
382 return smtk::static_pointer_cast<ResourceType>(
383 this->
create(std::type_index(
typeid(ResourceType)).hash_code(),
id, managers));
386 template<
typename ResourceType>
389 return smtk::static_pointer_cast<ResourceType>(this->
get(
id));
392 template<
typename ResourceType>
395 return smtk::static_pointer_cast<const ResourceType>(this->
get(
id));
398 template<
typename ResourceType>
401 return smtk::static_pointer_cast<ResourceType>(this->
get(url));
404 template<
typename ResourceType>
405 smtk::shared_ptr<const ResourceType>
Manager::get(
const std::string& url)
const
407 return smtk::static_pointer_cast<const ResourceType>(this->
get(url));
410 template<
typename ResourceType>
413 Resource::Index index(
typeid(ResourceType).hash_code());
414 std::set<Resource::Index> validIndices;
415 for (
const auto& metadatum : m_metadata)
417 if (metadatum.m_parentIndices.find(index) != metadatum.m_parentIndices.end())
419 validIndices.insert(metadatum.index());
423 std::set<smtk::shared_ptr<ResourceType>> values;
427 typedef Container::index<IndexTag>::type ResourcesByIndex;
428 ResourcesByIndex& resources = m_resources.get<
IndexTag>();
429 for (
const auto& idx : validIndices)
431 auto resourceItRange = resources.equal_range(idx);
432 for (
auto& it = resourceItRange.first; it != resourceItRange.second; ++it)
434 values.insert(smtk::static_pointer_cast<ResourceType>(*it));
442 template<
typename ResourceType>
444 const std::string& url,
445 const std::shared_ptr<smtk::common::Managers>& managers)
447 return smtk::static_pointer_cast<ResourceType>(
448 this->
read(std::type_index(
typeid(ResourceType)).hash_code(), url, managers));
451 template<
typename ResourceType>
454 return this->
add(std::type_index(
typeid(ResourceType)).hash_code(), resource);
482 static Yes Test(
typename C::ParentResource*);
489 value =
sizeof(Test<T>(
nullptr)) ==
sizeof(Yes)
494 template<
typename ResourceType,
bool derived_resource>
501 template<
typename ResourceType>
504 static std::set<Resource::Index> indices()
506 std::set<Resource::Index> indices;
507 indices.insert(
typeid(ResourceType).hash_code());
508 indices.insert(smtk::resource::Resource::type_index);
518 template<
typename ResourceType>
521 static std::set<Resource::Index> indices()
523 std::set<Resource::Index> indices;
524 indices.insert(std::type_index(
typeid(ResourceType)).hash_code());
527 typename ResourceType::ParentResource,
529 indices.insert(parentIndices.begin(), parentIndices.end());
536 template<
typename ResourceType>
539 ResourcePtr(
const std::string&,
const std::shared_ptr<smtk::common::Managers>&)>& read,
540 const std::function<
bool(
const ResourcePtr&,
const std::shared_ptr<smtk::common::Managers>&)>&
557 smtk::common::typeName<ResourceType>(), std::type_index(
typeid(ResourceType)).hash_code(),
561 Resource::Ptr resource = ResourceType::create();
565 (
read ?
read : [](
const std::string&,
const std::shared_ptr<smtk::common::Managers>&){
return ResourcePtr(); }),
566 (
write ?
write : [](
const ResourcePtr&,
const std::shared_ptr<smtk::common::Managers>&){
return false; })));
571 #endif // smtk_resource_Manager_h