From 7bd037fae43c963d5f67e9447b3ee6875591a2c7 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Thu, 15 Dec 2016 17:26:59 +0100 Subject: Don't set capabilities as property on creation. Instead we make it part of the plugin. This ensure we also have access to the proper capabilities when creating a resource via sinksh. --- common/domain/applicationdomaintype.cpp | 5 --- common/resource.cpp | 12 ++++-- common/resource.h | 3 +- common/resourcefacade.cpp | 43 +++++++++++++++++----- examples/dummyresource/resourcefactory.cpp | 3 +- examples/imapresource/imapresource.cpp | 9 ++++- examples/maildirresource/maildirresource.cpp | 10 +++-- .../mailtransportresource.cpp | 2 +- sinksh/sinksh_utils.cpp | 2 +- tests/mailsynctest.cpp | 4 +- tests/mailtest.cpp | 3 ++ 11 files changed, 70 insertions(+), 26 deletions(-) diff --git a/common/domain/applicationdomaintype.cpp b/common/domain/applicationdomaintype.cpp index c59a01e..60f5311 100644 --- a/common/domain/applicationdomaintype.cpp +++ b/common/domain/applicationdomaintype.cpp @@ -297,8 +297,6 @@ SinkResource DummyResource::create(const QByteArray &account) auto &&resource = ApplicationDomainType::createEntity(); resource.setResourceType("sink.dummy"); resource.setAccount(account); - resource.setCapabilities(QByteArrayList() << ResourceCapabilities::Mail::storage << "-folder.rename" << ResourceCapabilities::Mail::sent); - // resource.setProperty("capabilities", QVariant::fromValue(QByteArrayList() << ResourceCapabilities::Mail::storage << ResourceCapabilities::Mail::drafts << "-folder.rename" << ResourceCapabilities::Mail::trash)); return resource; } @@ -307,7 +305,6 @@ SinkResource MaildirResource::create(const QByteArray &account) auto &&resource = ApplicationDomainType::createEntity(); resource.setResourceType("sink.maildir"); resource.setAccount(account); - resource.setCapabilities(QByteArrayList() << ResourceCapabilities::Mail::storage << ResourceCapabilities::Mail::drafts << "-folder.rename" << ResourceCapabilities::Mail::trash << ResourceCapabilities::Mail::sent); return resource; } @@ -316,7 +313,6 @@ SinkResource MailtransportResource::create(const QByteArray &account) auto &&resource = ApplicationDomainType::createEntity(); resource.setResourceType("sink.mailtransport"); resource.setAccount(account); - resource.setCapabilities(QByteArrayList() << ResourceCapabilities::Mail::transport); return resource; } @@ -325,7 +321,6 @@ SinkResource ImapResource::create(const QByteArray &account) auto &&resource = ApplicationDomainType::createEntity(); resource.setResourceType("sink.imap"); resource.setAccount(account); - resource.setCapabilities(QByteArrayList() << ResourceCapabilities::Mail::storage << ResourceCapabilities::Mail::drafts << ResourceCapabilities::Mail::folderhierarchy << ResourceCapabilities::Mail::trash << ResourceCapabilities::Mail::sent); return resource; } diff --git a/common/resource.cpp b/common/resource.cpp index 533a132..32a92ca 100644 --- a/common/resource.cpp +++ b/common/resource.cpp @@ -55,19 +55,20 @@ void Resource::setLowerBoundRevision(qint64 revision) class ResourceFactory::Private { public: + QByteArrayList capabilities; static QHash> s_loadedFactories; }; QHash> ResourceFactory::Private::s_loadedFactories; -ResourceFactory::ResourceFactory(QObject *parent) : QObject(parent), d(0) +ResourceFactory::ResourceFactory(QObject *parent, const QByteArrayList &capabilities) : QObject(parent), d(new ResourceFactory::Private) { - Q_UNUSED(d); + d->capabilities = capabilities; } ResourceFactory::~ResourceFactory() { - // delete d; + delete d; } ResourceFactory *ResourceFactory::load(const QByteArray &resourceName) @@ -117,6 +118,11 @@ ResourceFactory *ResourceFactory::load(const QByteArray &resourceName) return nullptr; } +QByteArrayList ResourceFactory::capabilities() const +{ + return d->capabilities; +} + } // namespace Sink // Ignore warning I don't know how to fix in a moc file diff --git a/common/resource.h b/common/resource.h index 7789c53..d756521 100644 --- a/common/resource.h +++ b/common/resource.h @@ -64,13 +64,14 @@ class SINK_EXPORT ResourceFactory : public QObject public: static ResourceFactory *load(const QByteArray &resourceName); - ResourceFactory(QObject *parent); + ResourceFactory(QObject *parent, const QByteArrayList &capabilities); virtual ~ResourceFactory(); virtual Resource *createResource(const ResourceContext &context) = 0; virtual void registerFacades(const QByteArray &resourceName, FacadeFactory &factory) = 0; virtual void registerAdaptorFactories(const QByteArray &resourceName, AdaptorFactoryRegistry ®istry) {}; virtual void removeDataFromDisk(const QByteArray &instanceIdentifier) = 0; + QByteArrayList capabilities() const; private: class Private; diff --git a/common/resourcefacade.cpp b/common/resourcefacade.cpp index c4e16b1..ea4218d 100644 --- a/common/resourcefacade.cpp +++ b/common/resourcefacade.cpp @@ -24,6 +24,7 @@ #include "storage.h" #include "store.h" #include "resourceaccess.h" +#include "resource.h" #include using namespace Sink; @@ -33,25 +34,50 @@ SINK_DEBUG_AREA("ResourceFacade") template ConfigNotifier LocalStorageFacade::sConfigNotifier; +static void applyConfig(ConfigStore &configStore, const QByteArray &id, ApplicationDomain::ApplicationDomainType &object) +{ + const auto configurationValues = configStore.get(id); + for (auto it = configurationValues.constBegin(); it != configurationValues.constEnd(); it++) { + object.setProperty(it.key(), it.value()); + } +} + template static typename DomainType::Ptr readFromConfig(ConfigStore &configStore, const QByteArray &id, const QByteArray &type) { auto object = DomainType::Ptr::create(id); + applyConfig(configStore, id, *object); + return object; +} + +template <> +typename ApplicationDomain::SinkAccount::Ptr readFromConfig(ConfigStore &configStore, const QByteArray &id, const QByteArray &type) +{ + auto object = ApplicationDomain::SinkAccount::Ptr::create(id); + object->setProperty(ApplicationDomain::SinkAccount::AccountType::name, type); + applyConfig(configStore, id, *object); + return object; +} + +template <> +typename ApplicationDomain::SinkResource::Ptr readFromConfig(ConfigStore &configStore, const QByteArray &id, const QByteArray &type) +{ + auto object = ApplicationDomain::SinkResource::Ptr::create(id); object->setProperty(ApplicationDomain::SinkResource::ResourceType::name, type); - const auto configurationValues = configStore.get(id); - for (auto it = configurationValues.constBegin(); it != configurationValues.constEnd(); it++) { - object->setProperty(it.key(), it.value()); + if (auto res = ResourceFactory::load(type)) { + object->setCapabilities(res->capabilities()); } + applyConfig(configStore, id, *object); return object; } -static bool matchesFilter(const QHash &filter, const QMap &properties) +static bool matchesFilter(const QHash &filter, const ApplicationDomain::ApplicationDomainType &entity) { for (const auto &filterProperty : filter.keys()) { if (filterProperty == ApplicationDomain::SinkResource::ResourceType::name) { continue; } - if (!filter.value(filterProperty).matches(properties.value(filterProperty))) { + if (!filter.value(filterProperty).matches(entity.getProperty(filterProperty))) { return false; } } @@ -75,13 +101,12 @@ LocalStorageQueryRunner::LocalStorageQueryRunner(const Query &query, if (!query.ids().isEmpty() && !query.ids().contains(res)) { continue; } - const auto configurationValues = mConfigStore.get(res); - if (!matchesFilter(query.getBaseFilters(), configurationValues)){ - SinkTrace() << "Skipping due to filter."; + auto entity = readFromConfig(mConfigStore, res, type); + if (!matchesFilter(query.getBaseFilters(), *entity)){ + SinkTrace() << "Skipping due to filter." << res; continue; } SinkTrace() << "Found match " << res; - auto entity = readFromConfig(mConfigStore, res, type); updateStatus(*entity); mResultProvider->add(entity); } diff --git a/examples/dummyresource/resourcefactory.cpp b/examples/dummyresource/resourcefactory.cpp index 03238ef..0663bdb 100644 --- a/examples/dummyresource/resourcefactory.cpp +++ b/examples/dummyresource/resourcefactory.cpp @@ -176,7 +176,7 @@ DummyResource::~DummyResource() } DummyResourceFactory::DummyResourceFactory(QObject *parent) - : Sink::ResourceFactory(parent) + : Sink::ResourceFactory(parent, QByteArrayList() << Sink::ApplicationDomain::ResourceCapabilities::Mail::storage << "-folder.rename" << Sink::ApplicationDomain::ResourceCapabilities::Mail::sent) { } @@ -204,3 +204,4 @@ void DummyResourceFactory::removeDataFromDisk(const QByteArray &instanceIdentifi { DummyResource::removeFromDisk(instanceIdentifier); } + diff --git a/examples/imapresource/imapresource.cpp b/examples/imapresource/imapresource.cpp index 252b910..04781ef 100644 --- a/examples/imapresource/imapresource.cpp +++ b/examples/imapresource/imapresource.cpp @@ -742,7 +742,13 @@ ImapResource::ImapResource(const ResourceContext &resourceContext) } ImapResourceFactory::ImapResourceFactory(QObject *parent) - : Sink::ResourceFactory(parent) + : Sink::ResourceFactory(parent, + {Sink::ApplicationDomain::ResourceCapabilities::Mail::storage, + Sink::ApplicationDomain::ResourceCapabilities::Mail::drafts, + Sink::ApplicationDomain::ResourceCapabilities::Mail::folderhierarchy, + Sink::ApplicationDomain::ResourceCapabilities::Mail::trash, + Sink::ApplicationDomain::ResourceCapabilities::Mail::sent} + ) { } @@ -768,3 +774,4 @@ void ImapResourceFactory::removeDataFromDisk(const QByteArray &instanceIdentifie { ImapResource::removeFromDisk(instanceIdentifier); } + diff --git a/examples/maildirresource/maildirresource.cpp b/examples/maildirresource/maildirresource.cpp index 6a03263..997ddef 100644 --- a/examples/maildirresource/maildirresource.cpp +++ b/examples/maildirresource/maildirresource.cpp @@ -570,9 +570,14 @@ MaildirResource::MaildirResource(const Sink::ResourceContext &resourceContext) MaildirResourceFactory::MaildirResourceFactory(QObject *parent) - : Sink::ResourceFactory(parent) + : Sink::ResourceFactory(parent, + {Sink::ApplicationDomain::ResourceCapabilities::Mail::storage, + Sink::ApplicationDomain::ResourceCapabilities::Mail::drafts, + "-folder.rename", + Sink::ApplicationDomain::ResourceCapabilities::Mail::trash, + Sink::ApplicationDomain::ResourceCapabilities::Mail::sent} + ) { - } Sink::Resource *MaildirResourceFactory::createResource(const ResourceContext &context) @@ -596,4 +601,3 @@ void MaildirResourceFactory::removeDataFromDisk(const QByteArray &instanceIdenti { MaildirResource::removeFromDisk(instanceIdentifier); } - diff --git a/examples/mailtransportresource/mailtransportresource.cpp b/examples/mailtransportresource/mailtransportresource.cpp index b7ee77a..cf657f3 100644 --- a/examples/mailtransportresource/mailtransportresource.cpp +++ b/examples/mailtransportresource/mailtransportresource.cpp @@ -186,7 +186,7 @@ MailtransportResource::MailtransportResource(const Sink::ResourceContext &resour } MailtransportResourceFactory::MailtransportResourceFactory(QObject *parent) - : Sink::ResourceFactory(parent) + : Sink::ResourceFactory(parent, {Sink::ApplicationDomain::ResourceCapabilities::Mail::transport}) { } diff --git a/sinksh/sinksh_utils.cpp b/sinksh/sinksh_utils.cpp index c42fad3..1ee5997 100644 --- a/sinksh/sinksh_utils.cpp +++ b/sinksh/sinksh_utils.cpp @@ -76,7 +76,7 @@ QList requestedProperties(const QString &type) } else if (type == getTypeName()) { return QList() << Event::Summary::name; } else if (type == getTypeName()) { - return QList() << SinkResource::ResourceType::name << SinkResource::Account::name; + return QList() << SinkResource::ResourceType::name << SinkResource::Account::name << SinkResource::Capabilities::name; } else if (type == getTypeName()) { return QList() << SinkAccount::AccountType::name << SinkAccount::Name::name; } else if (type == getTypeName()) { diff --git a/tests/mailsynctest.cpp b/tests/mailsynctest.cpp index 6658d8b..31e40c4 100644 --- a/tests/mailsynctest.cpp +++ b/tests/mailsynctest.cpp @@ -46,7 +46,9 @@ void MailSyncTest::initTestCase() VERIFYEXEC(Store::create(resource)); mResourceInstanceIdentifier = resource.identifier(); - mCapabilities = resource.getProperty("capabilities").value(); + //Load the capabilities + resource = Store::readOne(Sink::Query{resource}); + mCapabilities = resource.getCapabilities(); } void MailSyncTest::cleanup() diff --git a/tests/mailtest.cpp b/tests/mailtest.cpp index ae5295e..fe28cde 100644 --- a/tests/mailtest.cpp +++ b/tests/mailtest.cpp @@ -45,6 +45,9 @@ void MailTest::initTestCase() VERIFYEXEC(Store::create(resource)); mResourceInstanceIdentifier = resource.identifier(); + + //Load the capabilities + resource = Store::readOne(Sink::Query{resource}); mCapabilities = resource.getCapabilities(); } -- cgit v1.2.3