private static final String getQueryFilter(final LDAPDirectoryQuery _q) throws LDAPException {
   StringBuilder filter = new StringBuilder();
   while (_q.hasMoreConditions()) {
     Object _o = _q.nextCondition();
     if (_o instanceof LDAPDirectoryQuery) {
       filter.append(getQueryFilter((LDAPDirectoryQuery) _o));
     } else if (_o instanceof Object[]) {
       filter.append(getConditionFilter((Object[]) _o));
     }
   }
   if (_q.getType() == LDAPDirectoryQuery.OR) {
     if (_q.totalConditions() > 1) {
       filter.insert(0, "(|");
       filter.append(")");
     }
   } else {
     if (_q.totalConditions() > 1) {
       filter.insert(0, "(&");
       filter.append(")");
     }
   }
   return filter.toString();
 }
 private String getQueryString(final DirContext ctx, final LDAPDirectoryQuery q)
     throws NamingException, LDAPException {
   StringBuilder filter = new StringBuilder();
   while (q.hasMoreConditions()) {
     Object _condition = q.nextCondition();
     if (_condition instanceof LDAPDirectoryQuery) {
       filter.append(getQueryFilter((LDAPDirectoryQuery) _condition));
     } else if (_condition instanceof Object[]) {
       int type = ((Integer) ((Object[]) _condition)[0]).intValue();
       String value = (String) ((Object[]) _condition)[2];
       if (type == LDAPDirectoryQuery.BRANCH) {
         SearchControls ctls = new SearchControls();
         ctls.setSearchScope(LDAPConnection.ONE_SCOPE);
         NamingEnumeration<SearchResult> answer =
             ctx.search(baseDN, "(" + ((Object[]) _condition)[1] + "=" + value + ")", ctls);
         while (answer.hasMoreElements()) {
           SearchResult sr = answer.nextElement();
           baseDN = sr.getName() + "," + baseDN;
         }
       } else {
         filter.append(getConditionFilter(((Object[]) _condition)));
       }
     }
   }
   if (q.getType() == LDAPDirectoryQuery.OR) {
     if (q.totalConditions() > 1) {
       filter.insert(0, "(|");
       filter.append(")");
     }
   } else {
     if (q.totalConditions() > 1) {
       filter.insert(0, "(&");
       filter.append(")");
     }
   }
   return filter.toString();
 }