You can search LDAP directories and ODBC directories. You search an organization using one of the search... methods in the class SmDmsOrganization.
You define a search using the following objects:
You can specify the search parameters to use when searching the directory. There are two times when you can specify search parameters:
You can use either option or both options. They are not mutually exclusive.
To specify a search parameter when you create a search object, pass one or more search parameter names to the constructor of the SmDmsSearch class.
There are some search parameters that you cannot specify during creation of the search object—for example, scope. The constructor for the SmDmsSearch class accepts only the following search parameters:
You can create an SmDmsSearch object without passing any search parameters to the constructor.
After a search object is created, you can use the set... methods in the SmDmsSearch class to:
By using the set... methods, you can set or reset any of the parameters shown in the following table:
Parameter |
Default |
Set Method |
Definition |
---|---|---|---|
classId |
Unknown (not set yet) |
setClassId() |
Class identifier. |
filter |
" " |
setFilter() |
Search filter, or the string you want to find. Can also be set when the search object is created. |
maxItems |
50 |
setMaxItems() |
Maximum number of result set items to display at a time. Can also be set when the search object is created. |
nMaxResults |
-1 |
setMaxResults() |
Maximum number of items for the result set. For example, if nMaxResults is 500, but 750 items match the search criteria, only the first 500 matches will be returned from the search. |
nextItem |
-1 |
setNextItem() |
The item to start with on the next search forward—for example: nextItem += maxItems |
previousItem |
-1 |
setPreviousItem() |
The item to start with on the next search backward—for example: previousItem-=maxItems |
propertyNames |
null |
setPropertyNames() |
Properties to return from the search. Can also be set when the search object is created. |
root |
" " |
setRoot() |
Directory entry where the search should start. Can also be set when the search object is created. Valid for LDAP searches only. |
scope |
None |
setScope() |
Levels searched. For LDAP searches only. |
timeout |
-1 |
setTimeout() |
Maximum duration of the search, in seconds. |
The search filter defines the items you want to retrieve in the search. You can set the search filter through an SmDmsSearch constructor or through the SmDmsSearch method setFilter().
The search filter is described differently for LDAP directories and ODBC directories.
With LDAP directories, you provide a complete LDAP search filter in the filter parameter of an SmDmsSearch constructor or setFilter() method. For example, if you pass filter and root to the SmDmsSearch constructor to search the organization swdev.com for groups, you could specify the following:
SmDmsSearch search = new SmDmsSearch ( "(&(objectclass=organizationalUnit) (ou=groups))", "o=swdev.com");
A search of an ODBC directory is performed through a SQL query. The DMS API supports the SQL SELECT statement.
The information you provide in the search filter depends on whether your search uses an SmDmsCursor object to provide sorting and paging operations:
With ODBC database searches that pass an SmDmsCursor object to the search method, the DMS API constructs the complete SQL SELECT statement from various sources, as follows:
Consider the following code fragment:
String DIR_ROOT = "root"; String SRCH_FILTER ="from SmGroup"; SmDmsSearch search = new SmDmsSearch(SRCH_FILTER); String[] prop = {"Name", "'Group' as Class"}; search.setPropertyNames(prop); Vector SortOrder = new Vector(); SortOrder.add("uid"); SmDmsCursor cursor = new SmDmsCursor(SortOrder,blockSize,false,true);
The DMS API uses the information in the previous example to build the following SQL statement:
SELECT Name, 'Group' AS Class FROM SmGroup ORDER BY uid ASC
Code Source |
Portion of SQL Statement |
---|---|
SRCH_FILTER parameter of |
from SmGroup |
SortOrder parameter of |
order by uid asc |
prop parameter of |
select Name, 'Group' as Class |
In the DMS API, searches are performed on an organization object.
To search an organization:
For example, the following SmDmsSearch constructor call creates a search object to search for groups. The root parameter specifies a start point of o=swdev.org.
SmDmsSearch mySearch = new SmDmsSearch ( "(&(objectclass=organizationalUnit) (ou=groups))", "o=swdev.org");
Note: The root is the top level of the SiteMinder user directory to search. It is not necessarily the top level of the entire directory structure.
Use the set... methods in the SmDmsSearch class to set any other search parameters—for example:
mySearch.setScope(2);
result = targetOrg.search (mySearch, 1);
The second parameter of the search() method indicates the direction to search, as shown in the following table:
Direction |
Integer Value |
---|---|
Reset |
0 |
Forward |
1 |
Back |
2 |
Refresh |
3 |
Vector mySearchResults = search.getResults();
The first element of the results vector contains the search parameters in a SmDmsSearchResultParams object. The remaining elements are SmDmsObject objects. To distinguish object types, the classId attribute of each object is set through the setClassId() method. For example, if the classId is DMSOBJECT_CLASS_USER, the object is a user. If the classId is DMSOBJECT_CLASS_GROUP, the object is a group.
The following example searches an organization using the search parameters set through the search.set... methods below. The results of the forward search are assigned to the vector vsearch and are printed along with the search parameters.
SmDmsContext dmsContext = new SmDmsContext(); SmDmsDirectory dmsDir = dmsContext.getDmsDirectory(); SmApiResult result = new SmApiResult(); SmDmsOrganization org = dmsDir.newOrganization (DIR_ROOT); // Search SmDmsOrganization test = org.newOrganization(""); SmDmsSearch search = new SmDmsSearch ( "(&(objectclass=organizationalUnit) (ou=groups))", "o=swdev.com"); // Define search parameters search.setScope(2); // Number of levels to search. search.setNextItem(0); // Initialize forward search start search.setMaxItems(20); // Max number of items to display search.setPreviousItem(0); // Initialize back search start search.setMaxResults(500); // Max items in the result set result = test.search(search, 1); Vector vsearch = search.getResults(); System.out.println("Search object vector size " + vsearch.size()); SmDmsSearchResultParams searchParams = (SmDmsSearchResultParams)vsearch.firstElement(); System.out.println("***Search Parameters***"); System.out.println(searchParams.toString()); System.out.println("removed element at 0"); vsearch.removeElementAt(0); System.out.println("Search object vector size " + vsearch.size()); for (int i=0; i<vsearch.size(); i++) { SmDmsObject dmsObj = (SmDmsObject)vsearch.elementAt(i); System.out.println("***Search**** " + dmsObj); printObject (dmsObj, result); } Hashtable attrs = dmsObj.getAttributes(); Enumeration keys = attrs.keys(); Enumeration values = attrs.elements(); while(values.hasMoreElements() )
The following code fragment configures sorting and paging features through an SmDmsCursor object and performs a search. The parameters for the SmDmsSearch object search would be defined in the same way as in the previous example:
Vector SortOrder = new Vector(); SortOrder.add("uid"); int blockSize = 20; SmDmsCursor cursor=new SmDmsCursor(SortOrder,blockSize,false,true); cursor.setOffset(15); result = org.search(search, cursor, 1); //Forward search System.out.println(keys.nextElement() + " = " + values.nextElement() );
Copyright © 2014 CA.
All rights reserved.
|
|