11 #ifndef smtk_project_Manager_h
12 #define smtk_project_Manager_h
14 #include "smtk/CoreExports.h"
19 #include "smtk/operation/Manager.h"
20 #include "smtk/operation/Observer.h"
22 #include "smtk/project/Container.h"
23 #include "smtk/project/Metadata.h"
24 #include "smtk/project/MetadataContainer.h"
25 #include "smtk/project/MetadataObserver.h"
26 #include "smtk/project/Observer.h"
28 #include "smtk/resource/Manager.h"
32 #include <type_traits>
47 static std::shared_ptr<Manager> create(
51 return smtk::shared_ptr<Manager>(
new Manager(resourceManager, operationManager));
60 typename ResourcesTuple = std::tuple<>,
61 typename OperationsTuple = std::tuple<>>
62 bool registerProject(
const std::string& version =
"0.0.0");
68 const std::string& name,
69 const std::set<std::string>& resources = {},
70 const std::set<std::string>& operations = {},
71 const std::string& version =
"0.0.0");
77 bool unregisterProject(
const std::string&);
79 template<
typename ProjectType>
80 bool unregisterProject();
83 template<
typename OperationType>
84 bool registerOperation();
88 template<
typename Tuple>
91 return Manager::registerOperations<0, Tuple>();
96 bool registered(
const std::string&)
const;
98 template<
typename ProjectType>
99 bool registered()
const;
102 bool unregisterOperation(
const std::string&);
103 bool unregisterOperation(
const smtk::operation::Operation::Index&);
104 template<
typename OperationType>
105 bool unregisterOperation();
108 template<
typename Tuple>
109 bool unregisterOperations()
111 return Manager::unregisterOperations<0, Tuple>();
115 ProjectPtr create(
const std::string&,
const std::shared_ptr<smtk::common::Managers>& =
nullptr);
118 const std::shared_ptr<smtk::common::Managers>& =
nullptr);
119 template<
typename ProjectType>
120 smtk::shared_ptr<ProjectType> create(
const std::shared_ptr<smtk::common::Managers>& =
nullptr);
127 const std::shared_ptr<smtk::common::Managers>& =
nullptr);
131 const std::shared_ptr<smtk::common::Managers>& =
nullptr);
132 template<
typename ProjectType>
133 smtk::shared_ptr<ProjectType> create(
135 const std::shared_ptr<smtk::common::Managers>& =
nullptr);
141 template<
typename ProjectType>
143 template<
typename ProjectType>
149 ConstProjectPtr get(
const std::string&)
const;
150 template<
typename ProjectType>
151 smtk::shared_ptr<ProjectType> get(
const std::string&);
152 template<
typename ProjectType>
153 smtk::shared_ptr<const ProjectType> get(
const std::string&)
const;
157 std::set<ProjectPtr> find(
const std::string&);
159 template<
typename ProjectType>
160 std::set<smtk::shared_ptr<ProjectType>> find();
169 template<
typename ProjectType>
170 bool add(
const smtk::shared_ptr<ProjectType>&);
182 const Container& projects()
const {
return m_projects; }
183 std::set<smtk::project::ProjectPtr> projectsSet()
const;
190 const Observers& observers()
const {
return m_observers; }
204 template<std::
size_t I,
typename Tuple>
205 inline typename std::enable_if<I != std::tuple_size<Tuple>::value,
bool>::type
208 bool registered = this->registerOperation<typename std::tuple_element<I, Tuple>::type>();
209 return registered && Manager::registerOperations<I + 1, Tuple>();
212 template<std::
size_t I,
typename Tuple>
213 inline typename std::enable_if<I == std::tuple_size<Tuple>::value,
bool>::type
219 template<std::
size_t I,
typename Tuple>
220 inline typename std::enable_if<I != std::tuple_size<Tuple>::value,
bool>::type
221 unregisterOperations()
223 bool unregistered = this->unregisterOperation<typename std::tuple_element<I, Tuple>::type>();
224 return unregistered && Manager::unregisterOperations<I + 1, Tuple>();
227 template<std::
size_t I,
typename Tuple>
228 inline typename std::enable_if<I == std::tuple_size<Tuple>::value,
bool>::type
229 unregisterOperations()
244 Metadata::Observers m_metadataObservers;
246 std::weak_ptr<smtk::resource::Manager> m_resourceManager;
247 std::weak_ptr<smtk::operation::Manager> m_operationManager;
253 smtk::operation::Observers::Key m_operationManagerObserver;
258 template<std::
size_t I,
typename Tuple>
259 inline typename std::enable_if<I != std::tuple_size<Tuple>::value>::type tupleToTypeNames(
260 std::set<std::string>& typeNames)
263 return tupleToTypeNames<I + 1, Tuple>(typeNames);
266 template<std::
size_t I,
typename Tuple>
267 inline typename std::enable_if<I == std::tuple_size<Tuple>::value>::type tupleToTypeNames(
268 std::set<std::string>& )
273 template<
typename Tuple>
274 std::set<std::string> tupleToTypeNames()
276 std::set<std::string> typeNames;
277 tupleToTypeNames<0, Tuple>(typeNames);
282 template<
typename ProjectType,
typename ResourcesTuple,
typename OperationsTuple>
286 smtk::common::typeName<ProjectType>(),
287 std::type_index(
typeid(ProjectType)).hash_code(),
288 [](
const smtk::common::UUID&
id,
const std::shared_ptr<smtk::common::Managers>& managers) {
289 Project::Ptr project = ProjectType::create();
293 if (managers->
contains<smtk::resource::Manager::Ptr>())
295 project->resources().setManager(managers->
get<smtk::resource::Manager::Ptr>());
297 if (managers->
contains<smtk::operation::Manager::Ptr>())
299 project->operations().setManager(managers->
get<smtk::operation::Manager::Ptr>());
305 detail::tupleToTypeNames<ResourcesTuple>(),
306 detail::tupleToTypeNames<OperationsTuple>(),
310 template<
typename ProjectType>
311 bool Manager::registered()
const
313 return this->registered(std::type_index(
typeid(ProjectType)).hash_code());
316 template<
typename ProjectType>
317 bool Manager::unregisterProject()
319 return this->unregisterProject(std::type_index(
typeid(ProjectType)).hash_code());
322 template<
typename OperationType>
329 auto op = OperationType::create();
330 op->setProjectManager(shared_from_this());
331 auto specification = op->specification();
334 smtk::common::typeName<OperationType>(),
335 std::type_index(
typeid(OperationType)).hash_code(),
337 []() {
return OperationType::create(); }));
340 template<
typename OperationType>
341 bool Manager::unregisterOperation()
343 return this->unregisterOperation(std::type_index(
typeid(OperationType)).hash_code());
346 template<
typename ProjectType>
347 std::shared_ptr<ProjectType> Manager::create(
const std::shared_ptr<smtk::common::Managers>& m)
349 return std::static_pointer_cast<ProjectType>(
350 this->create(std::type_index(
typeid(ProjectType)).hash_code(), m));
353 template<
typename ProjectType>
354 std::shared_ptr<ProjectType> Manager::create(
356 const std::shared_ptr<smtk::common::Managers>& m)
358 return std::static_pointer_cast<ProjectType>(
359 this->create(std::type_index(
typeid(ProjectType)).hash_code(),
id, m));
362 template<
typename ProjectType>
365 return std::static_pointer_cast<ProjectType>(this->
get(
id));
368 template<
typename ProjectType>
371 return std::static_pointer_cast<const ProjectType>(this->
get(
id));
374 template<
typename ProjectType>
375 std::shared_ptr<ProjectType>
Manager::get(
const std::string& url)
377 return std::static_pointer_cast<ProjectType>(this->
get(url));
380 template<
typename ProjectType>
381 std::shared_ptr<const ProjectType>
Manager::get(
const std::string& url)
const
383 return std::static_pointer_cast<const ProjectType>(this->
get(url));
386 template<
typename ProjectType>
387 std::set<std::shared_ptr<ProjectType>> Manager::find()
389 std::set<std::shared_ptr<Project>> tmp = this->
find(smtk::common::typeName<ProjectType>());
390 std::set<std::shared_ptr<ProjectType>>
projects;
391 for (
const auto& project : tmp)
393 projects.insert(std::static_pointer_cast<ProjectType>(project));
398 template<
typename ProjectType>
401 return this->
add(std::type_index(
typeid(ProjectType)).hash_code(), project);