読者です 読者をやめる 読者になる 読者になる

forcedotcom/wscにプルリクエストを送ってみた

先日Qiitaにこんな記事を書きました。その続きです。

qiita.com

さて、変換仕様をwscを使ってアップロードするメソッドは2つあります。

  • void BulkConnection#createTransformationSpecFromStream(JobInfo, InputStream)
  • TransformationSpecRequest BulkConnection#createTransformationSpec(JobInfo)

Qiitaでは前者の方だけ紹介しました。
使い分けですが、それぞれのメソッドシグネチャを見ると想像がつく通り、CSVファイル(やその他何かしらのストリーム)がそのまま渡せる場合は前者を、プログラム的に変換仕様を渡したい場合は後者を使う、みたいな感じだと思います*1

後者の場合の利用例は以下のような感じ。

    TransformationSpecRequest specRequest = connection.createTransformationSpec(job);
    specRequest.addSpecRow("Name", "Full Name", "", "");
    specRequest.addSpecRow("Title", "Job Title", "", "");
    specRequest.addSpecRow("LeadSource", "Lead Source", "Import", "");
    specRequest.addSpecRow("Description", "", "Imported from XYZ.csv", "");
    specRequest.addSpecRow("Birthdate", "Date of Birth", "", "dd MMM yy");
    specRequest.completeRequest();

変換仕様は、データ項目の対応付け | Bulk API 開発者ガイド | Salesforce Developersでサンプルとして載っているspec.csvと同等のものです。

しかし、これがどうしてもエラーで動かず、最終的にwscのバグという結論に落ち着きました。
そこでコードを修正し、正常に期待した動きになるところまで確認したので、プルリクを送ってみました。

github.com

正直なところ、業務で使っているわけでもないので、別にマージされなくてもいいやと思ってはいるのですが、プルリクを送るまでの手順だけ、メモとして残しておこうと思います。
以下の流れです。
(追記:無事、マージされました。)

  1. forcedotcom/wsc を clone する
  2. clone してきたソースコードを修正する
  3. ビルド
  4. 動作確認用のコードにおいて、依存関係を修正し、Mavenリポジトリや(Salesforceからダウンロードしてきたものでなく)3. で自前ビルドしたjarを参照するようにする
  5. 期待する動作になることを確認
  6. プルリクを送る

このうち、 3. と 4. のところだけメモ。

3. wscのビルド

READMEの通りです(要Maven)。きちんと既存のテストがパスすることは確認します。

mvn clean package -Dgpg.skip

ビルドが成功すると、 target フォルダの下に force-wsc-35.2.6.jar のようなファイルが作られるので、これを使います。

4. 依存関係の修正

私はビルドにGradleを使っているので、元々、

dependencies {
    compile "com.force.api:force-wsc:35.2.7"
    compile "com.force.api:force-partner-api:35.0.1"
}

のようにしていたところを、

dependencies {
    compile files('/path/to/wsc/target/force-wsc-35.2.6.jar')
    compile ("com.force.api:force-partner-api:35.0.1") {
        transitive = false
    }
    compile 'org.antlr:ST4:4.0.7'
    compile 'org.codehaus.jackson:jackson-core-asl:1.9.13'
    compile 'org.codehaus.jackson:jackson-mapper-asl:1.9.13'
}

のように修正します。force-partner-apiがforce-wscに依存関係を持っているので、推移的な依存関係を無効にしつつ(transitive = true)、ST4やらjacksonやらの必要なものだけ別途追加してます。

修正内容

ちなみに修正内容ですが、10行程度の修正の中で3〜4つのバグを直した(つもり)です。

  • 書き込んでいるCSVの内容が正しくない(先頭の項目の頭に余計なカンマが入ったり、改行されていなかったり)
  • completeRequestで処理の成否を判定する時に、常にリクエスト失敗と判定される
  • CSVしか扱えないのに、 Transport#connect でZIPフラグがtrueで処理されている

*1: 正直、プログラム中で変換仕様を組み立てたい場合でもByteArrayInputStreamあたりを渡せば事足りますが…。