From bf75a2b6b184a3504cdee4b88a6db4a82c6da150 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Sun, 17 Apr 2016 15:01:51 +0200 Subject: Don't encode the resource type into the identifier --- common/definitions.cpp | 10 ---------- common/definitions.h | 1 - common/facade.cpp | 3 ++- common/listener.cpp | 4 ++-- common/listener.h | 2 +- common/notifier.cpp | 4 ++-- common/notifier.h | 2 +- common/resourceaccess.cpp | 17 +++++------------ common/resourceaccess.h | 4 ++-- common/resourceconfig.cpp | 5 +++++ common/resourceconfig.h | 1 + common/resourcecontrol.cpp | 9 +++++---- common/store.cpp | 34 +++++++++++++++++++--------------- 13 files changed, 45 insertions(+), 51 deletions(-) (limited to 'common') diff --git a/common/definitions.cpp b/common/definitions.cpp index 101279e..26e23ed 100644 --- a/common/definitions.cpp +++ b/common/definitions.cpp @@ -36,13 +36,3 @@ QString Sink::temporaryFileLocation() dir.mkpath(path); return path; } - -QByteArray Sink::resourceName(const QByteArray &instanceIdentifier) -{ - auto split = instanceIdentifier.split('.'); - if (split.size() <= 1) { - return instanceIdentifier; - } - split.removeLast(); - return split.join('.'); -} diff --git a/common/definitions.h b/common/definitions.h index a90b15a..6a6796e 100644 --- a/common/definitions.h +++ b/common/definitions.h @@ -27,5 +27,4 @@ namespace Sink { QString SINK_EXPORT storageLocation(); QString SINK_EXPORT temporaryFileLocation(); -QByteArray SINK_EXPORT resourceName(const QByteArray &instanceIdentifier); } diff --git a/common/facade.cpp b/common/facade.cpp index 803f85c..cdd06f9 100644 --- a/common/facade.cpp +++ b/common/facade.cpp @@ -26,6 +26,7 @@ #include "domainadaptor.h" #include "queryrunner.h" #include "bufferutils.h" +#include "resourceconfig.h" using namespace Sink; @@ -38,7 +39,7 @@ GenericFacade::GenericFacade( : Sink::StoreFacade(), mResourceAccess(resourceAccess), mDomainTypeAdaptorFactory(adaptorFactory), mResourceInstanceIdentifier(resourceIdentifier) { if (!mResourceAccess) { - mResourceAccess = ResourceAccessFactory::instance().getAccess(resourceIdentifier); + mResourceAccess = ResourceAccessFactory::instance().getAccess(resourceIdentifier, ResourceConfig::getResourceType(resourceIdentifier)); } } diff --git a/common/listener.cpp b/common/listener.cpp index 145267a..828a917 100644 --- a/common/listener.cpp +++ b/common/listener.cpp @@ -42,10 +42,10 @@ #undef DEBUG_AREA #define DEBUG_AREA "resource.communication" -Listener::Listener(const QByteArray &resourceInstanceIdentifier, QObject *parent) +Listener::Listener(const QByteArray &resourceInstanceIdentifier, const QByteArray &resourceType, QObject *parent) : QObject(parent), m_server(new QLocalServer(this)), - m_resourceName(Sink::resourceName(resourceInstanceIdentifier)), + m_resourceName(resourceType), m_resourceInstanceIdentifier(resourceInstanceIdentifier), m_resource(0), m_clientBufferProcessesTimer(new QTimer(this)), diff --git a/common/listener.h b/common/listener.h index aca7c50..cd1a7f6 100644 --- a/common/listener.h +++ b/common/listener.h @@ -56,7 +56,7 @@ class SINK_EXPORT Listener : public QObject Q_OBJECT public: - Listener(const QByteArray &resourceName, QObject *parent = 0); + Listener(const QByteArray &resourceName, const QByteArray &resourceType, QObject *parent = 0); ~Listener(); signals: diff --git a/common/notifier.cpp b/common/notifier.cpp index 25d0b85..94ac84e 100644 --- a/common/notifier.cpp +++ b/common/notifier.cpp @@ -48,9 +48,9 @@ Notifier::Notifier(const QSharedPointer &resourceAccess) : d(new d->resourceAccess << resourceAccess; } -Notifier::Notifier(const QByteArray &instanceIdentifier) : d(new Sink::Notifier::Private) +Notifier::Notifier(const QByteArray &instanceIdentifier, const QByteArray &resourceType) : d(new Sink::Notifier::Private) { - auto resourceAccess = Sink::ResourceAccess::Ptr::create(instanceIdentifier); + auto resourceAccess = Sink::ResourceAccess::Ptr::create(instanceIdentifier, resourceType); resourceAccess->open(); QObject::connect(resourceAccess.data(), &ResourceAccess::notification, d->context.data(), [this](const Notification ¬ification) { for (const auto &handler : d->handler) { diff --git a/common/notifier.h b/common/notifier.h index 9e75dde..3d61e95 100644 --- a/common/notifier.h +++ b/common/notifier.h @@ -36,7 +36,7 @@ class SINK_EXPORT Notifier { public: Notifier(const QSharedPointer &resourceAccess); - Notifier(const QByteArray &resourceInstanceIdentifier); + Notifier(const QByteArray &resourceInstanceIdentifier, const QByteArray &resourceType); void registerHandler(std::function); private: diff --git a/common/resourceaccess.cpp b/common/resourceaccess.cpp index c8c8189..33820af 100644 --- a/common/resourceaccess.cpp +++ b/common/resourceaccess.cpp @@ -199,7 +199,7 @@ KAsync::Job ResourceAccess::Private::initializeSocket() TracePrivate() << "Failed to connect, starting resource"; // We failed to connect, so let's start the resource QStringList args; - args << resourceInstanceIdentifier; + args << resourceInstanceIdentifier << resourceName; qint64 pid = 0; if (QProcess::startDetached("sink_synchronizer", args, QDir::homePath(), &pid)) { TracePrivate() << "Started resource " << pid; @@ -218,15 +218,8 @@ KAsync::Job ResourceAccess::Private::initializeSocket() }); } -static QByteArray getResourceName(const QByteArray &instanceIdentifier) -{ - auto split = instanceIdentifier.split('.'); - split.removeLast(); - return split.join('.'); -} - -ResourceAccess::ResourceAccess(const QByteArray &resourceInstanceIdentifier) - : ResourceAccessInterface(), d(new Private(getResourceName(resourceInstanceIdentifier), resourceInstanceIdentifier, this)) +ResourceAccess::ResourceAccess(const QByteArray &resourceInstanceIdentifier, const QByteArray &resourceType) + : ResourceAccessInterface(), d(new Private(resourceType, resourceInstanceIdentifier, this)) { Log() << "Starting access"; } @@ -593,7 +586,7 @@ ResourceAccessFactory &ResourceAccessFactory::instance() return *instance; } -Sink::ResourceAccess::Ptr ResourceAccessFactory::getAccess(const QByteArray &instanceIdentifier) +Sink::ResourceAccess::Ptr ResourceAccessFactory::getAccess(const QByteArray &instanceIdentifier, const QByteArray resourceType) { if (!mCache.contains(instanceIdentifier)) { // Reuse the pointer if something else kept the resourceaccess alive @@ -605,7 +598,7 @@ Sink::ResourceAccess::Ptr ResourceAccessFactory::getAccess(const QByteArray &ins } if (!mCache.contains(instanceIdentifier)) { // Create a new instance if necessary - auto sharedPointer = Sink::ResourceAccess::Ptr::create(instanceIdentifier); + auto sharedPointer = Sink::ResourceAccess::Ptr::create(instanceIdentifier, resourceType); QObject::connect(sharedPointer.data(), &Sink::ResourceAccess::ready, sharedPointer.data(), [this, instanceIdentifier](bool ready) { if (!ready) { mCache.remove(instanceIdentifier); diff --git a/common/resourceaccess.h b/common/resourceaccess.h index bd9af65..60f29e9 100644 --- a/common/resourceaccess.h +++ b/common/resourceaccess.h @@ -88,7 +88,7 @@ class SINK_EXPORT ResourceAccess : public ResourceAccessInterface public: typedef QSharedPointer Ptr; - ResourceAccess(const QByteArray &resourceName); + ResourceAccess(const QByteArray &resourceInstanceIdentifier, const QByteArray &resourceType); ~ResourceAccess(); QByteArray resourceName() const; @@ -141,7 +141,7 @@ class ResourceAccessFactory { public: static ResourceAccessFactory &instance(); - Sink::ResourceAccess::Ptr getAccess(const QByteArray &instanceIdentifier); + Sink::ResourceAccess::Ptr getAccess(const QByteArray &instanceIdentifier, const QByteArray resourceType); QHash> mWeakCache; QHash mCache; diff --git a/common/resourceconfig.cpp b/common/resourceconfig.cpp index cfde4e9..a4e5fc5 100644 --- a/common/resourceconfig.cpp +++ b/common/resourceconfig.cpp @@ -71,6 +71,11 @@ QMap ResourceConfig::getResources() return resources; } +QByteArray ResourceConfig::getResourceType(const QByteArray &identifier) +{ + return getResources().value(identifier); +} + void ResourceConfig::clear() { auto settings = getConfig("resources"); diff --git a/common/resourceconfig.h b/common/resourceconfig.h index 2108caa..fb74249 100644 --- a/common/resourceconfig.h +++ b/common/resourceconfig.h @@ -29,6 +29,7 @@ class SINK_EXPORT ResourceConfig { public: static QMap getResources(); + static QByteArray getResourceType(const QByteArray &identifier); static QByteArray newIdentifier(const QByteArray &type); static void addResource(const QByteArray &identifier, const QByteArray &type); static void removeResource(const QByteArray &identifier); diff --git a/common/resourcecontrol.cpp b/common/resourcecontrol.cpp index d8b0972..ac6ddba 100644 --- a/common/resourcecontrol.cpp +++ b/common/resourcecontrol.cpp @@ -25,6 +25,7 @@ #include #include "resourceaccess.h" +#include "resourceconfig.h" #include "commands.h" #include "log.h" #include "notifier.h" @@ -44,7 +45,7 @@ KAsync::Job ResourceControl::shutdown(const QByteArray &identifier) [identifier, time](QSharedPointer socket, KAsync::Future &future) { // We can't currently reuse the socket socket->close(); - auto resourceAccess = ResourceAccessFactory::instance().getAccess(identifier); + auto resourceAccess = ResourceAccessFactory::instance().getAccess(identifier, ResourceConfig::getResourceType(identifier)); resourceAccess->open(); resourceAccess->sendCommand(Sink::Commands::ShutdownCommand) .then([&future, resourceAccess, time]() { @@ -64,7 +65,7 @@ KAsync::Job ResourceControl::start(const QByteArray &identifier) Trace() << "start " << identifier; auto time = QSharedPointer::create(); time->start(); - auto resourceAccess = ResourceAccessFactory::instance().getAccess(identifier); + auto resourceAccess = ResourceAccessFactory::instance().getAccess(identifier, ResourceConfig::getResourceType(identifier)); resourceAccess->open(); return resourceAccess->sendCommand(Sink::Commands::PingCommand).then([resourceAccess, time]() { Trace() << "Start complete." << Log::TraceTime(time->elapsed()); }); } @@ -75,7 +76,7 @@ KAsync::Job ResourceControl::flushMessageQueue(const QByteArrayList &resou return KAsync::iterate(resourceIdentifier) .template each([](const QByteArray &resource, KAsync::Future &future) { Trace() << "Flushing message queue " << resource; - auto resourceAccess = ResourceAccessFactory::instance().getAccess(resource); + auto resourceAccess = ResourceAccessFactory::instance().getAccess(resource, ResourceConfig::getResourceType(resource)); resourceAccess->open(); resourceAccess->synchronizeResource(false, true).then([&future, resourceAccess]() { future.setFinished(); }).exec(); }); @@ -94,7 +95,7 @@ KAsync::Job ResourceControl::inspect(const Inspection &inspectionCommand) auto time = QSharedPointer::create(); time->start(); Trace() << "Sending inspection " << resource; - auto resourceAccess = ResourceAccessFactory::instance().getAccess(resource); + auto resourceAccess = ResourceAccessFactory::instance().getAccess(resource, ResourceConfig::getResourceType(resource)); resourceAccess->open(); auto notifier = QSharedPointer::create(resourceAccess); auto id = QUuid::createUuid().toByteArray(); diff --git a/common/store.cpp b/common/store.cpp index 0321583..b89e08c 100644 --- a/common/store.cpp +++ b/common/store.cpp @@ -51,23 +51,27 @@ QString Store::getTemporaryFilePath() return Sink::temporaryFileLocation() + "/" + QUuid::createUuid().toString(); } -static QList getResources(const QList &resourceFilter, const QByteArray &type = QByteArray()) +/* + * Returns a map of resource instance identifiers and resource type + */ +static QMap getResources(const QList &resourceFilter, const QByteArray &type = QByteArray()) { + QMap resources; // Return the global resource (signified by an empty name) for types that don't belong to a specific resource if (type == "sinkresource" || type == "sinkaccount" || type == "identity") { - return QList() << ""; + resources.insert("", ""); + return resources; } - QList resources; const auto configuredResources = ResourceConfig::getResources(); if (resourceFilter.isEmpty()) { for (const auto &res : configuredResources.keys()) { // TODO filter by entity type - resources << res; + resources.insert(res, configuredResources.value(res)); } } else { for (const auto &res : resourceFilter) { if (configuredResources.contains(res)) { - resources << res; + resources.insert(res, configuredResources.value(res)); } else { qWarning() << "Resource is not existing: " << res; } @@ -99,16 +103,17 @@ QSharedPointer Store::loadModel(Query query) auto resources = getResources(query.resources, ApplicationDomain::getTypeName()); auto aggregatingEmitter = AggregatingResultEmitter::Ptr::create(); model->setEmitter(aggregatingEmitter); - KAsync::iterate(resources) - .template each([query, aggregatingEmitter](const QByteArray &resource, KAsync::Future &future) { - auto facade = FacadeFactory::instance().getFacade(resourceName(resource), resource); + KAsync::iterate(resources.keys()) + .template each([query, aggregatingEmitter, resources](const QByteArray &resourceInstanceIdentifier, KAsync::Future &future) { + const auto resourceType = resources.value(resourceInstanceIdentifier); + auto facade = FacadeFactory::instance().getFacade(resourceType, resourceInstanceIdentifier); if (facade) { - Trace() << "Trying to fetch from resource " << resource; + Trace() << "Trying to fetch from resource " << resourceInstanceIdentifier; auto result = facade->load(query); aggregatingEmitter->addEmitter(result.second); result.first.template then([&future]() { future.setFinished(); }).exec(); } else { - Trace() << "Couldn' find a facade for " << resource; + Trace() << "Couldn' find a facade for " << resourceInstanceIdentifier; // Ignore the error and carry on future.setFinished(); } @@ -129,8 +134,7 @@ static std::shared_ptr> getFacade(const QByteArray &reso return facade; } } - const auto resourceType = resourceName(resourceInstanceIdentifier); - if (auto facade = FacadeFactory::instance().getFacade(resourceType, resourceInstanceIdentifier)) { + if (auto facade = FacadeFactory::instance().getFacade(ResourceConfig::getResourceType(resourceInstanceIdentifier), resourceInstanceIdentifier)) { return facade; } return std::make_shared>(); @@ -168,7 +172,7 @@ KAsync::Job Store::removeDataFromDisk(const QByteArray &identifier) Trace() << "Remove data from disk " << identifier; auto time = QSharedPointer::create(); time->start(); - auto resourceAccess = ResourceAccessFactory::instance().getAccess(identifier); + auto resourceAccess = ResourceAccessFactory::instance().getAccess(identifier, ResourceConfig::getResourceType(identifier)); resourceAccess->open(); return resourceAccess->sendCommand(Sink::Commands::RemoveFromDiskCommand) .then([resourceAccess, time]() { Trace() << "Remove from disk complete." << Log::TraceTime(time->elapsed()); }); @@ -177,11 +181,11 @@ KAsync::Job Store::removeDataFromDisk(const QByteArray &identifier) KAsync::Job Store::synchronize(const Sink::Query &query) { Trace() << "synchronize" << query.resources; - auto resources = getResources(query.resources); + auto resources = getResources(query.resources).keys(); return KAsync::iterate(resources) .template each([query](const QByteArray &resource, KAsync::Future &future) { Trace() << "Synchronizing " << resource; - auto resourceAccess = ResourceAccessFactory::instance().getAccess(resource); + auto resourceAccess = ResourceAccessFactory::instance().getAccess(resource, ResourceConfig::getResourceType(resource)); resourceAccess->open(); resourceAccess->synchronizeResource(true, false).then([&future, resourceAccess]() { future.setFinished(); }).exec(); }); -- cgit v1.2.3