2016-08-23 86 views
0

我擁有員工和經理的層次結構。經理可以讓他下屬的其他經理等......直到員工的最後一級。我需要的是,對於一個特定的經理,我想要讓他下面的每個經理和員工,不管他有多高。這些經理和員工來自LDAP。每個用戶都有一個名爲「manager」的屬性(這是管理員的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

謝謝!它完美的工作,我讀過一些關於遞歸的教程,它非常有用 –

相關問題