Hari Krishna
Hari Krishna

Reputation: 3538

JNDI: How to use Logical not query to search LDAP

I am facing problem while applying logical not query.

For example,

NamingEnumeration<SearchResult> results =
    context.search("ou=people,dc=example,dc=com", "sn=Kumaran", searcCon);

Above statement is working absolutely fine, it is returning all the person entries whose sn is Kumaran.

Suppose that I change the statement to get all the person entries whose sn is not Kumaran.

NamingEnumeration<SearchResult> results =
   context.search("ou=people,dc=example,dc=com", "(!sn=Kumaran)", searcCon);

I am getting following error:

Exception in thread "main" javax.naming.directory.InvalidSearchFilterException: Unbalanced parenthesis; remaining name 'ou=people,dc=example,dc=com'
    at com.sun.jndi.ldap.Filter.findRightParen(Filter.java:694)
    at com.sun.jndi.ldap.Filter.encodeFilterList(Filter.java:733)
    at com.sun.jndi.ldap.Filter.encodeComplexFilter(Filter.java:657)
    at com.sun.jndi.ldap.Filter.encodeFilter(Filter.java:118)
    at com.sun.jndi.ldap.Filter.encodeFilterString(Filter.java:74)
    at com.sun.jndi.ldap.LdapClient.search(LdapClient.java:548)
    at com.sun.jndi.ldap.LdapCtx.doSearch(LdapCtx.java:1985)
    at com.sun.jndi.ldap.LdapCtx.searchAux(LdapCtx.java:1844)
    at com.sun.jndi.ldap.LdapCtx.c_search(LdapCtx.java:1769)
    at com.sun.jndi.toolkit.ctx.ComponentDirContext.p_search(ComponentDirContext.java:392)
    at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.search(PartialCompositeDirContext.java:358)
    at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.search(PartialCompositeDirContext.java:341)
    at javax.naming.directory.InitialDirContext.search(InitialDirContext.java:267)
    at jndi_tutorial.Test.getPeopleSnIsKumaran(Test.java:34)
    at jndi_tutorial.Test.main(Test.java:62)

Following is my code

public static void printResults(NamingEnumeration<SearchResult> results)
            throws NamingException {
        while (results.hasMoreElements()) {
            SearchResult res = results.next();
            Attributes atbs = res.getAttributes();
            Attribute nameAttr = atbs.get("cn");
            String name = (String) nameAttr.get();

            Attribute descriptionAtr = atbs.get("description");
            String description = (String) descriptionAtr.get();
            System.out.println(description);

            System.out.println("Name is :" + name + ",description is :"
                    + description);

        }
    }

/* Get all people whose sn is not equal to Kumaran */
    public static void getAllExcludeKumaran() throws NamingException {
        SearchControls searcCon = new SearchControls();
        searcCon.setSearchScope(SearchControls.SUBTREE_SCOPE);
        NamingEnumeration<SearchResult> results = context.search(
                "ou=people,dc=example,dc=com", "(!(sn=Kumaran))", searcCon);
        printResults(results);
    }

Reference

https://technet.microsoft.com/en-us/library/aa996205(v=exchg.65).aspx

Upvotes: 2

Views: 1814

Answers (2)

Kulbhushan Singh
Kulbhushan Singh

Reputation: 625

See RFC 2254:

filter ::= "(" filtercomp ")"

not ::= "!" filter

Your code should be like

context.search("ou=people,dc=example,dc=com", "((!sn=Kumaran))", searcCon);

It should work for you.

Upvotes: 0

Sergey Gornostaev
Sergey Gornostaev

Reputation: 7777

Try to add parenthesis (!(sn=Kumaran))

UPDATE:

Try this

...
SearchControls searcCon = new SearchControls();
String[] attributeFilter = { "cn", "description" };
searcCon.setReturningAttributes(attributeFilter);
searcCon.setSearchScope(SearchControls.SUBTREE_SCOPE);
...

Upvotes: 3

Related Questions