ImagingTools Core SDK
CFileRepositoryComp.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/IRightsProvider.h>
22
23// ImtCore includes
24#include <imtbase/IMetaInfoCreator.h>
25#include <imtbase/IRevisionController.h>
26#include <imtbase/ICollectionDataController.h>
27#include <imtbase/CObjectCollectionMetaInfo.h>
28#include <imtrepo/IFileCollectionInfo.h>
29#include <imtrepo/IFileObjectCollection.h>
30#include <imtrepo/CFileCollectionItem.h>
31
32
33namespace imtrepo
34{
35
36
41 public ilog::CLoggerComponentBase,
42 virtual public IFileObjectCollection,
43 virtual public imtbase::IObjectCollection::IDataFactory
44{
45 Q_DECLARE_TR_FUNCTIONS(CFileRepositoryComp);
46
47public:
48 typedef ilog::CLoggerComponentBase BaseClass;
49
50 I_BEGIN_COMPONENT(CFileRepositoryComp)
51 I_REGISTER_INTERFACE(IFileObjectCollection);
52 I_REGISTER_INTERFACE(IFileCollectionInfo);
53 I_REGISTER_INTERFACE(IObjectCollection);
54 I_ASSIGN(m_repositoryPathCompPtr, "RepositoryPath", "Path to the file collection folder", false, "RepositoryPath");
55 I_ASSIGN(m_resourceTypesCompPtr, "ResourceTypes", "List of supported resource types", false, "ResourceTypes");
56 I_ASSIGN(m_revisionAttrPtr, "RepositoryRevision", "Revision number of the whole repository", true, 0);
57 I_ASSIGN(m_isCalculateCheckSumAttrPtr, "IsCalculateCheckSum", "Calculate check sums for the file", true, true);
58 I_ASSIGN_MULTI_0(m_objectPersistenceListCompPtr, "ObjectPersistenceList", "List of persistence components used for data object loading", false);
59 I_ASSIGN_MULTI_0(m_resourceFileTypesCompPtr, "FileTypeInfos", "List of file type infos for corresponding resource type", false);
60 I_ASSIGN_MULTI_0(m_metaInfoCreatorListCompPtr, "MetaInfoCreatorList", "List of meta-info creators related to the object types", false);
61 I_ASSIGN_MULTI_0(m_objectFactoryListCompPtr, "ObjectFactoryList", "List of factories used for data object instance creation", false);
62 I_ASSIGN(m_documentInfoCollectionCompPtr, "DocumentInfoCollection", "Collection's table of contents", true, "DocumentInfoCollection");
63 I_ASSIGN(m_infoItemTypeIdAttrPtr, "InfoTypeId", "Type-ID of the file info item", true, "FileItemInfo");
64 I_END_COMPONENT;
65
66public:
68
69 // reimplemented (IFileCollectionInfo)
70 virtual const ifile::IFileResourceTypeConstraints* GetFileTypeConstraints() const override;
71 virtual bool GetFileInfo(const QByteArray& objectId, IFileCollectionItem& item) const override;
72 virtual QString GetCollectionRootFolder() const override;
73 virtual int GetRepositoryRevision() const override;
74 virtual FileCollectionLayout GetCollectionFileLayout() const override;
75
76 // reimplemented (IFileObjectCollection)
77 virtual QString GetFile(const QByteArray& objectId, const QString& targetFilePath = QString()) const override;
78 virtual QByteArray InsertFile(
79 const QString& filePath,
80 const QByteArray& objectTypeId = QByteArray(),
81 const QString& objectName = QString(),
82 const QString& objectDescription = QString(),
83 const QByteArray& proposedObjectId = QByteArray(),
84 const idoc::IDocumentMetaInfo* dataMetaInfoPtr = nullptr,
85 const idoc::IDocumentMetaInfo* collectionItemMetaInfoPtr = nullptr) override;
86 virtual bool UpdateFile(const QString& filePath, const QByteArray& objectId) override;
87
88 // reimplemented (IObjectCollection)
89 virtual const imtbase::IRevisionController* GetRevisionController() const override;
90 virtual const imtbase::ICollectionDataController* GetDataController() const override;
91 virtual int GetOperationFlags(const QByteArray& objectId = QByteArray()) const override;
92 virtual QByteArray InsertNewObject(
93 const QByteArray& typeId,
94 const QString& name,
95 const QString& description,
96 const istd::IChangeable* defaultValuePtr = nullptr,
97 const QByteArray& proposedObjectId = QByteArray(),
98 const idoc::IDocumentMetaInfo* dataMetaInfoPtr = nullptr,
99 const idoc::IDocumentMetaInfo* elementMetaInfoPtr = nullptr,
100 const imtbase::IOperationContext* operationContextPtr = nullptr) override;
101 virtual bool RemoveElements(const Ids& elementIds, const imtbase::IOperationContext* operationContextPtr = nullptr) override;
102 virtual bool RemoveElementSet(
103 const iprm::IParamsSet* selectionParamsPtr = nullptr,
104 const imtbase::IOperationContext* operationContextPtr = nullptr) override;
105 virtual bool RestoreObjects(
106 const Ids& objectIds,
107 const imtbase::IOperationContext* operationContextPtr = nullptr) override;
108 virtual bool RestoreObjectSet(
109 const iprm::IParamsSet* selectionParamsPtr = nullptr,
110 const imtbase::IOperationContext* operationContextPtr = nullptr) override;
111 virtual const istd::IChangeable* GetObjectPtr(const QByteArray& objectId) const override;
112 virtual bool GetObjectData(const QByteArray& objectId, DataPtr& dataPtr, const iprm::IParamsSet* dataConfigurationPtr = nullptr) const override;
113 virtual bool SetObjectData(const QByteArray& objectId, const istd::IChangeable& object, CompatibilityMode mode = CM_WITHOUT_REFS, const imtbase::IOperationContext* operationContextPtr = nullptr) override;
114 virtual imtbase::IObjectCollectionUniquePtr CreateSubCollection(int offset = 0, int count = -1, const iprm::IParamsSet* selectionParamsPtr = nullptr) const override;
115 virtual imtbase::IObjectCollectionIterator* CreateObjectCollectionIterator(
116 const QByteArray& objectId = QByteArray(),
117 int offset = 0,
118 int count = -1,
119 const iprm::IParamsSet* selectionParamsPtr = nullptr) const override;
120
121 // reimplemented (IObjectCollectionInfo)
122 virtual const iprm::IOptionsList* GetObjectTypesInfo() const override;
123 virtual Id GetObjectTypeId(const QByteArray& objectId) const override;
124 virtual idoc::MetaInfoPtr GetDataMetaInfo(const Id& objectId) const override;
125
126 // reimplemented (ICollectionInfo)
127 virtual int GetElementsCount(
128 const iprm::IParamsSet* selectionParamPtr = nullptr,
129 ilog::IMessageConsumer* logPtr = nullptr) const override;
130 virtual Ids GetElementIds(
131 int offset = 0,
132 int count = -1,
133 const iprm::IParamsSet* selectionParamsPtr = nullptr,
134 ilog::IMessageConsumer* logPtr = nullptr) const override;
135 virtual bool GetSubsetInfo(
136 imtbase::ICollectionInfo& subsetInfo,
137 int offset = 0,
138 int count = -1,
139 const iprm::IParamsSet* selectionParamsPtr = nullptr,
140 ilog::IMessageConsumer* logPtr = nullptr) const override;
141 virtual QVariant GetElementInfo(const QByteArray& elementId, int infoType, ilog::IMessageConsumer* logPtr = nullptr) const override;
142 virtual idoc::MetaInfoPtr GetElementMetaInfo(const Id& elementId, ilog::IMessageConsumer* logPtr = nullptr) const override;
143 virtual bool SetElementName(const Id& elementId, const QString& name, ilog::IMessageConsumer* logPtr = nullptr) override;
144 virtual bool SetElementDescription(const Id& elementId, const QString& description, ilog::IMessageConsumer* logPtr = nullptr) override;
145 virtual bool SetElementEnabled(const Id& elementId, bool isEnabled = true, ilog::IMessageConsumer* logPtr = nullptr) override;
146
147 // reimplemented (IObjectCollection::IDataFactory)
148 virtual istd::IChangeableUniquePtr CreateInstance(const QByteArray& keyId = "") const override;
149 virtual istd::IFactoryInfo::KeyList GetFactoryKeys() const override;
150
151protected:
152 class ResourceTypeConstraints: public ifile::IFileResourceTypeConstraints
153 {
154 public:
155 ResourceTypeConstraints();
156 void SetParent(CFileRepositoryComp* parentPtr);
157
158 // reimplemented (ifile::IFileResourceTypeConstraints)
159 virtual const ifile::IFileTypeInfo* GetFileTypeInfo(int resourceTypeIndex) const override;
160
161 // reimplemented (iprm::IOptionsList)
162 virtual int GetOptionsFlags() const override;
163 virtual int GetOptionsCount() const override;
164 virtual QString GetOptionName(int index) const override;
165 virtual QString GetOptionDescription(int index) const override;
166 virtual QByteArray GetOptionId(int index) const override;
167 virtual bool IsOptionEnabled(int index) const override;
168
169 private:
170 CFileRepositoryComp* m_parentPtr;
171 };
172
173 typedef imod::TModelWrap<ResourceTypeConstraints> ResourceTypeConstraintsModel;
174
175protected:
176 const ifile::IFilePersistence* GetObjectPersistence(const QByteArray& typeId) const;
177
178 QString CreateWorkingDir() const;
179 QString GetWorkingExt(
180 const ifile::IFilePersistence* persistencePtr,
181 const istd::IChangeable* dataObjectPtr,
182 const QString& fileName);
183
187 virtual istd::IChangeableUniquePtr CreateDataObject(const QByteArray& typeId) const;
188
192 virtual istd::IChangeableUniquePtr CreateObjectFromFile(const QString& filePath, const QByteArray& typeId) const;
193
197 bool IsPathInsideRepository(const QString& filePath) const;
198
203 virtual idoc::MetaInfoPtr CreateItemMetaInfo(const QString& dataObjectFilePath, const QByteArray& typeId) const;
204
209 const QString& localFilePath,
210 const QString& resourceName,
211 const QByteArray& typeId,
212 ilog::IMessageConsumer* messageConsumerPtr) const;
213 virtual QString CalculateTargetFilePath(
214 const QString& filePath,
215 const QString& objectName,
216 const QByteArray& typeId) const;
217 virtual QString CalculateTargetFilePath(
218 const QString& targetFolderPath,
219 const QString& localFilePath) const;
220 bool FinishInsertFileTransaction(
221 const QString& workingPath,
222 const QString& repositoryPath,
223 const QByteArray& fileId,
224 const CFileCollectionItem& collectionItem);
225
226 // reimplemented (icomp::CComponentBase)
227 virtual void OnComponentCreated() override;
228 virtual void OnComponentDestroyed() override;
229
230protected:
234 I_ATTR(int, m_revisionAttrPtr);
235
239 I_ATTR(bool, m_isCalculateCheckSumAttrPtr);
240
244 ResourceTypeConstraintsModel m_resourceTypeConstraints;
245
251 I_REF(ifile::IFileNameParam, m_repositoryPathCompPtr);
252
256 I_REF(iprm::IOptionsList, m_resourceTypesCompPtr);
257
261 I_MULTIREF(ifile::IFilePersistence, m_objectPersistenceListCompPtr);
262
266 I_MULTIREF(ifile::IFileTypeInfo, m_resourceFileTypesCompPtr);
267
271 I_MULTIREF(imtbase::IMetaInfoCreator, m_metaInfoCreatorListCompPtr);
272
276 I_MULTIFACT(istd::IChangeable, m_objectFactoryListCompPtr);
277
281 I_REF(imtbase::IObjectCollection, m_documentInfoCollectionCompPtr);
282
286 I_ATTR(QByteArray, m_infoItemTypeIdAttrPtr);
287
288private:
289 typedef QMap<QByteArray, DataPtr> ObjectCache;
290 mutable ObjectCache m_objectCache;
291 mutable QReadWriteLock m_objectCacheLock;
292
293 typedef QMap<QByteArray, const imtbase::IMetaInfoCreator*> MetaInfoCreatorMap;
294 MetaInfoCreatorMap m_metaInfoCreatorMap;
295};
296
297
298} // namespace imtrepo
299
300
bool IsPathInsideRepository(const QString &filePath) const
ResourceTypeConstraintsModel m_resourceTypeConstraints
virtual QString CalculateFolderPathInRepository(const QString &localFilePath, const QString &resourceName, const QByteArray &typeId, ilog::IMessageConsumer *messageConsumerPtr) const
virtual istd::IChangeableUniquePtr CreateObjectFromFile(const QString &filePath, const QByteArray &typeId) const
virtual istd::IChangeableUniquePtr CreateDataObject(const QByteArray &typeId) const
virtual idoc::MetaInfoPtr CreateItemMetaInfo(const QString &dataObjectFilePath, const QByteArray &typeId) const