2014年12月25日
株式会社FLECT
小西俊司
 Heroku Postgres上のデータをSalesforceの外部オ
ブジェクトとして参照したいらしい
 ODataの細かい仕様がどうなっているのかという点に
は全く踏み込んでいない
◦ 所詮2,3日調べた程度なので多くを期待してはいけない
 Open Data Protocol
◦ http://www.odata.org/
◦ Microsoft が主導で推進しているらしい
 httpのREST APIだけでデータの参照・更新・削除を
行うための仕様
 SQLのhttp版くらいに思っておけばOKだと思う
◦ ↑というか、まさに今この程度の理解
◦ 具体的な検索条件やソートの指定の仕方等はなんとなく試し
てみた程度でちゃんと調べてはいない
 httpだけでデータを読み書きできることにつきる
 CORS(Cross Origin Resource Sharing)との組み
合わせを考えるとこんな状況もありえるかも?
◦ 近年色々な鉄道会社が時刻表や電車の遅延情報などをAPI
で提供し始めている(気がする)
◦ しかし、それぞれの鉄道会社はAPIはRESTではあっても全部
独自形式(知らないけど多分)
◦ 各社のAPIはCORSには対応していないのでブラウザから直
接は叩けず、サーバで実行するしかない(に違いない)
◦ CORSとODataがサポートされればブラウザから直接各社の
データに統一規格でアクセスできるのサーバ不要でアプリが
作れる(公開先はもはやGitHub.ioで良いですね(^^v)
 まぁ希望なんで当分なさそうではあるけど
 V1からV4まであるらしい
◦ V4は近日正式リリース予定らしい
 どこが変わったのかは知らないけど、多分できること
が増えているのであろう
 現在広く使われているバージョンはV2
◦ かどうかは確信が無いが、とりあえずSalesforceの外部デー
タ参照でサポートされているのはV2のみ
◦ V4も近い将来サポートされるらしい
 http://www.odata.org/libraries/
 MS主導のため.NETのライブラリが一番充実している
 Javaのライブラリで有力なのは以下の二つ
◦ Apache Olingo
 V2 and V4
 サーバ/クライアント両対応
◦ odata4j
 V1 – V3
 サーバ/クライアント両対応
 odata4jはコミットログを見る限り停滞しているように
見えるので、Olingoを使うのが良さげ
 一部クラスがServlet API依存なので、Play等の非
Servletから扱うのはしんどい
◦ やりかけたけど途中であきらめました。
 ライブラリの完成度はやや怪しいかも。。。(--
◦ 2,3日の評価なんで何とも言えないけど(後述)
V4はまったく未検証
 https://github.com/shunjikonishi/odata-
producer
 Olingoで作成したOData Producer
◦ JPAのエンティティを作成することでテーブルをODataとして
公開出来る
◦ サンプルデータとして、Car, Makerという二つのテーブルと
テストデータを生成する
◦ ベーシック認証対応
 サンプルはHeroku上で公開されているので以下の
URLにアクセス
◦ BasicAuth: test/password
◦ http://flect-odata-test.herokuapp.com/odata
◦ http://flect-odata-test.herokuapp.com/odata/$metadata
◦ http://flect-odata-test.herokuapp.com/odata/Cars
◦ http://flect-odata-test.herokuapp.com/odata/Cars(1)
◦ http://flect-odata-
test.herokuapp.com/odata/Cars?$filter=Car_name%20eq%2
0%27LEGACY%27
 設定 > 開発 > External Data Sources
 設定項目
◦ サーバURL: OData ProducerのURL
(Ex. https://flect-odata-test.herokuapp.com/odata)
◦ 種別: OData 2.0
◦ 形式: AtomPub
◦ Basic認証を設定した場合以下の認証設定が必要
◦ ID種別: 指定ユーザ
◦ 認証プロトコル: パスワード認証
◦ ユーザ名とパスワード
 設定 > 開発 > 外部オブジェクト
◦ 外部データソースを指定する以外は通常のカスタムオブジェ
クトとあまり変わらない
◦ API参照名には「__x」が付加される
◦ 作成直後は外部IDと表示URLだけが項目として設定されて
おり、各フィールドは手動でカスタム項目として追加する必要
がある
 データ型等を指定できる
 大文字小文字の差異に注意($metadataでフィールド名を確認
しながら設定を行うと良い)
◦ 他の外部オブジェクトや標準/カスタムオブジェクトに対して
参照関係が設定できる
 多分、通常の参照/親子関係と同じ感覚で使用できると思う
 Car#maker_id -> Maker#maker_idの参照関係
を設定した例(デフォルトのまま)
 サブクエリ等も使えるがSOQLとして正しくてもエラー
となるケースもあるらしい
 成功するクエリの例
◦ SELECT
car_name__c,
maker__r.maker_name__c
FROM car__x
WHERE maker__r.maker_name__c = 'HONDA’
 EXTERNAL_OBJECT_UNSUPPORTED_EXCEPTION
◦ LIKE検索で発生
◦ ODataのfilterにLIKE構文はない
 QUERY_TOO_COMPLICATED
◦ 参照テーブルにLIKE構文を使用したらエラーコードが変わっ
た
◦ これもfilterの制限と思われる
原理的にODataでサポートしていない検索はできないはず
 http://flect-odata-
test.herokuapp.com/odata/Cars?$filter=inde
xof(Car_name, ‘WING’) eq 0
仕様にあるfilterのindexofとか実装されていない。
ただし、SalesforceからのOdata APIのキックでOlingo側の
未実装が問題となるケースには遭遇していない
 External Datasourceの設定画面にこんな項目がある
 多分filterのカスタム関数を自前で作ればそれが使えるんだと
思う
 この辺を参考にすれば実装できそう
 http://olingo.apache.org/doc/odata2/tutorials/Olingo_T
utorial_AdvancedRead_FilterVisitor.html
 必要に迫られれば作る(PullRequest歓迎)
 https://github.com/shunjikonishi/odata-
producer をフォーク
 環境変数DATABASE_URLに接続先のPostgreSQLの
URLを定義
◦ 現在はPostgreSQL固定になっているので、MySQL等を使う場合
はHerokuEntityManagerFactoryとpersistense.xmlの修正が
必要
 サンプルエンティティ(src/…/entities/*.java)を削除
 公開したいエンティティをentities以下に定義
 いじょ
◦ ローカルでの動作確認はrun.sh(run.bat)でできます。
◦ Herokuで動かす場合は環境変数「APP_OPTS」でBASIC認証が
設定できます。
 JPAのエンティティとして定
義する
◦ Lombokが入っているので
getter/setterは不要
 余計な修飾は一切いらな
い
◦ OneToManyとか
ManyToOneとかは
Salesforce側で解決される
ので不要
◦ 下手に付けるとOlingoがエ
ラーで落ちることがある
◦ @Columnでフィールド名を
変更しても良いけど
Salesforce側でも設定でき
るのであまり意味はない
 紆余曲折あったが、結局のところ公式ドキュメント
(http://olingo.apache.org/doc/odata2/index.htm
l)のJPAの章ほぼそのままで動いた
 ただしデフォルトでは例外発生時にStackTraceがでない
のでそこだけは手を入れた方が良い
◦ MyODataJPAServiceFactory#getCallback参照
◦ 当初OneToManyの定義が書き方によって動かなくて、原因を特
定するのにえらい苦労した
 フックポイントは多いので多分何でもできるはず
◦ ODataの仕様書をちゃんと読めばね。。。。
◦ ちょいちょいNot implementedを見かけるがそれも自力で解決で
きると思われる
 ちゃんと使おうと思ったら絶対ソースは読むべき(基本)
 とりあえずSalesforceから参照可能なODataProducerを
作るだけなら難しくはない
◦ 現状一番の問題はLIKEが使えないこと
◦ 認証がBASIC認証だけで良いかは課題
 HerokuのOAuthを使っても良いけどあんまり意味が無い気がする
◦ パフォーマンス、実用性などは実案件に即した検証が必要
 V4の今後がどうなるかは謎なので現状V2でどこまで作り
込むべきかは不明
◦ 1年以内にV4が来るならV2での実装は不要と思う
◦ しかしOlingoのV4ドキュメントは現状ほとんどない。。。(--
 OData自体はSalesforceと関係なくWatchする価値のあ
る技術

Salesforce連携のためのOData入門