/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
* or http://forgerock.org/license/CDDLv1.0.html.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at legal-notices/CDDLv1_0.txt.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information:
* Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*
*
* Copyright 2010 Sun Microsystems, Inc.
* Portions copyright 2012-2015 ForgeRock AS.
*/
package org.opends.server.protocols.internal;
import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.Set;
import org.forgerock.opendj.ldap.DereferenceAliasesPolicy;
import org.forgerock.opendj.ldap.SearchScope;
import org.forgerock.util.Reject;
import org.opends.server.types.Control;
import org.opends.server.types.DN;
import org.opends.server.types.DirectoryException;
import org.opends.server.types.SearchFilter;
/**
* Search request implementation.
*
* @see org.forgerock.opendj.ldap.requests.SearchRequest
*/
public final class SearchRequest extends AbstractRequestImpl {
/** Use a LinkedHashSet to return the attributes in the same order as requested by the user. */
private final Set<String> attributes = new LinkedHashSet<>();
private DereferenceAliasesPolicy dereferenceAliasesPolicy = DereferenceAliasesPolicy.NEVER;
private SearchFilter filter;
private DN name;
private SearchScope scope;
private int sizeLimit;
private int timeLimit;
private boolean typesOnly;
/**
* To be removed.
*
* @param name
* the dn
* @param scope
* the search scope
* @param filter
* the search filter
*/
SearchRequest(final DN name, final SearchScope scope, final SearchFilter filter) {
this.name = name;
this.scope = scope;
this.filter = filter;
}
/**
* To be removed.
*
* @param attributeDescriptions
* the attribute descriptions
* @return the current object
* @see org.forgerock.opendj.ldap.requests.SearchRequest#addAttribute(String...)
*/
public SearchRequest addAttribute(final String... attributeDescriptions) {
for (final String attributeDescription : attributeDescriptions) {
attributes.add(Reject.checkNotNull(attributeDescription));
}
return this;
}
/**
* To be added to {@link org.forgerock.opendj.ldap.requests.SearchRequest}?
*
* @param attributeDescriptions
* the attribute descriptions
* @return the current object
*/
public SearchRequest addAttribute(final Collection<String> attributeDescriptions) {
for (final String attributeDescription : attributeDescriptions) {
attributes.add(Reject.checkNotNull(attributeDescription));
}
return this;
}
/**
* To be removed.
*
* @return the attributes
* @see org.forgerock.opendj.ldap.requests.SearchRequest#getAttributes()
*/
public Set<String> getAttributes() {
return attributes;
}
/**
* To be removed.
*
* @return the dereference aliases policy
* @see org.forgerock.opendj.ldap.requests.SearchRequest#getDereferenceAliasesPolicy()
*/
public DereferenceAliasesPolicy getDereferenceAliasesPolicy() {
return dereferenceAliasesPolicy;
}
/**
* To be removed.
*
* @return the search filter
* @see org.forgerock.opendj.ldap.requests.SearchRequest#getFilter()
*/
public SearchFilter getFilter() {
return filter;
}
/**
* To be removed.
*
* @return the DN
* @see org.forgerock.opendj.ldap.requests.SearchRequest#getName()
*/
public DN getName() {
return name;
}
/**
* To be removed.
*
* @return the search scope
* @see org.forgerock.opendj.ldap.requests.SearchRequest#getScope()
*/
public SearchScope getScope() {
return scope;
}
/**
* To be removed.
*
* @return the size limit
* @see org.forgerock.opendj.ldap.requests.SearchRequest#getSizeLimit()
*/
public int getSizeLimit() {
return sizeLimit;
}
/**
* To be removed.
*
* @return is single entry search
* @see org.forgerock.opendj.ldap.requests.SearchRequest#isSingleEntrySearch()
*/
public boolean isSingleEntrySearch() {
return sizeLimit == 1 || SearchScope.BASE_OBJECT.equals(scope);
}
/**
* To be removed.
*
* @return the time limit
* @see org.forgerock.opendj.ldap.requests.SearchRequest#getTimeLimit()
*/
public int getTimeLimit() {
return timeLimit;
}
/**
* To be removed.
*
* @return the types only
* @see org.forgerock.opendj.ldap.requests.SearchRequest#isTypesOnly()
*/
public boolean isTypesOnly() {
return typesOnly;
}
/**
* To be removed.
*
* @param policy the dereference aliases policy
* @return the current request
* @see org.forgerock.opendj.ldap.requests.SearchRequest#setDereferenceAliasesPolicy(DereferenceAliasesPolicy)
*/
public SearchRequest setDereferenceAliasesPolicy(final DereferenceAliasesPolicy policy) {
Reject.ifNull(policy);
this.dereferenceAliasesPolicy = policy;
return this;
}
/**
* To be removed.
*
* @param filter the search filter
* @return the current request
* @see org.forgerock.opendj.ldap.requests.SearchRequest#setFilter(org.forgerock.opendj.ldap.Filter)
*/
public SearchRequest setFilter(final SearchFilter filter) {
Reject.ifNull(filter);
this.filter = filter;
return this;
}
/**
* To be removed.
*
* @param filter the search filter
* @return the current request
* @throws DirectoryException if problem occurs
* @see org.forgerock.opendj.ldap.requests.SearchRequest#setFilter(String)
*/
public SearchRequest setFilter(final String filter) throws DirectoryException {
this.filter = SearchFilter.createFilterFromString(filter);
return this;
}
/**
* To be removed.
*
* @param dn the dn
* @return the current request
* @see org.forgerock.opendj.ldap.requests.SearchRequest#setName(org.forgerock.opendj.ldap.DN)
*/
public SearchRequest setName(final DN dn) {
Reject.ifNull(dn);
this.name = dn;
return this;
}
/**
* To be removed.
*
* @param dn the dn
* @return the current request
* @throws DirectoryException if problem occurs
* @see org.forgerock.opendj.ldap.requests.SearchRequest#setName(String)
*/
public SearchRequest setName(final String dn) throws DirectoryException {
Reject.ifNull(dn);
this.name = DN.valueOf(dn);
return this;
}
/**
* To be removed.
*
* @param scope the search scope
* @return the current request
* @see org.forgerock.opendj.ldap.requests.SearchRequest#setScope(SearchScope)
*/
public SearchRequest setScope(final SearchScope scope) {
Reject.ifNull(scope);
this.scope = scope;
return this;
}
/**
* To be removed.
*
* @param limit the size limit
* @return the current request
* @see org.forgerock.opendj.ldap.requests.SearchRequest#setSizeLimit(int)
*/
public SearchRequest setSizeLimit(final int limit) {
Reject.ifFalse(limit >= 0, "negative size limit");
this.sizeLimit = limit;
return this;
}
/**
* To be removed.
*
* @param limit the time limit
* @return the current request
* @see org.forgerock.opendj.ldap.requests.SearchRequest#setTimeLimit(int)
*/
public SearchRequest setTimeLimit(final int limit) {
Reject.ifFalse(limit >= 0, "negative time limit");
this.timeLimit = limit;
return this;
}
/**
* To be removed.
*
* @param typesOnly the types only
* @return the current request
* @see org.forgerock.opendj.ldap.requests.SearchRequest#setTypesOnly(boolean)
*/
public SearchRequest setTypesOnly(final boolean typesOnly) {
this.typesOnly = typesOnly;
return this;
}
@Override
public SearchRequest addControl(Control control) {
super.addControl(control);
return this;
}
@Override
public SearchRequest addControl(Collection<Control> controls) {
super.addControl(controls);
return this;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder();
sb.append(getClass().getSimpleName());
sb.append("(name=").append(getName());
sb.append(", scope=").append(getScope());
sb.append(", filter=").append(getFilter());
sb.append(", dereferenceAliasesPolicy=").append(getDereferenceAliasesPolicy());
if (getSizeLimit()!=0) {
sb.append(", sizeLimit=").append(getSizeLimit());
}
if (getTimeLimit()!=0) {
sb.append(", timeLimit=").append(getTimeLimit());
}
sb.append(", typesOnly=").append(isTypesOnly());
if (!getAttributes().isEmpty()) {
sb.append(", attributes=").append(getAttributes());
}
if (!getControls().isEmpty()) {
sb.append(", controls=").append(getControls());
}
sb.append(")");
return sb.toString();
}
}