Recent Posts

RSS Feeds

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

Permalink     No Comments
Track Back :




Post a Comment:
Comments are closed for this entry.