Documentation

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

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>

定義済み変数

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

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

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

説明

使用量

kaleoInstanceToken ( KaleoInstanceToken )

ユーザーが 公開申請 をクリックするたびに、ワークフローインスタンスとそれに対応するインスタンストークン(KaleoInstanceToken)が作成されます。

kaleoInstanceToken.getKaleoInstanceTokenId()を呼び出して、注入されたトークンを使用してそのIDを取得します。 これは多くの場合、スクリプトのメソッドパラメータとして渡されます。

userId

userId が返されるかどうかは、コンテキストに依存します。

技術的には以下のようなロジックになります。 KaleoTaskInstanceToken.getcompletionUserId() がnullの場合、 KaleoTaskInstanceToken.getUserId()をチェックします。 それもnullの場合は、KaleoInstanceToken.getUserId()を呼び出します。 これは、スクリプトの実行時にワークフローに介入する最後のユーザーのIDです。 createdノードでは、これは 公開申請 をクリックしたユーザーですが、単一の承認者定義のreviewノードの終了時はレビューアのIDになります。

workflowContext (Map<String, Serializable>)

ワークフローのコンテキストには、スクリプトで使用できる情報が含まれています。

通常、コンテキストはパラメーターとして渡されますが、WorkflowContextのすべての属性はスクリプトでも使用できます。 スクリプトのワークフローコンテキストは、コンテキストに依存します。 ExecutionContext.getWorkflowContext()の呼び出しがnullに戻ると、ワークフローコンテキストはKaleoInstanceModel.getWorkflowContext()によって取得されます。

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

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

説明

使用法

kaleoTaskInstanceToken ( KaleoTaskInstanceToken )

タスクのトークン自体は、ワークフロースクリプトで利用できます。

これを使用してIDを取得し、プログラムによる割り当てなど、他の有用なプログラムワークフロー活動で使用します。

taskNameString):タスク自体の名前にアクセスできます(KaleoTak.getName()と同じ値を返します)。

workflowTaskAssignees (List< WorkflowTaskAssignee >)

タスクの担当者をリストアップします。

kaleoTimerInstanceToken ( KaleoTimerInstanceToken )

タスクタイマーが存在する場合は、kaleoTimerInstanceToken.getKaleoTimerInstanceTokenId()を呼び出して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>

注釈

スクリプトの returnValue 変数は、次のタスクや状態を決定する。

ダウンロード可能なワークフローのスクリプト例へのリンクは、 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のスクリプトエンジンの組み合わせは強力です。 権限を設定するときは、ワークフロー定義内のスクリプトが不適切だったり悪意を持って記述された場合の潜在的な影響に注意してください。