SalesForceには、書類を共有する仕組みがあり、「ドキュメント」フォルダの
ストレージにファイルを置くことができます。
今回のお客様のニーズは、定期的にSalesForce上にファイルをアップロードしておくので、毎晩、自動でダウンロード(取得)して、システムに取り込んで反映してもらいたい!というものでした。
以前の記事で、Salesforceの画面からcsvファイルをアップロードし、カスタムオブジェクトを生成(登録)する方法を書いたのですが、今回は、SFDCは単なるファイルストレージで、データを取り込む先は、別のシステムとなります。
ユーザとしては、せっかくセールスフォースに契約しているのだから、別にサーバをレンタルするよりも、その資産を有効に活かしたいと考えるのは至極当然ですね。
すでに、JavaのバッチからSFDCに接続し、カスタムオブジェクトをCSVファイルとして書き出す仕組みは作っていたのですが、ファイルそのものをダウンロードするにはどうするのか??
と思っていたのですが、意外にすんなり出来ました。
というのも、SalesForce上では、
多くのモノがSObjectとして認識されている
ので、「Document」オブジェクト型でデータを取得し、そのをそのままローカルのPC上で書き込めば良かった。。
public List getDocuments() throws ApplicationException {
List objectList = new ArrayList();
try{
// SOQLの作成
StringBuffer selectQuery = new StringBuffer();
selectQuery.append("SELECT ");
selectQuery.append("Id, ");
selectQuery.append("Name, ");
selectQuery.append("Body "); //Domument本体
selectQuery.append("FROM ");
selectQuery.append("Document ");
selectQuery.append("where IsDeleted = false ");
// クエリ実行
QueryResult rs = binding.query(selectQuery.toString());
// 検索結果の取得
boolean done = false;
if (rs.getSize() > 0){
while (!done) {
// 検索結果をリストに格納
for (SObject so : rs.getRecords()) {
objectList.add((Document)so);
}
}
}
}catch(Exception ex){
throw new ApplicationException("SFDC情報の取得に失敗しました。",ex);
}
return objectList;
}
上記のソースで、SOQLによりDocumentオブジェクトを取得します。
後は、そのオブジェクトのBody部分を、以下のようにファイルとして書き出します。
private void writeDocumnets() throws ApplicationException,IOException{
File csvFile = null;
FileOutputStream writer = null;
List ctInfoList = sfSession.getDocuments();
try {
if (ctInfoList.size() iter = ctInfoList.iterator();
while(iter.hasNext()) {
Document _op = iter.next();
writer = new FileOutputStream(_op.getName());
writer.write(_op.getBody());
if (writer != null) {
writer.close();
}
}
} finally {
if (writer != null) {
writer.close(); }
}
}
ちなみに、Documentオブジェクトでは
一回のファイルアップロードに5Mのガバナ制限があるよう
で、5M以上のファイルをアップロードするとエラーメッセージが出たのですが、Chatterの添付ファイルにはそのような制限は無いという話も聞きました。