ヘッダーをスキップ
Oracle® Fusion Middleware Oracle SOA Suite開発者ガイド
11g リリース1 (11.1.1.6.2)
B56238-06
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

33 カスタム・ワークリスト・クライアントの作成

この章では、サンプルのワークリスト・アプリケーションをはじめとして、開発者がワークフロー・サービスにより公開されたAPIを使用してワークフロー・サービスのクライアントを作成する方法について説明します。このAPIにより、クライアントは、リモートのEJB、SOAPおよびHTTPを使用してワークフロー・サービスと通信できるようになります。

この章には次の項が含まれます:

33.1 ワークフロー・サービスのクライアント作成に関する概要

次に、簡単なワークリスト・アプリケーションを作成する際の典型的なコール順序を示します。

簡単なワークリスト・アプリケーションを作成する手順は、次のとおりです。

  1. IWorklistServiceClientへのハンドルをWorkflowServiceClientFactoryから取得します。

  2. ITaskQueryServiceへのハンドルをIWorklistServiceClientから取得します。

  3. ユーザー名とパスワードをITaskQueryServiceの認証メソッドに渡して、ユーザーを認証します。IWorkflowContextへのハンドルを取得します。

  4. ITaskQueryServiceを使用してタスク・リストを問い合せます。

  5. ITaskServiceへのハンドルをIWorklistServiceClientから取得します。

  6. 返されたタスク・リストを反復し、ITaskServiceを使用してタスクに対するアクションを実行します。

例33-1は、ワークフロー・サービスのクライアントの作成方法を示しています。jsteinに割り当てられている全タスクのリストに対して問合せが実行されます。結果が設定されていないタスクが承認されます。

例33-1 ワークフロー・サービスのクライアントの作成: 結果を承認済に設定

try
{
 //Create JAVA WorflowServiceClient
 IWorkflowServiceClient  wfSvcClient = WorkflowServiceClientFactory.getWorkflowServiceClient(
  WorkflowServiceClientFactory.REMOTE_CLIENT);
 //Get the task query service
 ITaskQueryService querySvc = wfSvcClient.getTaskQueryService();

 //Login as jstein
 IWorkflowContext ctx = querySvc.authenticate("jstein","welcome1".toCharArry(),null);
 //Set up list of columns to query
 List queryColumns = new ArrayList();
 queryColumns.add("TASKID");
 queryColumns.add("TASKNUMBER");
 queryColumns.add("TITLE");
 queryColumns.add("OUTCOME");
 
 //Query a list of tasks assigned to jstein
 List tasks = querySvc.queryTasks(ctx,
              queryColumns,                   
              null, //Do not query additional info
              ITaskQueryService.AssignmentFilter.MY,
              null, //No keywords
              null, //No custom predicate
              null, //No special ordering
              0,    //Do not page the query result
              0);
 //Get the task service
 ITaskService taskSvc = wfSvcClient.getTaskService();
 //Loop over the tasks, outputting task information, and approving any
 //tasks whose outcome has not been set...
 for(int i = 0 ; i < tasks.size() ; i ++)
 {
  Task task = (Task)tasks.get(i);
  int taskNumber = task.getSystemAttributes().getTaskNumber();
  String title = task.getTitle();
  String taskId = task.getSystemAttributes().getTaskId();
  String outcome = task.getSystemAttributes().getOutcome();
  if(outcome == null)
  {
   outcome = "APPROVE";
   taskSvc.updateTaskOutcome(ctx,taskId,outcome);
  }
  System.out.println("Task #"+taskNumber+" ("+title+") is "+outcome);
 }

}
catch (Exception e)
{
 //Handle any exceptions raised here...
 System.out.println("Caught workflow exception: "+e.getMessage());
}

33.2 クライアント作成に使用するパッケージとクラス

クライアントの作成には、次のパッケージとクラスを使用します。

33.3 ワークフロー・サービス・クライアント

ワークリスト・アプリケーションは、ワークフロー・サービス・クライアントを介して様々なワークフロー・サービスにアクセスします。ワークフロー・サービス・クライアントのコードは、様々なローカル・プロトコルとリモート・プロトコルを使用したワークフロー・サービスとの通信に必要なロジックをすべてカプセル化します。ワークリスト・アプリケーションにワークフロー・サービス・クライアントのインスタンスがある場合は、クライアントとワークフロー・サービスとの通信方法を考慮する必要はありません。

クライアントを使用するメリットは、次のとおりです。

IWorkflowServiceClientインタフェースのインスタンス作成には、次のクラスが使用されます。

oracle.bpel.services.workflow.client.WorkflowServiceClientFactory

WorkflowServiceClientFactoryには、ワークフロー・クライアントを作成する複数のメソッドがあります。getWorkflowServiceClientは最も単純なメソッドで、パラメータとしてクライアント・タイプのみをとります。クライアント・タイプは次のいずれかです。

他のファクトリ・メソッドを使用すると、接続プロパティを直接指定し(ファクトリで接続プロパティをwf_client_config.xml fileからロードする必要はありません)、クライアント・アクティビティを記録するロガーを指定できます。

このリリースには、ワークフロー・サービス・クライアントの次の拡張機能が含まれています。

すべてのワークフロー・サービスのクライアント・ライブラリは、ファクトリを介して取得できます。各サービスに使用可能なクライアントについては、表34-1「Enterprise JavaBeans、SOAPおよびJavaサポート」を参照してください。

BPMIdentityServiceおよびBPMIdentityConfigServiceのインスタンスは、WorkflowServiceClientFactorygetSOAPIdentityServiceClientメソッドおよびgetSOAPIdentityConfigServiceClientメソッドをコールして取得できます。その他のすべてのサービスは、IWorkflowServiceClientのインスタンスを介して取得できます。

クライアント・クラスは、サービスのエンドポイントにwf_client_config.xml構成ファイルを使用します。クライアントのクラスパスでは、このファイルはクラスパス直下にあります。つまり、このファイルが格納されているディレクトリはクラスパス内にあります。wf_client_config.xmlファイルには、次の内容が含まれています。

例33-5 リモート・クライアント用のセクション

<remoteClient>
      <serverURL>t3://hostname.domain_name:7001</serverURL>
  <userName>weblogic</userName>
  <password>weblogic</password>
  <initialContextFactory>weblogic.jndi.WLInitialContextFactory
     </initialContextFactory>
  <participateInClientTransaction>false</participateInClientTransaction>
</remoteClient>

例33-6 SOAPエンドポイント用のセクション

<soapClient>
   <rootEndPointURL>http://hostname.domain_name:7001</rootEndPointURL>
   <identityPropagation mode="dynamic" type="saml">
   <policy-references>
      <policy-reference enabled="true" category="security" 
         uri="oracle/wss10_saml_token_client_policy"/>
      </policy-references>
   </identityPropagation>
</soapClient>

ワークフロー・クライアント構成のXMLスキーマ定義は、wf_client_config.xsdファイルに格納されています。

33.3.1 IWorkflowServiceClientインタフェース

IWorkflowServiceClientインタフェースは、各種ワークフロー・サービス・インタフェースへのハンドルを取得できるように、表33-1に示すメソッドを提供します。

表33-1 IWorkflowServiceClientのメソッド

メソッド インタフェース
getTaskService
oracle.bpel.services.workflow.task.ITaskService
getTaskQueryService
oracle.bpel.services.workflow.query.ITaskQueryService
getTaskReportService
oracle.bpel.services.workflow.report.ITaskReportService
getTaskMetadataService
oracle.bpel.services.workflow.metadata.ITaskMetadataService
getUserMetadataService
oracle.bpel.services.workflow.user.IUserMetadataService
getRuntimeConfigService
oracle.bpel.services.workflow.runtimeconfig.IRuntimeConfigService
getTaskEvidenceService
oracle.bpel.services.workflow.metadata.ITaskMetadataService

33.4 SOAPを使用するクライアント用のクラスパス

SOAPクライアントのクラスパスには、次のJARファイルが必要です。

wlfullclient.jarファイルは、例33-7に示すコマンドを使用して生成できます。

例33-7 wlfullclient.jarファイルの生成

cd ${bea.home}/wlserver_10.3/server/lib
java -jar ../../../modules/com.bea.core.jarbuilder_1.3.0.0.jar

注意:

クライアント・アプリケーションは、クラスパス内のsystem\services\configまたはsystem\services\schemaディレクトリを使用しません。


33.5 リモートEJBを使用するクライアント用のクラスパス

リモートEJBを使用するクライアントのクラスパスには、次のJARファイルが必要です。


注意:

クライアント・アプリケーションは、クラスパス内のsystem\services\configまたはsystem\services\schemaディレクトリを使用しません。


33.6 タスクの開始

タスクはプログラムによって開始できます。その場合は、次のタスク属性を設定する必要があります。

次のタスク属性はオプションですが、通常はクライアントによって設定されます。

33.6.1 タスクの作成

タスクのオブジェクト・モデルは、次のパッケージで使用できます。

oracle.bpel.services.workflow.task.model

このモデル内でオブジェクトを作成するには、ObjectFactoryクラスを使用します。

33.6.2 タスクのペイロード要素の作成

タスク・ペイロードには、複数のペイロード・メッセージ属性を含めることができます。ペイロードはタスクが定義されるまで詳細に定義されないため、タスクのJavaオブジェクト・モデルには、クライアント・ペイロード用の強い型指定のオブジェクトが含まれません。タスク・ペイロードはAnyType Javaオブジェクトで表されます。AnyType Javaオブジェクトは、ネームスペース内のpayloadをルートとして持つXML要素を使用して作成されます。

http://xmlns.oracle.com/bpel/workflow/task

ペイロードのXML要素には、他のすべてのXML要素が含まれます。各XML要素では、メッセージ属性を定義します。

例33-8は、タスク・ペイロードの設定方法を示しています。

例33-8 タスク・ペイロードの設定

import oracle.bpel.services.workflow.task.model.AnyType;
import oracle.bpel.services.workflow.task.model.ObjectFactory;
import oracle.bpel.services.workflow.task.model.Task;
..........

Document document = //createXMLDocument
Element payloadElem = document.createElementNS("http://xmlns.oracle.com/bpel/workflow/
  task", "payload");
Element orderElem = document.createElementNS("http://xmlns.oracle.com/pcbpel/test/order", "order");
Element child = document.createElementNS("http://xmlns.oracle.com/pcbpel/test/order", "id");
  child.appendChild(document.createTextNode("1234567"));
  orderElem.appendChild(child); 
  payloadElem.appendChild(orderElem);
  document.appendChild(payloadElem);

  task.setPayloadAsElement(payloadElem);

注意:

AnyType.getContent()要素は、変更不可のXML要素リストを返します。このリストには他のメッセージ属性を追加できません。


33.6.3 プログラムによるタスクの開始

例33-9は、休暇申請タスクをプログラムによって開始する方法を示しています。

例33-9 プログラムによる休暇申請タスクの開始

  // create task object
  ObjectFactory objectFactory = new ObjectFactory();
  Task task = objectFactory.createTask();

  // set title
  task.setTitle("Vacation request for jcooper"); 

  // set creator
  task.setCreator("jcooper");
 
// set taskDefinitionId. taskDefinitionId is the target
// namespace of the task 
// If namespace is used, the active version of the composite corresponding 
// to that of the namespace will be used.
task.setTaskDefinitionId("http://xmlns.oracle.com/VacationRequest/
Project1/Humantask1");  (Your task definition ID will be different.)

  // create and set payload 
  Document document = XMLUtil.createDocument();
  Element payloadElem = document.createElementNS(TASK_NS, "payload"); 
  Element vacationRequestElem = document.createElementNS(VACATION_REQUEST_NS,
    "VacationRequestProcessRequest");
 
  Element creatorChild = document.createElementNS(VACATION_REQUEST_NS, "creator");
  creatorChild.appendChild(document.createTextNode("jcooper")); 
  vacationRequestElem.appendChild(creatorChild);
  
  Element fromDateChild = document.createElementNS(VACATION_REQUEST_NS, "fromDate");
  fromDateChild.appendChild(document.createTextNode("2006-08-05T12:00:00")); 
  vacationRequestElem.appendChild(fromDateChild);
  
  Element toDateChild = document.createElementNS(VACATION_REQUEST_NS, "toDate");
  toDateChild.appendChild(document.createTextNode("2006-08-08T12:00:00"));
  vacationRequestElem.appendChild(toDateChild);
  
  Element reasonChild = document.createElementNS(VACATION_REQUEST_NS, "reason");
  reasonChild.appendChild(document.createTextNode("Hunting")); 
  vacationRequestElem.appendChild(reasonChild);
  
  payloadElem.appendChild(vacationRequestElem);
  document.appendChild(payloadElem);
  
  task.setPayloadAsElement(payloadElem);
 
  IWorkflowServiceClient workflowServiceClient =
    WorkflowServiceClientFactory.getWorkflowServiceClient
    (WorkflowServiceClientFactory.SOAP_CLIENT);
  ITaskService taskService = workflowServiceClient.getTaskService(); 
  IInitiateTaskResponse iInitiateTaskResponse = taskService.initiateTask(task); 
  Task retTask = iInitiateTaskResponse.getTask(); 
  System.out.println("Initiated: " + retTask.getSystemAttributes().getTaskNumber() + " - " +
    retTask.getSystemAttributes().getTaskId());
  return retTask;

33.7 ワークフロー標準ビュー定義の変更

ワークリスト・アプリケーションおよびUserMetadataService APIは、標準ビューの作成、更新および削除に使用できるメソッドを提供します。詳細は、第34.1.7項「ユーザー・メタデータ・サービス」を参照してください。

33.8 HelpDeskUIサンプルを使用したワークリスト・アプリケーションの記述

この項の例では、HelpDeskRequestデモの一部であるヘルプ・デスク・インタフェースの変更方法を示します。

ワークリスト・アプリケーションを記述する手順は、次のとおりです。

  1. ワークフロー・コンテキストは、ユーザーを認証することで作成します。

    // get workflow service client
      IWorkflowServiceClient wfSvcClient =
        WorkflowServiceClientFactory.getWorkflowServiceClient
        (WorkflowServiceClientFactory.REMOTE_CLIENT);
     
    //get the workflow context
    IWorkflowContext wfCtx =
    wfSvcClient.getTaskQueryService().authenticate(userId, pwd, null);
    

    これは、第33.1項「ワークフロー・サービスのクライアント作成に関する概要」のステップ3です。

    HelpDeskRequestのlogin.jspファイルでは、前述のAPIを使用してユーザーが認証され、ワークフロー・コンテキストが作成されます。ユーザーが認証されると、statusPage.jspファイルによって、ログイン・ユーザーに割当て済のタスクが表示されます。例33-10は、login.jspファイルからのサンプル・コードを示しています。

    例33-10 Login.jsp

    <%@ page import="javax.servlet.http.HttpSession"
             import="oracle.bpel.services.workflow.client.IWorkflowServiceClient"
             import="oracle.bpel.services.workflow.client.WorkflowServiceClientFactory"
             import="java.util.Set"
             import="java.util.Iterator"
             import="oracle.bpel.services.workflow.verification.IWorkflowContext"
             import="oracle.tip.pc.services.identity.config.ISConfiguration"%>
    <%@ page contentType="text/html;charset=windows-1252"%>
     
    <html>
    <head>
    <title>Help desk request login page</title>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    </head>
     
    <body bgcolor="#F0F0F0" text="#000000" style="font: 12px verdana; line-height:18px">
    <center>
    <div style="width:640px;padding:15px;border-width: 10px; border-color: #87b4d9; border-style:
     solid;
    background-color:white; text-align:left">
     
        <!-- Page Header, Application banner, logo + user status -->
        <jsp:include page="banner.jsp"/>
       
        <!-- Initiate Meta Information -->
     
        <div style="background-color:#F0F0F0; border-top:10px solid white;border-bottom:
          10px solid white;padding:10px;text-align:center" >
        <b>Welcome to the HelpDesk application</b>
        </div>
     
        <% 
         String redirectPrefix =  "/HelpDeskUI/";
          // Ask the browser not to cache the page
          response.setHeader("Pragma", "no-cache");
          response.setHeader("Cache-Control", "no-cache");
     
          HttpSession httpSession = request.getSession(false);
          if (httpSession != null) {
           
            IWorkflowContext ctx = (IWorkflowContext) httpSession.getAttribute("workflowContext");
            if (ctx != null) {
              response.sendRedirect(redirectPrefix + "statusPage.jsp");
            }
            else
            {
              String authFailedStr = request.getParameter("authFailed"); 
              boolean authFailed = false;
              if ("true".equals(authFailedStr))
              {
                authFailed = true;
              }
              else
              {
                authFailed = false;
              }
     
              if (!authFailed)
              {
                //Get page parameters:
                String userId="";
                if(request.getParameter("userId") != null)
                {
                  userId = request.getParameter("userId");
                }
                String pwd="";
                if(request.getParameter("pwd") != null)
                {
                  pwd = request.getParameter("pwd");
                }
     
                if(userId != null && (!("".equals(userId.trim())))
                   && pwd != null && (!("".equals(pwd.trim()))))   
                {
                  try {
                    HttpSession userSession = request.getSession(true);
     
                    IWorkflowServiceClient wfSvcClient =
                            WorkflowServiceClientFactory.getWorkflowServiceClient
                                    (WorkflowServiceClientFactory.REMOTE_CLIENT);
                    IWorkflowContext wfCtx =
                                wfSvcClient.getTaskQueryService().authenticate(userId, pwd, null);
                    httpSession.setAttribute("workflowContext", wfCtx);
                    response.sendRedirect(redirectPrefix + "statusPage.jsp");
                  }
                  catch (Exception e)
                  {
                    String worklistServiceError = e.getMessage();
                    response.sendRedirect(redirectPrefix + "login.jsp?authFailed=true");
                    out.println("error is " + worklistServiceError);
                  }          
                }
              } else
              {
                out.println("Authentication failed");
              }
            }
          }
        %>
     
        <form action='<%= request.getRequestURI() %>' method="post">
          <div style="width:100%">
          <table cellspacing="2" cellpadding="3" border="0" width="30%" align="center">
            <tr>
              <td>Username
              </td>
              <td>
                <input type="text" name="userId"/>
              </td>
            </tr>
            <tr>
              <td>Password
              </td>
              <td>
                <input type="password" name="pwd"/>
              </td>
            </tr>
            <tr>
              <td>
                <input type="submit" value="Submit"/>
              </td>
            </tr>
          </table>
        </form>
        </div>
    </div>
    </center>
      </body>
    </html>
    
  2. TaskQueryServiceからのqueryTask APIを使用してタスクを問い合せます。

    //add list of attributes to be queried from the task
    List displayColumns = new ArrayList();
         displayColumns.add("TASKNUMBER");
         displayColumns.add("TITLE");
         displayColumns.add("PRIORITY");
         displayColumns.add("STATE");
         displayColumns.add("UPDATEDDATE");
         displayColumns.add("UPDATEDBY");
         displayColumns.add("CREATOR");
         displayColumns.add("OUTCOME");
         displayColumns.add("CREATEDDATE");
         displayColumns.add("ASSIGNEEUSERS");
         displayColumns.add("ASSIGNEEGROUPS");
         // get the list of tasks
         List tasks =  wfSvcClient.getTaskQueryService().queryTasks
                            (wfCtx,
                            displayColumns,
                            null,
                            ITaskQueryService.AssignmentFilter.MY_AND_GROUP,
                            null,
                            null,
                            null,
                            0,
                            0);
        // create listing page by using above tasks
        //add href links to title to display details of the task by passing taskId
          as input parameter
       Use getTaskDetailsById(IWorkflowContext wftx, String taskId);
    

    これは、第33.1項「ワークフロー・サービスのクライアント作成に関する概要」のステップ4です。

    HelpDeskRequestのstatusPage.jspファイルを使用して、ヘルプ・デスク・リクエストのステータスが表示されます。例33-11は、statusPage.jspのコード例を示しています。

    例33-11 statusPage.jsp

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
    <%@ page import="oracle.tip.pc.services.identity.BPMAuthorizationService,
                     oracle.bpel.services.workflow.verification.IWorkflowContext,
                     oracle.tip.pc.services.common.ServiceFactory,
                     oracle.bpel.services.workflow.client.IWorkflowServiceClient,
                     oracle.bpel.services.workflow.client.WorkflowServiceClientFactory,
                     oracle.bpel.services.workflow.query.ITaskQueryService,
                     oracle.bpel.services.workflow.task.model.Task,
                     oracle.bpel.services.workflow.task.model.IdentityType,
                     oracle.tip.pc.services.identity.BPMUser,
                     java.util.List,
                     java.util.Calendar,
                     java.text.SimpleDateFormat,
                     java.util.ArrayList"%>
    <%@ page contentType="text/html;charset=UTF-8"%>
    <html>
      <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
        <title>RequestPage</title>
        <style TYPE="text/css">
          Body, Form, Table, Textarea, Select, Input, Option
          {  
            font-family : tahoma, verdana, arial, helvetica, sans-serif;
            font-size : 9pt;
          }
          table.banner
          {
            background-color: #eaeff5;
          }
          tr.userInfo
          {
            background-color: #eaeff5;
          }
          tr.problemInfo
          {
            background-color: #87b4d9;
          }
        </style>
      </head>
      <body bgcolor="White">
      <%
         HttpSession httpSession = request.getSession(false);
         httpSession.setAttribute("pageType","STATUSPAGE");
      %>
      <table bordercolor="#eaeff5" border="4" width="100%">
        <tr><td> <jsp:include page="banner.jsp"/> </td></tr>
      </table>
      <%
          BPMUser bpmUser = null;
          String redirectPrefix =  request.getContextPath() + "/";
          IWorkflowContext ctx = null;
          if (httpSession != null) {
            
            ctx = (IWorkflowContext) httpSession.getAttribute("workflowContext");
            if (ctx != null) {
                bpmUser = getAuthorizationService(ctx.getIdentityContext()).
                                 lookupUser(ctx.getUser());
            }
            else
            {
               response.sendRedirect(redirectPrefix + "login.jsp");
               return;
            }
          }
          else
          {
             response.sendRedirect(redirectPrefix + "login.jsp");
             return;
          }
          if(bpmUser == null)
          {
            response.sendRedirect(redirectPrefix + "login.jsp");
             return;
          }
          String status = (String)httpSession.getAttribute("requeststatus");
          if(status != null && !status.equals(""))
          {
        %>
           <p></p>
           <div style="text-align:left;color:red" >
             <%= status %>
           </div>
        <%    
          }
          httpSession.setAttribute("requeststatus",null);
          IWorkflowServiceClient  wfSvcClient =
                            WorkflowServiceClientFactory.getWorkflowServiceClient(
                                     WorkflowServiceClientFactory.REMOTE_CLIENT);
          List displayColumns = new ArrayList();
          displayColumns.add("TASKNUMBER");
          displayColumns.add("TITLE");
          displayColumns.add("PRIORITY");
          displayColumns.add("STATE");
          displayColumns.add("UPDATEDDATE");
          displayColumns.add("UPDATEDBY");
          displayColumns.add("CREATOR");
          displayColumns.add("OUTCOME");
          displayColumns.add("CREATEDDATE");
          displayColumns.add("ASSIGNEEUSERS");
          displayColumns.add("ASSIGNEEGROUPS");
          List tasks =  wfSvcClient.getTaskQueryService().queryTasks
                            (ctx,
                            displayColumns,
                            null,
                            ITaskQueryService.ASSIGNMENT_FILTER_CREATOR,
                            null,
                            null,
                            null,
                            0,
                            0);
      %>
      <p></p>
      <div style="text-align:left;color:green" >
       <b>
        Previous help desk request
       </b>
      </div>
      <p></p>
      <div style="text-align:center" >
      <table cellspacing="2" cellpadding="2" border="3" width="100%">
         <TR class="problemInfo">
             <TH>TaskNumber</TH>
             <TH>Title</TH>
             <TH>Priority</TH>
             <TH>CreatedDate</TH>
             <TH>Assignee(s)</TH>
             <TH>UpdatedDate</TH>
             <TH>UpdatedBy</TH>
             <TH>State</TH>
             <TH>Status</TH>
         </TR>
         <%
           SimpleDateFormat dflong = new SimpleDateFormat( "MM/dd/yy hh:mm a" );
           for(int i = 0 ; i < tasks.size() ; i ++)
           {
              Task task = (Task)tasks.get(i);
              int taskNumber = task.getSystemAttributes().getTaskNumber();
              String title = task.getTitle();
              int priority = task.getPriority();
              String assignee = getAssigneeString(task);
              Calendar createdDate = task.getSystemAttributes().getCreatedDate();              
              Calendar updateDate =  task.getSystemAttributes().getUpdatedDate();
              String updatedBy = task.getSystemAttributes().getUpdatedBy().getId();
              String state = task.getSystemAttributes().getState();
              String outcome = task.getSystemAttributes().getOutcome();
              if(outcome == null) outcome = "";
              String titleLink = "http://" + request.getServerName() +
                                 ":" + request.getServerPort() +
                                  "/integration/worklistapp/TaskDetails?taskId=" +  
                                  task.getSystemAttributes().getTaskId();
          %>
            <tr class="userInfo">
               <td><%=taskNumber%></td>
               <td><a href="<%=titleLink%>" target="_blank"><%=title%></a></td>
               <td><%=priority%></td>
               <td><%=dflong.format(createdDate.getTime())%></td>
               <td><%=assignee%></td>
               <td><%=dflong.format(updateDate.getTime())%></td>
               <td><%=updatedBy%></td>
               <td><%=state%></td>
               <td><%=outcome%></td>
            <tr>
         <%
           }
         %>
      </table>
      </div>
      <%!
          private BPMAuthorizationService getAuthorizationService(String identityContext)
          {
           BPMAuthorizationService authorizationService =
     ServiceFactory.getAuthorizationServiceInstance();
           if (identityContext != null)
             authorizationService = ServiceFactory.getAuthorizationServiceInstance(identityContext);
     
           return authorizationService;
          }
          private String getAssigneeString(Task task) throws Exception
          {
             List assignees = task.getSystemAttributes().getAssigneeUsers();
             StringBuffer buffer = null;
             for(int i = 0 ; i < assignees.size() ; i++)
             {
               IdentityType type = (IdentityType)assignees.get(i);
               String name = type.getId();
               if(buffer == null)
               {
                  buffer = new StringBuffer();
               }
               else
               {
                 buffer.append(",");
               }
               buffer.append(name).append("(U)");
             }
             assignees = task.getSystemAttributes().getAssigneeGroups();
             for(int i = 0 ; i < assignees.size() ; i++)
             {
               IdentityType type = (IdentityType)assignees.get(i);
               String name = type.getId();
               if(buffer == null)
               {
                  buffer = new StringBuffer();
               }
               else
               {
                 buffer.append(",");
               }
               buffer.append(name).append("(G)");
             }
             if(buffer == null)
             {
                return "";
             }
             else
             {
               return buffer.toString();
             }
          }
      %>
     </body>
    </html>