Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
mitkFileWriterRegistry.cpp
Go to the documentation of this file.
1 /*============================================================================
2 
3 The Medical Imaging Interaction Toolkit (MITK)
4 
5 Copyright (c) German Cancer Research Center (DKFZ)
6 All rights reserved.
7 
8 Use of this source code is governed by a 3-clause BSD license that can be
9 found in the LICENSE file.
10 
11 ============================================================================*/
12 
13 #include "mitkFileWriterRegistry.h"
14 
15 // MITK
16 #include "mitkBaseData.h"
17 #include "mitkCoreServices.h"
18 #include "mitkIMimeTypeProvider.h"
19 
20 // Microservices
21 #include <usGetModuleContext.h>
22 #include <usLDAPProp.h>
23 #include <usModuleContext.h>
24 #include <usServiceProperties.h>
25 
27 {
28 }
29 
31 {
32  for (auto &elem : m_ServiceObjects)
33  {
34  elem.second.UngetService(elem.first);
35  }
36 }
37 
38 std::vector<mitk::FileWriterRegistry::WriterReference> mitk::FileWriterRegistry::GetReferences(
39  const mitk::BaseData *baseData, us::ModuleContext *context)
40 {
41  return GetReferences(baseData, std::string(), context);
42 }
43 
44 std::vector<mitk::FileWriterRegistry::WriterReference> mitk::FileWriterRegistry::GetReferences(
45  const mitk::BaseData *baseData, const std::string &mimeType, us::ModuleContext *context)
46 {
47  if (baseData == nullptr)
48  {
49  mitkThrow() << "FileWriterRegistry::GetReferences was called with null basedata.";
50  std::vector<mitk::FileWriterRegistry::WriterReference> emptyResult;
51  return emptyResult;
52  }
53 
54  if (context == nullptr)
55  context = us::GetModuleContext();
56 
57  std::vector<WriterReference> result;
58 
59  // loop over the class hierarchy of baseData and get all writers
60  // claiming to support the actual baseData class or any of its super classes
61  std::vector<std::string> classHierarchy = baseData->GetClassHierarchy();
62  for (std::vector<std::string>::const_iterator clIter = classHierarchy.begin(), clIterEnd = classHierarchy.end();
63  clIter != clIterEnd;
64  ++clIter)
65  {
66  std::string filter =
67  us::LDAPProp(us::ServiceConstants::OBJECTCLASS()) == us_service_interface_iid<IFileWriter>() &&
69  (mimeType.empty() ? us::LDAPPropExpr(std::string()) : us::LDAPProp(IFileWriter::PROP_MIMETYPE()) == mimeType);
70  std::vector<WriterReference> refs = context->GetServiceReferences<IFileWriter>(filter);
71  result.insert(result.end(), refs.begin(), refs.end());
72  }
73  return result;
74 }
75 
77  us::ModuleContext *context)
78 {
79  if (!ref)
80  return nullptr;
81 
82  if (context == nullptr)
83  context = us::GetModuleContext();
84 
85  us::ServiceObjects<mitk::IFileWriter> serviceObjects = context->GetServiceObjects(ref);
86  mitk::IFileWriter *writer = serviceObjects.GetService();
87  m_ServiceObjects.insert(std::make_pair(writer, serviceObjects));
88  return writer;
89 }
90 
91 std::vector<mitk::IFileWriter *> mitk::FileWriterRegistry::GetWriters(const mitk::BaseData *baseData,
92  const std::string &mimeType,
93  us::ModuleContext *context)
94 {
95  if (baseData == nullptr)
96  {
97  mitkThrow() << "FileWriterRegistry::GetReferences was called with null basedata.";
98  std::vector<mitk::IFileWriter *> emptyResult;
99  return emptyResult;
100  }
101 
102  if (context == nullptr)
103  context = us::GetModuleContext();
104 
105  std::vector<mitk::IFileWriter *> result;
106 
107  std::vector<us::ServiceReference<IFileWriter>> refs;
108  if (mimeType.empty())
109  {
110  refs = GetReferences(baseData, context);
111  }
112  else
113  {
114  refs = GetReferences(baseData, mimeType, context);
115  }
116  std::sort(refs.begin(), refs.end());
117 
118  result.reserve(refs.size());
119 
120  // Translate List of ServiceRefs to List of Pointers
121  for (std::vector<us::ServiceReference<IFileWriter>>::const_reverse_iterator iter = refs.rbegin(), end = refs.rend();
122  iter != end;
123  ++iter)
124  {
125  us::ServiceObjects<mitk::IFileWriter> serviceObjects = context->GetServiceObjects(*iter);
126  mitk::IFileWriter *writer = serviceObjects.GetService();
127  m_ServiceObjects.insert(std::make_pair(writer, serviceObjects));
128  result.push_back(writer);
129  }
130 
131  return result;
132 }
133 
135 {
136  auto writerIter =
137  m_ServiceObjects.find(writer);
138  if (writerIter != m_ServiceObjects.end())
139  {
140  writerIter->second.UngetService(writer);
141  m_ServiceObjects.erase(writerIter);
142  }
143 }
144 
145 void mitk::FileWriterRegistry::UngetWriters(const std::vector<mitk::IFileWriter *> &writers)
146 {
147  for (const auto &writer : writers)
148  {
149  this->UngetWriter(writer);
150  }
151 }
void UngetWriter(IFileWriter *writer)
Base of all data objects.
Definition: mitkBaseData.h:37
std::vector< IFileWriter * > GetWriters(const BaseData *baseData, const std::string &mimeType, us::ModuleContext *context=us::GetModuleContext())
static std::string PROP_MIMETYPE()
Service property name for the mime-type associated with this file writer.
Definition: mitkIFileIO.cpp:24
virtual std::vector< std::string > GetClassHierarchy() const
Definition: mitkBaseData.h:41
#define mitkThrow()
IFileWriter * GetWriter(const WriterReference &ref, us::ModuleContext *context=us::GetModuleContext())
static std::vector< WriterReference > GetReferences(const BaseData *baseData, us::ModuleContext *context=us::GetModuleContext())
US_Core_EXPORT const std::string & OBJECTCLASS()
static std::string PROP_BASEDATA_TYPE()
Service property name for the supported mitk::BaseData sub-class.
The common interface of all MITK file writers.
static ModuleContext * GetModuleContext()
Returns the module context of the calling module.
void UngetWriters(const std::vector< IFileWriter *> &writers)