2016-08-23 5 views
0

У меня есть иерархия с сотрудниками и менеджерами. У менеджера могут быть другие менеджеры под ним и т. Д. ... до последнего уровня, который является сотрудниками. Мне нужно то, что для конкретного менеджера я хочу, чтобы каждый менеджер и сотрудники под него, независимо от того, насколько высокий уровень существует под ним. Эти менеджеры и сотрудники приходят из LDAP. У каждого пользователя есть атрибут «менеджер» (который является идентификатором менеджера), и они идентифицированы благодаря их «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

Спасибо! Он отлично работает, я прочитал несколько уроков о рекурсии, и это действительно полезно –

Смежные вопросы