summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--common/clientapi.cpp2
-rw-r--r--common/clientapi.h32
-rw-r--r--common/resourceconfig.cpp33
-rw-r--r--common/resourceconfig.h5
-rw-r--r--common/resourcefacade.cpp14
-rw-r--r--tests/clientapitest.cpp50
6 files changed, 88 insertions, 48 deletions
diff --git a/common/clientapi.cpp b/common/clientapi.cpp
index 88349db..06bf5ab 100644
--- a/common/clientapi.cpp
+++ b/common/clientapi.cpp
@@ -19,7 +19,7 @@ namespace Akonadi2
19 19
20void FacadeFactory::registerStaticFacades() 20void FacadeFactory::registerStaticFacades()
21{ 21{
22 FacadeFactory::instance().registerFacade<Akonadi2::ApplicationDomain::AkonadiResource, ResourceFacade>("resourceconfig"); 22 registerFacade<Akonadi2::ApplicationDomain::AkonadiResource, ResourceFacade>("resourceconfig");
23} 23}
24 24
25void Store::shutdown(const QByteArray &identifier) 25void Store::shutdown(const QByteArray &identifier)
diff --git a/common/clientapi.h b/common/clientapi.h
index d658003..a01db23 100644
--- a/common/clientapi.h
+++ b/common/clientapi.h
@@ -34,6 +34,7 @@
34#include "threadboundary.h" 34#include "threadboundary.h"
35#include "resultprovider.h" 35#include "resultprovider.h"
36#include "domain/applicationdomaintype.h" 36#include "domain/applicationdomaintype.h"
37#include "resourceconfig.h"
37 38
38namespace async { 39namespace async {
39 //This should abstract if we execute from eventloop or in thread. 40 //This should abstract if we execute from eventloop or in thread.
@@ -110,7 +111,7 @@ class FacadeFactory {
110public: 111public:
111 typedef std::function<std::shared_ptr<void>(const QByteArray &)> FactoryFunction; 112 typedef std::function<std::shared_ptr<void>(const QByteArray &)> FactoryFunction;
112 113
113 static void registerStaticFacades(); 114 void registerStaticFacades();
114 115
115 //FIXME: proper singleton implementation 116 //FIXME: proper singleton implementation
116 static FacadeFactory &instance() 117 static FacadeFactory &instance()
@@ -165,6 +166,11 @@ public:
165 } 166 }
166 167
167private: 168private:
169 FacadeFactory()
170 {
171 registerStaticFacades();
172 }
173
168 QHash<QByteArray, FactoryFunction> mFacadeRegistry; 174 QHash<QByteArray, FactoryFunction> mFacadeRegistry;
169}; 175};
170 176
@@ -188,6 +194,27 @@ public:
188 return split.join('.'); 194 return split.join('.');
189 } 195 }
190 196
197 static QList<QByteArray> getResources(const QList<QByteArray> &resourceFilter)
198 {
199 QList<QByteArray> resources;
200 const auto configuredResources = ResourceConfig::getResources();
201 if (resourceFilter.isEmpty()) {
202 for (const auto &res : configuredResources) {
203 //TODO filter by type
204 resources << res;
205 }
206 } else {
207 for (const auto &res : resourceFilter) {
208 if (configuredResources.contains(res)) {
209 resources << res;
210 } else {
211 qWarning() << "Resource is not existing: " << res;
212 }
213 }
214 }
215 return resources;
216 }
217
191 /** 218 /**
192 * Asynchronusly load a dataset 219 * Asynchronusly load a dataset
193 */ 220 */
@@ -200,9 +227,8 @@ public:
200 //We must guarantee that the emitter is returned before the first result is emitted. 227 //We must guarantee that the emitter is returned before the first result is emitted.
201 //The result provider must be threadsafe. 228 //The result provider must be threadsafe.
202 async::run([query, resultSet](){ 229 async::run([query, resultSet](){
203 //TODO if query.resources is empty, search for all resource that provide the type we're looking for
204 // Query all resources and aggregate results 230 // Query all resources and aggregate results
205 KAsync::iterate(query.resources) 231 KAsync::iterate(getResources(query.resources))
206 .template each<void, QByteArray>([query, resultSet](const QByteArray &resource, KAsync::Future<void> &future) { 232 .template each<void, QByteArray>([query, resultSet](const QByteArray &resource, KAsync::Future<void> &future) {
207 //TODO pass resource identifier to factory 233 //TODO pass resource identifier to factory
208 auto facade = FacadeFactory::instance().getFacade<DomainType>(resourceName(resource), resource); 234 auto facade = FacadeFactory::instance().getFacade<DomainType>(resourceName(resource), resource);
diff --git a/common/resourceconfig.cpp b/common/resourceconfig.cpp
index 1f8fcda..ec72fb9 100644
--- a/common/resourceconfig.cpp
+++ b/common/resourceconfig.cpp
@@ -30,33 +30,38 @@ static QSharedPointer<QSettings> getSettings()
30void ResourceConfig::addResource(const QByteArray &identifier, const QByteArray &type) 30void ResourceConfig::addResource(const QByteArray &identifier, const QByteArray &type)
31{ 31{
32 auto settings = getSettings(); 32 auto settings = getSettings();
33 settings->beginGroup("resources"); 33 settings->beginGroup(QString::fromLatin1(identifier));
34 settings->setValue(QString::fromLatin1(identifier), type); 34 settings->setValue("type", type);
35 settings->setValue("enabled", true);
35 settings->endGroup(); 36 settings->endGroup();
36 // settings->beginGroup(identifier);
37 // //Add some settings?
38 // settings->endGroup();
39 settings->sync(); 37 settings->sync();
40} 38}
41 39
42void ResourceConfig::removeResource(const QByteArray &identifier) 40void ResourceConfig::removeResource(const QByteArray &identifier)
43{ 41{
44 auto settings = getSettings(); 42 auto settings = getSettings();
45 settings->beginGroup("resources"); 43 settings->beginGroup(QString::fromLatin1(identifier));
46 settings->remove(QString::fromLatin1(identifier)); 44 settings->remove("");
47 settings->endGroup(); 45 settings->endGroup();
48 settings->sync(); 46 settings->sync();
49} 47}
50 48
51QList<QPair<QByteArray, QByteArray> > ResourceConfig::getResources() 49QMap<QByteArray, QByteArray> ResourceConfig::getResources()
52{ 50{
53 QList<QPair<QByteArray, QByteArray> > resources; 51 QMap<QByteArray, QByteArray> resources;
54 auto settings = getSettings(); 52 auto settings = getSettings();
55 settings->beginGroup("resources"); 53 for (const auto &identifier : settings->childGroups()) {
56 for (const auto &identifier : settings->childKeys()) { 54 settings->beginGroup(identifier);
57 const auto type = settings->value(identifier).toByteArray(); 55 const auto type = settings->value("type").toByteArray();
58 resources << qMakePair<QByteArray, QByteArray>(identifier.toLatin1(), type); 56 resources.insert(identifier.toLatin1(), type);
57 settings->endGroup();
59 } 58 }
60 settings->endGroup();
61 return resources; 59 return resources;
62} 60}
61
62void ResourceConfig::clear()
63{
64 auto settings = getSettings();
65 settings->clear();
66 settings->sync();
67}
diff --git a/common/resourceconfig.h b/common/resourceconfig.h
index eda870f..e1ba2bc 100644
--- a/common/resourceconfig.h
+++ b/common/resourceconfig.h
@@ -21,12 +21,13 @@
21 21
22#include <QList> 22#include <QList>
23#include <QByteArray> 23#include <QByteArray>
24#include <QPair> 24#include <QMap>
25 25
26class ResourceConfig 26class ResourceConfig
27{ 27{
28public: 28public:
29 static QList<QPair<QByteArray, QByteArray> > getResources(); 29 static QMap<QByteArray, QByteArray> getResources();
30 static void addResource(const QByteArray &identifier, const QByteArray &type); 30 static void addResource(const QByteArray &identifier, const QByteArray &type);
31 static void removeResource(const QByteArray &identifier); 31 static void removeResource(const QByteArray &identifier);
32 static void clear();
32}; 33};
diff --git a/common/resourcefacade.cpp b/common/resourcefacade.cpp
index 63b3126..9792934 100644
--- a/common/resourcefacade.cpp
+++ b/common/resourcefacade.cpp
@@ -56,11 +56,15 @@ KAsync::Job<void> ResourceFacade::remove(const Akonadi2::ApplicationDomain::Akon
56KAsync::Job<void> ResourceFacade::load(const Akonadi2::Query &query, const QSharedPointer<Akonadi2::ResultProvider<typename Akonadi2::ApplicationDomain::AkonadiResource::Ptr> > &resultProvider) 56KAsync::Job<void> ResourceFacade::load(const Akonadi2::Query &query, const QSharedPointer<Akonadi2::ResultProvider<typename Akonadi2::ApplicationDomain::AkonadiResource::Ptr> > &resultProvider)
57{ 57{
58 return KAsync::start<void>([query, resultProvider]() { 58 return KAsync::start<void>([query, resultProvider]() {
59 for (const auto &res : ResourceConfig::getResources()) { 59 const auto configuredResources = ResourceConfig::getResources();
60 auto resource = Akonadi2::ApplicationDomain::AkonadiResource::Ptr::create(); 60 for (const auto &res : configuredResources.keys()) {
61 resource->setProperty("identifier", res.first); 61 const auto type = configuredResources.value(res);
62 resource->setProperty("type", res.second); 62 if (!query.propertyFilter.contains("type") || query.propertyFilter.value("type").toByteArray() == type) {
63 resultProvider->add(resource); 63 auto resource = Akonadi2::ApplicationDomain::AkonadiResource::Ptr::create();
64 resource->setProperty("identifier", res);
65 resource->setProperty("type", type);
66 resultProvider->add(resource);
67 }
64 } 68 }
65 //TODO initialResultSetComplete should be implicit 69 //TODO initialResultSetComplete should be implicit
66 resultProvider->initialResultSetComplete(); 70 resultProvider->initialResultSetComplete();
diff --git a/tests/clientapitest.cpp b/tests/clientapitest.cpp
index 5eb16da..9b8c27e 100644
--- a/tests/clientapitest.cpp
+++ b/tests/clientapitest.cpp
@@ -5,6 +5,7 @@
5#include "clientapi.h" 5#include "clientapi.h"
6#include "facade.h" 6#include "facade.h"
7#include "synclistresult.h" 7#include "synclistresult.h"
8#include "resourceconfig.h"
8 9
9class RevisionNotifier : public QObject 10class RevisionNotifier : public QObject
10{ 11{
@@ -99,21 +100,29 @@ class ClientAPITest : public QObject
99 Q_OBJECT 100 Q_OBJECT
100private Q_SLOTS: 101private Q_SLOTS:
101 102
103 static std::shared_ptr<DummyResourceFacade> registerDummyFacade()
104 {
105 auto facade = std::make_shared<DummyResourceFacade>();
106 Akonadi2::FacadeFactory::instance().registerFacade<Akonadi2::ApplicationDomain::Event, DummyResourceFacade>("dummyresource",
107 [facade](const QByteArray &instanceIdentifier) {
108 return facade;
109 }
110 );
111 return facade;
112 }
113
102 void initTestCase() 114 void initTestCase()
103 { 115 {
104 Akonadi2::FacadeFactory::instance().resetFactory(); 116 Akonadi2::FacadeFactory::instance().resetFactory();
117 ResourceConfig::clear();
105 } 118 }
106 119
120
107 void testLoad() 121 void testLoad()
108 { 122 {
109 auto facade = std::make_shared<DummyResourceFacade>(); 123 auto facade = registerDummyFacade();
110 facade->results << QSharedPointer<Akonadi2::ApplicationDomain::Event>::create("resource", "id", 0, QSharedPointer<Akonadi2::ApplicationDomain::BufferAdaptor>()); 124 facade->results << QSharedPointer<Akonadi2::ApplicationDomain::Event>::create("resource", "id", 0, QSharedPointer<Akonadi2::ApplicationDomain::BufferAdaptor>());
111 125 ResourceConfig::addResource("dummyresource.instance1", "dummyresource");
112 Akonadi2::FacadeFactory::instance().registerFacade<Akonadi2::ApplicationDomain::Event, DummyResourceFacade>("dummyresource",
113 [facade](const QByteArray &instanceIdentifier) {
114 return facade;
115 }
116 );
117 126
118 Akonadi2::Query query; 127 Akonadi2::Query query;
119 query.resources << "dummyresource.instance1"; 128 query.resources << "dummyresource.instance1";
@@ -126,14 +135,9 @@ private Q_SLOTS:
126 135
127 void testLiveQuery() 136 void testLiveQuery()
128 { 137 {
129 auto facade = std::make_shared<DummyResourceFacade>(); 138 auto facade = registerDummyFacade();
130 facade->results << QSharedPointer<Akonadi2::ApplicationDomain::Event>::create("resource", "id", 0, QSharedPointer<Akonadi2::ApplicationDomain::BufferAdaptor>()); 139 facade->results << QSharedPointer<Akonadi2::ApplicationDomain::Event>::create("resource", "id", 0, QSharedPointer<Akonadi2::ApplicationDomain::BufferAdaptor>());
131 140 ResourceConfig::addResource("dummyresource.instance1", "dummyresource");
132 Akonadi2::FacadeFactory::instance().registerFacade<Akonadi2::ApplicationDomain::Event, DummyResourceFacade>("dummyresource",
133 [facade](const QByteArray &instanceIdentifier){
134 return facade;
135 }
136 );
137 141
138 Akonadi2::Query query; 142 Akonadi2::Query query;
139 query.resources << "dummyresource.instance1"; 143 query.resources << "dummyresource.instance1";
@@ -152,14 +156,9 @@ private Q_SLOTS:
152 156
153 void testQueryLifetime() 157 void testQueryLifetime()
154 { 158 {
155 auto facade = std::make_shared<DummyResourceFacade>(); 159 auto facade = registerDummyFacade();
156 facade->results << QSharedPointer<Akonadi2::ApplicationDomain::Event>::create("resource", "id", 0, QSharedPointer<Akonadi2::ApplicationDomain::BufferAdaptor>()); 160 facade->results << QSharedPointer<Akonadi2::ApplicationDomain::Event>::create("resource", "id", 0, QSharedPointer<Akonadi2::ApplicationDomain::BufferAdaptor>());
157 161 ResourceConfig::addResource("dummyresource.instance1", "dummyresource");
158 Akonadi2::FacadeFactory::instance().registerFacade<Akonadi2::ApplicationDomain::Event, DummyResourceFacade>("dummyresource",
159 [facade](const QByteArray &instanceIdentifier){
160 return facade;
161 }
162 );
163 162
164 Akonadi2::Query query; 163 Akonadi2::Query query;
165 query.resources << "dummyresource.instance1"; 164 query.resources << "dummyresource.instance1";
@@ -176,9 +175,12 @@ private Q_SLOTS:
176 175
177 void resourceManagement() 176 void resourceManagement()
178 { 177 {
179 Akonadi2::FacadeFactory::registerStaticFacades(); 178 ResourceConfig::clear();
179 Akonadi2::FacadeFactory::instance().registerStaticFacades();
180 ResourceConfig::addResource("resourceconfig", "resourceconfig");
181
180 Akonadi2::ApplicationDomain::AkonadiResource res; 182 Akonadi2::ApplicationDomain::AkonadiResource res;
181 res.setProperty("identifier", "identifier1"); 183 res.setProperty("identifier", "dummyresource.identifier1");
182 res.setProperty("type", "dummyresource"); 184 res.setProperty("type", "dummyresource");
183 185
184 Akonadi2::Store::create(res, "resourceconfig"); 186 Akonadi2::Store::create(res, "resourceconfig");
@@ -186,6 +188,7 @@ private Q_SLOTS:
186 { 188 {
187 Akonadi2::Query query; 189 Akonadi2::Query query;
188 query.resources << "resourceconfig"; 190 query.resources << "resourceconfig";
191 query.propertyFilter.insert("type", "dummyresource");
189 async::SyncListResult<Akonadi2::ApplicationDomain::AkonadiResource::Ptr> result(Akonadi2::Store::load<Akonadi2::ApplicationDomain::AkonadiResource>(query)); 192 async::SyncListResult<Akonadi2::ApplicationDomain::AkonadiResource::Ptr> result(Akonadi2::Store::load<Akonadi2::ApplicationDomain::AkonadiResource>(query));
190 result.exec(); 193 result.exec();
191 QCOMPARE(result.size(), 1); 194 QCOMPARE(result.size(), 1);
@@ -195,6 +198,7 @@ private Q_SLOTS:
195 { 198 {
196 Akonadi2::Query query; 199 Akonadi2::Query query;
197 query.resources << "resourceconfig"; 200 query.resources << "resourceconfig";
201 query.propertyFilter.insert("type", "dummyresource");
198 async::SyncListResult<Akonadi2::ApplicationDomain::AkonadiResource::Ptr> result(Akonadi2::Store::load<Akonadi2::ApplicationDomain::AkonadiResource>(query)); 202 async::SyncListResult<Akonadi2::ApplicationDomain::AkonadiResource::Ptr> result(Akonadi2::Store::load<Akonadi2::ApplicationDomain::AkonadiResource>(query));
199 result.exec(); 203 result.exec();
200 QCOMPARE(result.size(), 0); 204 QCOMPARE(result.size(), 0);