From 471825e65bb629d1d3370c314a48a6594c3f5bca Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Tue, 12 Apr 2016 22:17:52 +0200 Subject: Ported ResourceFacade to LocalStorageFacade --- common/resourcefacade.cpp | 133 +++++++++------------------------------------- common/resourcefacade.h | 7 +-- 2 files changed, 27 insertions(+), 113 deletions(-) (limited to 'common') diff --git a/common/resourcefacade.cpp b/common/resourcefacade.cpp index 935c613..32b508a 100644 --- a/common/resourcefacade.cpp +++ b/common/resourcefacade.cpp @@ -113,6 +113,19 @@ KAsync::Job LocalStorageFacade::remove(const DomainType &domai }); } +static bool matchesFilter(const QHash &filter, const QMap &properties) +{ + for (const auto &filterProperty : filter.keys()) { + if (filterProperty == "type") { + continue; + } + if (filter.value(filterProperty).toByteArray() != properties.value(filterProperty).toByteArray()) { + return false; + } + } + return true; +} + template QPair, typename Sink::ResultEmitter::Ptr> LocalStorageFacade::load(const Sink::Query &query) { @@ -125,9 +138,18 @@ QPair, typename Sink::ResultEmitter: const auto entries = mConfigStore.getEntries(); for (const auto &res : entries.keys()) { const auto type = entries.value(res); + if (query.propertyFilter.contains("type") && query.propertyFilter.value("type").toByteArray() != type) { + Trace() << "Skipping due to type."; + continue; + } if (!query.ids.isEmpty() && !query.ids.contains(res)) { continue; } + const auto configurationValues = mConfigStore.get(res); + if (!matchesFilter(query.propertyFilter, configurationValues)){ + Trace() << "Skipping due to filter."; + continue; + } resultProvider->add(readFromConfig(res, type)); } if (query.liveQuery) { @@ -149,12 +171,7 @@ QPair, typename Sink::ResultEmitter: } - - - - - -ResourceFacade::ResourceFacade(const QByteArray &) : Sink::StoreFacade() +ResourceFacade::ResourceFacade(const QByteArray &) : LocalStorageFacade("resources") { } @@ -162,60 +179,10 @@ ResourceFacade::~ResourceFacade() { } -KAsync::Job ResourceFacade::create(const Sink::ApplicationDomain::SinkResource &resource) -{ - return KAsync::start([resource, this]() { - const QByteArray type = resource.getProperty("type").toByteArray(); - const QByteArray providedIdentifier = resource.getProperty("identifier").toByteArray(); - // It is currently a requirement that the resource starts with the type - const QByteArray identifier = providedIdentifier.isEmpty() ? ResourceConfig::newIdentifier(type) : providedIdentifier; - Trace() << "Creating resource " << type << identifier; - ResourceConfig::addResource(identifier, type); - auto changedProperties = resource.changedProperties(); - changedProperties.removeOne("identifier"); - changedProperties.removeOne("type"); - if (!changedProperties.isEmpty()) { - // We have some configuration values - QMap configurationValues; - for (const auto &property : changedProperties) { - configurationValues.insert(property, resource.getProperty(property)); - } - ResourceConfig::configureResource(identifier, configurationValues); - } - }); -} - -KAsync::Job ResourceFacade::modify(const Sink::ApplicationDomain::SinkResource &resource) -{ - return KAsync::start([resource, this]() { - const QByteArray identifier = resource.identifier(); - if (identifier.isEmpty()) { - Warning() << "We need an \"identifier\" property to identify the resource to configure."; - return; - } - auto changedProperties = resource.changedProperties(); - changedProperties.removeOne("identifier"); - changedProperties.removeOne("type"); - if (!changedProperties.isEmpty()) { - auto config = ResourceConfig::getConfiguration(identifier); - for (const auto &property : changedProperties) { - config.insert(property, resource.getProperty(property)); - } - ResourceConfig::configureResource(identifier, config); - } - }); -} - KAsync::Job ResourceFacade::remove(const Sink::ApplicationDomain::SinkResource &resource) { - return KAsync::start([resource, this]() { - const QByteArray identifier = resource.identifier(); - if (identifier.isEmpty()) { - Warning() << "We need an \"identifier\" property to identify the resource to configure"; - return; - } - Trace() << "Removing resource " << identifier; - ResourceConfig::removeResource(identifier); + const auto identifier = resource.identifier(); + return LocalStorageFacade::remove(resource).then([identifier]() { // TODO shutdown resource, or use the resource process with a --remove option to cleanup (so we can take advantage of the file locking) QDir dir(Sink::storageLocation()); for (const auto &folder : dir.entryList(QStringList() << identifier + "*")) { @@ -224,56 +191,6 @@ KAsync::Job ResourceFacade::remove(const Sink::ApplicationDomain::SinkReso }); } -static bool matchesFilter(const QHash &filter, const QMap &properties) -{ - for (const auto &filterProperty : filter.keys()) { - if (filterProperty == "type") { - continue; - } - if (filter.value(filterProperty).toByteArray() != properties.value(filterProperty).toByteArray()) { - return false; - } - } - return true; -} - -QPair, typename Sink::ResultEmitter::Ptr> ResourceFacade::load(const Sink::Query &query) -{ - auto resultProvider = new Sink::ResultProvider(); - auto emitter = resultProvider->emitter(); - resultProvider->setFetcher([](const QSharedPointer &) {}); - resultProvider->onDone([resultProvider]() { delete resultProvider; }); - auto job = KAsync::start([query, resultProvider]() { - const auto configuredResources = ResourceConfig::getResources(); - for (const auto &res : configuredResources.keys()) { - const auto type = configuredResources.value(res); - if (query.propertyFilter.contains("type") && query.propertyFilter.value("type").toByteArray() != type) { - continue; - } - if (!query.ids.isEmpty() && !query.ids.contains(res)) { - continue; - } - const auto configurationValues = ResourceConfig::getConfiguration(res); - if (!matchesFilter(query.propertyFilter, configurationValues)){ - continue; - } - - auto resource = Sink::ApplicationDomain::SinkResource::Ptr::create(res); - resource->setProperty("type", type); - for (auto it = configurationValues.constBegin(); it != configurationValues.constEnd(); it++) { - resource->setProperty(it.key(), it.value()); - } - - resultProvider->add(resource); - } - // TODO initialResultSetComplete should be implicit - resultProvider->initialResultSetComplete(Sink::ApplicationDomain::SinkResource::Ptr()); - resultProvider->complete(); - }); - return qMakePair(job, emitter); -} - - AccountFacade::AccountFacade(const QByteArray &) : LocalStorageFacade("accounts") { diff --git a/common/resourcefacade.h b/common/resourcefacade.h index e7e39d3..725938a 100644 --- a/common/resourcefacade.h +++ b/common/resourcefacade.h @@ -72,15 +72,12 @@ private: static ConfigNotifier sConfigNotifier; }; -class ResourceFacade : public Sink::StoreFacade +class ResourceFacade : public LocalStorageFacade { public: ResourceFacade(const QByteArray &instanceIdentifier); virtual ~ResourceFacade(); - KAsync::Job create(const Sink::ApplicationDomain::SinkResource &resource) Q_DECL_OVERRIDE; - KAsync::Job modify(const Sink::ApplicationDomain::SinkResource &resource) Q_DECL_OVERRIDE; - KAsync::Job remove(const Sink::ApplicationDomain::SinkResource &resource) Q_DECL_OVERRIDE; - QPair, typename Sink::ResultEmitter::Ptr> load(const Sink::Query &query) Q_DECL_OVERRIDE; + virtual KAsync::Job remove(const Sink::ApplicationDomain::SinkResource &resource) Q_DECL_OVERRIDE; }; class AccountFacade : public LocalStorageFacade -- cgit v1.2.3