提供されているサンプルプロジェクトを MuleSoft プロジェクトの開始ポイントとして使用できます。
Vault でのドキュメントの作成
次の例では、外部ソース (データベース) からフェッチしたドキュメントメタデータを使用してドキュメントを一括で作成します。Vault でドキュメントを作成する前に、Veeva Vault FTP サーバーを使用してドキュメントファイルをアップロードします。ドキュメントの created 状況がデータベースに挿入されます。
Mule フローを作成する手順は、次のとおりです。
-
[Mule Palette (Mule パレット)] から HTTP Listener をドラッグし、プロジェクトキャンバスにドロップします。
-
使用する環境に応じて HTTP リスナーを設定します。
-
Database Select 操作をドラッグして、テーブルからドキュメントメタデータをフェッチします。
-
接続ログイン情報を使用して、Database Connector を設定します。
-
[Flow Reference (フロー参照)] 要素をドラッグして、サブフロー
upload-files-on-vault-ftp-server を参照します。 -
Transform Message コンポーネントをドラッグして、ドキュメントメタデータを CSV 形式に変換します。
-
VeevaVault コネクタパレットから Create Documents 操作をドラッグします。
-
Veeva Vault 接続の値を入力します。
-
Username (ユーザー名)
-
Password (パスワード)
-
Vault URL
-
Vault バージョン
-
Vault クライアント ID
-
-
Database Bulk Insert 操作をドラッグして、ドキュメント作成済み状況データをデータベーステーブルに挿入します。
-
Logger コンポーネントをドラッグして、コンソールまたはログファイルに情報を記録します。
-
Logger コンポーネントを含むサブフローを作成して、サブフローの情報を記録します。
-
Read file 操作と FTPS Write 操作を含む For-Each スコープをドラッグして、ファイルを Veeva Vault FTP サーバーに書き込みます。 -
Veeva Vault FTP サーバーのログイン情報を使用して FTPS Connector を設定します。
XML コード
次のサンプル XML コードは、Create Documents 操作のフローを示しています。
<flow name="create-documents-operationFlow"
doc:id="98fe428d-3961-41e9-afaf-1cbe2b38dee5" >
<http:listener doc:name="Listener" doc:id="a894ea19-6344-4553-aa50-b7827c8e8096" config-ref="HTTP_Listener_config" path="/create-documents"/>
<db:select doc:name="Select" doc:id="e5af2ee1-faf6-4397-aea8-7df1ca873abb" config-ref="Database_Config">
<db:sql >SELECT * FROM createdocuments</db:sql>
</db:select>
<!-- <flow-ref doc:name="upload-files-on-vault-ftp-server" doc:id="8be764bb-bf76-4c9f-870b-fe708077e28e" name="upload-files-on-vault-ftp-server"/> -->
<ee:transform doc:name="Transform Message" doc:id="ac21fdf2-9117-4201-a595-907e4dd1ea12">
<ee:message>
<ee:set-payload><![CDATA[%dw 2.0
output application/csv headerLineNumber = 0 , header = true
---
payload map ( payload01 , indexOfPayload01 ) -> {
lifecycle__v: payload01.lifecycle__v,
study__v: payload01.study__v,
subtype__v: payload01.subtype__v,
name__v: payload01.name__v ++ '--' ++ randomInt(10000) as String,
type__v: payload01.type__v,
classification__v: payload01.classification__v,
product__v: payload01.product__v,
file: payload01.file as String
}]]></ee:set-payload>
</ee:message>
</ee:transform>
<veevavault:create-documents metadataFormat="CSV" doc:name="Create Documents" doc:id="5b98678c-1559-4827-80a9-289aad4a8873" config-ref="Veeva_Vault_Config"/>
<db:bulk-insert doc:name=__"Bulk insert" doc:id="e8dd307e-40db-42bb-b82a-b72f6b235d00" config-ref="Database_Config">
<db:bulk-input-parameters ><![CDATA[#[output application/java
---
payload.data map () -> {
'id': $.id as String,
'external_id__v': $.external_id__v as String,
'responseStatus': $.responseStatus
}]]]>
</db:bulk-input-parameters>
<db:sql >INSERT into documents (id, external_id__v, responseStatus) VALUES (:id: external_id__v, :responseStatus)
</db:sql>
</db:bulk-insert>
<logger level="INFO" doc:name="Logger" doc:id="a447ff60-8deb-471c-a1be-cc6c01dfcc29" message="Document Created :: #[output application/json --- payload]"/>
<error-handler >
<on-error-propagate enableNotifications="true" logException="true" doc:name="On Error Propagate" doc:id="19d98427-1566-4f82-b694-f59cc6eb169a" type="ANY" >
<logger level="INFO" doc:name="Logger" doc:id="9c23d079-fbf2-42e7-afe2-b5186a7b9a3f" message="Flow Exception Handled -- #[payload]" />
</on-error-propagate>
</error-handler>
</flow>
ドキュメントの詳細を取得する
この例では、種別、サブタイプ、分類に基づいてドキュメントの詳細を取得してデータベースに保存します。
Mule フローを作成する手順は、次のとおりです。
-
[Mule Palette (Mule パレット)] から HTTP Listener をドラッグし、プロジェクトキャンバスにドロップします。
-
使用する環境に応じて HTTP リスナーを設定します。
-
VeevaVault コネクタパレットから Get Documents 操作をドラッグアンドドロップします。
-
Veeva Vault 接続の値を入力します。
-
Username (ユーザー名)
-
Password (パスワード)
-
Vault URL
-
Vault バージョン
-
Vault クライアント ID
-
-
各更新ボタンをクリックして、ドキュメント種別、サブタイプ、および分類のリストをフェッチします。
-
各ドロップダウンリストからドキュメント種別、サブタイプ、および分類を選択します。
-
ビジネス要件に応じてドキュメントプロパティを [Document Properties (ドキュメントプロパティ)] リストに追加し、プロパティ名を VQL クエリに組み込んで、VQL クエリを動的にビルドします。
-
Veeva Vault Get Documents 操作の後に For-Each スコープをドラッグします。
-
Transform Message コンポーネントと Database Connector Insert 操作をそれぞれのパレットからプロジェクトにドロップします。
-
ビジネス要件に従って、DataWeave を使用して変換を設定します。
-
データをテーブルに挿入するように Database Insert クエリを設定します。
-
For-Each の後に Set Payload トランスフォーマーをドラッグして、トリガーされたソースに戻るペイロードを設定します。
-
Logger コンポーネントをドラッグして、コンソールまたはログファイルに情報を記録します。
XML コード
<flow name=__"get-documents-operationFlow"__ doc:id=__"facc29d2-8025-4b58-a3ec-322ded221705"__ >
<http:listener doc:name=__"Listener"__ doc:id=__"93298153-7da4-4fcc-b028-00e692b0d19e"__ config-ref=__"HTTP_Listener_config"__ path=__"/get-documents"__/>
<veevavault:get-documents doc:name=__"Get Documents"__ doc:id=__"c9e9f482-91ce-40d2-a7f7-92b39fc7e8a3"__ config-ref=__"Veeva_Vault_Config"__>
<veevavault:documents type=__"site_management__c"__>
<veevavault:document-properties >
<veevavault:document-property value=__"name__v"__ />
<veevavault:document-property value=__"type__v"__ />
<veevavault:document-property value=__"subtype__v"__ />
<veevavault:document-property value=__"classification__v"__ />
<veevavault:document-property value=__"lifecycle__v"__ />
<veevavault:document-property value=__"status__v"__ />
<veevavault:document-property value=__"study__v"__ />
<veevavault:document-property value=__"product__v"__ />
</veevavault:document-properties>
</veevavault:documents>
</veevavault:get-documents>
<foreach doc:name=__"For Each"__ doc:id=__"a05bd532-48eb-42a8-af56-7c9830a4433d"__ >
<ee:transform doc:name=__"Transform Message"__ doc:id=__"d5bf0da9-e544-4728-a3e9-57dc05a02fa9"__ >
<ee:message >
<ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
payload]]></ee:set-payload>
</ee:message>
</ee:transform>
<db:insert doc:name=__"Insert"__ doc:id=__"bf5a1288-8f37-456d-b26c-d18b8ea411db"__ config-ref=__"Database_Config"__>
<db:sql >INSERT INTO [.underline]#createdocuments# (name__v, type__v, subtype__v, classification__v, lifecycle__v,
product__v, status__v, study__v, file) VALUES (:name__v, :type__v, :subtype__v, :classification__v, :lifecycle__v, :product__v, :status__v, :study__v, :file)</db:sql>
<db:input-parameters ><![CDATA[#[%dw 2.0
output application/json
---
{
'name__v': payload.name__v as String,
'type__v': payload.type__v as String,
'subtype__v': payload.subtype__v as String,
'classification__v': payload.classification__v as String,
'lifecycle__v': payload.lifecycle__v as String,
'product__v': payload.product__v[0],
'status__v': payload.status__v as String,
'study__v': payload.study__v[0],
'file': "CDA.docx"
}]]]></db:input-parameters>
</db:insert>
</foreach>
<set-payload value=__"#[output application/json --- payload.payload]"__ doc:name=__"Set Payload"__ doc:id=__"abcb3160-55a5-49f8-9b31-d7e61dca3d2e"__ />
<logger level=__"INFO"__ doc:name=__"Logger"__ doc:id=__"ab49834e-389e-483e-84a4-2b61752bba72"__ message=__"Document Details :: #[payload]"__/>
<error-handler >
<on-error-propagate enableNotifications=__"true"__ logException=__"true"__ doc:name=__"Error Propagate"__ doc:id=__"a7ac2cf2-ec74-408b-8a02-ee1a0d24e8f4"__ type=__"ANY"__ >
<logger level=__"INFO"__ doc:name=__"Logger"__ doc:id=__"2b932042-57f3-45d8-9e6b-3cd9fcda6509"__ message=__"Flow Exception Handled -- #[payload]"__ />
</on-error-propagate>
</error-handler>
</flow>
ドキュメントまたはオブジェクトデータのフェッチ
この Mule フローでは、VQL クエリを使用して Veeva Vault からドキュメントまたはオブジェクトデータを取得します。
Mule フローを作成する手順は、次のとおりです。
-
[Mule Palette (Mule パレット)] から HTTP Listener をドラッグし、プロジェクトキャンバスにドロップします。
-
使用する環境に応じて HTTP リスナーを設定します。
-
Veeva Vault Connector パレットから Veeva Vault Query 操作をドラッグします。
-
Veeva Vault 接続の値を入力します。
-
Username (ユーザー名)
-
Password (パスワード)
-
Vault URL
-
Vault バージョン
-
Vault クライアント ID
-
-
ビジネス要件に従って VQL クエリを定義します。
-
VQL クエリで使用する場合は、入力プレースホルダーを追加して、実行時に VQL で動的に組み込みます。
-
Veeva Vault Query 操作の後に For-Each スコープをドラッグします。
-
Transform Message 操作と File - Write 操作をそれぞれのパレットからドロップします。
-
ペイロードを変換するビジネスニーズに応じて、Dataweave を使用して変換を設定します。
-
作業ファイルのパスを使用して、File Connector を設定します。
-
指定したファイルにペイロードデータを書き込むように Write 操作を設定します。
-
For-Each の後に Set Payload トランスフォーマーをドラッグして、トリガーされたソースに戻るペイロードを設定します。
-
Logger コンポーネントをドラッグして、コンソールまたはログファイルに情報を記録します。

XML コード
<flow name="query-operation-with-database-operationFlow" doc:id="451f0f78-1e2e-4cc4-b56d-4f427f01e30a" >
<http:listener doc:name="Listener" doc:id="454e6602-2c2f-4e98-8569-b3e928bf3da5" config-ref="HTTP_Listener_config" path="/query"/>
<veevavault:query doc:name="Query" doc:id="e4310f17-b0f5-49c0-8662-bc2d798fd9de" fetchSize="1000" config-ref="Veeva_Vault_Config">
<veevavault:vql >SELECT id, name__v, type__v, subtype__v, classification__v, lifecycle__v, status__v, study__v, product__v from :table WHERE name__v= 'F22611234--6764'</veevavault:vql>
<veevavault:input-parameters ><![CDATA[#[{
'table': 'documents'
}]]]></veevavault:input-parameters>
</veevavault:query>
<foreach doc:name="For Each" doc:id="55a3f3e9-b0ad-4c6d-8ccf-96f2d11f7bc8" >
<ee:transform doc:name="Transform Message" doc:id="f4875262-fe32-42e6-8e21-a21e592a729d" >
<ee:message >
<ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
payload]]></ee:set-payload>
</ee:message>
</ee:transform>
<file:write doc:name="Write" doc:id="cb88f995-b31f-4dcf-b508-ea8340ae84fb" path="query.json" config-ref="File_Config" mode="APPEND">
<file:content><![CDATA[#[output application/json
---
payload]]]></file:content>
</file:write>
</foreach>
<set-payload value="#['Flow Completed']" doc:name="Set Payload" doc:id="66f96a83-dfc9-4855-a65c-c35327cfec2a" />
<logger level="INFO" doc:name="Logger" doc:id="016dc7a0-7014-44d9-bcbd-d2f540c2fc2e" message="Query Operation flow Completed - #[payload]"/>
<error-handler >
<on-error-propagate enableNotifications="true" logException="true" doc:name="On Error Propagate" doc:id="6a7998b6-4384-41fb-bb5a-625f5410003a" type="ANY">
<logger level="INFO" doc:name="Logger" doc:id="46ee422c-4430-4b63-b1c3-6c993ad732fa" message="Flow Exception Handled -- #[payload]"/>
</on-error-propagate>
</error-handler>
</flow>
Spark メッセージの検証
この Mule フローでは、Vault からトリガーされた Spark メッセージを検証します。
Mule フローを作成する手順は、次のとおりです。
-
[Mule Palette (Mule パレット)] から HTTP Listener をドラッグし、プロジェクトキャンバスにドロップします。
-
HTTPS Connector 用の JKS 証明書には、Veeva Vault との TLS 接続を介して Spark メッセージを受信するための HTTPS リスナー用の .jks ファイルが必要です。
以下は、.jks ファイルを作成するための手順です (<JDK_HOME>/bin ディレクトリにある Java Keytool を使用できます)。次に例を示します。-
<JDK_HOME>/bin ディレクトリから次のコマンドを実行します。`keytool -genkey -keyalg RSA -alias mule -keystore spark-listener.jks -storepass password -validity 360 -keysize 2048`
これにより、現在のディレクトリに `spark-listener.jks` ファイルが作成されます。
-
src/main/resources プロジェクトディレクトリの spark-listener.jks ファイルをコピーしてインポートします。HTTPS リスナーを次のように設定します。-
[General (一般)] タブで、次のように設定します。
-
Protocol (プロトコル): HTTPS
-
Host (ホスト): 0.0.0.0
-
Port (ポート): 8082
-
-
[TLS] タブ > [Key Store (キーストア)] で、以下を設定します。
-
Type (種別): JKS
-
Path (パス): spark-listener.jks
-
Alias (別名): mule
-
Key Password (キーパスワード): password
-
Password (パスワード): password
-
-
-
-
Veeva Vault パレットから Spark Validator 操作をプロジェクトキャンバスにドラッグします。
-
Veeva Vault 接続の値を入力します。
-
Username (ユーザー名)
-
Password (パスワード)
-
Vault URL
-
Vault バージョン
-
Vault クライアント ID
-
-
Spark Validator パラメーターを次のように設定します。
-
Include Spark Header (Spark ヘッダーを含める):
FALSE -
Public Key Path:
${file.keyPath} 公開キーファイル (00001.pem) の保存場所へのパスを使用して、configuration.yaml の file.keyPath プロパティを定義します。 -
Spark Headers (Spark ヘッダー):
#[attributes.headers] -
Spark Message (Spark メッセージ):
#[payload]
-
-
Set Payload 操作をプロジェクトキャンバスにドラッグし、Value 項目で以下を定義します。
---- output application/json --- { "payload" : payload, "attributes": attributes } ---- -
Logger コンポーネントをプロジェクトキャンバスにドラッグして、次のメッセージを使用してペイロードを記録します。
Spark Message :: #[payload]

XML コード
<flow name="spark-message-validator-operationFlow" doc:id="de35a9a3-61f3-4cd1-9c58-f645c95187d3" >
<http:listener doc:name="Listener" doc:id="687a4226-b8df-4657-a329-1a79e4b8b2ea" config-ref="Spark_Listener" path="/"/>
<veevavault:spark-message-validator doc:name="Spark Validator" doc:id="384e963f-3f1c-4117-a6f3-1e8b09a585a9" config-ref="Veeva_Vault_Config" publicKeyPath="${file.keyPath}" includeSparkHeader="TRUE"/>
<set-payload value='#[output application/json --- {
"payload" : payload,
"attributes": attributes
}]' doc:name="Set Payload" doc:id="69071232-9e9b-459f-8061-59f44e76ae98" />
<logger level="INFO" doc:name="Logger" doc:id="3ce348b9-bfbb-4c16-8663-48ecb401fbb2" message="Spark Message :: #[payload]"/>
</flow>
REST API を呼び出して単一のドキュメントを作成します。
Mule フローを作成する手順は、次のとおりです。
-
[Mule Palette (Mule パレット)] から HTTP Listener をドラッグし、プロジェクトキャンバスにドロップします。
-
HTTP リスナーを使用している環境に応じた値で設定します。
-
[Mule Palette (Mule パレット)] ビューから、[File Connector] > [Read] 操作をプロジェクトキャンバスにドラッグし、Vault ドキュメントに関連付けられたファイルのコンテンツから読み取るようにファイルパスを設定します。
-
[Mule Palette (Mule パレット)] から、Veeva Vault Invoke Rest API 操作をキャンバス上にドラッグします。
-
Veeva Vault 接続の値を入力します。
-
Username (ユーザー名)
-
Password (パスワード)
-
Vault URL
-
Vault バージョン
-
Vault クライアント ID
-
-
次のパラメーターを設定します。
Method: POST, Path: "/objects/documents", Headers: Key: "Accept" Value: "application/json" Key: "Content-Type" Value: "multipart/form-data; boundary=abcdefg" URI Parameters: Leave it empty. Query Parameters: Leave it empty.
Body: %dw 2.0 output multipart/form-data boundary='abcdefg' --- { parts: { file: { headers: { "Content-Disposition": { "name": "file", "filename": attributes.fileName }, "Content-Type": payload.^mimeType }, content : payload }, name__v: { headers: { }, content: 'Test Document' }, type__v: { headers: { }, content: 'Trial Management' }, subtype__v: { headers: { }, content: 'Meetings' }, classification__v: { headers: { }, content: 'Kick-off Meeting Material' }, lifecycle__v: { headers: { }, content: 'Base Doc Lifecycle' }, study__v: { headers: { }, content: '0ST000000000301' }, comments__c: { headers: { }, content: 'Test Document' } } } -
PUT リクエストも同様に設定することができます。
Method: PUT, Path: "/objects/documents/{doc_id}", Headers: Key: "Accept" Value: "application/json" Key: "Content-Type" Value: "application/x-www-form-urlencoded" URI Parameters: Key: "doc_id" Value: "259592" Query Parameters: Leave it empty.Body: %dw 2.0 output application/x-www-form-urlencoded --- { "id": "259592", "name__v": "Kick-off Meeting Material Updated", "product__v": "00P000000000403", "study__v": "0ST000000000202", "notes__v": "Notes Updated" }注意: Vault REST API を呼び出すには、要件に従って上記のパラメーターを設定します。
-
Logger コンポーネントをプロジェクトキャンバスにドラッグして、次のメッセージを使用してペイロードを記録します。
Invoke Veeva API response :: #[payload]

XML コード
<flow name="invoke-veeva-api-operationFlow" doc:id="fc3c7fa8-2934-4089-aa2a-dfa4f41fdb1a" >
<http:listener doc:name="Listener" doc:id="26ab408f-73db-4fe9-80ec-4121938e0828" config-ref="HTTP_Listener_config" path="/invoke-veeva-api"/>
<file:read doc:name="Read" doc:id="7f8bd32f-7ad2-4cd8-a4e7-dd9cc6834963" config-ref="File_Config" path="#['testdata/Test Document Renditions.pdf']" outputMimeType="application/octet-stream"/>
<veevavault:invoke-rest-api doc:name="Invoke REST API" doc:id="ed667811-1343-49ae-bb38-0ac3e59bb4cb" config-ref="Veeva_Vault_Config" path="/objects/documents" method="POST">
<veevavault:body ><![CDATA[#[%dw 2.0
output multipart/form-data boundary='abcdefg'
---
{
parts: {
file: {
headers: {
"Content-Disposition": {
"name": "file",
"filename": attributes.fileName
},
"Content-Type": payload.^mimeType
},
content : payload
},
name__v: {
headers: {
},
content: 'Test Document'
},
type__v: {
headers: {
},
content: 'Trial Management'
},
subtype__v: {
headers: {
},
content: 'Meetings'
},
classification__v: {
headers: {
},
content: 'Kick-off Meeting Material'
},
lifecycle__v: {
headers: {
},
content: 'Base Doc Lifecycle'
},
study__v: {
headers: {
},
content: '0ST000000000301'
},
comments__c: {
headers: {
},
content: 'Test Document'
}
}
}]]]></veevavault:body>
<veevavault:headers ><![CDATA[#[output application/java
---
{
"Accept" : "application/json",
"Content-Type" : "multipart/form-data; boundary=abcdefg"
}]]]></veevavault:headers>
</veevavault:invoke-rest-api>
<logger level="INFO" doc:name="Logger" doc:id="182eb2ad-d346-4f30-8d64-ad37fc574c21" message="Invoke Veeva API response :: #[payload]" />
</flow>