2016-08-23 6 views
0

私には従業員と管理者の階層があります。マネージャーは、従業員である最後のレベルまで、彼の下に他のマネージャーを持つことができます。私が必要とするのは、特定のマネージャのためには、彼の下にどれだけのレベルがあるにせよ、すべてのマネージャと従業員を彼の下に置くことです。これらのマネージャーと従業員はLDAPから来ています。各ユーザーには「マネージャ」というID(マネージャのID)という属性があり、それらは「uid」によって識別されます階層の最後の要素に達する

今のところ、マネージャとその下の従業員からすべてのマネージャを取得できます私は最初のマネージャーの下にレベルの数を知らずにそれを行う方法を知らない。ここに私が持っているものがあります:

public static ArrayList<String> getUsersByManager(String str) throws NamingException{ 
    String baseDN = "ou=Internal,ou=People,o=group"; 
    ArrayList<String> list = new ArrayList<String>(); 
    ArrayList<String> list2 = new ArrayList<String>(); 
    SearchControls sc = new SearchControls(); 
    String[] attributeFilter = {"uid"}; 
    sc.setReturningAttributes(attributeFilter); 
    sc.setSearchScope(SearchControls.SUBTREE_SCOPE); 
    String filter = "(&(manager=uid="+str+",ou=Internal,ou=People,o=Group))"; 
    DirContext contexte = Connexion(); 
    NamingEnumeration results = contexte.search(baseDN, filter, sc); 
    while(results.hasMore()){ 
     SearchResult sr = (SearchResult) results.next(); 
     Attributes attrs = sr.getAttributes(); 
     list.add(attrs.get("uid").get().toString()); 
     list2.add(attrs.get("uid").get().toString()); 
    } 
    for(String s : list){ 
     filter = "(&(manager=uid="+s+",ou=Internal,ou=People,o=Group))"; 
     NamingEnumeration result = contexte.search(baseDN, filter, sc); 
     while(result.hasMore()){ 
      SearchResult search = (SearchResult) result.next(); 
      Attributes attr = search.getAttributes(); 
      list2.add(attr.get("uid").get().toString()); 
     } 
    } 
    contexte.close(); 
    return list2; 
    } 

あなたはどうすればいいですか教えてください。

+0

解決策は再帰と呼ばれます。あなたがそれについて知らないならば、それはややこしい、しかし学ぶことができます。そしてあなたがそれをつかんだら、あなたはおそらくそれを愛するでしょう。再帰に関するチュートリアルを見つけてください。 –

+0

@ OleV.V。さて、ありがとう、私はこれをチェックします、あなたは良いチュートリアルを開始していますか? –

+0

本当にありません。私はWWWの存在前に大学でこのことを学んだ。 –

答えて

0

これはコンパイルもテストもされていません(私はConnextionメソッドも、テストするLDAPサーバーもありません)。私はそれがあなたを始めることを望む。コードを理解するために、再帰については読んでおくべきです。

public static ArrayList<String> getUsersByManager(String manager) throws NamingException { 
    String baseDN = "ou=Internal,ou=People,o=group"; 
    ArrayList<String> list = new ArrayList<String>(); 
    SearchControls sc = new SearchControls(); 
    String[] attributeFilter = { "uid" }; 
    sc.setReturningAttributes(attributeFilter); 
    sc.setSearchScope(SearchControls.SUBTREE_SCOPE); 
    String filter = "(&(manager=uid=" + manager + ",ou=Internal,ou=People,o=Group))"; 
    DirContext contexte = Connexion(); 
    NamingEnumeration results = contexte.search(baseDN, filter, sc); 
    while (results.hasMore()) { 
     SearchResult sr = (SearchResult) results.next(); 
     Attributes attrs = sr.getAttributes(); 
     String user = attrs.get("uid").get().toString(); 
     list.add(user); 
     // recursive call: 
     ArrayList<String> usersManaged = getUsersByManager(user); 
     list.addAll(usersManaged); 
    } 
    contexte.close(); 
    return list; 
} 
+0

ありがとうございます!それは完全に動作します、私は再帰についてのチュートリアルを読んだことがあります –

関連する問題