2009年12月5日土曜日

JNDI / LDAP

RMI とJNDI との連携を試してみたいが、その前に 普通の Serializeable なオブジェクトを JNDI に登録する方法を確認したい。以下、JNDI を使って、HashMap オブジェクトを LDAP コンテキストに登録した記録。 (Cygwin の OpenLDAP を動かすやり方と、ここで使っている LDAP設定は前ポスト参照) 以下の試行では、Eclipse 3.5 Galileo から JUnit 4を使って、@Test メソッドを個別に実行する方法でやってみた。(@Test メソッドごとに実行するやり方は、Eclipse の Outline ビューでメソッドを選択して、コンテキストメニューから [Run As]/ [JUnit Test]。) コードは以下のようなものを用いた。
import ・・・略

public class App {
  private static Context ctx = null;
  
  @BeforeClass
  public static void connect() throws Exception {
    Hashtable<String, String> env = new Hashtable<String, String>(11);
    env.put(Context.INITIAL_CONTEXT_FACTORY,
        "com.sun.jndi.ldap.LdapCtxFactory");
    env.put(Context.PROVIDER_URL, "ldap://localhost:389/o=JNDITest,dc=example,dc=com");
    env.put(Context.SECURITY_AUTHENTICATION, "simple");
    env.put(Context.SECURITY_PRINCIPAL, "cn=Manager,dc=example,dc=com");
    env.put(Context.SECURITY_CREDENTIALS, "secret");

    ctx = new InitialContext(env);
  }
  @AfterClass
  public static void closeContext() throws Exception {
    if (null != ctx) ctx.close();
  }
  @Test
  public void bind() throws Exception {
    Map<String, String> map = new HashMap<String, String>();
    map.put("keyA", "valueA");
    ctx.bind("cn=map", map);
  }
  @SuppressWarnings("unchecked")
  @Test
  public void lookup() throws Exception {
    Map<String, String> map = (Map<String, String>) ctx.lookup("cn=map");
    assertEquals("valueA", map.get("keyA"));
  }
  @Test
  public void unbind() throws Exception {
    ctx.unbind("cn=map");
  }
}
これを以下の手順で動かして、どうなるか観察する。
  • まず lookup() を実行する。未登録なので NamingException が発生する事を確認
  • 次に bind() を実行し、例外が出ない事を確認。また実際に o=JNDITest の下に cn=map エントリが作られている事を、LDAP Admin で確認
  • 再び lookup() を実行し、今度は例外も無く assertEquals が成功する事を確認
  • 最後に unbind() を実行。例外無く終了し、LDAP Admin でみると cn=map エントリが消えている事を確認
これで RMI とJNDI の組み合わせを試す準備ができた。

0 件のコメント:

コメントを投稿