/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright (c) 2005 Sun Microsystems Inc. All Rights Reserved
*
* The contents of this file are subject to the terms
* of the Common Development and Distribution License
* (the License). You may not use this file except in
* compliance with the License.
*
* You can obtain a copy of the License at
* https://opensso.dev.java.net/public/CDDLv1.0.html or
* opensso/legal/CDDLv1.0.txt
* See the License for the specific language governing
* permission and limitations under the License.
*
* When distributing Covered Code, include this CDDL
* Header Notice in each file and include the License file
* at opensso/legal/CDDLv1.0.txt.
* If applicable, add the following below the CDDL Header,
* with the fields enclosed by brackets [] replaced by
* your own identifying information:
* "Portions Copyrighted [year] [name of copyright owner]"
*
* $Id: SearchControl.java,v 1.5 2009/01/28 05:34:51 ww203982 Exp $
*
* Portions Copyright 2015 ForgeRock AS.
*/
package com.iplanet.ums;
import java.util.Hashtable;
import org.forgerock.opendj.ldap.SearchScope;
/**
* This class provides a way to customize Search behaviors. Common behaviors are
* time limit, result limit and Virtual list view. In future, we will provide
* ways for client to define different hierarchical tree through SearchControl.
*
* @supported.api
*/
public class SearchControl implements java.io.Serializable {
private static final long serialVersionUID = -8755868973524858945L;
static final String KeyVlvRange = "vlvRange";
static final String KeyVlvJumpTo = "vlvJumpTo";
static final String KeyTimeOut = "timeOut";
static final String KeySortKeys = "sortKeys";
static final String KeyMaxResults = "maxResults";
static final String KeySearchScope = "searchScope";
static final int DEFAULT_MAX_RESULTS = 0;
static final int DEFAULT_TIMEOUT = 0;
// Disabled by default
private static boolean getAllAttributesEnabled = false;
/**
* Search scope for one level. You use this search scope in getting
* immediate children of a container. This is the default search scope in
* getChildren method in search API. One can use
* SearchControl.setSearchScope to override the default search scope in
* getChildren.
*
* @supported.api
*/
public static final int SCOPE_ONE = SearchScope.SINGLE_LEVEL.intValue();
/**
* Search scope for subtree level. This scope is used as the default search
* scope in the search API. One can use SearchControl.setSearchScope to
* override the default search scope in search methods.
*
* @supported.api
*/
public static final int SCOPE_SUB = SearchScope.WHOLE_SUBTREE.intValue();
/**
* Search scope for just this object.
*
* @supported.api
*/
public static final int SCOPE_BASE = SearchScope.BASE_OBJECT.intValue();
/**
* Set sort order based on attribute names.
*
* @param attributeNames
* array of attribute names to sort on
* @supported.api
*/
public void setSortKeys(String[] attributeNames) {
SortKey[] sortKeys;
if (attributeNames == null)
return;
sortKeys = new SortKey[attributeNames.length];
for (int i = 0; i < sortKeys.length; i++) {
sortKeys[i] = new SortKey();
sortKeys[i].attributeName = attributeNames[i];
sortKeys[i].reverse = false;
}
set(KeySortKeys, sortKeys);
}
/**
* Set sort order based on SortKey
*
* @param sortKeys
* array of SortKey.
* @supported.api
*/
public void setSortKeys(SortKey[] sortKeys) {
set(KeySortKeys, sortKeys);
}
/**
* Get existing attribute names for sorting.
* @supported.api
*/
public SortKey[] getSortKeys() {
return (SortKey[]) get(KeySortKeys);
}
/**
* Set range for retrieving VLV data.
*
* @param startIndex
* starting position
* @param beforeCount
* Number of entries before the startIndex
* @param afterCount
* Number of entries after the startIndex.
* @supported.api
*/
public void setVLVRange(int startIndex, int beforeCount, int afterCount) {
int[] range = new int[3];
range[0] = startIndex;
range[1] = beforeCount;
range[2] = afterCount;
set(KeyVlvRange, range);
}
/**
* Set range for retrieving VLV data.
*
* @param jumpTo
* Search expression defining the result set return
* @param beforeCount
* Number of entries before the startIndex
* @param afterCount
* Number of entries after the startIndex.
* @supported.api
*/
public void setVLVRange(String jumpTo, int beforeCount, int afterCount) {
int[] range = new int[3];
range[0] = 0;
range[1] = beforeCount;
range[2] = afterCount;
set(KeyVlvJumpTo, jumpTo);
set(KeyVlvRange, range);
}
/**
* Get range for current VLV setting.
*
* @return array of int which contain startIndex, beforeCount and
* afterCount.
* @supported.api
*/
public int[] getVLVRange() {
return (int[]) get(KeyVlvRange);
}
/**
* Get jumpTo value for VLV range.
*
* @return jumpTo value.
* @supported.api
*/
public String getVLVJumpTo() {
return (String) get(KeyVlvJumpTo);
}
/**
* Sets the maximum number of milliseconds to wait for any operation for the
* search.
*
* @param timeOut
* Max number of milliseconds.
* @supported.api
*/
public void setTimeOut(int timeOut) {
set(KeyTimeOut, new Integer(timeOut));
}
/**
* Get current time out setting.
* @supported.api
*/
public int getTimeOut() {
Integer i = (Integer) get(KeyTimeOut);
if (i == null) {
return DEFAULT_TIMEOUT;
} else {
return i.intValue();
}
}
/**
* Sets the maximum number of search results to return; 0 means there is no
* limit.
* @supported.api
*/
public void setMaxResults(int maxNumber) {
set(KeyMaxResults, new Integer(maxNumber));
}
/**
* Gets the maximum number of search results to return. return 0 means there
* is no limit.
* @supported.api
*/
public int getMaxResults() {
Integer i = (Integer) get(KeyMaxResults);
if (i == null) {
return DEFAULT_MAX_RESULTS;
} else {
return i.intValue();
}
}
/**
* Sets the search scope in SearchControl.
*
* @param scope
* Search scope defined in the SearchControl to be used with the
* search API.
* @supported.api
*/
public void setSearchScope(int scope) {
set(KeySearchScope, new Integer(scope));
}
/**
* Gets the search scope defined in the SearchControl.
*
* @return search scope defined in the SearchControl. If search scope is
* never defined in the SearchControl SCOPE_SUB for subtree type of
* search is assumed.
* @supported.api
*/
public int getSearchScope() {
Integer scope = (Integer) get(KeySearchScope);
if (scope != null) {
return scope.intValue();
} else {
return SearchControl.SCOPE_SUB;
}
}
/**
* Gets the search scope defined in the SearchControl. Allow user to specify
* default search scope if nothing has been defined in the SearchControl
* yet.
*
* @param defaultScope
* Scope value to be used in case the SearchControl is not set up
* with a search scope
*
* @return Search scope defined in the SearchControl. Return defaultScope if
* scope is not defined in the control.
* @supported.api
*/
public int getSearchScope(int defaultScope) {
Integer scope = (Integer) get(KeySearchScope);
if (scope != null) {
return scope.intValue();
} else {
return defaultScope;
}
}
/**
* Sets internal attribute value in SearchControl
*/
protected void set(String name, Object o) {
m_hashTable.put(name, o);
}
/**
* Gets internal attribute defined in SearchControl
*
* @param name
* Name of attribute to get
* @return Object representing the value of the attribute. Return null
* object if the given attribute name is not found
*/
protected Object get(String name) {
return m_hashTable.get(name);
}
/**
* Checks if an internal attribute is defined for the control
*
* @param name
* Name of internal attribute to check against
* @return true
if internal attribute is defined in the
* control and false
otherwise
*/
protected boolean contains(String name) {
return m_hashTable.containsKey(name);
}
/**
* Sets the specified boolean value to the variable. Boolean value is set to
* true, if all attributes of the entries need to be obtained as part of the
* search.
*
* NOTE: If this getAllReturnAttributes boolean is set to true as part of
* AMSearchControl, it overrides any other setReturnAttributes set as part
* of the AMSearchControl. This is similar to using a wildcard '*' in
* search.
*
* When all the return attributes are set, the return attributes can be
* obtained as a map with DN as map-key and set of attribute values as
* map-value from AMSearchResults object.
*
* @param getAllAttributes
* Boolean value set to true as part of the AMSearchControl to
* obtain all attributes as part of the search.
*
*
*/
public void setAllReturnAttributes(boolean getAllAttributes) {
getAllAttributesEnabled = getAllAttributes;
}
/**
* Method to check if the boolean getAllAttributesEnabled is enabled or
* disabled.
*
* @return Returns the value of the boolean getAllAttributesEnabled. Returns
* true or false.
*/
public boolean isGetAllReturnAttributesEnabled() {
return getAllAttributesEnabled;
}
private Hashtable m_hashTable = new Hashtable();
}