7#include <QtCore/QMutex>
8#include <QtCore/QThread>
9#include <QtCore/QReadWriteLock>
10#include <QtCore/QFileInfo>
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>
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>
39class CFileCollectionCompBaseAttr:
41 public ilog::CLoggerComponentBase
45 typedef ilog::CLoggerComponentBase BaseClass;
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");
58 I_ATTR(
int, m_revisionAttrPtr);
63 I_ATTR(
bool, m_isCalculateCheckSumAttrPtr);
68 I_ATTR(
bool, m_asynchronousReadingAttrPtr);
73 I_REF(iser::IVersionInfo, m_versionInfoCompPtr);
81 public CFileCollectionCompBaseAttr,
83 virtual public imtbase::IObjectCollection::IDataFactory,
84 virtual public IRepositoryItemInfoProvider,
89 typedef CFileCollectionCompBaseAttr BaseClass;
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);
115 virtual const IRepositoryItemInfo* GetRepositoryItemInfo(
const QByteArray& itemId)
const override;
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;
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;
136 virtual const ifile::IFilePersistence* GetPersistenceForObjectType(
const QByteArray& typeId)
const override;
137 virtual bool ExportFile(
140 const QString& targetFilePath = QString())
const override;
141 virtual Id ImportFile(
143 const QByteArray& typeId,
144 const QString& sourceFilePath = QString(),
145 const QString& objectName = QString())
const override;
150 virtual int GetOperationFlags(
const QByteArray& objectId = QByteArray())
const override;
151 virtual QByteArray InsertNewObject(
152 const QByteArray& typeId,
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,
161 virtual bool RemoveElementSet(
162 const iprm::IParamsSet* selectionParamsPtr =
nullptr,
164 virtual bool RestoreObjects(
165 const Ids& objectIds,
167 virtual bool RestoreObjectSet(
168 const iprm::IParamsSet* selectionParamsPtr =
nullptr,
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;
175 const QByteArray& objectId = QByteArray(),
178 const iprm::IParamsSet* selectionParamsPtr =
nullptr)
const override;
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;
186 virtual int GetElementsCount(
187 const iprm::IParamsSet* selectionParamPtr =
nullptr,
188 ilog::IMessageConsumer* logPtr =
nullptr)
const override;
189 virtual Ids GetElementIds(
192 const iprm::IParamsSet* selectionParamsPtr =
nullptr,
193 ilog::IMessageConsumer* logPtr =
nullptr)
const override;
194 virtual bool GetSubsetInfo(
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;
207 virtual istd::IChangeableUniquePtr CreateInstance(
const QByteArray& keyId =
"")
const override;
208 virtual istd::IFactoryInfo::KeyList GetFactoryKeys()
const override;
214 explicit ResourceLocker(
216 const QByteArray& resourceId,
217 const QString& resourceName);
222 QByteArray m_resourceId;
223 QString m_resourceName;
226 struct RepositoryInfo
228 QString metaInfoFileSuffix;
229 QString dataFileSuffix;
232 class RepositoryItemInfo:
virtual public IRepositoryItemInfo
235 virtual void SetRepositoryItemFilePath(RepositoryFileType fileId,
const QString& filePath);
238 virtual RepositoryFileTypes GetRepositoryItemFileTypes()
const override;
239 virtual QString GetRepositoryItemFilePath(RepositoryFileType fileId)
const override;
242 QMap<int, QString> m_files;
245 class RepositoryItemInfoProvider:
247 virtual public IRepositoryItemInfoProvider
256 virtual const IRepositoryItemInfo* GetRepositoryItemInfo(
const QByteArray& itemId)
const override;
259 virtual int GetElementsCount(
260 const iprm::IParamsSet* selectionParamPtr =
nullptr,
261 ilog::IMessageConsumer* logPtr =
nullptr)
const override;
262 virtual Ids GetElementIds(
265 const iprm::IParamsSet* selectionParamsPtr =
nullptr,
266 ilog::IMessageConsumer* logPtr =
nullptr)
const override;
267 virtual bool GetSubsetInfo(
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;
283 RepositoryItemInfo itemInfo;
288 QList<Item> m_repositoryItems;
290 mutable QReadWriteLock m_lock;
294 typedef QList<CFileCollectionItem> Files;
296 class ResourceTypeConstraints:
public ifile::IFileResourceTypeConstraints
299 ResourceTypeConstraints();
303 virtual const ifile::IFileTypeInfo* GetFileTypeInfo(
int resourceTypeIndex)
const override;
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;
317 typedef imod::TModelWrap<ResourceTypeConstraints> ResourceTypeConstraintsModel;
321 static RepositoryInfo GetRepositoryInfo();
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);
338 virtual istd::IChangeableUniquePtr
CreateObjectFromFile(
const QString& filePath,
const QByteArray& typeId)
const;
349 QString CalculateShortFileName(
const QString& fileName,
const QFileInfo& fileInfo,
const QString& prefix)
const;
357 virtual bool SaveMetaInfo(
const idoc::IDocumentMetaInfo& metaInfo,
const QString& metaInfoFilePath)
const;
365 virtual bool LoadMetaInfo(idoc::IDocumentMetaInfo& metaInfo,
const QString& metaInfoFilePath)
const;
388 virtual idoc::MetaInfoPtr
CreateItemMetaInfo(
const QString& dataObjectFilePath,
const QByteArray& typeId)
const;
393 bool CreateItemMetaInfoFile(
const QString& dataObjectFilePath,
const QByteArray& typeId,
const QString& metaInfoFilePath)
const;
400 void ReadRepositoryItems();
401 void ReadItem(Files& files,
const QString& itemFilePath)
const;
404 void StartRepositoryLoader();
405 Q_INVOKABLE
void OnReaderProgress(
int progress);
406 Q_INVOKABLE
void OnReaderFinished();
407 Q_INVOKABLE
void OnReaderInterrupted();
409 bool IsObjectIdLocked(
const QByteArray& resourceId);
410 bool IsObjectNameLocked(
const QString& resourceName);
411 bool IsObjectIdUsed(
const QByteArray& objectId);
417 const QString& localFilePath,
418 const QString& resourceName,
419 const QByteArray& typeId,
420 ilog::IMessageConsumer* messageConsumerPtr)
const = 0;
422 virtual QString CalculateTargetFilePath(
423 const QString& filePath,
424 const QString& objectName,
425 const QByteArray& typeId)
const = 0;
427 virtual QString CalculateTargetFilePath(
428 const QString& targetFolderPath,
429 const QString& localFilePath)
const = 0;
431 bool FinishInsertFileTransaction(
432 const QString& workingPath,
433 const QString& repositoryPath,
434 const QByteArray& fileId,
438 virtual void OnComponentCreated()
override;
439 virtual void OnComponentDestroyed()
override;
452 mutable QReadWriteLock m_filesLock;
454 typedef QMap<QByteArray, DataPtr> ObjectCache;
455 mutable ObjectCache m_objectCache;
456 mutable QReadWriteLock m_objectCacheLock;
462 I_REF(iauth::ILogin, m_loginProviderCompPtr);
469 I_REF(ifile::IFileNameParam, m_repositoryPathCompPtr);
474 I_REF(imtfile::IFileCompression, m_compressorCompPtr);
479 I_REF(iprm::IOptionsList, m_resourceTypesCompPtr);
484 I_REF(ifile::IFilePersistence, m_helperFilesPersistenceCompPtr);
489 I_MULTIREF(ibase::IProgressManager, m_progressManagerListCompPtr);
494 I_MULTIREF(ifile::IFilePersistence, m_objectPersistenceListCompPtr);
499 I_MULTIREF(ifile::IFileTypeInfo, m_resourceFileTypesCompPtr);
509 I_MULTIFACT(istd::IChangeable, m_objectFactoryListCompPtr);
514 I_ATTR(
bool, m_enableCacheAttrPtr);
517 class ReaderThread:
public QThread
524 virtual void run()
override;
531 ReaderThread m_readerThread;
534 typedef QMap<QByteArray, const imtbase::IMetaInfoCreator*> MetaInfoCreatorMap;
535 MetaInfoCreatorMap m_metaInfoCreatorMap;
537 QList<QByteArray> m_lockedObjectIds;
538 QList<QString> m_lockedObjectNames;
539 QMutex m_lockedObjectInfoMutex;
541 RepositoryItemInfoProvider m_itemInfoProvider;
543 std::atomic<bool> m_isCacheEnabled;
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