Recuperando Atributos LDAP [Resolvido]

olá pessoal,

criei uma estrutura para testes no LDAP e estou tentando recuperar os atributos de um nó especifico.
Estou tentando recuperar o atributo MEMBER. Só que está vindo apenas o primeiro que está sendo criado no script. É possível retornar vários atributos com o mesmo nome? Se não, como criar a estrutura para armazenar, por exemplo, uma lista de valores.

O objetivo desta função é passar por parâmetro uma String, no caso o valor de algum MEMBER, e retornar o perfil de acordo com o nome.

Desde já agradeço.

Abaixo está o código e o script.

[code]public String searchUser(String userName){
try{
Hashtable env = new Hashtable();

	    String sp = "com.sun.jndi.ldap.LdapCtxFactory";
	    env.put(Context.INITIAL_CONTEXT_FACTORY, sp);		    
	    env.put(Context.PROVIDER_URL, ldapUrl);
	    
	    env.put(Context.SECURITY_AUTHENTICATION, "simple");
	    env.put(Context.SECURITY_PRINCIPAL, "uid=" + user + ",ou=system");
	    env.put(Context.SECURITY_CREDENTIALS, pass);
	    
	    DirContext dctx = new InitialDirContext(env);
	    
	    String base = "";

	    SearchControls sc = new SearchControls();
	    String[] attributeFilter = { "" };
	    sc.setReturningAttributes(attributeFilter);
	    sc.setSearchScope(SearchControls.SUBTREE_SCOPE);

	    String filter = "(objectClass=*)";
	    
	    NamingEnumeration results = dctx.search(base, filter, sc);
	    
	    while (results.hasMore()){
	    	
	    	SearchResult sr = (SearchResult) results.next();			    
	    	
	    	String _nameOfNode = sr.getName();
		    Attributes attrs = sr.getAttributes();  	     	  
		    	  
		    NamingEnumeration an = attrs.getAll();
		    
		    try{
		    	NamingEnumeration ab = attrs.getIDs();
		    	
		    	Attribute abc = attrs.get("member");
		    	System.out.println(abc.get());
		    }catch (Exception ertr){ertr.printStackTrace();}
		    
		    String _attributes = "";
		    	  
		    Vector<Attribute> vSource = new Vector<Attribute>();
		    
		    // NAO IMPORTA QTOS ATRIBUTOS TENHA, ELE PEGA APENAS O PRIMEIRO !!!! 
		    while (an.hasMoreElements()){
		    	try{
		    		Attribute a = (Attribute) an.next();
			    	//System.out.println(" 1 - " + a.get());
			    	//if (a.getID().toString().contains("member")){
			    		if (a.get().toString().contains(userName)){
			    			if (!_nameOfNode.toString().split(",")[0].contains(userName)){
			    				System.out.println(_nameOfNode.split(",")[0].split("=")[1]);
			    			}
			    			
			    		}
		    	}catch (Exception ert){ert.printStackTrace();}
		    
		    }		   
	    }
	}catch (Exception er){er.printStackTrace();}
	return "";
}[/code]
dn: dc=example,dc=com
objectClass: domain
objectClass: extensibleObject
objectClass: top
dc: example

dn: o=caixa_amb,dc=example,dc=com
objectClass: organization
o: caixa_amb

dn: ou=usuarios,o=caixa_amb,dc=example,dc=com
objectClass: organizationalUnit
ou: usuarios

dn: ou=useradmin,o=caixa_amb,dc=example,dc=com
objectClass: organizationalUnit
ou: useradmin

dn: ou=admin,o=caixa_amb,dc=example,dc=com
objectClass: organizationalUnit
ou: admin

dn: ou=aplicacoes,o=caixa_amb,dc=example,dc=com
objectClass: organizationalUnit
ou: aplicacoes

dn: ou=aplicacao01, ou=aplicacoes,o=caixa_amb,dc=example,dc=com
objectClass: organizationalUnit
ou: aplicacao01

dn: ou=simbrasil, ou=aplicacoes,o=caixa_amb,dc=example,dc=com
objectClass: organizationalUnit
ou: simbrasil

dn: ou=perfil_admin, ou=simbrasil, ou=aplicacoes,o=caixa_amb,dc=example,dc=com
objectClass: organizationalUnit
objectClass: extensibleObject
member: cn=Pedro, ou=usuarios, o=caixa_amb, dc=example, dc=com
member: cn=Cesar, ou=useradmin, o=caixa_amb, dc=example, dc=com 
member: cn=sa, ou=useradmin, o=caixa_amb, dc=example, dc=com
postalCode: 1234567
ou: perfil_admin

dn: ou=perfil_usuario, ou=simbrasil, ou=aplicacoes,o=caixa_amb,dc=example,dc=com
objectClass: organizationalUnit
postalCode: 98765432
ou: perfil_usuario

dn: ou=perfil_1, ou=aplicacao01, ou=aplicacoes,o=caixa_amb,dc=example,dc=com
objectClass: organizationalUnit
postalCode: 2222222
ou: perfil_1

dn: ou=perfil_2, ou=aplicacao01, ou=aplicacoes,o=caixa_amb,dc=example,dc=com
objectClass: organizationalUnit
postalCode: 111111
ou: perfil_2

dn: cn=Jose Carlos, ou=admin, o=caixa_amb, dc=example, dc=com
objectClass: organizationalPerson
cn: Jose Carlos
sn: Jose Carlos

dn: cn=Ze, ou=admin, o=caixa_amb, dc=example, dc=com
objectClass: organizationalPerson
cn: Ze
sn: Ze

dn: cn=Antonio, ou=usuarios, o=caixa_amb, dc=example, dc=com
objectClass: organizationalPerson
cn: Antonio
sn: Antonio

dn: cn=Pedro, ou=usuarios, o=caixa_amb, dc=example, dc=com
objectClass: organizationalPerson
cn: Pedro
sn: Pedro

dn: cn=sa, ou=useradmin, o=caixa_amb, dc=example, dc=com
objectClass: organizationalPerson
cn: sa
sn: sa

dn: cn=Cesar, ou=useradmin, o=caixa_amb, dc=example, dc=com
objectClass: organizationalPerson
cn: Cesar
sn: Cesar

Antes de tudo, só dando uma reforçada no conceito: o objeto não tem vários atributos MEMBER, e sim um atributo com vários valores.

Para tratar um atributo com multiplos valores você pode fazer o seguinte:

No lugar onde usou:

Attribute a = (Attribute) an.next(); //... mais codigo.... a.get() //.... //... mais codigo...
Utilize a.getAll() para retornar um enumeration com os valores do atributo, aí você itera nesse enumeration para encontrar o que deseja.

Se desejar saber de antemão se o atributo possui um ou diversos valores, utilize a.size() que retorna a quantidade.

Espero ter ajudado!

resolveu sim, vlw cara. Segue abaixo o código de como ficou.

[code]public String searchUser(String userName){
try{
Hashtable env = new Hashtable();

	    String sp = "com.sun.jndi.ldap.LdapCtxFactory";
	    env.put(Context.INITIAL_CONTEXT_FACTORY, sp);		    
	    env.put(Context.PROVIDER_URL, ldapUrl);
	    
	    env.put(Context.SECURITY_AUTHENTICATION, "simple");
	    env.put(Context.SECURITY_PRINCIPAL, "uid=" + user + ",ou=system");
	    env.put(Context.SECURITY_CREDENTIALS, pass);
	    
	    DirContext dctx = new InitialDirContext(env);
	    
	    String base = "";

	    SearchControls sc = new SearchControls();
	    String[] attributeFilter = { "" };
	    sc.setReturningAttributes(attributeFilter);
	    sc.setSearchScope(SearchControls.SUBTREE_SCOPE);

	    String filter = "(objectClass=*)";
	    
	    NamingEnumeration results = dctx.search(base, filter, sc);
	    
	    while (results.hasMore()){
	    	
	    	SearchResult sr = (SearchResult) results.next();			    
	    	
	    	String _nameOfNode = sr.getName();
		    Attributes attrs = sr.getAttributes();  	     	  
		    	  
		    NamingEnumeration an = attrs.getAll();
		    
		    String _attributes = "";			      
		    Vector<Attribute> vSource = new Vector<Attribute>();
		    
		    while (an.hasMoreElements()){
		    	try{
		    		Attribute a = (Attribute) an.next();
		    		for(int i=0; i< a.size(); i++){
		    			if (a.get(i).toString().contains("=" + userName)){
			    			if (!_nameOfNode.toString().split(",")[0].contains(userName)){
			    				System.out.println(_nameOfNode.split(",")[0].split("=")[1]);
			    			}				    			
			    		}
		    		}				    	
		    	}catch (Exception ert){}			    
		    }		   
	    }
	}catch (Exception er){er.printStackTrace();}
	return "";
}

[/code]