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);
        }
    }
Comments:

Post a Comment:
Comments are closed for this entry.
About

yosshi

Search

Archives
« 4月 2014
  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
   
       
Today