今日の思いつき
Microsoft の Share Point Server では、APIがストアドプロシージャの形で公開されていて、Java + JDBCでさくっと呼び出せます。例えば、「プリンシパルが属するShare Point グループの一覧取得」であれば「proc_SecListSiteGroupsContainingUser」を使えばOK。
public List<SiteGroup> getGroupsContainingUser ( String siteId, int uid ) throws SQLException { CallableStatement cs = null; List<SiteGroup> lists = new ArrayList<SiteGroup>(); try { // ストアドプロシージャを実行 cs = con.prepareCall("{call proc_SecListSiteGroupsContainingUser(?, ?)}"); cs.setString(1, siteId); cs.setInt( 2, uid ) ; cs.execute(); // 結果セットを読み込み ResultSet rs = cs.getResultSet(); while(rs.next()) { lists.add(new SiteGroup( rs.getInt( 1 ), rs.getString( 2 ))); } } catch(SQLException ex) { throw ex; } finally { try { if(null != cs) { cs.close(); } } catch(SQLException sx) { ; } } return lists; }
で、設計的に↑のようなメソッド一式を持った「Share Pointからデータを取ってくるためのDao」を用意するのは、まぁ、筋かなと思うわけですが、プロシージャがけっこうたくさんあるわけです。引数を渡す部分とかSQL文を生成するコードとか恐らく全てのメソッドで同じだし、なんとか共通化できないか。ということでプロキシとかどうでしょう。
イメージとしては
次のようなイータフェイスを用意しておいて、
class UserDao { /** * プリンシパルが属するShare Point グループの一覧を取得する * @param siteCollectionId サイトコレクションID * @param principalId プリンシパルID * @return Share Point グループの一覧 */ List<SiteGroup> getGroupsContainingUser ( String siteCollectionId, int principalId ) throws SQLException; }
以下のような感じでプロキシのインスタンスを生成/APIを実行すれば、メソッド名に対応するストアドプロシージャをコールして結果を返す、という仕組み。
UserDao dao = WSSProxy.create( UserDao.calss, "<データベースホスト>" ... ); String siteCollectionId = null; // 省略 int principalId = -1; // 省略 List<siteGroup> list = dao.getGroupsContainingUser( siteCollectionId, principalId );
- 接続先サーバー、データベース等はプロキシ作成時に渡す。
- 実行するプロシージャはデフォルトは「proc_<メソッド名>」形式とする。変更したい場合はアノテーションで明示。
- ストアドプロシージャの引数は、メソッドに与えられたモノをそのまま使用する。
メンドクサそうなのは、結果セットのコンバートかな。とりあえずList
と、思いつきはするものの
実際使う予定のAPIは10個くらいなので、元がとれるか微妙だよな。うーん。10個くらいならちまちま作った方が早いような。