感謝のプログラミング 10000時間

たどり着いた結果(さき)は、感謝でした。

JNDIのサンプル作ってみた。

スポンサーリンク

プロフェッショナルJava サーバープログラミングの勉強中。

サービスプロバイダなしにJNDIを使うことはできない。
サービスプロバイダとはディレクトリサービスとの対話を可能にするJavaクラスのセットのっことである。

分散ネットワークとは、あるアプリケーションが実際に実行しているアプリケーションから離れたところにあるコードを使用するもの。

分散アーキテクチャは以下のようなものがある。
・RMI
・CORBA
・EJB
これらはレジストリサービスを提供する。
つまり、分散コードの場所を見つけるために使用する。


■LADPサーバをローカル(windowsマシン)に立てるためOpenLDAP
http://www.userbooster.de/en/download/openldap-for-windows.aspx

http://blog.livedoor.jp/k_urushima/archives/853561.html

OpenLDAP
デフォルトのポートは389。
SSLのポートは636となっている。


■Java EE SDKのダウンロード
http://www.oracle.com/technetwork/java/javaee/downloads/java-ee-sdk-6u3-downloads-439814.html

http://www.ne.jp/asahi/hishidama/home/tech/java/j2ee/index.html#インストール


LDAPサーバにJNDIで接続するサンプル。

package professional;

import java.util.Enumeration;
import java.util.Hashtable;

import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;

public class JNDISearch {
	public static String INITCTX = "com.sun.jndi.ldap.LdapCtxFactory";
	public static String MY_HOST = "ldap://localhost:389";
	public static String MY_SEARCHBASE = "dc=mydomain, dc=com";
	public static String MY_FILTER = "(sn=Carter)";
	
	public static void main(String[] args){
		
		try{
			Hashtable env = new Hashtable();
			
			//Contextはjavax.namingパッケージにあるインターフェース
			//String INITIAL_CONTEXT_FACTORY = "java.naming.factory.initial";
			//と定義されている。ここではJNDIプロバイダに使用するクラスを指定している。
			env.put(Context.INITIAL_CONTEXT_FACTORY, INITCTX);
			
			//String PROVIDER_URL = "java.naming.provider.url";
			//ディレクトリサービスに使用するホストとポート番号を指定する。
			env.put(Context.PROVIDER_URL, MY_HOST);
			
			//ディレクトリコンテキストへの参照を取得する。
			DirContext ctx = new InitialDirContext(env);
			
			//検索のスコープを指定する。
			SearchControls constraints = new SearchControls();
			
			//public final static int SUBTREE_SCOPE = 2;
			constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
			
			//実際の検索を実行する。検索ベース、フィルタ、検索のスコープを含む制約を与える。
			NamingEnumeration results = ctx.search(MY_SEARCHBASE, MY_FILTER,constraints);
			
			//検索の結果をたどってみる
			while(results != null && results.hasMore()) {
				SearchResult sr = (SearchResult) results.next();
				
				String dn = sr.getName();
				System.out.println("Distinguished Name is" + dn);
				
				Attributes attrs = sr.getAttributes();
				
				for(NamingEnumeration ne = attrs.getAll(); ne.hasMoreElements();){
					Attribute attr = (Attribute) ne.next();
					String attrID = attr.getID();
					
					System.out.println(attrID + ":");
					for(Enumeration vals = attr.getAll(); vals.hasMoreElements();) {
						System.out.println("\t" + vals.nextElement());
					}
				}
				System.out.println("\n");
			}
		
		}catch(Exception e){
			e.printStackTrace();
			System.exit(1);
		}
		
		
	}
}

実行結果は、そんなの無いよ、というもの。
探してくれたみたい。

javax.naming.AuthenticationNotSupportedException: [LDAP: error code 48 - Inappropriate Authentication]; remaining name 'dc=mydomain, dc=com'
	at com.sun.jndi.ldap.LdapCtx.mapErrorCode(LdapCtx.java:3058)
	at com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:3013)
	at com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:2820)
	at com.sun.jndi.ldap.LdapCtx.searchAux(LdapCtx.java:1829)
	at com.sun.jndi.ldap.LdapCtx.c_search(LdapCtx.java:1752)
	at com.sun.jndi.toolkit.ctx.ComponentDirContext.p_search(ComponentDirContext.java:368)
	at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.search(PartialCompositeDirContext.java:338)
	at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.search(PartialCompositeDirContext.java:321)
	at javax.naming.directory.InitialDirContext.search(InitialDirContext.java:248)
	at professional.JNDISearch.main(JNDISearch.java:45)

次はエントリの追加をやってみる。