/* * Copyright (C) 2015 Christian Mollekopf * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "facade.h" #include "commands.h" #include "log.h" #include "storage.h" #include "definitions.h" #include "domainadaptor.h" #include "queryrunner.h" #include "bufferutils.h" #include "resourceconfig.h" using namespace Sink; template GenericFacade::GenericFacade(const ResourceContext &context) : Sink::StoreFacade(), mResourceContext(context), mResourceAccess(mResourceContext.resourceAccess()) { } template GenericFacade::~GenericFacade() { } template QByteArray GenericFacade::bufferTypeForDomainType() { // We happen to have a one to one mapping return Sink::ApplicationDomain::getTypeName(); } template KAsync::Job GenericFacade::create(const DomainType &domainObject) { flatbuffers::FlatBufferBuilder entityFbb; if (!mResourceContext.adaptorFactory().createBuffer(domainObject, entityFbb)) { SinkWarning() << "No domain type adaptor factory available"; return KAsync::error(); } return mResourceAccess->sendCreateCommand(domainObject.identifier(), bufferTypeForDomainType(), BufferUtils::extractBuffer(entityFbb)); } template KAsync::Job GenericFacade::modify(const DomainType &domainObject) { SinkTrace() << "Modifying entity: " << domainObject.identifier() << domainObject.changedProperties(); flatbuffers::FlatBufferBuilder entityFbb; if (!mResourceContext.adaptorFactory().createBuffer(domainObject, entityFbb)) { SinkWarning() << "No domain type adaptor factory available"; return KAsync::error(); } return mResourceAccess->sendModifyCommand(domainObject.identifier(), domainObject.revision(), bufferTypeForDomainType(), QByteArrayList(), BufferUtils::extractBuffer(entityFbb), domainObject.changedProperties(), QByteArray(), false); } template KAsync::Job GenericFacade::move(const DomainType &domainObject, const QByteArray &newResource) { SinkTrace() << "Moving entity: " << domainObject.identifier() << domainObject.changedProperties() << newResource; flatbuffers::FlatBufferBuilder entityFbb; if (!mResourceContext.adaptorFactory().createBuffer(domainObject, entityFbb)) { SinkWarning() << "No domain type adaptor factory available"; return KAsync::error(); } return mResourceAccess->sendModifyCommand(domainObject.identifier(), domainObject.revision(), bufferTypeForDomainType(), QByteArrayList(), BufferUtils::extractBuffer(entityFbb), domainObject.changedProperties(), newResource, true); } template KAsync::Job GenericFacade::copy(const DomainType &domainObject, const QByteArray &newResource) { SinkTrace() << "Copying entity: " << domainObject.identifier() << domainObject.changedProperties() << newResource; flatbuffers::FlatBufferBuilder entityFbb; if (!mResourceContext.adaptorFactory().createBuffer(domainObject, entityFbb)) { SinkWarning() << "No domain type adaptor factory available"; return KAsync::error(); } return mResourceAccess->sendModifyCommand(domainObject.identifier(), domainObject.revision(), bufferTypeForDomainType(), QByteArrayList(), BufferUtils::extractBuffer(entityFbb), domainObject.changedProperties(), newResource, false); } template KAsync::Job GenericFacade::remove(const DomainType &domainObject) { return mResourceAccess->sendDeleteCommand(domainObject.identifier(), domainObject.revision(), bufferTypeForDomainType()); } template QPair, typename ResultEmitter::Ptr> GenericFacade::load(const Sink::Query &query, const Log::Context &ctx) { // The runner lives for the lifetime of the query auto runner = new QueryRunner(query, mResourceContext, bufferTypeForDomainType(), ctx); runner->setResultTransformation(mResultTransformation); return qMakePair(KAsync::null(), runner->emitter()); } #define REGISTER_TYPE(T) \ template class Sink::GenericFacade; \ SINK_REGISTER_TYPES() #include "facade.moc"