oo

例:ジャーナル記事の中間バージョンの削除

ここでは、ジャーナル記事の中間バージョンを削除する手順とコードサンプルを示します。 スクリプトコンソールでは、JavaまたはGroovyコードを実行して、不要なオブジェクトバージョンを削除できます。

ジャーナル記事の中間バージョンを削除する手順の例を次に示します。

  1. 保持する最新バージョンの数を決定します。 元のバージョンと最新バージョンを保持する必要がありますが、追加の最新バージョンを保持することもできます。 たとえば、2つの最新バージョンを保持することも、最新バージョンのみを保持することもできます。

  2. エンティティのバージョンを削除する方法を見つけます。 Liferay DXPの アプリAPIcom.liferay.portal.kernel API が使用可能なオプションです。

    Service Builder エンティティの場合は、エンティティの*LocalServiceUtilクラスのdelete*メソッドを調べます。

    たとえば、 JournalArticleLocalServiceUtil の次のdeleteArticleは、ジャーナル記事のバージョンを1つ削除します。

    deleteArticle(long groupId, java.lang.String articleId, double version,
        java.lang.String articleURL,
        com.liferay.portal.kernel.service.ServiceContext serviceContext)
    
  3. 削除するエンティティのバージョンとそれらを削除するために必要な情報を集約します。 たとえば、削除基準に一致する範囲内のすべてのJournalArticleバージョンを取得し、それらのエンティティIDとグループIDをバージョンに関連付けます(上記のdeleteArticleメソッドにはエンティティIDとグループIDが必要です)。

    エンティティオブジェクト(JournalArticleなど)には通常、バージョンフィールドがあります。 JournalArticleResourceには、各JournalArticleの記事ID(エンティティのID)とグループIDがあります。 JournalArticleResourceは各JournalArticleを取得するための鍵で、複数のバージョンを持つことができます。 削除するJournalArticleバージョンを特定する手順は次のとおりです。

    1. すべてのJournalArticleResourceオブジェクトを取得します。

      List<JournalArticleResource> journalArticleResources =
          JournalArticleLocalServiceUtil.getJournalArticleResources(start, end);
      
    2. JournalArticleResourceに関連付けられたJournalArticleオブジェクトを介して、各JournalArticleバージョンのワークフローステータスを取得します。 動的クエリ は、各オブジェクトから必要なデータを正確に取得する効率的な方法です。

      for (JournalArticleResource
          journalArticeResource : journalArticleResources) {
      
          List<Double> journalArticlesVersionsToDelete =
              new ArrayList<Double>();
      
          DynamicQuery dq =
              DynamicQueryFactoryUtil.forClass(JournalArticle.class)
                  .setProjection(ProjectionFactoryUtil.projectionList()
                      .add(ProjectionFactoryUtil.property("id"))
                      .add(ProjectionFactoryUtil.property("version"))
                      .add(ProjectionFactoryUtil.property("status")))
                  .add(PropertyFactoryUtil.forName("groupId")
                      .eq(journalArticeResource.getGroupId()))
                  .add(PropertyFactoryUtil.forName("articleId")
                      .eq(journalArticeResource.getArticleId()))
                  .addOrder(OrderFactoryUtil.asc("version"));
      
          List<Object[]> result =
              JournalArticleLocalServiceUtil.dynamicQuery(dq);
      
          // See the next step for the sample code that goes here
      }
      
    3. JournalArticleResourceごとに(JournalArticleエンティティごとに1つあります)、保持する最初のバージョンと最新バージョンの範囲内にあり、かつステータスが削除に適している中間バージョンのリストを作成します。 たとえば、承認済みまたは期限切れの中間記事バージョン( WorkflowConstants.STATUS APPROVEDまたはWorkflowConstants.STATUS EXPIRED )を削除することができます。 MIN_NUMBER_FIRST_VERSIONS_KEPTおよびMIN_NUMBER_LATEST_VERSIONS_KEPT変数は、保持する最初の(最も古い)バージョンと最新の(最も新しい)バージョンの最小数と最大数をマークします。

      List<Double> journalArticlesVersionsToDelete =
          new ArrayList<Double>();
      
      for (int i=0; i < result.size(); i++) {
          long id = (long) result.get(i)[0];
          double version = (double) result.get(i)[1];
          int status = (int) result.get(i)[2];
      
          if ((status == WorkflowConstants.STATUS_APPROVED) || (status == WorkflowConstants.STATUS_EXPIRED) {
      
              if (i < MIN_NUMBER_FIRST_VERSIONS_KEPT) {
                  continue;
              }
      
              if (i >= (result.size() -
                  MIN_NUMBER_LATEST_VERSIONS_KEPT)) {
                  continue;
              }
      
              journalArticlesVersionsToDelete.add(version);
          }
      }
      
      // See the next step for the sample code that goes here
      
  4. 最後に、集計したバージョンに一致する各ジャーナル記事を削除します。

    for (double version : journalArticlesVersionsToDelete) {
    {
        JournalArticleLocalServiceUtil.deleteArticle(journalArticeResource.getGroupId(),
            journalArticeResource.getArticleId(),
            journalArticlesVersionsToDelete(i), null, null);
    }
    

同様のコードを記述して、他のエンティティの中間バージョンを削除できます。 コードの準備ができたら、サンプルモジュールを使用するか、スクリプトコンソールを使用してスクリプトとして実行します。

tip

削除する各オブジェクトのバージョン(およびその他の必要な情報)を印刷します。 削除をコミットする前に、オブジェクト削除呼び出しをコメントアウトし、テストとして削除するバージョンのプリントアウトを読み取ることもできます。

関連トピック