File indexing completed on 2024-05-12 05:26:19

0001 /*
0002  * Copyright (C) 2015 Aaron Seigo <aseigo@kolabsystems.com>
0003  * Copyright (C) 2015 Christian Mollekopf <mollekopf@kolabsystems.com>
0004  *
0005  *   This program is free software; you can redistribute it and/or modify
0006  *   it under the terms of the GNU General Public License as published by
0007  *   the Free Software Foundation; either version 2 of the License, or
0008  *   (at your option) any later version.
0009  *
0010  *   This program is distributed in the hope that it will be useful,
0011  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
0012  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
0013  *   GNU General Public License for more details.
0014  *
0015  *   You should have received a copy of the GNU General Public License
0016  *   along with this program; if not, write to the
0017  *   Free Software Foundation, Inc.,
0018  *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA.
0019  */
0020 
0021 #pragma once
0022 
0023 #include <QAbstractItemModel>
0024 #include <QSharedPointer>
0025 
0026 #include "common/query.h"
0027 #include "common/store.h"
0028 
0029 #include "state.h"
0030 #include "syntaxtree.h"
0031 
0032 namespace SinkshUtils {
0033 
0034 class StoreBase;
0035 
0036 bool isValidStoreType(const QString &type);
0037 StoreBase &getStore(const QString &type);
0038 QSharedPointer<QAbstractItemModel> loadModel(const QString &type, Sink::Query query);
0039 QList<QByteArray> requestedProperties(const QString &type);
0040 QStringList resourceIds();
0041 QStringList resourceCompleter(const QStringList &, const QString &fragment, State &state);
0042 QStringList resourceOrTypeCompleter(const QStringList &commands, const QString &fragment, State &state);
0043 QStringList typeCompleter(const QStringList &commands, const QString &fragment, State &state);
0044 QStringList debugareaCompleter(const QStringList &, const QString &fragment, State &state);
0045 QMap<QString, QString> keyValueMapFromArgs(const QStringList &args);
0046 bool applyFilter(Sink::Query &query, const QStringList &args);
0047 bool applyFilter(Sink::Query &query, const SyntaxTree::Options &args);
0048 QByteArray parseUid(const QByteArray &);
0049 
0050 /**
0051  * A small abstraction layer to use the sink store with the type available as string.
0052  */
0053 class StoreBase
0054 {
0055 public:
0056     virtual ~StoreBase(){};
0057     virtual Sink::ApplicationDomain::ApplicationDomainType::Ptr getObject() = 0;
0058     virtual Sink::ApplicationDomain::ApplicationDomainType::Ptr getObject(const QByteArray &resourceInstanceIdentifier, const QByteArray &identifier = QByteArray()) = 0;
0059     virtual KAsync::Job<void> create(const Sink::ApplicationDomain::ApplicationDomainType &type) = 0;
0060     virtual KAsync::Job<void> modify(const Sink::ApplicationDomain::ApplicationDomainType &type) = 0;
0061     virtual KAsync::Job<void> remove(const Sink::ApplicationDomain::ApplicationDomainType &type) = 0;
0062     virtual QSharedPointer<QAbstractItemModel> loadModel(const Sink::Query &query) = 0;
0063     virtual QList<Sink::ApplicationDomain::ApplicationDomainType> read(const Sink::Query &query) = 0;
0064 };
0065 
0066 class DummyStore : public StoreBase
0067 {
0068 public:
0069     Sink::ApplicationDomain::ApplicationDomainType::Ptr getObject() Q_DECL_OVERRIDE
0070     {
0071         return {};
0072     }
0073 
0074     Sink::ApplicationDomain::ApplicationDomainType::Ptr getObject(const QByteArray &resourceInstanceIdentifier, const QByteArray &identifier = QByteArray()) Q_DECL_OVERRIDE
0075     {
0076         return {};
0077     }
0078 
0079     KAsync::Job<void> create(const Sink::ApplicationDomain::ApplicationDomainType &type) Q_DECL_OVERRIDE
0080     {
0081         return KAsync::null();
0082     }
0083 
0084     KAsync::Job<void> modify(const Sink::ApplicationDomain::ApplicationDomainType &type) Q_DECL_OVERRIDE
0085     {
0086         return KAsync::null();
0087     }
0088 
0089     KAsync::Job<void> remove(const Sink::ApplicationDomain::ApplicationDomainType &type) Q_DECL_OVERRIDE
0090     {
0091         return KAsync::null();
0092     }
0093 
0094     QSharedPointer<QAbstractItemModel> loadModel(const Sink::Query &query) Q_DECL_OVERRIDE
0095     {
0096         return {};
0097     }
0098 
0099     QList<Sink::ApplicationDomain::ApplicationDomainType> read(const Sink::Query &query) Q_DECL_OVERRIDE
0100     {
0101         return {};
0102     }
0103 };
0104 
0105 template <typename T>
0106 class Store : public StoreBase
0107 {
0108 public:
0109     Sink::ApplicationDomain::ApplicationDomainType::Ptr getObject() Q_DECL_OVERRIDE
0110     {
0111         return T::Ptr::create();
0112     }
0113 
0114     Sink::ApplicationDomain::ApplicationDomainType::Ptr getObject(const QByteArray &resourceInstanceIdentifier, const QByteArray &identifier = QByteArray()) Q_DECL_OVERRIDE
0115     {
0116         return T::Ptr::create(resourceInstanceIdentifier, identifier, 0, QSharedPointer<Sink::ApplicationDomain::MemoryBufferAdaptor>::create());
0117     }
0118 
0119     KAsync::Job<void> create(const Sink::ApplicationDomain::ApplicationDomainType &type) Q_DECL_OVERRIDE
0120     {
0121         return Sink::Store::create<T>(*static_cast<const T *>(&type));
0122     }
0123 
0124     KAsync::Job<void> modify(const Sink::ApplicationDomain::ApplicationDomainType &type) Q_DECL_OVERRIDE
0125     {
0126         return Sink::Store::modify<T>(*static_cast<const T *>(&type));
0127     }
0128 
0129     KAsync::Job<void> remove(const Sink::ApplicationDomain::ApplicationDomainType &type) Q_DECL_OVERRIDE
0130     {
0131         return Sink::Store::remove<T>(*static_cast<const T *>(&type));
0132     }
0133 
0134     QSharedPointer<QAbstractItemModel> loadModel(const Sink::Query &query) Q_DECL_OVERRIDE
0135     {
0136         return Sink::Store::loadModel<T>(query);
0137     }
0138 
0139     QList<Sink::ApplicationDomain::ApplicationDomainType> read(const Sink::Query &query) Q_DECL_OVERRIDE
0140     {
0141         QList<Sink::ApplicationDomain::ApplicationDomainType> list;
0142         for (const auto &o : Sink::Store::read<T>(query)) {
0143             list << o;
0144         }
0145         return list;
0146     }
0147 };
0148 }