Developer Guide
ご覧のページは、お客様の利便性のために一部機械翻訳されています。また、ドキュメントは頻繁に更新が加えられており、翻訳は未完成の部分が含まれることをご了承ください。最新情報は都度公開されておりますため、必ず英語版をご参照ください。翻訳に問題がある場合は、 こちら までご連絡ください。

ワークフローでのスクリプトエンジンの使用

重要

DXP 2024.Q3 以降、スクリプトはデフォルトで無効になっています。 システム設定 → スクリプト管理 (セキュリティ カテゴリ) で有効にできます。

Groovy スクリプトを XML ワークフロー定義 に追加して、ロジックを挿入し、ワークフローで Liferay の Java サービスにアクセスします。 ワークフロー実行時にスクリプトが実行されます。

ワークフローノードへのスクリプトの追加

これらのワークフローノードタイプでは、<actions>からワークフロースクリプトを呼び出すことができます。

  • <fork>
  • <join>
  • <state>
  • <task>

さらに、以下の が示すように、スクリプトを <condition> ノードに直接追加することもできます。 Java で条件ロジックを記述する方法については、 条件評価子の作成 を参照してください。

アクションは次のようなスクリプトを呼び出します。

<actions>
   <action>
      <script>
         <![CDATA[script code goes here]]>
      </script>
      <script-language>groovy</script-language>
   </action>
   ...
</actions>

<script> 要素にロジックを直接記述する代わりに、 ActionExecutor Java クラスを記述し、ワークフロー定義で呼び出すことができます。 ワークフロー定義で、言語をjavaに設定し、ActionExecutorを呼び出します。

<actions>
   <action>
      <name>reject</name>
      <script>
         <![CDATA[com.acme.e5c9.internal.kaleo.runtime.action.executor.E5C9ActionExecutor]]>
      </script>
      <script-language>java</script-language>
      <execution-type>onAssignment</execution-type>
   </action>
   ...
</actions>

一般的なスクリプト操作として、ワークフローの状態の設定があります。 例えば、このスクリプトでは、ワークフローの状態をapprovedに設定しています。

<script>
<![CDATA[
   import com.liferay.portal.kernel.workflow.WorkflowStatusManagerUtil;
   import com.liferay.portal.kernel.workflow.WorkflowConstants;

   WorkflowStatusManagerUtil.updateStatus(WorkflowConstants.getLabelStatus("approved"), workflowContext);
]]>
</script>
<script-language>groovy</script-language>

定義済み変数

すべてのノードタイプに共通する変数もあれば、 task ノードだけが利用できる変数もあります。

すべてのノードタイプに共通する変数

次の変数は、ワークフロースクリプトを実行できる場所であればどこからでも利用できます。

変数説明使用量
kaleoInstanceToken (KaleoInstanceToken)ユーザーが [ワークフローに送信]をクリックするたびに、ワークフロー インスタンスと対応するインスタンス トークン ( KaleoInstanceToken) が作成されます。kaleoInstanceToken.getKaleoInstanceTokenId()を呼び出して、注入されたトークンを使用してそのIDを取得します。 これは多くの場合、スクリプトのメソッドパラメータとして渡されます。
userIduserId が返されるかどうかは、コンテキストに依存します。ロジックは次のように動作します: KaleoTaskInstanceToken.getcompletionUserId()がNULLの場合、KaleoTaskInstanceToken.getUserId()を確認します。 それもnullの場合は、KaleoInstanceToken.getUserId()を呼び出します。 これは、スクリプトの実行時にワークフローに介入する最後のユーザーのIDです。 作成された ノードでは、これは ワークフローに送信をクリックしたユーザーになりますが、これは単一承認者定義の レビュー ノードの終了時のレビュー担当者の ID になります。
ワークフローコンテキスト (マップ<String, Serializable>)ワークフローのコンテキストには、スクリプトで使用できる情報が含まれています。コンテキストは通常、パラメータとして渡されますが、すべての WorkflowContext 属性もスクリプト内で使用できます。 スクリプトのワークフローコンテキストは、コンテキストに依存します。 ExecutionContext.getWorkflowContext()の呼び出しがnullに戻ると、ワークフローコンテキストはKaleoInstanceModel.getWorkflowContext()によって取得されます。

タスクノードに挿入される変数

これらの変数は、タスクノードに注入されます。

変数説明使用法
kaleoTaskInstanceToken (KaleoTaskInstanceToken)タスクのトークン自体は、ワークフロースクリプトで利用できます。これを使用して ID を取得します。これは、他のプログラムによるワークフロー アクティビティで役立ちます。
taskNameString):タスク自体の名前にアクセスできます(KaleoTak.getName()と同じ値を返します)。
ワークフロー タスク担当者 (リスト<ワークフロー タスク担当者>)タスクの担当者をリストアップします。
kaleoTimerInstanceToken (KaleoTimerInstanceToken)タスク タイマー が存在する場合は、 kaleoTimerInstanceToken.getKaleoTimerInstanceTokenId()を呼び出してその ID を取得します。
警告

これらの変数は、ワークフロー タスク ノードのアクション スクリプト (つまり、 <actions><action><script> ブロック内のスクリプト) に表示されます。 スクリプトによる割り当て にはこれらの変数は挿入されません。

スクリプトの例

ワークフローのほぼすべての時点で、Liferayのスクリプトエンジンを使用して、ワークフローAPIまたは他のLiferay APIにアクセスできます。 ワークフロースクリプトを使用できる実用的な方法をいくつか次に示します。

  • 特定の役割を持つユーザーのリストを取得する
  • 指定されたコンテンツ承認者に、コンテンツをレビューできない場合に連絡する人のリストを記載したメールを送信する
  • コンテンツの承認に割り当てられたユーザーのアラートポートレットに表示されるアラートを作成する

以下のワークフロースクリプトはGroovyで記述され、条件ノードと共に使用されます。 このスクリプトは、Liferay の アセット フレームワーク を使用してアセットのカテゴリを決定し、そのカテゴリを使用して正しい承認プロセスを自動的に決定します。 アセットがlegalカテゴリーにある場合は、提出時にLegal Reviewタスクに送られます。 それ以外の場合、アセットはDefault Reviewタスクに送信されます。

<script>
   <![CDATA[
      import com.liferay.portal.kernel.util.GetterUtil;
      import com.liferay.portal.kernel.workflow.WorkflowConstants;
      import com.liferay.portal.kernel.workflow.WorkflowHandler;
      import com.liferay.portal.kernel.workflow.WorkflowHandlerRegistryUtil;
      import com.liferay.asset.kernel.model.AssetCategory;
      import com.liferay.asset.kernel.model.AssetEntry;
      import com.liferay.asset.kernel.model.AssetRenderer;
      import com.liferay.asset.kernel.model.AssetRendererFactory;
      import com.liferay.asset.kernel.service.AssetEntryLocalServiceUtil;

      import java.util.List;

      String className = (String)workflowContext.get(
         WorkflowConstants.CONTEXT_ENTRY_CLASS_NAME);

      WorkflowHandler workflowHandler =
         WorkflowHandlerRegistryUtil.getWorkflowHandler(className);

      AssetRendererFactory assetRendererFactory =
         workflowHandler.getAssetRendererFactory();

      long classPK =
         GetterUtil.getLong((String)workflowContext.get
         (WorkflowConstants.CONTEXT_ENTRY_CLASS_PK));

      AssetRenderer assetRenderer =
         workflowHandler.getAssetRenderer(classPK);

      AssetEntry assetEntry = assetRendererFactory.getAssetEntry(
         assetRendererFactory.getClassName(), assetRenderer.getClassPK());

      List<AssetCategory> assetCategories = assetEntry.getCategories();

      returnValue = "Default Review";

      for (AssetCategory assetCategory : assetCategories) {
         String categoryName = assetCategory.getName();

         if (categoryName.equals("legal")) {
               returnValue = "Legal Review";

               return;
         }
      }
      ]]>
</script>
<script-language>groovy</script-language>

条件ノード スクリプトの returnValue 変数は、次のタスクまたは状態を決定するための有効な遷移名である必要があります。

Liferay Portalの場合、有効な移行名はXMLファイルまたはワークフローのソースビューに入力された移行の<name>要素の値です。 Liferay DXP の場合、プロセスビルダーで定義のソースを表示するときは、代わりにトランジションの <id> 要素で指定されているトランジション ID の値を使用する必要があります。

ダウンロード可能なワークフロー スクリプトの例へのリンクについては、「 ワークフロー定義の作成 」を参照してください。

OSGiサービスの呼び出し

サービス トラッカー は、利用可能な OSGi サービスを取得します。 Service Trackerがサービスに対してnullを返した場合、そのサービスは利用できず、応答時に適切な処理を行うことができます。

以下は、JournalArticleLocalServiceを使用して記事数を取得するGroovyで記述されたワークフロースクリプトです。

import com.liferay.journal.model.JournalArticle;
import com.liferay.journal.service.JournalArticleLocalService;
import com.liferay.portal.scripting.groovy.internal.GroovyExecutor;

import org.osgi.framework.Bundle;
import org.osgi.framework.FrameworkUtil;
import org.osgi.util.tracker.ServiceTracker;

ServiceTracker<JournalArticleLocalService, JournalArticleLocalService> st;

try {
   Bundle bundle = FrameworkUtil.getBundle(GroovyExecutor.class);

   st = new ServiceTracker(bundle.getBundleContext(), JournalArticleLocalService.class, null);
   st.open();

   JournalArticleLocalService jaService = st.waitForService(500);

   if (jaService == null) {
      _log.warn("The required service 'JournalArticleLocalService' is not available.");
   }
   else {
      java.util.List<JournalArticle>articles = jaService.getArticles();
      if (articles != null) {
         _log.info("Article count: " + articles.size());
      } else {
         _log.info("no articles");
      }
   }
}
catch(Exception e) {
   //Handle error appropriately
}
finally {
   if (st != null) {
      st.close();
   }
}

このスクリプトは、スクリプトを実行するクラスのOSGiバンドルを使用してサービスを追跡します。 com.liferay.portal.scripting.groovy.internal.GroovyExecutorインスタンスがスクリプトを実行するため、インスタンスのバンドルを使用してサービスを追跡します。

Bundle bundle = FrameworkUtil.getBundle(GroovyExecutor.class);

LiferayのKaleoワークフローエンジンとLiferayのスクリプトエンジンの組み合わせは強力です。 権限を設定するときは、ワークフロー定義内のスクリプトが不適切だったり悪意を持って記述された場合の潜在的な影響に注意してください。