問題
Documents and Media Library でファイルとメタデータを管理するモジュールを開発しようとしていますが、メタデータ セットのメタデータを操作するのに苦労しています。
ドキュメントおよびメディア ドキュメントの保存されたメタデータにアクセスするにはどうすればよいですか?
それらにアクセスするための正しいクラスとサービスを教えてください。
Environment
- DXP 7.4
解決策
1. データベース テーブル:
「Documents and Media」ドキュメントとそのメタデータに関連するデータベース テーブルは次のとおりです。
- DLFileEntry、DLFileVersion、DLFileEntryType、DDMStructure、DLFileEntryMetadata、DDMStorageLink、DDMField、および DDMFieldAttribute
これらのテーブル間の関係は次のとおりです。
- すべてのドキュメントは
DLFileEntry
に格納されます。 テーブル. ドキュメントは、テーブルDLFileVersion
に複数のドキュメント バージョンを持つことができます。 - 「ドキュメント タイプ」のメタデータ定義は、
DLFileEntryType
(名前) とDDMStructure
(構造) に格納されます。DLFileEntryType
linksDLFileVersion
withDDMStructure
DLFileVersion
バージョンにメタデータを含む「ドキュメント タイプ」がある場合、DLFileEntryMetadata
にエントリがあり、DLFileEntry
(dlFileEntryId)、DLFileVersion
(dlFileVersionId)、DDMStructure
およびDDM データ ストレージ (ddmStorageId)- DXP 7.4 では、
DLFileEntryMetadata
のデータ ストレージは、DDMStorageLink
、DDMField
、およびDDMFieldAttribute
に格納されます。
重要: Liferay API を使用して、これらのテーブルを常に変更する必要があります。 他のメカニズムを使用してテーブル レコードを更新/削除しないでください。
2. ドキュメント バージョンからメタデータを読み取る Java コード:
開始点として、groovy スクリプト getMetadata-AllFields-DLFileEntry_74x.groovy
を実装しました。これは、データベースのすべての DLFileEntry オブジェクトからすべてのメタデータを取得し、スクリプト出力にダンプします。
スクリプトを実行するには、コントロール パネル => サーバー管理 => スクリプトに移動し、添付ファイルの内容をコピーする必要があります。
これらのテーブルに関連する Java クラスは、次の Java パッケージにあります。
- モデル: com.liferay.document.library.kernel.model.* => DLFileEntry、DLFileVersion、DLFileEntryMetadata、DLFileEntryType:
- サービス: com.liferay.document.library.kernel.service.* => DLFileEntryLocalService、DLFileVersionLocalService、DLFileEntryMetadataLocalService、DLFileEntryTypeLocalService:
また、ダイナミック データ マッピング クラスを使用して、DDMField、DDMFieldAttribute、DDMStorageLink、および DDMStructure からすべての情報を取得する必要があります。詳細については、以下を参照してください。
ドキュメントのメタデータを取得する場合は、通常、次のパスに従います。
- DLFileVersion を取得します。 DLFileEntry から
dlFileEntry.getFileVersion()
を呼び出すか、DLFileVersionLocalService サービスを使用して取得できます。 -
dlFileVersion.getFileEntryTypeId()
を呼び出すだけで、DLFileVersion から DLFileEntryType (= ドキュメント タイプ) を取得します。 -
dlFileEntryType.getDDMStructures()
を呼び出して、DLFileEntryType から DDMStructures (= 文書型定義) を取得します。 - DDMStructures と DLFileVersion を取得
たら、API を呼び出して DLFileEntryMetadata を取得できます
- DLFileEntryMetadata オブジェクトを使用すると、
StorageEngineManagerUtil.getDDMFormValues(fileEntryMetadata.getDDMStorageId())
を呼び出して、DDM データ ストレージから実際のデータにアクセスできます。 - この呼び出しは、格納されている DDMFormFieldValue オブジェクトを取得できる DDMFormValues オブジェクトを返します。
3. ドキュメント バージョンにメタデータを追加/更新する Java コード:
製品がメタデータを挿入するいくつかの Liferay コード例を次に示します。これを例として使用して、独自のコードを記述してください:3.1 DLFileEntry の作成:
次のコードを参照してください: https://github.com/liferay /liferay-portal/blob/7981e83f8002dec2719622319ec5efc72b279042/portal-impl/src/com/liferay/portlet/documentlibrary/service/impl/DLFileEntryLocalServiceImpl.java#L2092-L2096 ここで _addFileVersion メソッド呼び出し
に dataEntry1 ddmFormValuesMap マップに格納されます3.2 DDMFormValues の作成:
ここに、ddmFormValuesMap マップの作成方法の例をいくつか示します。
DDMFormValues の作成方法の例を 2 つ示します。
- https://github.com/liferay/liferay-portal/blob/7981e83f8002dec2719622319ec5efc72b279042/modules/apps/document-library/document-library-web/src/main/java/com/liferay/document/library/web/internal/ portlet/action/EditFileEntryMVCActionCommand.java#L1188-L1215
- https://github.com/liferay/liferay-portal/blob/7981e83f8002dec2719622319ec5efc72b279042/modules/apps/portal/portal-tika/src/main/java/com/liferay/portal/tika/internal/metadata/TikaRawMetadataProcessor.java# L138-L170
3.3 ファイルのメタデータを更新する:
ドキュメントから自動的に抽出されたメタデータがドキュメントに追加される別の例があります。RawMetadataProcessorImpl および TikaRawMetadataProcessor クラスを参照してください。- https://github.com/liferay/liferay-portal/blob/master/portal-impl/src/com/liferay/portlet/documentlibrary/util/RawMetadataProcessorImpl.java#L119-L170
- https://github.com/liferay/liferay-portal/blob/7981e83f8002dec2719622319ec5efc72b279042/modules/apps/portal/portal-tika/src/main/java/com/liferay/portal/tika/internal/metadata/TikaRawMetadataProcessor.java# L100-L107
ただし、これは特殊なケースです。ユーザー インターフェイスでは使用できない RawMetadataProcessor という内部構造を使用するためです。