summaryrefslogtreecommitdiffstats
path: root/examples/dummyresource
diff options
context:
space:
mode:
authorChristian Mollekopf <chrigi_1@fastmail.fm>2016-05-28 00:24:53 +0200
committerChristian Mollekopf <chrigi_1@fastmail.fm>2016-05-28 00:24:53 +0200
commite9c75177590d8546ebd9425f16c4269a9c92f517 (patch)
tree8a953631e467d9df50657e22bd90954b7b71c990 /examples/dummyresource
parent8f01eb530262d1442fc4fa0782a41e052412d43b (diff)
downloadsink-e9c75177590d8546ebd9425f16c4269a9c92f517.tar.gz
sink-e9c75177590d8546ebd9425f16c4269a9c92f517.zip
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.
Diffstat (limited to 'examples/dummyresource')
-rw-r--r--examples/dummyresource/resourcefactory.cpp163
-rw-r--r--examples/dummyresource/resourcefactory.h6
2 files changed, 93 insertions, 76 deletions
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 @@
35#include "definitions.h" 35#include "definitions.h"
36#include "facadefactory.h" 36#include "facadefactory.h"
37#include "indexupdater.h" 37#include "indexupdater.h"
38#include "adaptorfactoryregistry.h"
38#include <QDate> 39#include <QDate>
39#include <QUuid> 40#include <QUuid>
40 41
@@ -43,8 +44,87 @@
43#define ENTITY_TYPE_MAIL "mail" 44#define ENTITY_TYPE_MAIL "mail"
44#define ENTITY_TYPE_FOLDER "folder" 45#define ENTITY_TYPE_FOLDER "folder"
45 46
47class DummySynchronizer : public Sink::Synchronizer {
48 public:
49
50 DummySynchronizer(const QByteArray &resourceType, const QByteArray &resourceInstanceIdentifier)
51 : Sink::Synchronizer(resourceType, resourceInstanceIdentifier)
52 {
53
54 }
55
56 Sink::ApplicationDomain::Event::Ptr createEvent(const QByteArray &ridBuffer, const QMap<QString, QVariant> &data)
57 {
58 static uint8_t rawData[100];
59 auto event = Sink::ApplicationDomain::Event::Ptr::create();
60 event->setProperty("summary", data.value("summary").toString());
61 event->setProperty("remoteId", ridBuffer);
62 event->setProperty("description", data.value("description").toString());
63 event->setProperty("attachment", QByteArray::fromRawData(reinterpret_cast<const char*>(rawData), 100));
64 return event;
65 }
66
67 Sink::ApplicationDomain::Mail::Ptr createMail(const QByteArray &ridBuffer, const QMap<QString, QVariant> &data)
68 {
69 auto mail = Sink::ApplicationDomain::Mail::Ptr::create();
70 mail->setProperty("subject", data.value("subject").toString());
71 mail->setProperty("senderEmail", data.value("senderEmail").toString());
72 mail->setProperty("senderName", data.value("senderName").toString());
73 mail->setProperty("date", data.value("date").toString());
74 mail->setProperty("folder", syncStore().resolveRemoteId(ENTITY_TYPE_FOLDER, data.value("parentFolder").toByteArray()));
75 mail->setProperty("unread", data.value("unread").toBool());
76 mail->setProperty("important", data.value("important").toBool());
77 return mail;
78 }
79
80 Sink::ApplicationDomain::Folder::Ptr createFolder(const QByteArray &ridBuffer, const QMap<QString, QVariant> &data)
81 {
82 auto folder = Sink::ApplicationDomain::Folder::Ptr::create();
83 folder->setProperty("name", data.value("name").toString());
84 folder->setProperty("icon", data.value("icon").toString());
85 if (!data.value("parent").toString().isEmpty()) {
86 auto sinkId = syncStore().resolveRemoteId(ENTITY_TYPE_FOLDER, data.value("parent").toByteArray());
87 folder->setProperty("parent", sinkId);
88 }
89 return folder;
90 }
91
92 void synchronize(const QByteArray &bufferType, const QMap<QString, QMap<QString, QVariant> > &data, std::function<Sink::ApplicationDomain::ApplicationDomainType::Ptr(const QByteArray &ridBuffer, const QMap<QString, QVariant> &data)> createEntity)
93 {
94 auto time = QSharedPointer<QTime>::create();
95 time->start();
96 //TODO find items to remove
97 int count = 0;
98 for (auto it = data.constBegin(); it != data.constEnd(); it++) {
99 count++;
100 const auto remoteId = it.key().toUtf8();
101 auto entity = createEntity(remoteId, it.value());
102 createOrModify(bufferType, remoteId, *entity);
103 }
104 Trace() << "Sync of " << count << " entities of type " << bufferType << " done." << Sink::Log::TraceTime(time->elapsed());
105 }
106
107 KAsync::Job<void> synchronizeWithSource() Q_DECL_OVERRIDE
108 {
109 Log() << " Synchronizing with the source";
110 return KAsync::start<void>([this]() {
111 synchronize(ENTITY_TYPE_EVENT, DummyStore::instance().events(), [this](const QByteArray &ridBuffer, const QMap<QString, QVariant> &data) {
112 return createEvent(ridBuffer, data);
113 });
114 synchronize(ENTITY_TYPE_MAIL, DummyStore::instance().mails(), [this](const QByteArray &ridBuffer, const QMap<QString, QVariant> &data) {
115 return createMail(ridBuffer, data);
116 });
117 synchronize(ENTITY_TYPE_FOLDER, DummyStore::instance().folders(), [this](const QByteArray &ridBuffer, const QMap<QString, QVariant> &data) {
118 return createFolder(ridBuffer, data);
119 });
120 Log() << "Done Synchronizing";
121 });
122 }
123
124};
125
46DummyResource::DummyResource(const QByteArray &instanceIdentifier, const QSharedPointer<Sink::Pipeline> &pipeline) 126DummyResource::DummyResource(const QByteArray &instanceIdentifier, const QSharedPointer<Sink::Pipeline> &pipeline)
47 : Sink::GenericResource(instanceIdentifier, pipeline), 127 : Sink::GenericResource(PLUGIN_NAME, instanceIdentifier, pipeline, QSharedPointer<Sink::NullChangeReplay>::create(), QSharedPointer<DummySynchronizer>::create(PLUGIN_NAME, instanceIdentifier)),
48 mEventAdaptorFactory(QSharedPointer<DummyEventAdaptorFactory>::create()), 128 mEventAdaptorFactory(QSharedPointer<DummyEventAdaptorFactory>::create()),
49 mMailAdaptorFactory(QSharedPointer<DummyMailAdaptorFactory>::create()), 129 mMailAdaptorFactory(QSharedPointer<DummyMailAdaptorFactory>::create()),
50 mFolderAdaptorFactory(QSharedPointer<DummyFolderAdaptorFactory>::create()) 130 mFolderAdaptorFactory(QSharedPointer<DummyFolderAdaptorFactory>::create())
@@ -57,80 +137,9 @@ DummyResource::DummyResource(const QByteArray &instanceIdentifier, const QShared
57 QVector<Sink::Preprocessor*>() << new DefaultIndexUpdater<Sink::ApplicationDomain::Event>); 137 QVector<Sink::Preprocessor*>() << new DefaultIndexUpdater<Sink::ApplicationDomain::Event>);
58} 138}
59 139
60Sink::ApplicationDomain::Event::Ptr DummyResource::createEvent(const QByteArray &ridBuffer, const QMap<QString, QVariant> &data, Sink::Storage::Transaction &transaction) 140DummyResource::~DummyResource()
61{
62 static uint8_t rawData[100];
63 auto event = Sink::ApplicationDomain::Event::Ptr::create();
64 event->setProperty("summary", data.value("summary").toString());
65 event->setProperty("remoteId", ridBuffer);
66 event->setProperty("description", data.value("description").toString());
67 event->setProperty("attachment", QByteArray::fromRawData(reinterpret_cast<const char*>(rawData), 100));
68 return event;
69}
70
71Sink::ApplicationDomain::Mail::Ptr DummyResource::createMail(const QByteArray &ridBuffer, const QMap<QString, QVariant> &data, Sink::Storage::Transaction &transaction)
72{ 141{
73 auto mail = Sink::ApplicationDomain::Mail::Ptr::create();
74 mail->setProperty("subject", data.value("subject").toString());
75 mail->setProperty("senderEmail", data.value("senderEmail").toString());
76 mail->setProperty("senderName", data.value("senderName").toString());
77 mail->setProperty("date", data.value("date").toString());
78 mail->setProperty("folder", resolveRemoteId(ENTITY_TYPE_FOLDER, data.value("parentFolder").toByteArray(), transaction));
79 mail->setProperty("unread", data.value("unread").toBool());
80 mail->setProperty("important", data.value("important").toBool());
81 return mail;
82}
83 142
84Sink::ApplicationDomain::Folder::Ptr DummyResource::createFolder(const QByteArray &ridBuffer, const QMap<QString, QVariant> &data, Sink::Storage::Transaction &transaction)
85{
86 auto folder = Sink::ApplicationDomain::Folder::Ptr::create();
87 folder->setProperty("name", data.value("name").toString());
88 folder->setProperty("icon", data.value("icon").toString());
89 if (!data.value("parent").toString().isEmpty()) {
90 auto sinkId = resolveRemoteId(ENTITY_TYPE_FOLDER, data.value("parent").toByteArray(), transaction);
91 folder->setProperty("parent", sinkId);
92 }
93 return folder;
94}
95
96void DummyResource::synchronize(const QByteArray &bufferType, const QMap<QString, QMap<QString, QVariant> > &data, Sink::Storage::Transaction &transaction, Sink::Storage::Transaction &synchronizationTransaction, DomainTypeAdaptorFactoryInterface &adaptorFactory, std::function<Sink::ApplicationDomain::ApplicationDomainType::Ptr(const QByteArray &ridBuffer, const QMap<QString, QVariant> &data, Sink::Storage::Transaction &)> createEntity)
97{
98 auto time = QSharedPointer<QTime>::create();
99 time->start();
100 //TODO find items to remove
101 int count = 0;
102 for (auto it = data.constBegin(); it != data.constEnd(); it++) {
103 count++;
104 const auto remoteId = it.key().toUtf8();
105 auto entity = createEntity(remoteId, it.value(), synchronizationTransaction);
106 createOrModify(transaction, synchronizationTransaction, adaptorFactory, bufferType, remoteId, *entity);
107 }
108 Trace() << "Sync of " << count << " entities of type " << bufferType << " done." << Sink::Log::TraceTime(time->elapsed());
109}
110
111KAsync::Job<void> DummyResource::synchronizeWithSource(Sink::Storage &mainStore, Sink::Storage &synchronizationStore)
112{
113 Log() << " Synchronizing";
114 return KAsync::start<void>([this, &mainStore, &synchronizationStore]() {
115 auto transaction = mainStore.createTransaction(Sink::Storage::ReadOnly);
116 auto synchronizationTransaction = synchronizationStore.createTransaction(Sink::Storage::ReadWrite);
117 synchronize(ENTITY_TYPE_EVENT, DummyStore::instance().events(), transaction, synchronizationTransaction, *mEventAdaptorFactory, [this](const QByteArray &ridBuffer, const QMap<QString, QVariant> &data, Sink::Storage::Transaction &synchronizationTransaction) {
118 return createEvent(ridBuffer, data, synchronizationTransaction);
119 });
120 synchronize(ENTITY_TYPE_MAIL, DummyStore::instance().mails(), transaction, synchronizationTransaction, *mMailAdaptorFactory, [this](const QByteArray &ridBuffer, const QMap<QString, QVariant> &data, Sink::Storage::Transaction &synchronizationTransaction) {
121 return createMail(ridBuffer, data, synchronizationTransaction);
122 });
123 synchronize(ENTITY_TYPE_FOLDER, DummyStore::instance().folders(), transaction, synchronizationTransaction, *mFolderAdaptorFactory, [this](const QByteArray &ridBuffer, const QMap<QString, QVariant> &data, Sink::Storage::Transaction &synchronizationTransaction) {
124 return createFolder(ridBuffer, data, synchronizationTransaction);
125 });
126 Log() << "Done Synchronizing";
127 });
128}
129
130KAsync::Job<void> DummyResource::replay(Sink::Storage &synchronizationStore, const QByteArray &type, const QByteArray &key, const QByteArray &value)
131{
132 Trace() << "Replaying " << key;
133 return KAsync::null<void>();
134} 143}
135 144
136void DummyResource::removeDataFromDisk() 145void DummyResource::removeDataFromDisk()
@@ -160,6 +169,7 @@ KAsync::Job<void> DummyResource::inspect(int inspectionType, const QByteArray &i
160 return KAsync::null<void>(); 169 return KAsync::null<void>();
161} 170}
162 171
172
163DummyResourceFactory::DummyResourceFactory(QObject *parent) 173DummyResourceFactory::DummyResourceFactory(QObject *parent)
164 : Sink::ResourceFactory(parent) 174 : Sink::ResourceFactory(parent)
165{ 175{
@@ -178,3 +188,10 @@ void DummyResourceFactory::registerFacades(Sink::FacadeFactory &factory)
178 factory.registerFacade<Sink::ApplicationDomain::Folder, DummyResourceFolderFacade>(PLUGIN_NAME); 188 factory.registerFacade<Sink::ApplicationDomain::Folder, DummyResourceFolderFacade>(PLUGIN_NAME);
179} 189}
180 190
191void DummyResourceFactory::registerAdaptorFactories(Sink::AdaptorFactoryRegistry &registry)
192{
193 registry.registerFactory<Sink::ApplicationDomain::Folder, DummyFolderAdaptorFactory>(PLUGIN_NAME);
194 registry.registerFactory<Sink::ApplicationDomain::Mail, DummyMailAdaptorFactory>(PLUGIN_NAME);
195 registry.registerFactory<Sink::ApplicationDomain::Event, DummyEventAdaptorFactory>(PLUGIN_NAME);
196}
197
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
37{ 37{
38public: 38public:
39 DummyResource(const QByteArray &instanceIdentifier, const QSharedPointer<Sink::Pipeline> &pipeline = QSharedPointer<Sink::Pipeline>()); 39 DummyResource(const QByteArray &instanceIdentifier, const QSharedPointer<Sink::Pipeline> &pipeline = QSharedPointer<Sink::Pipeline>());
40 KAsync::Job<void> synchronizeWithSource(Sink::Storage &mainStore, Sink::Storage &synchronizationStore) Q_DECL_OVERRIDE; 40 virtual ~DummyResource();
41 using GenericResource::synchronizeWithSource; 41
42 void removeDataFromDisk() Q_DECL_OVERRIDE; 42 void removeDataFromDisk() Q_DECL_OVERRIDE;
43 static void removeFromDisk(const QByteArray &instanceIdentifier); 43 static void removeFromDisk(const QByteArray &instanceIdentifier);
44 KAsync::Job<void> inspect(int inspectionType, const QByteArray &inspectionId, const QByteArray &domainType, const QByteArray &entityId, const QByteArray &property, const QVariant &expectedValue) Q_DECL_OVERRIDE; 44 KAsync::Job<void> inspect(int inspectionType, const QByteArray &inspectionId, const QByteArray &domainType, const QByteArray &entityId, const QByteArray &property, const QVariant &expectedValue) Q_DECL_OVERRIDE;
45private: 45private:
46 KAsync::Job<void> replay(Sink::Storage &synchronizationStore, const QByteArray &type, const QByteArray &key, const QByteArray &value) Q_DECL_OVERRIDE;
47 Sink::ApplicationDomain::Event::Ptr createEvent(const QByteArray &rid, const QMap<QString, QVariant> &data, Sink::Storage::Transaction &); 46 Sink::ApplicationDomain::Event::Ptr createEvent(const QByteArray &rid, const QMap<QString, QVariant> &data, Sink::Storage::Transaction &);
48 Sink::ApplicationDomain::Mail::Ptr createMail(const QByteArray &rid, const QMap<QString, QVariant> &data, Sink::Storage::Transaction &); 47 Sink::ApplicationDomain::Mail::Ptr createMail(const QByteArray &rid, const QMap<QString, QVariant> &data, Sink::Storage::Transaction &);
49 Sink::ApplicationDomain::Folder::Ptr createFolder(const QByteArray &rid, const QMap<QString, QVariant> &data, Sink::Storage::Transaction &); 48 Sink::ApplicationDomain::Folder::Ptr createFolder(const QByteArray &rid, const QMap<QString, QVariant> &data, Sink::Storage::Transaction &);
@@ -65,5 +64,6 @@ public:
65 64
66 Sink::Resource *createResource(const QByteArray &instanceIdentifier) Q_DECL_OVERRIDE; 65 Sink::Resource *createResource(const QByteArray &instanceIdentifier) Q_DECL_OVERRIDE;
67 void registerFacades(Sink::FacadeFactory &factory) Q_DECL_OVERRIDE; 66 void registerFacades(Sink::FacadeFactory &factory) Q_DECL_OVERRIDE;
67 void registerAdaptorFactories(Sink::AdaptorFactoryRegistry &registry) Q_DECL_OVERRIDE;
68}; 68};
69 69