How to generate audit process image file through Oracle BPM 12c API

Oracle BPM 11g/12cの場合、監査証跡のイメージは、BPM WorkspaceもしくはEnterprise Manager Fusion Middleware Controlから確認することができますが、Java APIを駆使して、監査証跡のイメージを取得したい、というニーズは少なからずあるようです。 監査証跡イメージとは、プロセスインスタンスがどのアクティビティまで進行したのか、を図示したものです。例えば下図の場合、既に全てのアクティビティが完了していることがわかります。

output

さて、そのJava APIを使った取得方法を分類すると大きく2種類に分かれます。まずはoracle.bpm.services.tools.ProcessInstanceAuditHelperというユーティリティクラスを使う方法。11gではこのクラスにあるgetAuditImage()を使うとイメージを取得することができます。ですが、12cではこのクラスがなくなりました。代わりに oracle.bpm.services.instancequery.IInstanceQueryService#getProcessAuditDiagram() を使うようガイドが出ています。

もう一つは、以下のエントリで紹介されているように、非公開APIを使う方法です。

Adding Process Instance Audit Images to the Worklist (RedStack) https://redstack.wordpress.com/2011/07/07/adding-process-instance-audit-images-to-the-worklist/
Archiving Audit Diagrams as Images in Oracle SOA Suite BPM Processes https://beatechnologies.wordpress.com/2011/07/26/archiving-audit-diagrams-as-images-in-oracle-soa-suite-bpm-processes/

各エントリにあるコードをご覧頂くとわかる通り、非公開APIが使われています。そのため、リリースやバージョンが新しくなると、これまでのコードが使えなくなる可能性がありますし、それ以前に、あくまでも自己責任であって製品サポートの範囲外であることは覚悟しなければなりません。

# 実際、11gで動作確認された上記エントリのコードは、12cでは動作しませんでした。

今回は、サポートされるAPIを使いたいので前者の方式を使うことにします。幸い、Oracle BPM 12cでも同様のクラスが存在します。ただ、メソッドの戻り値はBase64 Encodedの文字列なので、これをバイナリイメージに変換する必要があります。

package test;

import java.awt.image.BufferedImage;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.Properties;

import oracle.bpel.services.bpm.common.IBPMContext;
import oracle.bpel.services.workflow.client.IWorkflowServiceClientConstants;
import oracle.bpel.services.workflow.client.WorkflowServiceClientFactory;

import oracle.bpm.client.BPMServiceClientFactory;
import oracle.bpm.services.common.exception.BPMException;
import oracle.bpm.services.instancequery.IInstanceQueryService;
import oracle.bpm.ui.Image;
import oracle.bpm.ui.utils.ImageExtension;
import oracle.bpm.ui.utils.ImageIOFacade;

public class AuditProcessImage1 {
    public AuditProcessImage1() {
        super();
    }

    /**
     * get BPMServiceClientFactory from property file
     * @return BPMServiceClientFactory
     */
    public static BPMServiceClientFactory getBPMServiceClientFactory() {

        Properties prop = new Properties();
        try {
            prop.load(new FileInputStream(new File("connection.properties")));
        } catch (IOException e) {
            e.printStackTrace();
        }
        String soaURL = "t3://" + prop.getProperty("hostname") + ":" + prop.getProperty("port");

        Map<IWorkflowServiceClientConstants.CONNECTION_PROPERTY, String> properties =
            new HashMap<IWorkflowServiceClientConstants.CONNECTION_PROPERTY, String>();
        properties.put(IWorkflowServiceClientConstants.CONNECTION_PROPERTY.CLIENT_TYPE,
                       WorkflowServiceClientFactory.REMOTE_CLIENT);
        properties.put(IWorkflowServiceClientConstants.CONNECTION_PROPERTY.EJB_PROVIDER_URL, soaURL);
        properties.put(IWorkflowServiceClientConstants.CONNECTION_PROPERTY.EJB_SECURITY_PRINCIPAL,
                       prop.getProperty("username"));
        properties.put(IWorkflowServiceClientConstants.CONNECTION_PROPERTY.EJB_SECURITY_CREDENTIALS,
                       prop.getProperty("password"));
        properties.put(IWorkflowServiceClientConstants.CONNECTION_PROPERTY.EJB_INITIAL_CONTEXT_FACTORY,
                       "weblogic.jndi.WLInitialContextFactory");
        return BPMServiceClientFactory.getInstance(properties, null, null);
    }

    /**
     * Main method for test application.
     * @param args[0] Instance Id
     * @param args[1] Full Path for output image file
     */
    public static void main(String[] args) {
        // Argument check
        // [0] Instance ID [1] Output File Path (In case of Windows, seperator of "\\" is required) [2] Audit|Process
        if (args.length != 3) {
            System.err.println("java auditimage.InstanceImage {Instance ID} {full path of output image file} {Audit|Process|RouteOnly}");
            System.exit(1);
        }
        String instanceId = args[0];
        String outputPath = args[1];

        try {
            // Connect to BPM Server
            // get BPMContext and create Utility Class instance
            // Locale is fixed to ja_JP in this sample.
            BPMServiceClientFactory bpmServiceClientFactory = getBPMServiceClientFactory();
            IBPMContext bpmContext =
                bpmServiceClientFactory.getBPMUserAuthenticationService().getBPMContextForAuthenticatedUser();
            IInstanceQueryService instanceQueryService =
                bpmServiceClientFactory.getBPMServiceClient().getInstanceQueryService();

            String Base64 = instanceQueryService.getProcessAuditDiagram(bpmContext, instanceId, Locale.JAPAN);

            Image image = Image.createFromBase64(Base64);
            BufferedImage bufferedImage = (BufferedImage) image.asAwtImage();

            try( ByteArrayOutputStream auditImageOutputStream = new ByteArrayOutputStream()) {
                ImageIOFacade.writeImage(bufferedImage, ImageExtension.PNG, auditImageOutputStream);
                try (InputStream diagram = new ByteArrayInputStream(auditImageOutputStream.toByteArray())) {
                    writeToFile(diagram, outputPath);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }catch(IOException e){
                e.printStackTrace();
            }
        } catch (IOException | BPMException e) {
            e.printStackTrace();
        }
    }

    private static void writeToFile(InputStream istream, String outputFilePath) throws IOException {
        try (OutputStream out = new FileOutputStream(outputFilePath)) {
            // output file
            byte[] buf = new byte[1024];
            int len;
            while ((len = istream.read(buf)) > 0) {
                out.write(buf, 0, len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

このアプリケーションでは、BPM Serverに接続し、コンテキストを取得して、インスタンスIDと出力先を指定して、getProcessAuditDiagram()を呼び出し、イメージファイルに出力しています。接続に必要な情報(URL、ユーザー名、パスワードなど)はconnection.propertiesファイルに切り出しています。

# Java 8ならBase64クラスのおかげで少し楽になるかもしれませんが。

connection.propertiesはこんな感じです。

hostname=foo.bar.com
port=7001
username=weblogic
password=welcome1

実行にあたっては、以下のライブラリ(jarファイル)をClass Pathに設定する必要があります。結構多いですね。

# このパズルを解くのが一番時間がかかりました。

JARファイルのあるディレクトリ JARファイル
$Oracle_Home/oracle_common/modules com.oracle.webservices.fmw.jrf-ws-api_12.1.3.jar com.oracle.webservices.fmw.wsclient-impl_12.1.3.jar
$Oracle_Home/oracle_common/modules/clients com.oracle.webservices.fmw.client_12.1.3.jar
$Oracle_Home/oracle_common/modules/oracle.jrf_12.1.3 jrf.jar
$Oracle_Home/soa/soa/modules oracle.bpm.runtime.public-tools.jar
$Oracle_Home/soa/soa/modules/oracle.bpm.client_11.1.1 oracle.bpm.bpm-services.client.jar oracle.bpm.bpm-services.interface.jar oracle.bpm.client.jar oracle.bpm.web-resources.jar
$Oracle_Home/soa/soa/modules/oracle.bpm.project_11.1.1 oracle.bpm.common.model.jar oracle.bpm.diagram.draw.jar oracle.bpm.project.catalog.jar oracle.bpm.project.compile.jar oracle.bpm.project.draw.jar oracle.bpm.project.io.jar oracle.bpm.project.jar oracle.bpm.project.model.jar oracle.bpm.project.ui.jar oracle.bpm.scripting.catalog.jar oracle.bpm.scripting.lib.jar slf4j-api.jar slf4j-jdk14.jar
$Oracle_Home/soa/soa/modules/oracle.bpm.runtime_11.1.1 oracle.bpm.analytics.metrics.model.jar oracle.bpm.bpm-services.internal.jar oracle.bpm.casemgmt.model.jar oracle.bpm.core.jar oracle.bpm.metadata.jar oracle.bpm.papi.jar oracle.bpm.parser.jar oracle.bpm.runtime.bpmn-engine.jar oracle.bpm.vfilesystem.jar
$Oracle_Home/soa/soa/modules/oracle.bpm.workspace_11.1.1 oracle.bpm.ui.jar
$Oracle_Home/soa/soa/modules/oracle.rules_11.1.1 rulesdk2.jar
$Oracle_Home/soa/soa/modules/oracle.soa.bpel_11.1.1 orabpel.jar
$Oracle_Home/soa/soa/modules/oracle.soa.fabric_11.1.1 bpm-infra.jar
$Oracle_Home/soa/soa/modules/oracle.soa.workflow_11.1.1 bpm-services.jar
$Oracle_Home/wlserver/server/lib wlthint3client.jar

上記のコードは以下にUpしています。

Audit Instance Image
https://github.com/anishi1222/BPM-and-PCS/tree/master/Audit%20Instance%20Image

anishi1222 について

とあるキャラクターの中の人です。
カテゴリー: Middleware タグ: パーマリンク

How to generate audit process image file through Oracle BPM 12c API への1件のフィードバック

  1. ピンバック: How to get Process Image File through Oracle BPM 12c API | Troubadour

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中