ImagingTools Core SDK
CCachedObjectCollectionComp.h
1// SPDX-License-Identifier: LGPL-2.1-or-later OR GPL-2.0-or-later OR GPL-3.0-or-later OR LicenseRef-ImtCore-Commercial
2#pragma once
3
4
5// Qt includes
6#include <QtCore/QReadWriteLock>
7
8// ACF includes
9#include <istd/TComposedFactory.h>
10#include <icomp/CComponentBase.h>
11#include <istd/TDelPtr.h>
12#include <istd/TPointerVector.h>
13#include <imod/TSingleModelObserverBase.h>
14
15// ImtCore includes
16#include <imtbase/IObjectCollection.h>
17
18
19namespace imtbase
20{
21
22
28 public icomp::CComponentBase,
29 public imod::TSingleModelObserverBase<istd::IChangeable>,
30 virtual public imtbase::IObjectCollection
31{
32public:
33 typedef icomp::CComponentBase BaseClass;
34 typedef imod::TSingleModelObserverBase<istd::IChangeable> BaseClass2;
35
36 I_BEGIN_COMPONENT(CCachedObjectCollectionComp);
37 I_REGISTER_INTERFACE(IObjectCollection);
38 I_REGISTER_INTERFACE(IObjectCollectionInfo);
39 I_REGISTER_INTERFACE(ICollectionInfo);
40 I_ASSIGN(m_objectCollectionCompPtr, "ObjectCollection", "Base collection containing real data", true, "ObjectCollection");
41 I_ASSIGN_TO(m_objectCollectionModelCompPtr, m_objectCollectionCompPtr, true);
42 I_ASSIGN(m_metaInfoCacheLimitAttrPtr, "MetaInfoCacheLimit", "Maximal count of filter combinations stored in the ring buffer (meta info cache)", true, 1000);
43 I_ASSIGN(m_objectCacheLimitAttrPtr, "ObjectCacheLimit", "Maximal count of the data objects in the ring buffer (cache)", true, 100);
44 I_END_COMPONENT;
45
47
48 // reimplemented (icomp::CComponentBase)
49 virtual void OnComponentCreated() override;
50 virtual void OnComponentDestroyed() override;
51
52 // reimplemented (imod::CSingleModelObserverBase)
53 virtual void OnUpdate(const istd::IChangeable::ChangeSet& changeSet) override;
54
55 // reimplemented (IObjectCollection)
56 virtual const IRevisionController* GetRevisionController() const override;
57 virtual const ICollectionDataController* GetDataController() const override;
58 virtual int GetOperationFlags(const Id& objectId = Id()) const override;
59 virtual Id InsertNewObject(
60 const QByteArray& typeId,
61 const QString& name,
62 const QString& description,
63 const istd::IChangeable* defaultValuePtr = nullptr,
64 const Id& proposedElementId = Id(),
65 const idoc::IDocumentMetaInfo* dataMetaInfoPtr = nullptr,
66 const idoc::IDocumentMetaInfo* elementMetaInfoPtr = nullptr,
67 const IOperationContext* operationContextPtr = nullptr) override;
68 virtual bool RemoveElements(const Ids& elementIds, const IOperationContext* operationContextPtr = nullptr) override;
69 virtual bool RemoveElementSet(
70 const iprm::IParamsSet* selectionParamsPtr = nullptr,
71 const IOperationContext* operationContextPtr = nullptr) override;
72 virtual bool RestoreObjects(
73 const Ids& objectIds,
74 const IOperationContext* operationContextPtr = nullptr) override;
75 virtual bool RestoreObjectSet(
76 const iprm::IParamsSet* selectionParamsPtr = nullptr,
77 const IOperationContext* operationContextPtr = nullptr) override;
78 virtual const istd::IChangeable* GetObjectPtr(const Id& objectId) const override;
79 virtual bool GetObjectData(const Id& objectId, DataPtr& dataPtr, const iprm::IParamsSet* dataConfigurationPtr = nullptr) const override;
80 virtual bool SetObjectData(const Id& objectId, const istd::IChangeable& object, CompatibilityMode mode = CM_WITHOUT_REFS, const IOperationContext* operationContextPtr = nullptr) override;
81 virtual IObjectCollectionUniquePtr CreateSubCollection(int offset, int count, const iprm::IParamsSet *selectionParamsPtr) const override;
82 virtual imtbase::IObjectCollectionIterator* CreateObjectCollectionIterator(
83 const QByteArray& objectId = QByteArray(),
84 int offset = 0,
85 int count = -1,
86 const iprm::IParamsSet* selectionParamsPtr = nullptr) const override;
87
88 // reimplemented (IObjectCollectionInfo)
89 virtual const iprm::IOptionsList* GetObjectTypesInfo() const override;
90 virtual QByteArray GetObjectTypeId(const Id& objectId) const override;
91 virtual idoc::MetaInfoPtr GetDataMetaInfo(const Id& objectId) const override;
92
93 // reimplemented (ICollectionInfo)
94 virtual int GetElementsCount(
95 const iprm::IParamsSet* selectionParamsPtr = nullptr,
96 ilog::IMessageConsumer* logPtr = nullptr) const override;
97 virtual Ids GetElementIds(
98 int offset = 0,
99 int count = -1,
100 const iprm::IParamsSet* selectionParamsPtr = nullptr,
101 ilog::IMessageConsumer* logPtr = nullptr) const override;
102 virtual bool GetSubsetInfo(
103 ICollectionInfo& subsetInfo,
104 int offset = 0,
105 int count = -1,
106 const iprm::IParamsSet* selectionParamsPtr = nullptr,
107 ilog::IMessageConsumer* logPtr = nullptr) const override;
108 virtual QVariant GetElementInfo(const Id& elementId, int infoType, ilog::IMessageConsumer* logPtr = nullptr) const override;
109 virtual idoc::MetaInfoPtr GetElementMetaInfo(const Id& elementId, ilog::IMessageConsumer* logPtr = nullptr) const override;
110 virtual bool SetElementName(const Id& elementId, const QString& name, ilog::IMessageConsumer* logPtr = nullptr) override;
111 virtual bool SetElementDescription(const Id& elementId, const QString& description, ilog::IMessageConsumer* logPtr = nullptr) override;
112 virtual bool SetElementEnabled(const Id& elementId, bool isEnabled = true, ilog::IMessageConsumer* logPtr = nullptr) override;
113
114protected:
115 struct FilteredCollection
116 {
117 FilteredCollection(int aOffset, int aCount, const QByteArray& aSelectionParamsData, IObjectCollectionUniquePtr&& aCachePtr)
118 :offset(aOffset),
119 count(aCount),
120 selectionParamsData(aSelectionParamsData),
121 cachePtr(std::move(aCachePtr))
122 {
123 }
124 int offset;
125 int count;
126 QByteArray selectionParamsData;
127 imtbase::IObjectCollectionUniquePtr cachePtr;
128 };
129
130 FilteredCollection* GetFilteredCollection(
131 int offset = 0,
132 int count = -1,
133 const iprm::IParamsSet* selectionParamsPtr = nullptr) const;
134
135 void ClearCache();
136 void RemoveOldestObjectFromCache() const;
137
138private:
139 I_REF(imtbase::IObjectCollection, m_objectCollectionCompPtr);
140 I_REF(imod::IModel, m_objectCollectionModelCompPtr);
141 I_ATTR(int, m_metaInfoCacheLimitAttrPtr);
142 I_ATTR(int, m_objectCacheLimitAttrPtr);
143
144 mutable istd::TPointerVector<FilteredCollection> m_cachedCollections;
145
146 struct CacheItem
147 {
148 istd::IChangeableSharedPtr dataPtr;
149 qint64 timestamp = 0;
150 };
151
152 typedef QMap<QByteArray, CacheItem> CacheItemMap;
153 mutable CacheItemMap m_cacheItems;
154
155 int m_operationFlags;
156 mutable QReadWriteLock m_lock;
157};
158
159
160} // namespace imtbase
161
162