ImagingTools Core SDK
CFileCollectionCompBase.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/QMap>
7#include <QtCore/QMutex>
8#include <QtCore/QThread>
9#include <QtCore/QReadWriteLock>
10#include <QtCore/QFileInfo>
11
12// ACF includes
13#include <istd/TSmartPtr.h>
14#include <iser/ISerializable.h>
15#include <imod/TModelWrap.h>
16#include <ilog/TLoggerCompWrap.h>
17#include <idoc/CStandardDocumentMetaInfo.h>
18#include <ifile/IFileNameParam.h>
19#include <ifile/IFilePersistence.h>
20#include <ifile/IFileResourceTypeConstraints.h>
21#include <iauth/ILogin.h>
22#include <iauth/IRightsProvider.h>
23
24// ImtCore includes
25#include <imtbase/IMetaInfoCreator.h>
26#include <imtbase/IRevisionController.h>
27#include <imtbase/ICollectionDataController.h>
28#include <imtfile/IFileCompression.h>
29#include <imtrepo/IFileCollectionInfo.h>
30#include <imtrepo/IFileObjectCollection.h>
31#include <imtrepo/IRepositoryItemInfoProvider.h>
32#include <imtrepo/CFileCollectionItem.h>
33
34
35namespace imtrepo
36{
37
38
39class CFileCollectionCompBaseAttr:
40 public QObject,
41 public ilog::CLoggerComponentBase
42{
43 Q_OBJECT
44public:
45 typedef ilog::CLoggerComponentBase BaseClass;
46
47 I_BEGIN_BASE_COMPONENT(CFileCollectionCompBaseAttr)
48 I_ASSIGN(m_revisionAttrPtr, "RepositoryRevision", "Revision number of the whole repository", true, 0);
49 I_ASSIGN(m_isCalculateCheckSumAttrPtr, "IsCalculateCheckSum", "Calculate check sums for the file", true, true);
50 I_ASSIGN(m_asynchronousReadingAttrPtr, "AsynchronousReading", "If enabled, the collection will reading asynchronously", true, false);
51 I_ASSIGN(m_versionInfoCompPtr, "VersionInfo", "Version info", true, "VersionInfo");
52 I_END_COMPONENT;
53
54protected:
58 I_ATTR(int, m_revisionAttrPtr);
59
63 I_ATTR(bool, m_isCalculateCheckSumAttrPtr);
64
68 I_ATTR(bool, m_asynchronousReadingAttrPtr);
69
73 I_REF(iser::IVersionInfo, m_versionInfoCompPtr);
74};
75
76
81 public CFileCollectionCompBaseAttr,
82 virtual public IFileObjectCollection,
83 virtual public imtbase::IObjectCollection::IDataFactory,
84 virtual public IRepositoryItemInfoProvider,
86{
87 Q_OBJECT
88public:
89 typedef CFileCollectionCompBaseAttr BaseClass;
90
91 I_BEGIN_BASE_COMPONENT(CFileCollectionCompBase)
92 I_REGISTER_INTERFACE(IFileObjectCollection);
93 I_REGISTER_INTERFACE(IFileCollectionInfo);
94 I_REGISTER_INTERFACE(IObjectCollection);
95 I_REGISTER_INTERFACE(IObjectCollectionInfo);
96 I_REGISTER_INTERFACE(ICollectionInfo);
97 I_ASSIGN(m_loginProviderCompPtr, "Login", "Provider of login data used for revision management", false, "Login");
98 I_ASSIGN(m_repositoryPathCompPtr, "RepositoryPath", "Path to the file collection folder", false, "RepositoryPath");
99 I_ASSIGN(m_compressorCompPtr, "FileCompressor", "File compressor", false, "FileCompressor");
100 I_ASSIGN(m_resourceTypesCompPtr, "ResourceTypes", "List of supported resource types", false, "ResourceTypes");
101 I_ASSIGN(m_helperFilesPersistenceCompPtr, "HelperFilesPersistence", "Persistence component used for loading / saving helper (item and meta) files. Replaced by default persistence engine if not specified", false, "HelperFilesPersistence");
102 I_ASSIGN_MULTI_0(m_progressManagerListCompPtr, "ProgressManagerList", "List of progress manager components", false);
103 I_ASSIGN_MULTI_0(m_objectPersistenceListCompPtr, "ObjectPersistenceList", "List of persistence components used for data object loading", false);
104 I_ASSIGN_MULTI_0(m_resourceFileTypesCompPtr, "FileTypeInfos", "List of file type infos for corresponding resource type", false);
105 I_ASSIGN_MULTI_0(m_metaInfoCreatorListCompPtr, "MetaInfoCreatorList", "List of meta-info creators related to the object types", false);
106 I_ASSIGN_MULTI_0(m_objectFactoryListCompPtr, "ObjectFactoryList", "List of factories used for data object instance creation", false);
107 I_ASSIGN(m_enableCacheAttrPtr, "EnableCache", "If enabled, the data objects will be placed into the cache to improve performance of the data reading", true, false);
108 I_END_COMPONENT;
109
110public:
112
113 // reimplemented (IRepositoryItemInfoProvider)
114 virtual const imtbase::ICollectionInfo& GetRepositoryItems() override;
115 virtual const IRepositoryItemInfo* GetRepositoryItemInfo(const QByteArray& itemId) const override;
116
117 // reimplemented (IFileCollectionInfo)
118 virtual const ifile::IFileResourceTypeConstraints* GetFileTypeConstraints() const override;
119 virtual bool GetFileInfo(const QByteArray& objectId, IFileCollectionItem& fileCollectionItem) const override;
120 virtual QString GetCollectionRootFolder() const override;
121 virtual int GetRepositoryRevision() const override;
122
123 // reimplemented (IFileObjectCollection)
124 virtual QString GetFile(const QByteArray& objectId, const QString& targetFilePath = QString()) const override;
125 virtual QByteArray InsertFile(
126 const QString& filePath,
127 const QByteArray& objectTypeId = QByteArray(),
128 const QString& objectName = QString(),
129 const QString& objectDescription = QString(),
130 const QByteArray& proposedObjectId = QByteArray(),
131 const idoc::IDocumentMetaInfo* dataMetaInfoPtr = nullptr,
132 const idoc::IDocumentMetaInfo* collectionItemMetaInfoPtr = nullptr) override;
133 virtual bool UpdateFile(const QString& filePath, const QByteArray& objectId) override;
134
135 // reimplemented (ICollectionDataController)
136 virtual const ifile::IFilePersistence* GetPersistenceForObjectType(const QByteArray& typeId) const override;
137 virtual bool ExportFile(
138 const imtbase::IObjectCollection& collection,
139 const Id& objectId,
140 const QString& targetFilePath = QString()) const override;
141 virtual Id ImportFile(
142 imtbase::IObjectCollection& collection,
143 const QByteArray& typeId,
144 const QString& sourceFilePath = QString(),
145 const QString& objectName = QString()) const override;
146
147 // reimplemented (IObjectCollection)
148 virtual const imtbase::IRevisionController* GetRevisionController() const override;
149 virtual const imtbase::ICollectionDataController* GetDataController() const override;
150 virtual int GetOperationFlags(const QByteArray& objectId = QByteArray()) const override;
151 virtual QByteArray InsertNewObject(
152 const QByteArray& typeId,
153 const QString& name,
154 const QString& description,
155 const istd::IChangeable* defaultValuePtr = nullptr,
156 const QByteArray& proposedObjectId = QByteArray(),
157 const idoc::IDocumentMetaInfo* dataMetaInfoPtr = nullptr,
158 const idoc::IDocumentMetaInfo* elementMetaInfoPtr = nullptr,
159 const imtbase::IOperationContext* operationContextPtr = nullptr) override;
160 virtual bool RemoveElements(const Ids& elementIds, const imtbase::IOperationContext* operationContextPtr = nullptr) override;
161 virtual bool RemoveElementSet(
162 const iprm::IParamsSet* selectionParamsPtr = nullptr,
163 const imtbase::IOperationContext* operationContextPtr = nullptr) override;
164 virtual bool RestoreObjects(
165 const Ids& objectIds,
166 const imtbase::IOperationContext* operationContextPtr = nullptr) override;
167 virtual bool RestoreObjectSet(
168 const iprm::IParamsSet* selectionParamsPtr = nullptr,
169 const imtbase::IOperationContext* operationContextPtr = nullptr) override;
170 virtual const istd::IChangeable* GetObjectPtr(const QByteArray& objectId) const override;
171 virtual bool GetObjectData(const QByteArray& objectId, DataPtr& dataPtr, const iprm::IParamsSet* dataConfigurationPtr = nullptr) const override;
172 virtual bool SetObjectData(const QByteArray& objectId, const istd::IChangeable& object, CompatibilityMode mode = CM_WITHOUT_REFS, const imtbase::IOperationContext* operationContextPtr = nullptr) override;
173 virtual imtbase::IObjectCollectionUniquePtr CreateSubCollection(int offset = 0, int count = -1, const iprm::IParamsSet* selectionParamsPtr = nullptr) const override;
174 virtual imtbase::IObjectCollectionIterator* CreateObjectCollectionIterator(
175 const QByteArray& objectId = QByteArray(),
176 int offset = 0,
177 int count = -1,
178 const iprm::IParamsSet* selectionParamsPtr = nullptr) const override;
179
180 // reimplemented (IObjectCollectionInfo)
181 virtual const iprm::IOptionsList* GetObjectTypesInfo() const override;
182 virtual Id GetObjectTypeId(const QByteArray& objectId) const override;
183 virtual idoc::MetaInfoPtr GetDataMetaInfo(const Id& objectId) const override;
184
185 // reimplemented (ICollectionInfo)
186 virtual int GetElementsCount(
187 const iprm::IParamsSet* selectionParamPtr = nullptr,
188 ilog::IMessageConsumer* logPtr = nullptr) const override;
189 virtual Ids GetElementIds(
190 int offset = 0,
191 int count = -1,
192 const iprm::IParamsSet* selectionParamsPtr = nullptr,
193 ilog::IMessageConsumer* logPtr = nullptr) const override;
194 virtual bool GetSubsetInfo(
195 imtbase::ICollectionInfo& subsetInfo,
196 int offset = 0,
197 int count = -1,
198 const iprm::IParamsSet* selectionParamsPtr = nullptr,
199 ilog::IMessageConsumer* logPtr = nullptr) const override;
200 virtual QVariant GetElementInfo(const QByteArray& elementId, int infoType, ilog::IMessageConsumer* logPtr = nullptr) const override;
201 virtual idoc::MetaInfoPtr GetElementMetaInfo(const Id& elementId, ilog::IMessageConsumer* logPtr = nullptr) const override;
202 virtual bool SetElementName(const Id& elementId, const QString& name, ilog::IMessageConsumer* logPtr = nullptr) override;
203 virtual bool SetElementDescription(const Id& elementId, const QString& description, ilog::IMessageConsumer* logPtr = nullptr) override;
204 virtual bool SetElementEnabled(const Id& elementId, bool isEnabled = true, ilog::IMessageConsumer* logPtr = nullptr) override;
205
206 // reimplemented (IObjectCollection::IDataFactory)
207 virtual istd::IChangeableUniquePtr CreateInstance(const QByteArray& keyId = "") const override;
208 virtual istd::IFactoryInfo::KeyList GetFactoryKeys() const override;
209
210protected:
211 class ResourceLocker
212 {
213 public:
214 explicit ResourceLocker(
215 CFileCollectionCompBase& collection,
216 const QByteArray& resourceId,
217 const QString& resourceName);
218 ~ResourceLocker();
219
220 private:
221 CFileCollectionCompBase& m_collection;
222 QByteArray m_resourceId;
223 QString m_resourceName;
224 };
225
226 struct RepositoryInfo
227 {
228 QString metaInfoFileSuffix;
229 QString dataFileSuffix;
230 };
231
232 class RepositoryItemInfo: virtual public IRepositoryItemInfo
233 {
234 public:
235 virtual void SetRepositoryItemFilePath(RepositoryFileType fileId, const QString& filePath);
236
237 // reimplemented (IRepositoryItemInfo)
238 virtual RepositoryFileTypes GetRepositoryItemFileTypes() const override;
239 virtual QString GetRepositoryItemFilePath(RepositoryFileType fileId) const override;
240
241 private:
242 QMap<int, QString> m_files;
243 };
244
245 class RepositoryItemInfoProvider:
246 virtual public imtbase::ICollectionInfo,
247 virtual public IRepositoryItemInfoProvider
248 {
249 public:
250 RepositoryItemInfoProvider(CFileCollectionCompBase& parent);
251
252 bool UpdateItems();
253
254 // reimplemented (IRepositoryItemInfoProvider)
255 virtual const imtbase::ICollectionInfo& GetRepositoryItems() override;
256 virtual const IRepositoryItemInfo* GetRepositoryItemInfo(const QByteArray& itemId) const override;
257
258 // reimplemented (imtbase::ICollectionInfo)
259 virtual int GetElementsCount(
260 const iprm::IParamsSet* selectionParamPtr = nullptr,
261 ilog::IMessageConsumer* logPtr = nullptr) const override;
262 virtual Ids GetElementIds(
263 int offset = 0,
264 int count = -1,
265 const iprm::IParamsSet* selectionParamsPtr = nullptr,
266 ilog::IMessageConsumer* logPtr = nullptr) const override;
267 virtual bool GetSubsetInfo(
268 imtbase::ICollectionInfo& subsetInfo,
269 int offset = 0,
270 int count = -1,
271 const iprm::IParamsSet* selectionParamsPtr = nullptr,
272 ilog::IMessageConsumer* logPtr = nullptr) const override;
273 virtual QVariant GetElementInfo(const QByteArray& elementId, int infoType, ilog::IMessageConsumer* logPtr = nullptr) const override;
274 virtual idoc::MetaInfoPtr GetElementMetaInfo(const Id& elementId, ilog::IMessageConsumer* logPtr = nullptr) const override;
275 virtual bool SetElementName(const Id& elementId, const QString& name, ilog::IMessageConsumer* logPtr = nullptr) override;
276 virtual bool SetElementDescription(const Id& elementId, const QString& description, ilog::IMessageConsumer* logPtr = nullptr) override;
277 virtual bool SetElementEnabled(const Id& elementId, bool isEnabled = true, ilog::IMessageConsumer* logPtr = nullptr) override;
278
279 private:
280 struct Item
281 {
282 QByteArray id;
283 RepositoryItemInfo itemInfo;
284 };
285
286 private:
287 CFileCollectionCompBase& m_parent;
288 QList<Item> m_repositoryItems;
289
290 mutable QReadWriteLock m_lock;
291 };
292
293
294 typedef QList<CFileCollectionItem> Files;
295
296 class ResourceTypeConstraints: public ifile::IFileResourceTypeConstraints
297 {
298 public:
299 ResourceTypeConstraints();
300 void SetParent(CFileCollectionCompBase* parentPtr);
301
302 // reimplemented (ifile::IFileResourceTypeConstraints)
303 virtual const ifile::IFileTypeInfo* GetFileTypeInfo(int resourceTypeIndex) const override;
304
305 // reimplemented (iprm::IOptionsList)
306 virtual int GetOptionsFlags() const override;
307 virtual int GetOptionsCount() const override;
308 virtual QString GetOptionName(int index) const override;
309 virtual QString GetOptionDescription(int index) const override;
310 virtual QByteArray GetOptionId(int index) const override;
311 virtual bool IsOptionEnabled(int index) const override;
312
313 private:
314 CFileCollectionCompBase* m_parentPtr;
315 };
316
317 typedef imod::TModelWrap<ResourceTypeConstraints> ResourceTypeConstraintsModel;
318
319
320protected:
321 static RepositoryInfo GetRepositoryInfo();
322
323 void EnumerateRepositoryItems(QFileInfoList& fileList) const;
324 QString CreateWorkingDir() const;
325 QString GetWorkingExt(
326 const ifile::IFilePersistence* persistencePtr,
327 const istd::IChangeable* dataObjectPtr,
328 const QString& fileName);
329
333 virtual istd::IChangeableUniquePtr CreateDataObject(const QByteArray& typeId) const;
334
338 virtual istd::IChangeableUniquePtr CreateObjectFromFile(const QString& filePath, const QByteArray& typeId) const;
339
346 QString SaveCollectionItem(const CFileCollectionItem& repositoryItem, const QString& dataFilePath = QString()) const;
347 QString GetDataItemFilePath(const CFileCollectionItem& repositoryFile) const;
348 QString GetMetaInfoFilePath(const CFileCollectionItem& repositoryFile) const;
349 QString CalculateShortFileName(const QString& fileName, const QFileInfo& fileInfo, const QString& prefix) const;
350
357 virtual bool SaveMetaInfo(const idoc::IDocumentMetaInfo& metaInfo, const QString& metaInfoFilePath) const;
358
365 virtual bool LoadMetaInfo(idoc::IDocumentMetaInfo& metaInfo, const QString& metaInfoFilePath) const;
366
370 bool IsPathInsideRepository(const QString& filePath) const;
371
376 int GetFileIndexById(const QByteArray& fileId) const;
377
382 int GetFileIndexByName(const QString& fileName) const;
383
388 virtual idoc::MetaInfoPtr CreateItemMetaInfo(const QString& dataObjectFilePath, const QByteArray& typeId) const;
389
393 bool CreateItemMetaInfoFile(const QString& dataObjectFilePath, const QByteArray& typeId, const QString& metaInfoFilePath) const;
394
399
400 void ReadRepositoryItems();
401 void ReadItem(Files& files, const QString& itemFilePath) const;
402 bool ReadItemFile(CFileCollectionItem& collectionItem, const QString& itemFilePath) const;
403
404 void StartRepositoryLoader();
405 Q_INVOKABLE void OnReaderProgress(int progress);
406 Q_INVOKABLE void OnReaderFinished();
407 Q_INVOKABLE void OnReaderInterrupted();
408
409 bool IsObjectIdLocked(const QByteArray& resourceId);
410 bool IsObjectNameLocked(const QString& resourceName);
411 bool IsObjectIdUsed(const QByteArray& objectId);
412
417 const QString& localFilePath,
418 const QString& resourceName,
419 const QByteArray& typeId,
420 ilog::IMessageConsumer* messageConsumerPtr) const = 0;
421
422 virtual QString CalculateTargetFilePath(
423 const QString& filePath,
424 const QString& objectName,
425 const QByteArray& typeId) const = 0;
426
427 virtual QString CalculateTargetFilePath(
428 const QString& targetFolderPath,
429 const QString& localFilePath) const = 0;
430
431 bool FinishInsertFileTransaction(
432 const QString& workingPath,
433 const QString& repositoryPath,
434 const QByteArray& fileId,
435 const CFileCollectionItem& collectionItem);
436
437 // reimplemented (icomp::CComponentBase)
438 virtual void OnComponentCreated() override;
439 virtual void OnComponentDestroyed() override;
440
441protected:
445 ResourceTypeConstraintsModel m_resourceTypeConstraints;
446
451 mutable Files m_files;
452 mutable QReadWriteLock m_filesLock;
453
454 typedef QMap<QByteArray, DataPtr> ObjectCache;
455 mutable ObjectCache m_objectCache;
456 mutable QReadWriteLock m_objectCacheLock;
457
458protected:
462 I_REF(iauth::ILogin, m_loginProviderCompPtr);
463
469 I_REF(ifile::IFileNameParam, m_repositoryPathCompPtr);
470
474 I_REF(imtfile::IFileCompression, m_compressorCompPtr);
475
479 I_REF(iprm::IOptionsList, m_resourceTypesCompPtr);
480
484 I_REF(ifile::IFilePersistence, m_helperFilesPersistenceCompPtr);
485
489 I_MULTIREF(ibase::IProgressManager, m_progressManagerListCompPtr);
490
494 I_MULTIREF(ifile::IFilePersistence, m_objectPersistenceListCompPtr);
495
499 I_MULTIREF(ifile::IFileTypeInfo, m_resourceFileTypesCompPtr);
500
504 I_MULTIREF(imtbase::IMetaInfoCreator, m_metaInfoCreatorListCompPtr);
505
509 I_MULTIFACT(istd::IChangeable, m_objectFactoryListCompPtr);
510
514 I_ATTR(bool, m_enableCacheAttrPtr);
515
516private:
517 class ReaderThread: public QThread
518 {
519 public:
520 explicit ReaderThread(CFileCollectionCompBase* parentPtr);
521
522 private:
523 // reimplemented (QThread)
524 virtual void run() override;
525
526 private:
527 CFileCollectionCompBase* m_parentPtr;
528 };
529
530private:
531 ReaderThread m_readerThread;
532 Files m_readerFiles;
533
534 typedef QMap<QByteArray, const imtbase::IMetaInfoCreator*> MetaInfoCreatorMap;
535 MetaInfoCreatorMap m_metaInfoCreatorMap;
536
537 QList<QByteArray> m_lockedObjectIds;
538 QList<QString> m_lockedObjectNames;
539 QMutex m_lockedObjectInfoMutex;
540
541 RepositoryItemInfoProvider m_itemInfoProvider;
542
543 std::atomic<bool> m_isCacheEnabled;
544};
545
546
547} // namespace imtrepo
548
549
ResourceTypeConstraintsModel m_resourceTypeConstraints
int GetFileIndexByName(const QString &fileName) const
virtual istd::IChangeableUniquePtr CreateObjectFromFile(const QString &filePath, const QByteArray &typeId) const
virtual istd::IChangeableUniquePtr CreateDataObject(const QByteArray &typeId) const
virtual bool LoadMetaInfo(idoc::IDocumentMetaInfo &metaInfo, const QString &metaInfoFilePath) const
int GetFileIndexById(const QByteArray &fileId) const
bool IsPathInsideRepository(const QString &filePath) const
QString SaveCollectionItem(const CFileCollectionItem &repositoryItem, const QString &dataFilePath=QString()) const
virtual idoc::MetaInfoPtr CreateItemMetaInfo(const QString &dataObjectFilePath, const QByteArray &typeId) const
virtual QString CalculateFolderPathInRepository(const QString &localFilePath, const QString &resourceName, const QByteArray &typeId, ilog::IMessageConsumer *messageConsumerPtr) const =0
bool CreateItemMetaInfoFile(const QString &dataObjectFilePath, const QByteArray &typeId, const QString &metaInfoFilePath) const
virtual bool SaveMetaInfo(const idoc::IDocumentMetaInfo &metaInfo, const QString &metaInfoFilePath) const
void UpdateItemMetaInfo(CFileCollectionItem &item) const