diff --git a/Modules/Core/include/mitkPreferenceListReaderOptionsFunctor.h b/Modules/Core/include/mitkPreferenceListReaderOptionsFunctor.h index 592414d59a..8002dc3122 100644 --- a/Modules/Core/include/mitkPreferenceListReaderOptionsFunctor.h +++ b/Modules/Core/include/mitkPreferenceListReaderOptionsFunctor.h @@ -1,57 +1,62 @@ /*============================================================================ The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center (DKFZ) All rights reserved. Use of this source code is governed by a 3-clause BSD license that can be found in the LICENSE file. ============================================================================*/ #ifndef MITKPREFERENCELISTREADEROPTIONSFUNCTOR_H #define MITKPREFERENCELISTREADEROPTIONSFUNCTOR_H #include #include #include #include namespace mitk { /** * \ingroup IO * * \brief Option callback functor with a preference list/ black list option selection strategy. * * This functor can be used if a option selection should be done without user interaction. * Setting up the functor one can specify a preference and black lists of controller descriptions. * Any controller description on the black list will be ignored and never selected. * The first controller description found on the preference list will be selected. * Any controller listed on the black list is always ignored. Even if it is also * listed on the preference list. * If no preference listed controller is available, the functor will use the pre selected reader. * If no pre selected controller is available, the functor will use the first not black * listed reader. + * If user options (non empty) are specified for the functor, the selected reader will be set + * with these user options. * * \see IOUtil */ struct MITKCORE_EXPORT PreferenceListReaderOptionsFunctor : public IOUtil::ReaderOptionsFunctorBase { using ListType = std::vector; bool operator()(IOUtil::LoadInfo &loadInfo) const override; PreferenceListReaderOptionsFunctor(); PreferenceListReaderOptionsFunctor(const ListType& preference, const ListType& black); + PreferenceListReaderOptionsFunctor(const ListType& preference, const IFileReader::Options& options); + PreferenceListReaderOptionsFunctor(const ListType& preference, const ListType& black, const IFileReader::Options& options); protected: - ListType m_PreferenceList; - ListType m_BlackList; + const ListType m_PreferenceList; + const ListType m_BlackList; + const IFileReader::Options m_Options; }; } #endif // MITKWHITELISTREADEROPTIONSFUNCTOR_H diff --git a/Modules/Core/src/IO/mitkPreferenceListReaderOptionsFunctor.cpp b/Modules/Core/src/IO/mitkPreferenceListReaderOptionsFunctor.cpp index dc7f493c68..632bf1a0a6 100644 --- a/Modules/Core/src/IO/mitkPreferenceListReaderOptionsFunctor.cpp +++ b/Modules/Core/src/IO/mitkPreferenceListReaderOptionsFunctor.cpp @@ -1,72 +1,88 @@ /*============================================================================ The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center (DKFZ) All rights reserved. Use of this source code is governed by a 3-clause BSD license that can be found in the LICENSE file. ============================================================================*/ #include "mitkPreferenceListReaderOptionsFunctor.h" mitk::PreferenceListReaderOptionsFunctor::PreferenceListReaderOptionsFunctor() { } +mitk::PreferenceListReaderOptionsFunctor::PreferenceListReaderOptionsFunctor(const ListType& preference, const IFileReader::Options& options) : m_PreferenceList(preference), m_Options(options) +{ + +} + mitk::PreferenceListReaderOptionsFunctor::PreferenceListReaderOptionsFunctor(const ListType& preference, const ListType& black) : m_PreferenceList(preference), m_BlackList(black) { } +mitk::PreferenceListReaderOptionsFunctor::PreferenceListReaderOptionsFunctor(const ListType& preference, const ListType& black, const IFileReader::Options& options) : m_PreferenceList(preference), m_BlackList(black), m_Options(options) +{ + +} + bool mitk::PreferenceListReaderOptionsFunctor::operator()(IOUtil::LoadInfo &loadInfo) const { auto readerItems = loadInfo.m_ReaderSelector.Get(); auto selectedID = loadInfo.m_ReaderSelector.GetSelectedId(); //check if the pre selected ID is on the blacklist. If true, "un"select. auto finding = std::find(m_BlackList.begin(), m_BlackList.end(), loadInfo.m_ReaderSelector.GetSelected().GetDescription()); if (finding != m_BlackList.end()) { selectedID = -1; } for (auto reader : readerItems) { finding = std::find(m_BlackList.begin(), m_BlackList.end(), reader.GetDescription()); if (finding != m_BlackList.end()) { continue; } finding = std::find(m_PreferenceList.begin(), m_PreferenceList.end(), reader.GetDescription()); if (finding != m_PreferenceList.end()) { selectedID = reader.GetServiceId(); break; } if (selectedID==-1) { selectedID = reader.GetServiceId(); } } if (selectedID == -1) { mitkThrow() << "No valid reader found. All available readers are black listed."; } if (!loadInfo.m_ReaderSelector.Select(selectedID)) { MITK_DEBUG << "Was not able to select reader found by the PreferenceListReaderOptionsFunctor"; } + auto reader = loadInfo.m_ReaderSelector.GetSelected().GetReader(); + if (!m_Options.empty() && nullptr != reader) + { + reader->SetOptions(m_Options); + } + return true; } diff --git a/Modules/Core/test/mitkPreferenceListReaderOptionsFunctorTest.cpp b/Modules/Core/test/mitkPreferenceListReaderOptionsFunctorTest.cpp index c4af10cd1c..f81ee9152c 100644 --- a/Modules/Core/test/mitkPreferenceListReaderOptionsFunctorTest.cpp +++ b/Modules/Core/test/mitkPreferenceListReaderOptionsFunctorTest.cpp @@ -1,199 +1,219 @@ /*============================================================================ The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center (DKFZ) All rights reserved. Use of this source code is governed by a 3-clause BSD license that can be found in the LICENSE file. ============================================================================*/ #include "mitkPreferenceListReaderOptionsFunctor.h" #include "mitkTestFixture.h" #include "mitkTestingMacros.h" #include #include #include #include #include namespace mitk { class TestFileReaderService : public mitk::AbstractFileReader { public: TestFileReaderService(const std::string &description) : AbstractFileReader(CustomMimeType("TestMimeType"), description) { + Options options; + options["o1"] = 0; + this->SetDefaultOptions(options); m_ServiceRegistration = RegisterService(); }; ~TestFileReaderService() override { }; using AbstractFileReader::Read; std::vector> DoRead() override { std::vector> result; return result; }; ConfidenceLevel GetConfidenceLevel() const override { return Supported; }; private: TestFileReaderService * Clone() const override { return new TestFileReaderService(*this); }; us::ServiceRegistration m_ServiceRegistration; }; } // namespace mitk class mitkPreferenceListReaderOptionsFunctorTestSuite : public mitk::TestFixture { CPPUNIT_TEST_SUITE(mitkPreferenceListReaderOptionsFunctorTestSuite); MITK_TEST(UsePreferenceList); MITK_TEST(UseBlackList); MITK_TEST(UseNoList); MITK_TEST(UseBlackAndPreferenceList); MITK_TEST(UseOverlappingBlackAndPreferenceList); MITK_TEST(UsePreferenceListWithInexistantReaders); MITK_TEST(UseAllBlackedList); - + MITK_TEST(SetOptions); CPPUNIT_TEST_SUITE_END(); private: std::string m_ImagePath; mitk::PreferenceListReaderOptionsFunctor::ListType preference; mitk::PreferenceListReaderOptionsFunctor::ListType black; mitk::PreferenceListReaderOptionsFunctor::ListType emptyList; mitk::TestFileReaderService* m_NormalService; mitk::TestFileReaderService* m_PrefService; mitk::TestFileReaderService* m_BlackService; mitk::CustomMimeType* m_TestMimeType; public: void setUp() override { m_ImagePath = GetTestDataFilePath("BallBinary30x30x30.nrrd"); preference = { "Prefered Test Service" }; black = { "Unwanted Test Service" }; emptyList = {}; m_TestMimeType = new mitk::CustomMimeType("TestMimeType"); m_TestMimeType->AddExtension("nrrd"); m_TestMimeType->SetCategory(mitk::IOMimeTypes::CATEGORY_IMAGES()); m_TestMimeType->SetComment("Test mime type"); us::ModuleContext *context = us::GetModuleContext(); us::ServiceProperties props; - props[us::ServiceConstants::SERVICE_RANKING()] = 10; + props[us::ServiceConstants::SERVICE_RANKING()] = 100; context->RegisterService(m_TestMimeType, props); m_NormalService = new mitk::TestFileReaderService("Normal Test Service"); m_PrefService = new mitk::TestFileReaderService("Prefered Test Service"); m_BlackService = new mitk::TestFileReaderService("Unwanted Test Service"); } void tearDown() override { delete m_PrefService; delete m_BlackService; delete m_NormalService; delete m_TestMimeType; } void UsePreferenceList() { mitk::IOUtil::LoadInfo info(m_ImagePath); mitk::PreferenceListReaderOptionsFunctor functor = mitk::PreferenceListReaderOptionsFunctor(preference, emptyList); CPPUNIT_ASSERT(true == functor(info)); auto description = info.m_ReaderSelector.GetSelected().GetDescription(); CPPUNIT_ASSERT_EQUAL(std::string("Prefered Test Service"), description); + CPPUNIT_ASSERT("0" == info.m_ReaderSelector.GetSelected().GetReader()->GetOptions()["o1"].ToString()); } void UseNoList() { mitk::IOUtil::LoadInfo info(m_ImagePath); mitk::PreferenceListReaderOptionsFunctor functor = mitk::PreferenceListReaderOptionsFunctor(emptyList, emptyList); CPPUNIT_ASSERT(true == functor(info)); auto description = info.m_ReaderSelector.GetSelected().GetDescription(); CPPUNIT_ASSERT_EQUAL(std::string("Normal Test Service"), description); } void UseBlackList() { mitk::IOUtil::LoadInfo info(m_ImagePath); mitk::PreferenceListReaderOptionsFunctor functor = mitk::PreferenceListReaderOptionsFunctor(emptyList, black); CPPUNIT_ASSERT(true == functor(info)); auto description = info.m_ReaderSelector.GetSelected().GetDescription(); CPPUNIT_ASSERT(description != "Unwanted Test Service"); } void UseBlackAndPreferenceList() { mitk::IOUtil::LoadInfo info(m_ImagePath); mitk::PreferenceListReaderOptionsFunctor functor = mitk::PreferenceListReaderOptionsFunctor(preference, black); CPPUNIT_ASSERT(true == functor(info)); auto description = info.m_ReaderSelector.GetSelected().GetDescription(); CPPUNIT_ASSERT_EQUAL(std::string("Prefered Test Service"), description); } void UseOverlappingBlackAndPreferenceList() { mitk::IOUtil::LoadInfo info(m_ImagePath); black.push_back("Prefered Test Service"); black.push_back("Normal Test Service"); mitk::PreferenceListReaderOptionsFunctor functor = mitk::PreferenceListReaderOptionsFunctor(preference, black); CPPUNIT_ASSERT(true == functor(info)); auto description = info.m_ReaderSelector.GetSelected().GetDescription(); CPPUNIT_ASSERT_EQUAL(std::string("ITK NrrdImageIO"), description); } void UsePreferenceListWithInexistantReaders() { mitk::IOUtil::LoadInfo info(m_ImagePath); preference.push_back("InexistantReader"); mitk::PreferenceListReaderOptionsFunctor functor = mitk::PreferenceListReaderOptionsFunctor(preference, emptyList); CPPUNIT_ASSERT(true == functor(info)); auto description = info.m_ReaderSelector.GetSelected().GetDescription(); CPPUNIT_ASSERT_EQUAL(std::string("Prefered Test Service"), description); } void UseAllBlackedList() { mitk::IOUtil::LoadInfo info(m_ImagePath); for (auto reader : info.m_ReaderSelector.Get()) { black.push_back(reader.GetDescription()); } mitk::PreferenceListReaderOptionsFunctor functor = mitk::PreferenceListReaderOptionsFunctor(emptyList, black); CPPUNIT_ASSERT_THROW(functor(info), mitk::Exception); } + + void SetOptions() + { + mitk::IOUtil::LoadInfo info(m_ImagePath); + + mitk::IFileReader::Options options; + options.insert(std::make_pair("o1", 42)); + + mitk::PreferenceListReaderOptionsFunctor functor = mitk::PreferenceListReaderOptionsFunctor(preference, options); + + CPPUNIT_ASSERT(true == functor(info)); + auto description = info.m_ReaderSelector.GetSelected().GetDescription(); + CPPUNIT_ASSERT_EQUAL(std::string("Prefered Test Service"), description); + CPPUNIT_ASSERT("42" == info.m_ReaderSelector.GetSelected().GetReader()->GetOption("o1").ToString()); + } + }; MITK_TEST_SUITE_REGISTRATION(mitkPreferenceListReaderOptionsFunctor) diff --git a/Modules/DICOMReaderServices/src/mitkManualSelectingDICOMReaderService.cpp b/Modules/DICOMReaderServices/src/mitkManualSelectingDICOMReaderService.cpp index 479da04892..47db50fdaa 100644 --- a/Modules/DICOMReaderServices/src/mitkManualSelectingDICOMReaderService.cpp +++ b/Modules/DICOMReaderServices/src/mitkManualSelectingDICOMReaderService.cpp @@ -1,64 +1,64 @@ /*============================================================================ The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center (DKFZ) All rights reserved. Use of this source code is governed by a 3-clause BSD license that can be found in the LICENSE file. ============================================================================*/ #include "mitkManualSelectingDICOMReaderService.h" namespace mitk { ManualSelectingDICOMReaderService::ManualSelectingDICOMReaderService() : BaseDICOMReaderService("MITK DICOM Reader v2 (manual)") { Options defaultOptions; m_Selector = mitk::DICOMFileReaderSelector::New(); m_Selector->LoadBuiltIn3DConfigs(); m_Selector->LoadBuiltIn3DnTConfigs(); auto readers = m_Selector->GetAllConfiguredReaders(); std::vector configs; for (const auto& reader : readers) { configs.push_back(reader->GetConfigurationLabel()); } defaultOptions["Configuration"] = configs; this->SetDefaultOptions(defaultOptions); this->RegisterService(); } -DICOMFileReader::Pointer ManualSelectingDICOMReaderService::GetReader(const mitk::StringList& relevantFiles) const +DICOMFileReader::Pointer ManualSelectingDICOMReaderService::GetReader(const mitk::StringList& /*relevantFiles*/) const { const auto label = this->GetOption("Configuration").ToString(); mitk::DICOMFileReader::Pointer selectedReader = nullptr; auto readers = m_Selector->GetAllConfiguredReaders(); for (const auto& reader : readers) { if (label == reader->GetConfigurationLabel()) { selectedReader = reader; } } return selectedReader; }; ManualSelectingDICOMReaderService* ManualSelectingDICOMReaderService::Clone() const { return new ManualSelectingDICOMReaderService(*this); } }