/*
* ====================
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2008-2009 Sun Microsystems, Inc. All rights reserved.
*
* The contents of this file are subject to the terms of the Common Development
* and Distribution License("CDDL") (the "License"). You may not use this file
* except in compliance with the License.
*
* You can obtain a copy of the License at
* http://IdentityConnectors.dev.java.net/legal/license.txt
* See the License for the specific language governing permissions and limitations
* under the License.
*
* When distributing the Covered Code, include this CDDL Header Notice in each file
* and include the License file at identityconnectors/legal/license.txt.
* If applicable, add the following below this CDDL Header, with the fields
* enclosed by brackets [] replaced by your own identifying information:
* "Portions Copyrighted [year] [name of copyright owner]"
* ====================
* "Portions Copyrighted 2014 ForgeRock AS"
*/
package org.identityconnectors.ldap.search;
import static org.identityconnectors.common.StringUtil.isNotBlank;
import java.io.IOException;
import java.util.List;
import javax.naming.NamingException;
import javax.naming.PartialResultException;
import javax.naming.directory.SearchControls;
import org.identityconnectors.framework.common.exceptions.ConnectorException;
import org.identityconnectors.ldap.LdapConnection;
import org.identityconnectors.ldap.LdapConnection.ServerType;
/**
* A class to perform an LDAP search against a {@link LdapConnection}.
*
* @author Andrei Badea
*/
public class LdapInternalSearch {
private final LdapConnection conn;
private final String filter;
private final List<String> baseDNs;
private final LdapSearchStrategy strategy;
private final SearchControls controls;
public LdapInternalSearch(LdapConnection conn, String filter, List<String> baseDNs, LdapSearchStrategy strategy, SearchControls controls) {
this.conn = conn;
this.filter = filter;
this.baseDNs = baseDNs;
this.strategy = strategy;
this.controls = controls;
}
public void execute(LdapSearchResultsHandler handler) {
String filter = blankAsAllObjects(this.filter);
try {
strategy.doSearch(conn, baseDNs, filter, controls, handler);
} catch (IOException e) {
throw new ConnectorException(e);
} catch (PartialResultException e) {
// AD issue: The default naming context on the DC is used as the baseContexts, hence this PartialResultException.
// Let's just silently catch it. It is thrown at the end of the search anyway...
if (!(ServerType.MSAD.equals(conn.getServerType()) || ServerType.MSAD_GC.equals(conn.getServerType()))) {
throw new ConnectorException(e);
}
} catch (NamingException e) {
throw new ConnectorException(e);
}
}
private static String blankAsAllObjects(String query) {
return isNotBlank(query) ? query : "(objectClass=*)";
}
public static SearchControls createDefaultSearchControls() {
SearchControls result = new SearchControls();
result.setCountLimit(0);
// Setting true to be consistent with the adapter. However, the
// comment in the adapter that this flag causes the referrals to be
// followed is wrong. Cf. http://java.sun.com/products/jndi/tutorial/ldap/misc/aliases.html.
result.setDerefLinkFlag(true);
result.setReturningObjFlag(false);
result.setTimeLimit(0);
return result;
}
public String getPagedResultsCookie() {
return strategy.getPagedResultsCookie();
}
public int getRemainingPagedResults() {
return strategy.getRemainingPagedResults();
}
}