From e9c75177590d8546ebd9425f16c4269a9c92f517 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Sat, 28 May 2016 00:24:53 +0200 Subject: Refactored the generic resource to use separate classes for changereplay and synchronization. This cleans up the API and avoids the excessive passing around of transactions. It also provides more flexibility in eventually using different synchronization strategies for different resources. --- examples/dummyresource/resourcefactory.cpp | 163 ++++++++++++++++------------- examples/dummyresource/resourcefactory.h | 6 +- 2 files changed, 93 insertions(+), 76 deletions(-) (limited to 'examples/dummyresource') diff --git a/examples/dummyresource/resourcefactory.cpp b/examples/dummyresource/resourcefactory.cpp index 48858da..609d23e 100644 --- a/examples/dummyresource/resourcefactory.cpp +++ b/examples/dummyresource/resourcefactory.cpp @@ -35,6 +35,7 @@ #include "definitions.h" #include "facadefactory.h" #include "indexupdater.h" +#include "adaptorfactoryregistry.h" #include #include @@ -43,8 +44,87 @@ #define ENTITY_TYPE_MAIL "mail" #define ENTITY_TYPE_FOLDER "folder" +class DummySynchronizer : public Sink::Synchronizer { + public: + + DummySynchronizer(const QByteArray &resourceType, const QByteArray &resourceInstanceIdentifier) + : Sink::Synchronizer(resourceType, resourceInstanceIdentifier) + { + + } + + Sink::ApplicationDomain::Event::Ptr createEvent(const QByteArray &ridBuffer, const QMap &data) + { + static uint8_t rawData[100]; + auto event = Sink::ApplicationDomain::Event::Ptr::create(); + event->setProperty("summary", data.value("summary").toString()); + event->setProperty("remoteId", ridBuffer); + event->setProperty("description", data.value("description").toString()); + event->setProperty("attachment", QByteArray::fromRawData(reinterpret_cast(rawData), 100)); + return event; + } + + Sink::ApplicationDomain::Mail::Ptr createMail(const QByteArray &ridBuffer, const QMap &data) + { + auto mail = Sink::ApplicationDomain::Mail::Ptr::create(); + mail->setProperty("subject", data.value("subject").toString()); + mail->setProperty("senderEmail", data.value("senderEmail").toString()); + mail->setProperty("senderName", data.value("senderName").toString()); + mail->setProperty("date", data.value("date").toString()); + mail->setProperty("folder", syncStore().resolveRemoteId(ENTITY_TYPE_FOLDER, data.value("parentFolder").toByteArray())); + mail->setProperty("unread", data.value("unread").toBool()); + mail->setProperty("important", data.value("important").toBool()); + return mail; + } + + Sink::ApplicationDomain::Folder::Ptr createFolder(const QByteArray &ridBuffer, const QMap &data) + { + auto folder = Sink::ApplicationDomain::Folder::Ptr::create(); + folder->setProperty("name", data.value("name").toString()); + folder->setProperty("icon", data.value("icon").toString()); + if (!data.value("parent").toString().isEmpty()) { + auto sinkId = syncStore().resolveRemoteId(ENTITY_TYPE_FOLDER, data.value("parent").toByteArray()); + folder->setProperty("parent", sinkId); + } + return folder; + } + + void synchronize(const QByteArray &bufferType, const QMap > &data, std::function &data)> createEntity) + { + auto time = QSharedPointer::create(); + time->start(); + //TODO find items to remove + int count = 0; + for (auto it = data.constBegin(); it != data.constEnd(); it++) { + count++; + const auto remoteId = it.key().toUtf8(); + auto entity = createEntity(remoteId, it.value()); + createOrModify(bufferType, remoteId, *entity); + } + Trace() << "Sync of " << count << " entities of type " << bufferType << " done." << Sink::Log::TraceTime(time->elapsed()); + } + + KAsync::Job synchronizeWithSource() Q_DECL_OVERRIDE + { + Log() << " Synchronizing with the source"; + return KAsync::start([this]() { + synchronize(ENTITY_TYPE_EVENT, DummyStore::instance().events(), [this](const QByteArray &ridBuffer, const QMap &data) { + return createEvent(ridBuffer, data); + }); + synchronize(ENTITY_TYPE_MAIL, DummyStore::instance().mails(), [this](const QByteArray &ridBuffer, const QMap &data) { + return createMail(ridBuffer, data); + }); + synchronize(ENTITY_TYPE_FOLDER, DummyStore::instance().folders(), [this](const QByteArray &ridBuffer, const QMap &data) { + return createFolder(ridBuffer, data); + }); + Log() << "Done Synchronizing"; + }); + } + +}; + DummyResource::DummyResource(const QByteArray &instanceIdentifier, const QSharedPointer &pipeline) - : Sink::GenericResource(instanceIdentifier, pipeline), + : Sink::GenericResource(PLUGIN_NAME, instanceIdentifier, pipeline, QSharedPointer::create(), QSharedPointer::create(PLUGIN_NAME, instanceIdentifier)), mEventAdaptorFactory(QSharedPointer::create()), mMailAdaptorFactory(QSharedPointer::create()), mFolderAdaptorFactory(QSharedPointer::create()) @@ -57,80 +137,9 @@ DummyResource::DummyResource(const QByteArray &instanceIdentifier, const QShared QVector() << new DefaultIndexUpdater); } -Sink::ApplicationDomain::Event::Ptr DummyResource::createEvent(const QByteArray &ridBuffer, const QMap &data, Sink::Storage::Transaction &transaction) -{ - static uint8_t rawData[100]; - auto event = Sink::ApplicationDomain::Event::Ptr::create(); - event->setProperty("summary", data.value("summary").toString()); - event->setProperty("remoteId", ridBuffer); - event->setProperty("description", data.value("description").toString()); - event->setProperty("attachment", QByteArray::fromRawData(reinterpret_cast(rawData), 100)); - return event; -} - -Sink::ApplicationDomain::Mail::Ptr DummyResource::createMail(const QByteArray &ridBuffer, const QMap &data, Sink::Storage::Transaction &transaction) +DummyResource::~DummyResource() { - auto mail = Sink::ApplicationDomain::Mail::Ptr::create(); - mail->setProperty("subject", data.value("subject").toString()); - mail->setProperty("senderEmail", data.value("senderEmail").toString()); - mail->setProperty("senderName", data.value("senderName").toString()); - mail->setProperty("date", data.value("date").toString()); - mail->setProperty("folder", resolveRemoteId(ENTITY_TYPE_FOLDER, data.value("parentFolder").toByteArray(), transaction)); - mail->setProperty("unread", data.value("unread").toBool()); - mail->setProperty("important", data.value("important").toBool()); - return mail; -} -Sink::ApplicationDomain::Folder::Ptr DummyResource::createFolder(const QByteArray &ridBuffer, const QMap &data, Sink::Storage::Transaction &transaction) -{ - auto folder = Sink::ApplicationDomain::Folder::Ptr::create(); - folder->setProperty("name", data.value("name").toString()); - folder->setProperty("icon", data.value("icon").toString()); - if (!data.value("parent").toString().isEmpty()) { - auto sinkId = resolveRemoteId(ENTITY_TYPE_FOLDER, data.value("parent").toByteArray(), transaction); - folder->setProperty("parent", sinkId); - } - return folder; -} - -void DummyResource::synchronize(const QByteArray &bufferType, const QMap > &data, Sink::Storage::Transaction &transaction, Sink::Storage::Transaction &synchronizationTransaction, DomainTypeAdaptorFactoryInterface &adaptorFactory, std::function &data, Sink::Storage::Transaction &)> createEntity) -{ - auto time = QSharedPointer::create(); - time->start(); - //TODO find items to remove - int count = 0; - for (auto it = data.constBegin(); it != data.constEnd(); it++) { - count++; - const auto remoteId = it.key().toUtf8(); - auto entity = createEntity(remoteId, it.value(), synchronizationTransaction); - createOrModify(transaction, synchronizationTransaction, adaptorFactory, bufferType, remoteId, *entity); - } - Trace() << "Sync of " << count << " entities of type " << bufferType << " done." << Sink::Log::TraceTime(time->elapsed()); -} - -KAsync::Job DummyResource::synchronizeWithSource(Sink::Storage &mainStore, Sink::Storage &synchronizationStore) -{ - Log() << " Synchronizing"; - return KAsync::start([this, &mainStore, &synchronizationStore]() { - auto transaction = mainStore.createTransaction(Sink::Storage::ReadOnly); - auto synchronizationTransaction = synchronizationStore.createTransaction(Sink::Storage::ReadWrite); - synchronize(ENTITY_TYPE_EVENT, DummyStore::instance().events(), transaction, synchronizationTransaction, *mEventAdaptorFactory, [this](const QByteArray &ridBuffer, const QMap &data, Sink::Storage::Transaction &synchronizationTransaction) { - return createEvent(ridBuffer, data, synchronizationTransaction); - }); - synchronize(ENTITY_TYPE_MAIL, DummyStore::instance().mails(), transaction, synchronizationTransaction, *mMailAdaptorFactory, [this](const QByteArray &ridBuffer, const QMap &data, Sink::Storage::Transaction &synchronizationTransaction) { - return createMail(ridBuffer, data, synchronizationTransaction); - }); - synchronize(ENTITY_TYPE_FOLDER, DummyStore::instance().folders(), transaction, synchronizationTransaction, *mFolderAdaptorFactory, [this](const QByteArray &ridBuffer, const QMap &data, Sink::Storage::Transaction &synchronizationTransaction) { - return createFolder(ridBuffer, data, synchronizationTransaction); - }); - Log() << "Done Synchronizing"; - }); -} - -KAsync::Job DummyResource::replay(Sink::Storage &synchronizationStore, const QByteArray &type, const QByteArray &key, const QByteArray &value) -{ - Trace() << "Replaying " << key; - return KAsync::null(); } void DummyResource::removeDataFromDisk() @@ -160,6 +169,7 @@ KAsync::Job DummyResource::inspect(int inspectionType, const QByteArray &i return KAsync::null(); } + DummyResourceFactory::DummyResourceFactory(QObject *parent) : Sink::ResourceFactory(parent) { @@ -178,3 +188,10 @@ void DummyResourceFactory::registerFacades(Sink::FacadeFactory &factory) factory.registerFacade(PLUGIN_NAME); } +void DummyResourceFactory::registerAdaptorFactories(Sink::AdaptorFactoryRegistry ®istry) +{ + registry.registerFactory(PLUGIN_NAME); + registry.registerFactory(PLUGIN_NAME); + registry.registerFactory(PLUGIN_NAME); +} + diff --git a/examples/dummyresource/resourcefactory.h b/examples/dummyresource/resourcefactory.h index 865f6e5..f73eb32 100644 --- a/examples/dummyresource/resourcefactory.h +++ b/examples/dummyresource/resourcefactory.h @@ -37,13 +37,12 @@ class DummyResource : public Sink::GenericResource { public: DummyResource(const QByteArray &instanceIdentifier, const QSharedPointer &pipeline = QSharedPointer()); - KAsync::Job synchronizeWithSource(Sink::Storage &mainStore, Sink::Storage &synchronizationStore) Q_DECL_OVERRIDE; - using GenericResource::synchronizeWithSource; + virtual ~DummyResource(); + void removeDataFromDisk() Q_DECL_OVERRIDE; static void removeFromDisk(const QByteArray &instanceIdentifier); KAsync::Job inspect(int inspectionType, const QByteArray &inspectionId, const QByteArray &domainType, const QByteArray &entityId, const QByteArray &property, const QVariant &expectedValue) Q_DECL_OVERRIDE; private: - KAsync::Job replay(Sink::Storage &synchronizationStore, const QByteArray &type, const QByteArray &key, const QByteArray &value) Q_DECL_OVERRIDE; Sink::ApplicationDomain::Event::Ptr createEvent(const QByteArray &rid, const QMap &data, Sink::Storage::Transaction &); Sink::ApplicationDomain::Mail::Ptr createMail(const QByteArray &rid, const QMap &data, Sink::Storage::Transaction &); Sink::ApplicationDomain::Folder::Ptr createFolder(const QByteArray &rid, const QMap &data, Sink::Storage::Transaction &); @@ -65,5 +64,6 @@ public: Sink::Resource *createResource(const QByteArray &instanceIdentifier) Q_DECL_OVERRIDE; void registerFacades(Sink::FacadeFactory &factory) Q_DECL_OVERRIDE; + void registerAdaptorFactories(Sink::AdaptorFactoryRegistry ®istry) Q_DECL_OVERRIDE; }; -- cgit v1.2.3