サンプルのワークリスト・アプリケーションを開始すると、ワークフロー・サービスで公開されたAPIを使用して、ワークフロー・サービスのクライアントを作成できます。このAPIにより、クライアントは、リモートのEJB、SOAPおよびHTTPを使用してワークフロー・サービスと通信できるようになります。
項目は次のとおりです。
次に、簡単なワークリスト・アプリケーションを作成する際の典型的なコール順序を示します。
簡単なワークリスト・アプリケーションを作成する手順は、次のとおりです。
IWorklistServiceClient
へのハンドルをWorkflowServiceClientFactory
から取得します。
ITaskQueryService
へのハンドルをIWorklistServiceClient
から取得します。
ユーザー名とパスワードをITaskQueryService
の認証メソッドに渡して、ユーザーを認証します。IWorkflowContext
へのハンドルを取得します。
ITaskQueryService
を使用してタスク・リストを問い合せます。
ITaskService
へのハンドルをIWorklistServiceClient
から取得します。
返されたタスク・リストを反復し、ITaskService
を使用してタスクに対するアクションを実行します。
例30-1は、ワークフロー・サービスのクライアントの作成方法を示しています。jsteinに割り当てられている全タスクのリストに対して問合せが実行されます。結果が設定されていないタスクが承認されます。
例30-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()); }
クライアントの作成には、次のパッケージとクラスを使用します。
oracle.bpel.services.workflow.metadata.config.model
このパッケージ内の各クラスには、タスク定義ファイル内のワークフロー構成用のオブジェクト・モデルが含まれています。オブジェクトの作成には、ObjectFactory
クラスを使用できます。
oracle.bpel.services.workflow.metadata.routingslip.model
このパッケージ内の各クラスには、ルーティング・スリップ用のオブジェクト・モデルが含まれています。オブジェクトの作成には、ObjectFactory
クラスを使用できます。
oracle.bpel.services.workflow.metadata.taskdisplay.model
このパッケージ内の各クラスには、タスク表示用のオブジェクト・モデルが含まれています。オブジェクトの作成には、ObjectFactory
クラスを使用できます。
oracle.bpel.services.workflow.metadata.taskdefinition.model
このパッケージ内の各クラスには、タスク定義ファイル用のオブジェクト・モデルが含まれています。オブジェクトの作成には、ObjectFactory
クラスを使用できます。
oracle.bpel.services.workflow.client.IWorkflowServiceClient
ワークフロー・サービス・クライアントのインタフェースです。
oracle.bpel.services.workflow.client.WorkflowServiceClientFactory
ワークフロー・サービス・クライアントを作成するためのファクトリです。
oracle.bpel.services.workflow.metadata.ITaskMetadataService
タスク・メタデータ・サービスのインタフェースです。
oracle.bpel.services.workflow.task.ITaskService
タスク・サービスのインタフェースです。
oracle.bpel.services.workflow.task.IRoutingSlipCallback
タスク処理中にコールバックを受信するコールバック・クラスのインタフェースです。
oracle.bpel.services.workflow.task.IAssignmentService
割当てサービスのインタフェースです。
ワークリスト・アプリケーションは、ワークフロー・サービス・クライアントを介して様々なワークフロー・サービスにアクセスします。ワークフロー・サービス・クライアントのコードは、様々なローカル・プロトコルとリモート・プロトコルを使用したワークフロー・サービスとの通信に必要なロジックをすべてカプセル化します。ワークリスト・アプリケーションにワークフロー・サービス・クライアントのインスタンスがある場合は、クライアントとワークフロー・サービスとの通信方法を考慮する必要はありません。
クライアントを使用するメリットは、次のとおりです。
SOAP/HTTPやEnterprise JavaBeansなどの基礎となる接続メカニズムの複雑さが軽減されます。
使用する起動メカニズムの変更(SOAP/HTTPからリモートEnterprise JavaBeansへの変更など)が容易になります。
IWorkflowServiceClient
インタフェースのインスタンス作成には、次のクラスが使用されます。
oracle.bpel.services.workflow.client.WorkflowServiceClientFactory
WorkflowServiceClientFactory
には、ワークフロー・クライアントを作成する複数のメソッドがあります。getWorkflowServiceClient
は最も単純なメソッドで、パラメータとしてクライアント・タイプのみをとります。クライアント・タイプは次のいずれかです。
WorkflowServiceClientFactory.REMOTE_CLIENT
: クライアントはリモートEnterprise JavaBeansインタフェースを使用してリモートのワークフロー・サービスを起動します。
WorkflowServiceClientFactory.SOAP_CLIENT
: クライアントはSOAPを使用して、リモートのワークフロー・サービスへのWebサービス・インタフェースを起動します。
他のファクトリ・メソッドを使用すると、接続プロパティを直接指定し(ファクトリで接続プロパティをwf_client_config.xml file
からロードする必要はありません)、クライアント・アクティビティを記録するロガーを指定できます。
このリリースには、ワークフロー・サービス・クライアントの次の拡張機能が含まれています。
例30-2および例30-3に示すように、ワークフロー・クライアント構成は、JAXBオブジェクトまたはマップのいずれかを使用して指定できます。
例30-2 JAXBオブジェクトを使用したワークフロー・クライアント構成
WorkflowServicesClientConfigurationType wscct = new WorkflowServicesClientConfigurationType(); List<ServerType> servers = wscct.getServer(); ServerType server = new ServerType(); server.setDefault(true); server.setName(serverName); servers.add(server); RemoteClientType rct = new RemoteClientType(); rct.setServerURL("t3://stapj73:7001"); rct.setUserName("weblogic"); rct.setPassword("weblogic")); rct.setInitialContextFactory("weblogic.jndi.WLInitialContextFactory"); rct.setParticipateInClientTransaction(false); server.setRemoteClient(rct); IWorkflowServiceClient wfSvcClient = WorkflowServiceClientFactory.getWorkflowServiceClient( WorkflowServiceClientFactory.REMOTE_CLIENT, wscct, logger);
例30-3 マップを使用したワークフロー・クライアント構成
Map<IWorkflowServiceClientConstants.CONNECTION_PROPERTY,java.lang.String> properties = new HashMap<IWorkflowServiceClientConstants.CONNECTION_PROPERTY,java.lang.String>(); properties.put(IWorkflowServiceClientConstants.CONNECTION_PROPERTY.MODE, IWorkflowServiceClientConstants.MODE_DYNAMIC); properties.put(IWorkflowServiceClientConstants.CONNECTION_PROPERTY.SOAP_END_POINT_ROOT, "http://localhost:8888"); IWorkflowServiceClient client = WorkflowServiceClientFactory.getWorkflowServiceClient(WorkflowServiceClientFactory.SOAP_CLIENT, properties, null);
クライアントでは、クライアントがメッセージを記録するjava.util.logging.Logger
を必要に応じて渡すことができます。ロガーが指定されていない場合、ワークフロー・サービスのクライアント・コードは何も記録しません。例30-4は、ロガーをワークフロー・サービス・クライアントに渡す方法を示しています。
すべてのワークフロー・サービスのクライアント・ライブラリは、ファクトリを介して取得できます。各サービスに使用可能なクライアントについては、「表31-1 Enterprise JavaBeans、SOAPおよびJavaサポート」を参照してください。
BPMIdentityService
およびBPMIdentityConfigService
のインスタンスは、WorkflowServiceClientFactory
でgetSOAPIdentityServiceClient
メソッドおよびgetSOAPIdentityConfigServiceClient
メソッドをコールして取得できることに注意してください。その他のすべてのサービスは、IWorkflowServiceClient
のインスタンスを介して取得できます。
クライアント・クラスは、サービスのエンドポイントにwf_client_config.xml
構成ファイルを使用します。クライアントのクラスパスでは、このファイルはクラスパス直下にあります。つまり、このファイルが格納されているディレクトリはクラスパス内にあります。wf_client_config.xml
ファイルには、次の内容が含まれています。
例30-5に示すリモート・クライアント用のセクション
例30-5 リモート・クライアント用のセクション
<remoteClient>
<serverURL>t3://hostname.domain_name:7001</serverURL>
<userName>weblogic</userName>
<password>weblogic</password>
<initialContextFactory>weblogic.jndi.WLInitialContextFactory
</initialContextFactory>
<participateInClientTransaction>false</participateInClientTransaction>
</remoteClient>
例30-6に示す各サービスのSOAPエンドポイント用のセクション
例30-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
ファイルに格納されています。
IWorkflowServiceClient
インタフェースは、各種ワークフロー・サービス・インタフェースへのハンドルを取得できるように、表30-1に示すメソッドを提供します。
表30-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 |
SOAPクライアントのクラスパスには、次のJARファイルが必要です。
${bea.home}/wlserver_10.3/server/lib/wlfullclient.jar
${bea.home}/AS11gR1SOA/webservices/wsclient_extended.jar
${bea.home}/AS11gR1SOA/soa/modules/oracle.soa.fabric_11.1.1/bpm-infra.jar
${bea.home}/AS11gR1SOA/soa/modules/oracle.soa.workflow_11.1.1/bpm-services.jar
${bea.home}/AS11gR1SOA/soa/modules/oracle.soa.fabric_11.1.1/fabric-runtime.jar
wlfullclient.jar
ファイルは、例30-7に示すコマンドを使用して生成できます。
例30-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 ディレクトリを使用しません。 |
リモートEJBを使用するクライアントのクラスパスには、次のJARファイルが必要です。
xmlparserv2.jar
xml.jar
bpm-infra.jar
bpm-services.jar
bpm-services-client.jar
(ワークフローにADFデータ・コントロールを使用する場合のみ)
fabric-runtime.jar
注意: クライアント・アプリケーションは、クラスパス内のsystem\services\config またはsystem\services\schema ディレクトリを使用しません。 |
タスクはプログラムによって開始できます。その場合は、次のタスク属性を設定する必要があります。
taskDefinitionId
title
payload
priority
次のタスク属性はオプションですが、通常はクライアントによって設定されます。
creator
ownerUser
: 空の場合はbpeladmin
にデフォルト設定されます。
processInfo
identificationKey
: タスクは、TaskQueryServiceからの識別キーに基づいて問い合せることができます。
タスクのオブジェクト・モデルは、次のパッケージで使用できます。
oracle.bpel.services.workflow.task.model
このモデル内でオブジェクトを作成するには、ObjectFactory
クラスを使用します。
タスク・ペイロードには、複数のペイロード・メッセージ属性を含めることができます。ペイロードはタスクが定義されるまで詳細に定義されないため、タスクのJavaオブジェクト・モデルには、クライアント・ペイロード用の強い型指定のオブジェクトが含まれません。タスク・ペイロードはAnyType
Javaオブジェクトで表されます。AnyType
Javaオブジェクトは、ネームスペース内のpayload
をルートとして持つXML要素を使用して作成されます。
http://xmlns.oracle.com/bpel/workflow/task
ペイロードのXML要素には、他のすべてのXML要素が含まれます。各XML要素では、メッセージ属性を定義します。
例30-8は、タスク・ペイロードの設定方法を示しています。
例30-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要素リストを返します。このリストには他のメッセージ属性を追加できません。 |
例30-9は、休暇申請タスクをプログラムによって開始する方法を示しています。
例30-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;
ワークリスト・アプリケーションおよびUserMetadataService
APIは、標準ビューの作成、更新および削除に使用できるメソッドを提供します。詳細は、第31.1.7項「ユーザー・メタデータ・サービス」を参照してください。
この項の例では、HelpDeskRequestデモの一部であるヘルプ・デスク・インタフェースの変更方法を示します。
ワークリスト・アプリケーションを記述する手順は、次のとおりです。
ワークフロー・コンテキストは、ユーザーを認証することで作成します。
// get workflow service client IWorkflowServiceClient wfSvcClient = WorkflowServiceClientFactory.getWorkflowServiceClient (WorkflowServiceClientFactory.REMOTE_CLIENT); //get the workflow context IWorkflowContext wfCtx = wfSvcClient.getTaskQueryService().authenticate(userId, pwd, null);
これは、第30.1項「ワークフロー・サービスのクライアント作成に関する概要」のステップ3です。
HelpDeskRequestのlogin.jsp
ファイルでは、前述のAPIを使用してユーザーが認証され、ワークフロー・コンテキストが作成されます。ユーザーが認証されると、statusPage.jsp
ファイルによって、ログイン・ユーザーに割当て済のタスクが表示されます。例30-10は、login.jsp
ファイルからのサンプル・コードを示しています。
例30-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>
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);
これは、第30.1項「ワークフロー・サービスのクライアント作成に関する概要」のステップ4です。
HelpDeskRequestのstatusPage.jsp
ファイルを使用して、ヘルプ・デスク・リクエストのステータスが表示されます。例30-11は、statusPage.jsp
のコード例を示しています。
例30-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>