Apexを使用してSpringCMからチャンク内の大きなドキュメントにアクセスする方法

October 18, 2016 Sato Yoshihisa

2016年8月12日 by Satyanarayan Choudhary

 本ブログはアピリオUSのテックブログにSatyanarayan Choudharyが寄稿した記事を抄訳したものです。 原文 ”How to Access Large Document in Chunks from SpringCM Using Apex” はこちらからご覧いただけます。

SpringCMは契約書、文書などのコンテンツをSalesforceで管理することができるクラウドベースのエンタープライズコンテンツ管理システムです。

SpringCMは、デスクトップ、Web、そしてモバイルプラットフォームなどのコンテンツへのアクセスを提供します。

標準またはカスタムオブジェクトに対してSpringCMを使用する方法

  • オブジェクトに関連付けられたドキュメントを持つことができるように、Salesforceの標準またはカスタムオブジェクトにSpringCMを追加することができます。これによりオブジェクトレコード内のドキュメントを表示または管理することが容易になります。
  • SpringCMは、ターゲットオブジェクトが識別され、フォルダ構造が定義されるよう、各オブジェクトレコードのための個別のフォルダを提供します。
  • SpringCMではアウト・オブ・ボックス設定をすることにより、ドキュメントのカスタマイズをすることなくオブジェクトに関連付けられたSalesforceの取引先情報や連絡先などの文書にアクセスすることができます。取引先や連絡先以外の他のSalesforceオブジェクトについては、個別にVisualforceページを作成する必要があります。
  • オブジェクトのページにVisualforceページを追加することで、レコードの文書にアクセスすることができます。場合によっては、Apexを使ってSalesforceドキュメントを変換するにはSpringCMからドキュメントにアクセスする、またはダウンロードする必要がでてきます。そして、XML文書のように処理、解析し、それに基づいてレコードを作成することができるようになります。
 

事前に準備すること:

    > AppExchangeからSpringCMをインストールします

     > オブジェクトにSpringCMを設定します

    >ここからWSDLをダウンロードします

    > WSDLからクラスを生成します

 

public with sharing class SpringCMFileManager {
	static final String OBJECT_TYPE = 'Account';
	static final String SFTYPE_PREFIX = 'Salesforce.';
	static final String DOC_TYPE = 'xml';
	static final Integer CHUNK_SIZE = 500000; 

	// Spring CMからドキュメントをフェッチする方法
	public static Document getDocument(
		String userName, String userKey, String accountId,String apiKey, String folderAccountId, String docName){

		// 変数の設定
		Document doc;
		string downloadStream;
		string docData = '';
		integer position = 0;
		integer chunkSize = CHUNK_SIZE;
		SpringCMSF.SCMDocument fetchedDoc;
		SpringCMSF.SpringCMServiceSoap service = new SpringCMSF.SpringCMServiceSoap();

		// トークンを取得
		string token = service.AuthenticateNonDefault(userName, userKey, accountId, apiKey);

		// EOS (Streamオブジェクト)からフォルダ情報を入手
		SpringCMEos.SpringCMUtilities.EosObject resultObj = SpringCMEos.SpringCMUtilities.createEOSObject(folderAccountId, OBJECT_TYPE);
		string sfType = SFTYPE_PREFIX + resultObj.getSfType();
		string sfId = resultObj.getSfId();
		string path = resultObj.getPath();
		string folderName = resultObj.getFoldername();
		SpringCMSF.SCMFolder scmFolder;
		SpringCMSF.SCMList results;

		// アクセスフォルダ
		scmFolder = service.FindOrCreateEOSFolder(token, sfId , sfType, folderName, path, true);

		// ページ作成
		SpringCMSF.SCMDocumentPager pager = new SpringCMSF.SCMDocumentPager();
		pager.StartIndex = 0;
		pager.PageSize = 100; // This is the large size of page
		pager.SortAscending = true;
		String folderId = scmFolder.Id;
		Boolean loadExtendedMetadata = false;

		// ドキュメントをフェッチする

		results = service.FolderGetContents(token, scmFolder.Id, loadExtendedMetadata, pager);

		if(results != null && results.SCMDocuments != null && results.SCMDocuments.SCMDocument.size() > 0){
			for(SpringCMSF.SCMDocument scmDoc : results.SCMDocuments.SCMDocument){
				if(scmDoc.Name == docName){
					fetchedDoc = scmDoc;

					fetchedDoc = scmDoc;

					//全てのバイトを取得するまでポジションが増加(ダウンロードが終わるまでループさせる)
					while (position < fetchedDoc.FileSize){ if (position + chunkSize >= fetchedDoc.FileSize){
						chunkSize = (integer)(fetchedDoc.FileSize - position);
					}

					downloadStream = service.DocumentDownload(token, scmDoc.Id, position, chunkSize, 'Native');
					docData += EncodingUtil.base64Decode(downloadStream).toString();

					//ポジションを次のチャンクに移動
					position += chunkSize;
				}

				break;
				}
			}
		}

		if(fetchedDoc != null){
			doc = new Document();
			doc.Body = Blob.valueOf(docData);
			doc.FolderId = UserInfo.getUserId();
			doc.Name = docName;
			doc.ContentType = fetchedDoc.MIMEType;
			doc.Type = DOC_TYPE;
		}

		return doc;
	}
}

 

著者について

外資系SIベンダーでの経験を経て、2015年11月にアピリオへJoin。2017年10月より山形県鶴岡市に移住すると共に、リモートワークを開始。東京在住時とほぼ変わらない仕事内容で日々業務を実践。日々進化するクラウド技術、次々と生まれる新しい技術を学びつつ、お客様にデリバリーを行なっている。

Linkedin をフォロー Sato Yoshihisa のコンテンツをもっと見る
戻る
Apex似のSOQL呼び出しJavaコーディングの実験
Apex似のSOQL呼び出しJavaコーディングの実験

こんにちは、いがぴょんことアピリオの伊賀敏樹です。 外部JavaアプリケーションからSalesforce/Force.comを呼び出すインタフェース・プログラミングについて、SOQL に着眼してコーディングをApe...

次へ
使ってみよう Salesforce Community Cloud(下)
使ってみよう Salesforce Community Cloud(下)

こんにちはアピリオ北嵐です。さてCommunity Cloudのセットアップ手順紹介の後半です。前半ではコミュニティ・サイトを立ち上げる手順を紹介しました。これまでの作業であなたの組織でカスタマー向けのコミュニティ...

アピリオまでお気軽にお問合せください

ご質問はこちら