diff options
author | Christian Mollekopf <chrigi_1@fastmail.fm> | 2016-05-28 00:24:53 +0200 |
---|---|---|
committer | Christian Mollekopf <chrigi_1@fastmail.fm> | 2016-05-28 00:24:53 +0200 |
commit | e9c75177590d8546ebd9425f16c4269a9c92f517 (patch) | |
tree | 8a953631e467d9df50657e22bd90954b7b71c990 /examples/dummyresource | |
parent | 8f01eb530262d1442fc4fa0782a41e052412d43b (diff) | |
download | sink-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.cpp | 163 | ||||
-rw-r--r-- | examples/dummyresource/resourcefactory.h | 6 |
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 | ||
47 | class 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 | |||
46 | DummyResource::DummyResource(const QByteArray &instanceIdentifier, const QSharedPointer<Sink::Pipeline> &pipeline) | 126 | DummyResource::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 | ||
60 | Sink::ApplicationDomain::Event::Ptr DummyResource::createEvent(const QByteArray &ridBuffer, const QMap<QString, QVariant> &data, Sink::Storage::Transaction &transaction) | 140 | DummyResource::~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 | |||
71 | Sink::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 | ||
84 | Sink::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 | |||
96 | void 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 | |||
111 | KAsync::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 | |||
130 | KAsync::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 | ||
136 | void DummyResource::removeDataFromDisk() | 145 | void 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 | |||
163 | DummyResourceFactory::DummyResourceFactory(QObject *parent) | 173 | DummyResourceFactory::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 | ||
191 | void DummyResourceFactory::registerAdaptorFactories(Sink::AdaptorFactoryRegistry ®istry) | ||
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 | { |
38 | public: | 38 | public: |
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; |
45 | private: | 45 | private: |
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 ®istry) Q_DECL_OVERRIDE; | ||
68 | }; | 68 | }; |
69 | 69 | ||