ワークフローでのスクリプトエンジンの使用¶
Liferayのワークフローエンジンは、XMLワークフロー定義に埋め込まれたGroovyスクリプトを使って、ワークフロー実行時にスクリプトを実行することができます。
ワークフロースクリプトのトピックは次のとおりです。
ワークフローノードへのスクリプトの追加¶
ワークフロースクリプトは、次のワークフローノードタイプのアクションから呼び出すことができます。
<fork>
<join>
<state>
<task>
スクリプトを呼び出すアクションの形式は次のとおりです。
<actions>
<action>
<script>
<![CDATA[script code goes here]]>
</script>
<script-language>groovy</script-language>
</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>
定義済み変数¶
すべてのノードタイプに共通する変数もあれば、 タスク
ノードだけが利用できる変数もあります。
すべてのノードタイプに共通する変数¶
次の変数は、ワークフロースクリプトを実行できる場所であればどこからでも利用できます。
値 |
説明 |
使用量 |
---|---|---|
|
ユーザーが 公開申請 をクリックするたびに、ワークフローインスタンスとそれに対応するインスタンストークン( |
|
|
|
技術的には以下のようなロジックになります。 |
|
ワークフローのコンテキストには、スクリプトで使用できる情報が含まれています。 |
通常、コンテキストはパラメーターとして渡されますが、 |
タスクノードに挿入される変数¶
これらの変数は、タスクノードに注入されます。
値 |
説明 |
使用法 |
---|---|---|
|
タスクのトークン自体は、ワークフロースクリプトで利用できます。 |
これを使用してIDを取得し、プログラムによる割り当てなど、他の有用なプログラムワークフロー活動で使用します。 |
|
||
|
タスクの担当者をリストアップします。 |
|
|
タスクタイマーが存在する場合は、 |
スクリプトの例¶
ワークフローのほぼすべての時点で、Liferayのスクリプトエンジンを使用して、ワークフローAPIまたは他のLiferay APIにアクセスできます。 ワークフロースクリプトを使用できる実用的な方法をいくつか次に示します。
特定の役割を持つユーザーのリストを取得する
指定されたコンテンツ承認者に、コンテンツをレビューできない場合に連絡する人のリストを記載したメールを送信する
コンテンツを承認する権限を持つユーザーに対して、アラートポートレットに表示するアラートの作成
以下のワークフロースクリプトはGroovyを使って書かれており、 Condition
Nodeと共に使用されます。 スクリプトはLiferayのアセットフレームワークを使用してアセットのカテゴリを決定し、カテゴリを使用して正しい承認プロセスを自動的に決定します。 アセットが 法的な
カテゴリーにある場合は、提出時に 法的審査
タスクに送られます。 それ以外の場合、アセットは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>
注釈
ConditionノードスクリプトのreturnValue
変数には、次のタスクやステートを決定するための有効なトランジション名を指定する必要があります。
Liferay Portal の場合、有効な遷移名は XML ファイルまたはプロセスビルダーのソースビューに入力された遷移の <name>
要素の値です。 Liferay DXP では、プロセスビルダーで定義のソースを表示するとき、代わりにトランジションの <id>
要素で指定されたトランジション ID の値を使用する必要があります。
ダウンロード可能なワークフローのスクリプト例へのリンクは、 Crafting Workflow Definitions を参照してください。
OSGiサービスの呼び出し¶
Service Trackerは、使用可能な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のスクリプトエンジンの組み合わせは強力です。 権限を設定するときは、ワークフロー定義内のスクリプトが不適切だったり悪意を持って記述された場合の潜在的な影響に注意してください。