diff options
-rw-r--r-- | common/resourcefacade.cpp | 33 | ||||
-rw-r--r-- | common/store.cpp | 2 |
2 files changed, 24 insertions, 11 deletions
diff --git a/common/resourcefacade.cpp b/common/resourcefacade.cpp index 4a8037d..c702777 100644 --- a/common/resourcefacade.cpp +++ b/common/resourcefacade.cpp | |||
@@ -34,33 +34,42 @@ SINK_DEBUG_AREA("ResourceFacade") | |||
34 | template<typename DomainType> | 34 | template<typename DomainType> |
35 | ConfigNotifier LocalStorageFacade<DomainType>::sConfigNotifier; | 35 | ConfigNotifier LocalStorageFacade<DomainType>::sConfigNotifier; |
36 | 36 | ||
37 | static void applyConfig(ConfigStore &configStore, const QByteArray &id, ApplicationDomain::ApplicationDomainType &object) | 37 | static void applyConfig(ConfigStore &configStore, const QByteArray &id, ApplicationDomain::ApplicationDomainType &object, const QByteArrayList &requestedProperties) |
38 | { | 38 | { |
39 | const auto configurationValues = configStore.get(id); | 39 | const auto configurationValues = configStore.get(id); |
40 | for (auto it = configurationValues.constBegin(); it != configurationValues.constEnd(); it++) { | 40 | for (auto it = configurationValues.constBegin(); it != configurationValues.constEnd(); it++) { |
41 | object.setProperty(it.key(), it.value()); | 41 | object.setProperty(it.key(), it.value()); |
42 | } | 42 | } |
43 | //Populate the object with dummy values for non-available but requested properties. | ||
44 | //This avoid a warning about non-existing properties in bufferadaptor.h | ||
45 | if (!requestedProperties.isEmpty()) { | ||
46 | for (const auto &requested: requestedProperties) { | ||
47 | if (!object.hasProperty(requested)) { | ||
48 | object.setProperty(requested, QVariant{}); | ||
49 | } | ||
50 | } | ||
51 | } | ||
43 | } | 52 | } |
44 | 53 | ||
45 | template <typename DomainType> | 54 | template <typename DomainType> |
46 | static typename DomainType::Ptr readFromConfig(ConfigStore &configStore, const QByteArray &id, const QByteArray &type) | 55 | static typename DomainType::Ptr readFromConfig(ConfigStore &configStore, const QByteArray &id, const QByteArray &type, const QByteArrayList &requestedProperties) |
47 | { | 56 | { |
48 | auto object = DomainType::Ptr::create(id); | 57 | auto object = DomainType::Ptr::create(id); |
49 | applyConfig(configStore, id, *object); | 58 | applyConfig(configStore, id, *object, requestedProperties); |
50 | return object; | 59 | return object; |
51 | } | 60 | } |
52 | 61 | ||
53 | template <> | 62 | template <> |
54 | typename ApplicationDomain::SinkAccount::Ptr readFromConfig<ApplicationDomain::SinkAccount>(ConfigStore &configStore, const QByteArray &id, const QByteArray &type) | 63 | typename ApplicationDomain::SinkAccount::Ptr readFromConfig<ApplicationDomain::SinkAccount>(ConfigStore &configStore, const QByteArray &id, const QByteArray &type, const QByteArrayList &requestedProperties) |
55 | { | 64 | { |
56 | auto object = ApplicationDomain::SinkAccount::Ptr::create(id); | 65 | auto object = ApplicationDomain::SinkAccount::Ptr::create(id); |
57 | object->setProperty(ApplicationDomain::SinkAccount::AccountType::name, type); | 66 | object->setProperty(ApplicationDomain::SinkAccount::AccountType::name, type); |
58 | applyConfig(configStore, id, *object); | 67 | applyConfig(configStore, id, *object, requestedProperties); |
59 | return object; | 68 | return object; |
60 | } | 69 | } |
61 | 70 | ||
62 | template <> | 71 | template <> |
63 | typename ApplicationDomain::SinkResource::Ptr readFromConfig<ApplicationDomain::SinkResource>(ConfigStore &configStore, const QByteArray &id, const QByteArray &type) | 72 | typename ApplicationDomain::SinkResource::Ptr readFromConfig<ApplicationDomain::SinkResource>(ConfigStore &configStore, const QByteArray &id, const QByteArray &type, const QByteArrayList &requestedProperties) |
64 | { | 73 | { |
65 | auto object = ApplicationDomain::SinkResource::Ptr::create(id); | 74 | auto object = ApplicationDomain::SinkResource::Ptr::create(id); |
66 | object->setProperty(ApplicationDomain::SinkResource::ResourceType::name, type); | 75 | object->setProperty(ApplicationDomain::SinkResource::ResourceType::name, type); |
@@ -70,7 +79,7 @@ typename ApplicationDomain::SinkResource::Ptr readFromConfig<ApplicationDomain:: | |||
70 | object->setCapabilities(res->capabilities()); | 79 | object->setCapabilities(res->capabilities()); |
71 | } | 80 | } |
72 | } | 81 | } |
73 | applyConfig(configStore, id, *object); | 82 | applyConfig(configStore, id, *object, requestedProperties); |
74 | return object; | 83 | return object; |
75 | } | 84 | } |
76 | 85 | ||
@@ -104,7 +113,7 @@ LocalStorageQueryRunner<DomainType>::LocalStorageQueryRunner(const Query &query, | |||
104 | if (!query.ids().isEmpty() && !query.ids().contains(res)) { | 113 | if (!query.ids().isEmpty() && !query.ids().contains(res)) { |
105 | continue; | 114 | continue; |
106 | } | 115 | } |
107 | auto entity = readFromConfig<DomainType>(mConfigStore, res, type); | 116 | auto entity = readFromConfig<DomainType>(mConfigStore, res, type, query.requestedProperties); |
108 | if (!matchesFilter(query.getBaseFilters(), *entity)){ | 117 | if (!matchesFilter(query.getBaseFilters(), *entity)){ |
109 | SinkTraceCtx(mLogCtx) << "Skipping due to filter." << res; | 118 | SinkTraceCtx(mLogCtx) << "Skipping due to filter." << res; |
110 | continue; | 119 | continue; |
@@ -169,7 +178,7 @@ template<typename DomainType> | |||
169 | void LocalStorageQueryRunner<DomainType>::statusChanged(const QByteArray &identifier) | 178 | void LocalStorageQueryRunner<DomainType>::statusChanged(const QByteArray &identifier) |
170 | { | 179 | { |
171 | SinkTraceCtx(mLogCtx) << "Status changed " << identifier; | 180 | SinkTraceCtx(mLogCtx) << "Status changed " << identifier; |
172 | auto entity = readFromConfig<DomainType>(mConfigStore, identifier, ApplicationDomain::getTypeName<DomainType>()); | 181 | auto entity = readFromConfig<DomainType>(mConfigStore, identifier, ApplicationDomain::getTypeName<DomainType>(), QByteArrayList{}); |
173 | updateStatus(*entity); | 182 | updateStatus(*entity); |
174 | mResultProvider->modify(entity); | 183 | mResultProvider->modify(entity); |
175 | } | 184 | } |
@@ -213,7 +222,7 @@ KAsync::Job<void> LocalStorageFacade<DomainType>::create(const DomainType &domai | |||
213 | } | 222 | } |
214 | configStore.modify(identifier, configurationValues); | 223 | configStore.modify(identifier, configurationValues); |
215 | } | 224 | } |
216 | sConfigNotifier.add(::readFromConfig<DomainType>(configStore, identifier, type)); | 225 | sConfigNotifier.add(::readFromConfig<DomainType>(configStore, identifier, type, QByteArrayList{})); |
217 | }); | 226 | }); |
218 | } | 227 | } |
219 | 228 | ||
@@ -242,7 +251,7 @@ KAsync::Job<void> LocalStorageFacade<DomainType>::modify(const DomainType &domai | |||
242 | } | 251 | } |
243 | 252 | ||
244 | const auto type = configStore.getEntries().value(identifier); | 253 | const auto type = configStore.getEntries().value(identifier); |
245 | sConfigNotifier.modify(::readFromConfig<DomainType>(configStore, identifier, type)); | 254 | sConfigNotifier.modify(::readFromConfig<DomainType>(configStore, identifier, type, QByteArrayList{})); |
246 | }); | 255 | }); |
247 | } | 256 | } |
248 | 257 | ||
@@ -337,6 +346,8 @@ QPair<KAsync::Job<void>, typename Sink::ResultEmitter<typename ApplicationDomain | |||
337 | runner->setStatusUpdater([runner, monitoredResources, ctx](ApplicationDomain::SinkAccount &account) { | 346 | runner->setStatusUpdater([runner, monitoredResources, ctx](ApplicationDomain::SinkAccount &account) { |
338 | Query query; | 347 | Query query; |
339 | query.filter<ApplicationDomain::SinkResource::Account>(account.identifier()); | 348 | query.filter<ApplicationDomain::SinkResource::Account>(account.identifier()); |
349 | query.request<ApplicationDomain::SinkResource::Account>() | ||
350 | .request<ApplicationDomain::SinkResource::Capabilities>(); | ||
340 | const auto resources = Store::read<ApplicationDomain::SinkResource>(query); | 351 | const auto resources = Store::read<ApplicationDomain::SinkResource>(query); |
341 | SinkTraceCtx(ctx) << "Found resource belonging to the account " << account.identifier() << " : " << resources; | 352 | SinkTraceCtx(ctx) << "Found resource belonging to the account " << account.identifier() << " : " << resources; |
342 | auto accountIdentifier = account.identifier(); | 353 | auto accountIdentifier = account.identifier(); |
diff --git a/common/store.cpp b/common/store.cpp index 727f4cc..264f2e3 100644 --- a/common/store.cpp +++ b/common/store.cpp | |||
@@ -92,6 +92,7 @@ QPair<typename AggregatingResultEmitter<typename DomainType::Ptr>::Ptr, typenam | |||
92 | auto facade = FacadeFactory::instance().getFacade<ApplicationDomain::SinkResource>(); | 92 | auto facade = FacadeFactory::instance().getFacade<ApplicationDomain::SinkResource>(); |
93 | Q_ASSERT(facade); | 93 | Q_ASSERT(facade); |
94 | Sink::Query resourceQuery; | 94 | Sink::Query resourceQuery; |
95 | resourceQuery.request<ApplicationDomain::SinkResource::Capabilities>(); | ||
95 | if (query.liveQuery()) { | 96 | if (query.liveQuery()) { |
96 | SinkTraceCtx(ctx) << "Listening for new resources."; | 97 | SinkTraceCtx(ctx) << "Listening for new resources."; |
97 | resourceQuery.setFlags(Query::LiveQuery); | 98 | resourceQuery.setFlags(Query::LiveQuery); |
@@ -103,6 +104,7 @@ QPair<typename AggregatingResultEmitter<typename DomainType::Ptr>::Ptr, typenam | |||
103 | resourceFilter.propertyFilter.insert(ApplicationDomain::SinkResource::Capabilities::name, Query::Comparator{ApplicationDomain::getTypeName<DomainType>(), Query::Comparator::Contains}); | 104 | resourceFilter.propertyFilter.insert(ApplicationDomain::SinkResource::Capabilities::name, Query::Comparator{ApplicationDomain::getTypeName<DomainType>(), Query::Comparator::Contains}); |
104 | } | 105 | } |
105 | resourceQuery.setFilter(resourceFilter); | 106 | resourceQuery.setFilter(resourceFilter); |
107 | resourceQuery.requestedProperties << resourceFilter.propertyFilter.keys(); | ||
106 | 108 | ||
107 | auto result = facade->load(resourceQuery, resourceCtx); | 109 | auto result = facade->load(resourceQuery, resourceCtx); |
108 | auto emitter = result.second; | 110 | auto emitter = result.second; |