From ca5020095abfb76e63bd801e9722c07193eb05f5 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Fri, 28 Apr 2017 15:29:18 +0200 Subject: A single propertymapper for both directions --- common/domain/typeimplementations.cpp | 137 +++++++++++----------------------- common/domain/typeimplementations.h | 18 ++--- common/domainadaptor.h | 23 ++---- common/propertymapper.h | 64 ++++++++-------- tests/domainadaptortest.cpp | 4 +- 5 files changed, 89 insertions(+), 157 deletions(-) diff --git a/common/domain/typeimplementations.cpp b/common/domain/typeimplementations.cpp index 598e5a7..a87e73d 100644 --- a/common/domain/typeimplementations.cpp +++ b/common/domain/typeimplementations.cpp @@ -32,6 +32,10 @@ using namespace Sink; using namespace Sink::ApplicationDomain; +#define SINK_REGISTER_SERIALIZER(MAPPER, ENTITYTYPE, PROPERTY, LOWERCASEPROPERTY) \ + MAPPER.addMapping(&Sink::ApplicationDomain::Buffer::ENTITYTYPE::LOWERCASEPROPERTY, &Sink::ApplicationDomain::Buffer::ENTITYTYPE##Builder::add_##LOWERCASEPROPERTY); + + void TypeImplementation::configure(TypeIndex &index) { // index.addProperty(); @@ -61,69 +65,39 @@ void TypeImplementation::configure(IndexPropertyMapper &indexPropertyMappe }); } -void TypeImplementation::configure(ReadPropertyMapper &propertyMapper) -{ - propertyMapper.addMapping(&Buffer::sender); - propertyMapper.addMapping(&Buffer::to); - propertyMapper.addMapping(&Buffer::cc); - propertyMapper.addMapping(&Buffer::bcc); - propertyMapper.addMapping(&Buffer::subject); - propertyMapper.addMapping(&Buffer::date); - propertyMapper.addMapping(&Buffer::unread); - propertyMapper.addMapping(&Buffer::important); - propertyMapper.addMapping(&Buffer::folder); - propertyMapper.addMapping(&Buffer::mimeMessage); - propertyMapper.addMapping(&Buffer::fullPayloadAvailable); - propertyMapper.addMapping(&Buffer::draft); - propertyMapper.addMapping(&Buffer::trash); - propertyMapper.addMapping(&Buffer::sent); - propertyMapper.addMapping(&Buffer::messageId); - propertyMapper.addMapping(&Buffer::parentMessageId); -} - -void TypeImplementation::configure(WritePropertyMapper &propertyMapper) +void TypeImplementation::configure(PropertyMapper &propertyMapper) { - propertyMapper.addMapping(&BufferBuilder::add_sender); - propertyMapper.addMapping(&BufferBuilder::add_to); - propertyMapper.addMapping(&BufferBuilder::add_cc); - propertyMapper.addMapping(&BufferBuilder::add_bcc); - propertyMapper.addMapping(&BufferBuilder::add_subject); - propertyMapper.addMapping(&BufferBuilder::add_date); - propertyMapper.addMapping(&BufferBuilder::add_unread); - propertyMapper.addMapping(&BufferBuilder::add_important); - propertyMapper.addMapping(&BufferBuilder::add_folder); - propertyMapper.addMapping(&BufferBuilder::add_mimeMessage); - propertyMapper.addMapping(&BufferBuilder::add_fullPayloadAvailable); - propertyMapper.addMapping(&BufferBuilder::add_draft); - propertyMapper.addMapping(&BufferBuilder::add_trash); - propertyMapper.addMapping(&BufferBuilder::add_sent); - propertyMapper.addMapping(&BufferBuilder::add_messageId); - propertyMapper.addMapping(&BufferBuilder::add_parentMessageId); + SINK_REGISTER_SERIALIZER(propertyMapper, Mail, Sender, sender); + SINK_REGISTER_SERIALIZER(propertyMapper, Mail, To, to); + SINK_REGISTER_SERIALIZER(propertyMapper, Mail, Cc, cc); + SINK_REGISTER_SERIALIZER(propertyMapper, Mail, Bcc, bcc); + SINK_REGISTER_SERIALIZER(propertyMapper, Mail, Subject, subject); + SINK_REGISTER_SERIALIZER(propertyMapper, Mail, Date, date); + SINK_REGISTER_SERIALIZER(propertyMapper, Mail, Unread, unread); + SINK_REGISTER_SERIALIZER(propertyMapper, Mail, Important, important); + SINK_REGISTER_SERIALIZER(propertyMapper, Mail, Folder, folder); + SINK_REGISTER_SERIALIZER(propertyMapper, Mail, MimeMessage, mimeMessage); + SINK_REGISTER_SERIALIZER(propertyMapper, Mail, FullPayloadAvailable, fullPayloadAvailable); + SINK_REGISTER_SERIALIZER(propertyMapper, Mail, Draft, draft); + SINK_REGISTER_SERIALIZER(propertyMapper, Mail, Trash, trash); + SINK_REGISTER_SERIALIZER(propertyMapper, Mail, Sent, sent); + SINK_REGISTER_SERIALIZER(propertyMapper, Mail, MessageId, messageId); + SINK_REGISTER_SERIALIZER(propertyMapper, Mail, ParentMessageId, parentMessageId); } - void TypeImplementation::configure(TypeIndex &index) { index.addProperty(Folder::Parent::name); index.addProperty(Folder::Name::name); } -void TypeImplementation::configure(ReadPropertyMapper &propertyMapper) -{ - propertyMapper.addMapping(&Buffer::parent); - propertyMapper.addMapping(&Buffer::name); - propertyMapper.addMapping(&Buffer::icon); - propertyMapper.addMapping(&Buffer::specialpurpose); - propertyMapper.addMapping(&Buffer::enabled); -} - -void TypeImplementation::configure(WritePropertyMapper &propertyMapper) +void TypeImplementation::configure(PropertyMapper &propertyMapper) { - propertyMapper.addMapping(&BufferBuilder::add_parent); - propertyMapper.addMapping(&BufferBuilder::add_name); - propertyMapper.addMapping(&BufferBuilder::add_icon); - propertyMapper.addMapping(&BufferBuilder::add_specialpurpose); - propertyMapper.addMapping(&BufferBuilder::add_enabled); + SINK_REGISTER_SERIALIZER(propertyMapper, Folder, Parent, parent); + SINK_REGISTER_SERIALIZER(propertyMapper, Folder, Name, name); + SINK_REGISTER_SERIALIZER(propertyMapper, Folder, Icon, icon); + SINK_REGISTER_SERIALIZER(propertyMapper, Folder, SpecialPurpose, specialpurpose); + SINK_REGISTER_SERIALIZER(propertyMapper, Folder, Enabled, enabled); } void TypeImplementation::configure(IndexPropertyMapper &) @@ -137,26 +111,15 @@ void TypeImplementation::configure(TypeIndex &index) index.addProperty(Contact::Uid::name); } -void TypeImplementation::configure(ReadPropertyMapper &propertyMapper) +void TypeImplementation::configure(PropertyMapper &propertyMapper) { - propertyMapper.addMapping(&Buffer::uid); - propertyMapper.addMapping(&Buffer::fn); - propertyMapper.addMapping(&Buffer::emails); - propertyMapper.addMapping(&Buffer::vcard); - propertyMapper.addMapping(&Buffer::addressbook); - propertyMapper.addMapping(&Buffer::firstname); - propertyMapper.addMapping(&Buffer::lastname); -} - -void TypeImplementation::configure(WritePropertyMapper &propertyMapper) -{ - propertyMapper.addMapping(&BufferBuilder::add_uid); - propertyMapper.addMapping(&BufferBuilder::add_fn); - propertyMapper.addMapping(&BufferBuilder::add_emails); - propertyMapper.addMapping(&BufferBuilder::add_vcard); - propertyMapper.addMapping(&BufferBuilder::add_addressbook); - propertyMapper.addMapping(&BufferBuilder::add_firstname); - propertyMapper.addMapping(&BufferBuilder::add_lastname); + SINK_REGISTER_SERIALIZER(propertyMapper, Contact, Uid, uid); + SINK_REGISTER_SERIALIZER(propertyMapper, Contact, Fn, fn); + SINK_REGISTER_SERIALIZER(propertyMapper, Contact, Emails, emails); + SINK_REGISTER_SERIALIZER(propertyMapper, Contact, Vcard, vcard); + SINK_REGISTER_SERIALIZER(propertyMapper, Contact, Addressbook, addressbook); + SINK_REGISTER_SERIALIZER(propertyMapper, Contact, Firstname, firstname); + SINK_REGISTER_SERIALIZER(propertyMapper, Contact, Lastname, lastname); } void TypeImplementation::configure(IndexPropertyMapper &) @@ -171,16 +134,10 @@ void TypeImplementation::configure(TypeIndex &index) index.addProperty(Addressbook::Name::name); } -void TypeImplementation::configure(ReadPropertyMapper &propertyMapper) +void TypeImplementation::configure(PropertyMapper &propertyMapper) { - propertyMapper.addMapping(&Buffer::parent); - propertyMapper.addMapping(&Buffer::name); -} - -void TypeImplementation::configure(WritePropertyMapper &propertyMapper) -{ - propertyMapper.addMapping(&BufferBuilder::add_parent); - propertyMapper.addMapping(&BufferBuilder::add_name); + SINK_REGISTER_SERIALIZER(propertyMapper, Addressbook, Parent, parent); + SINK_REGISTER_SERIALIZER(propertyMapper, Addressbook, Name, name); } void TypeImplementation::configure(IndexPropertyMapper &) @@ -194,20 +151,12 @@ void TypeImplementation::configure(TypeIndex &index) index.addProperty(Event::Uid::name); } -void TypeImplementation::configure(ReadPropertyMapper &propertyMapper) -{ - propertyMapper.addMapping(&Buffer::summary); - propertyMapper.addMapping(&Buffer::description); - propertyMapper.addMapping(&Buffer::uid); - propertyMapper.addMapping(&Buffer::attachment); -} - -void TypeImplementation::configure(WritePropertyMapper &propertyMapper) +void TypeImplementation::configure(PropertyMapper &propertyMapper) { - propertyMapper.addMapping(&BufferBuilder::add_summary); - propertyMapper.addMapping(&BufferBuilder::add_description); - propertyMapper.addMapping(&BufferBuilder::add_uid); - propertyMapper.addMapping(&BufferBuilder::add_attachment); + SINK_REGISTER_SERIALIZER(propertyMapper, Event, Summary, summary); + SINK_REGISTER_SERIALIZER(propertyMapper, Event, Description, description); + SINK_REGISTER_SERIALIZER(propertyMapper, Event, Uid, uid); + SINK_REGISTER_SERIALIZER(propertyMapper, Event, Attachment, attachment); } void TypeImplementation::configure(IndexPropertyMapper &) diff --git a/common/domain/typeimplementations.h b/common/domain/typeimplementations.h index 8acea58..7e4608c 100644 --- a/common/domain/typeimplementations.h +++ b/common/domain/typeimplementations.h @@ -26,8 +26,7 @@ #include "contact_generated.h" #include "addressbook_generated.h" -class ReadPropertyMapper; -class WritePropertyMapper; +class PropertyMapper; class IndexPropertyMapper; class TypeIndex; @@ -46,8 +45,7 @@ public: typedef Sink::ApplicationDomain::Buffer::Mail Buffer; typedef Sink::ApplicationDomain::Buffer::MailBuilder BufferBuilder; static void configure(TypeIndex &index); - static void configure(ReadPropertyMapper &propertyMapper); - static void configure(WritePropertyMapper &propertyMapper); + static void configure(PropertyMapper &propertyMapper); static void configure(IndexPropertyMapper &indexPropertyMapper); }; @@ -57,8 +55,7 @@ public: typedef Sink::ApplicationDomain::Buffer::Folder Buffer; typedef Sink::ApplicationDomain::Buffer::FolderBuilder BufferBuilder; static void configure(TypeIndex &); - static void configure(ReadPropertyMapper &); - static void configure(WritePropertyMapper &); + static void configure(PropertyMapper &); static void configure(IndexPropertyMapper &indexPropertyMapper); }; @@ -68,8 +65,7 @@ public: typedef Sink::ApplicationDomain::Buffer::Contact Buffer; typedef Sink::ApplicationDomain::Buffer::ContactBuilder BufferBuilder; static void configure(TypeIndex &); - static void configure(ReadPropertyMapper &); - static void configure(WritePropertyMapper &); + static void configure(PropertyMapper &); static void configure(IndexPropertyMapper &indexPropertyMapper); }; @@ -79,8 +75,7 @@ public: typedef Sink::ApplicationDomain::Buffer::Addressbook Buffer; typedef Sink::ApplicationDomain::Buffer::AddressbookBuilder BufferBuilder; static void configure(TypeIndex &); - static void configure(ReadPropertyMapper &); - static void configure(WritePropertyMapper &); + static void configure(PropertyMapper &); static void configure(IndexPropertyMapper &indexPropertyMapper); }; @@ -90,8 +85,7 @@ public: typedef Sink::ApplicationDomain::Buffer::Event Buffer; typedef Sink::ApplicationDomain::Buffer::EventBuilder BufferBuilder; static void configure(TypeIndex &); - static void configure(ReadPropertyMapper &); - static void configure(WritePropertyMapper &); + static void configure(PropertyMapper &); static void configure(IndexPropertyMapper &indexPropertyMapper); }; diff --git a/common/domainadaptor.h b/common/domainadaptor.h index 1db43ca..c38b713 100644 --- a/common/domainadaptor.h +++ b/common/domainadaptor.h @@ -38,7 +38,7 @@ */ template flatbuffers::Offset -createBufferPart(const Sink::ApplicationDomain::ApplicationDomainType &domainObject, flatbuffers::FlatBufferBuilder &fbb, const WritePropertyMapper &mapper) +createBufferPart(const Sink::ApplicationDomain::ApplicationDomainType &domainObject, flatbuffers::FlatBufferBuilder &fbb, const PropertyMapper &mapper) { // First create a primitives such as strings using the mappings QList> propertiesToAddToResource; @@ -66,7 +66,7 @@ createBufferPart(const Sink::ApplicationDomain::ApplicationDomainType &domainObj * After this the buffer can be extracted from the FlatBufferBuilder object. */ template -static void createBufferPartBuffer(const Sink::ApplicationDomain::ApplicationDomainType &domainObject, flatbuffers::FlatBufferBuilder &fbb, WritePropertyMapper &mapper) +static void createBufferPartBuffer(const Sink::ApplicationDomain::ApplicationDomainType &domainObject, flatbuffers::FlatBufferBuilder &fbb, PropertyMapper &mapper) { auto pos = createBufferPart(domainObject, fbb, mapper); // Because we cannot template the following call @@ -151,7 +151,7 @@ public: } void const *mLocalBuffer; - QSharedPointer mLocalMapper; + QSharedPointer mLocalMapper; QSharedPointer mIndexMapper; TypeIndex *mIndex; }; @@ -169,12 +169,10 @@ class SINK_EXPORT DomainTypeAdaptorFactory : public DomainTypeAdaptorFactoryInte public: DomainTypeAdaptorFactory() - : mLocalMapper(QSharedPointer::create()), - mLocalWriteMapper(QSharedPointer::create()), + : mPropertyMapper(QSharedPointer::create()), mIndexMapper(QSharedPointer::create()) { - Sink::ApplicationDomain::TypeImplementation::configure(*mLocalMapper); - Sink::ApplicationDomain::TypeImplementation::configure(*mLocalWriteMapper); + Sink::ApplicationDomain::TypeImplementation::configure(*mPropertyMapper); Sink::ApplicationDomain::TypeImplementation::configure(*mIndexMapper); } @@ -189,7 +187,7 @@ public: { auto adaptor = QSharedPointer::create(); adaptor->mLocalBuffer = Sink::EntityBuffer::readBuffer(entity.local()); - adaptor->mLocalMapper = mLocalMapper; + adaptor->mLocalMapper = mPropertyMapper; adaptor->mIndexMapper = mIndexMapper; adaptor->mIndex = index; return adaptor; @@ -199,11 +197,7 @@ public: createBuffer(const Sink::ApplicationDomain::ApplicationDomainType &domainObject, flatbuffers::FlatBufferBuilder &fbb, void const *metadataData = 0, size_t metadataSize = 0) Q_DECL_OVERRIDE { flatbuffers::FlatBufferBuilder localFbb; - if (mLocalWriteMapper) { - // SinkTrace() << "Creating local buffer part"; - createBufferPartBuffer(domainObject, localFbb, *mLocalWriteMapper); - } - + createBufferPartBuffer(domainObject, localFbb, *mPropertyMapper); Sink::EntityBuffer::assembleEntityBuffer(fbb, metadataData, metadataSize, 0, 0, localFbb.GetBufferPointer(), localFbb.GetSize()); return true; } @@ -219,8 +213,7 @@ public: protected: - QSharedPointer mLocalMapper; - QSharedPointer mLocalWriteMapper; + QSharedPointer mPropertyMapper; QSharedPointer mIndexMapper; }; diff --git a/common/propertymapper.h b/common/propertymapper.h index fa4592b..fd24278 100644 --- a/common/propertymapper.h +++ b/common/propertymapper.h @@ -65,10 +65,17 @@ QVariant SINK_EXPORT propertyToVariant(const flatbuffers::Vector + void addMapping(FunctionReturnValue (Buffer::*f)() const, void (BufferBuilder::*f2)(Arg)) + { + addReadMapping(f); + addWriteMapping(f2); + } virtual QVariant getProperty(const QByteArray &key, void const *buffer) const { @@ -79,6 +86,14 @@ public: return QVariant(); } + virtual void setProperty(const QByteArray &key, const QVariant &value, QList> &builderCalls, flatbuffers::FlatBufferBuilder &fbb) const + { + if (mWriteAccessors.contains(key)) { + auto accessor = mWriteAccessors.value(key); + builderCalls << accessor(value, fbb); + } + } + bool hasMapping(const QByteArray &key) const { return mReadAccessors.contains(key); @@ -89,69 +104,50 @@ public: return mReadAccessors.keys(); } - void addMapping(const QByteArray &property, const std::function &mapping) +private: + void addReadMapping(const QByteArray &property, const std::function &mapping) { mReadAccessors.insert(property, mapping); } template - void addMapping(FunctionReturnValue (Buffer::*f)() const) + void addReadMapping(FunctionReturnValue (Buffer::*f)() const) { - addMapping(T::name, [f](void const *buffer) -> QVariant { return propertyToVariant((static_cast(buffer)->*f)()); }); + addReadMapping(T::name, [f](void const *buffer) -> QVariant { return propertyToVariant((static_cast(buffer)->*f)()); }); } -private: - QHash> mReadAccessors; -}; -class WritePropertyMapper -{ -public: - virtual ~WritePropertyMapper(){}; - - virtual void setProperty(const QByteArray &key, const QVariant &value, QList> &builderCalls, flatbuffers::FlatBufferBuilder &fbb) const - { - if (mWriteAccessors.contains(key)) { - auto accessor = mWriteAccessors.value(key); - builderCalls << accessor(value, fbb); - } - } - - bool hasMapping(const QByteArray &key) const - { - return mWriteAccessors.contains(key); - } - - void addMapping(const QByteArray &property, const std::function(const QVariant &, flatbuffers::FlatBufferBuilder &)> &mapping) + void addWriteMapping(const QByteArray &property, const std::function(const QVariant &, flatbuffers::FlatBufferBuilder &)> &mapping) { mWriteAccessors.insert(property, mapping); } template - void addMapping(void (BufferBuilder::*f)(uint8_t)) + void addWriteMapping(void (BufferBuilder::*f)(uint8_t)) { - addMapping(T::name, [f](const QVariant &value, flatbuffers::FlatBufferBuilder &fbb) -> std::function { + addWriteMapping(T::name, [f](const QVariant &value, flatbuffers::FlatBufferBuilder &fbb) -> std::function { return [value, f](void *builder) { (static_cast(builder)->*f)(value.value()); }; }); } template - void addMapping(void (BufferBuilder::*f)(bool)) + void addWriteMapping(void (BufferBuilder::*f)(bool)) { - addMapping(T::name, [f](const QVariant &value, flatbuffers::FlatBufferBuilder &fbb) -> std::function { + addWriteMapping(T::name, [f](const QVariant &value, flatbuffers::FlatBufferBuilder &fbb) -> std::function { return [value, f](void *builder) { (static_cast(builder)->*f)(value.value()); }; }); } template - void addMapping(void (BufferBuilder::*f)(flatbuffers::Offset)) + void addWriteMapping(void (BufferBuilder::*f)(flatbuffers::Offset)) { - addMapping(T::name, [f](const QVariant &value, flatbuffers::FlatBufferBuilder &fbb) -> std::function { + addWriteMapping(T::name, [f](const QVariant &value, flatbuffers::FlatBufferBuilder &fbb) -> std::function { auto offset = variantToProperty(value, fbb); return [offset, f](void *builder) { (static_cast(builder)->*f)(offset); }; }); } -private: + QHash> mReadAccessors; QHash(const QVariant &, flatbuffers::FlatBufferBuilder &)>> mWriteAccessors; }; + diff --git a/tests/domainadaptortest.cpp b/tests/domainadaptortest.cpp index 2b7455a..df44819 100644 --- a/tests/domainadaptortest.cpp +++ b/tests/domainadaptortest.cpp @@ -47,7 +47,7 @@ private slots: void testCreateBufferPart() { - auto writeMapper = QSharedPointer::create(); + auto writeMapper = QSharedPointer::create(); Sink::ApplicationDomain::TypeImplementation::configure(*writeMapper); Sink::ApplicationDomain::Event event; @@ -100,7 +100,7 @@ private slots: void testMail() { - auto writeMapper = QSharedPointer::create(); + auto writeMapper = QSharedPointer::create(); Sink::ApplicationDomain::TypeImplementation::configure(*writeMapper); Sink::ApplicationDomain::Mail mail; -- cgit v1.2.3