LDAPコンテキストのディレクトリ配下全削除用コード
JNDI/LDAPによるエントリの削除は、ディレクトリを構成する
ノードの葉(一番最下層)から順に削除しなければなりません。
つまり、子ノードを持つエントリは直接削除することができないのです。
そこで、ノードの葉から順に再起的に削除する必要があるのですが、
下記は、指定したDN配下全てのエントリを再起的に削除するための
サンプルコードになります。。
赤線で示したコードが実際にLDAPサーバから削除するコードになります。
/**
* 指定したDN以下のノードを再起的に削除する。
*
* @param ctx ディレクトリコンテキスト
* @param dn 削除対象のルートノードのDN
*/
private void deleteAll (Context ctx,String dn) {
try {
NamingEnumeration list = ctx.listBindings(dn);
//現在のDNの配下にサブコンテキストが存在するか
while (list.hasMore()) {
Binding item = (Binding)list.next();
String className = item.getClassName();
String name = item.getName();
String subdn = name + “,” + dn;
Object o = item.getObject();
if (o instanceof javax.naming.Context){
Context subctx = (Context)o;
//さらにその下にサブコンテキストが存在するか
NamingEnumeration sublist = ctx.listBindings(subdn);
if(sublist.hasMore()){
//存在する場合、再起的呼び出し
deleteAll (ctx, subdn);
}else{
//存在しない場合、コンテキストを削除
ctx.destroySubcontext(subdn);
logger.info(“DN: ” + subdn + “is deleted from LDAP”);
}
}
}
ctx.destroySubcontext(dn);
logger.info(“DN: ” + dn + “is deleted from LDAP”);
}catch (NamingException ex) {
logger.error(“Failed to delete entry on LDAP”,ex);
}
}
Entry filed under: Java.