EntryIDSetSorter.java revision 763a75aeed1a7731ddb95b99496aa7c1bf206ed0
/*
* 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
* 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 2008 Sun Microsystems, Inc.
* Portions Copyright 2011-2015 ForgeRock AS
*/
/**
* This class provides a mechanism for sorting the contents of an entry ID set
* based on a given sort order.
*/
class EntryIDSetSorter
{
/**
* Creates a new entry ID set which is a sorted representation of the provided
* set using the given sort order.
*
* @param entryContainer The entry container with which the ID list is associated.
* @param txn The database transaction
* @param entryIDSet The entry ID set to be sorted.
* @param searchOperation The search operation being processed.
* @param sortOrder The sort order to use for the entry ID set.
* @param vlvRequest The VLV request control included in the search
* request, or {@code null} if there was none.
* @return A new entry ID set which is a sorted representation of the
* provided set using the given sort order.
* @throws DirectoryException If an error occurs while performing the sort.
*/
throws DirectoryException
{
if (! entryIDSet.isDefined())
{
return new EntryIDSet();
}
{
try
{
{
}
}
catch (Exception e)
{
LocalizableMessage message = ERR_ENTRYIDSORTER_CANNOT_EXAMINE_ENTRY.get(id, getExceptionMessage(e));
}
}
// See if there is a VLV request to further pare down the set of results,
// and if there is where it should be processed by offset or assertion value.
long[] sortedIDs;
if (vlvRequest != null)
{
{
if (targetOffset < 0)
{
// The client specified a negative target offset. This should never be allowed.
message);
}
else if (targetOffset == 0)
{
// This is an easy mistake to make, since VLV offsets start at 1
// instead of 0. We'll assume the client meant to use 1.
targetOffset = 1;
}
if (startPos < 0)
{
// This can happen if beforeCount >= offset, and in this case we'll
// just adjust the start position to ignore the range of beforeCount
// that doesn't exist.
startPos = 0;
}
{
// The start position is beyond the end of the list. In this case,
// we'll assume that the start position was one greater than the
// size of the list and will only return the beforeCount entries.
afterCount = 0;
}
int treePos = 0;
int arrayPos = 0;
{
{
continue;
}
{
break;
}
}
{
// We don't have enough entries in the set to meet the requested
// page size, so we'll need to shorten the array.
long[] newIDArray = new long[arrayPos];
}
}
else
{
boolean targetFound = false;
int targetOffset = 0;
int includedBeforeCount = 0;
int includedAfterCount = 0;
int listSize = 0;
{
if (targetFound)
{
listSize++;
if (includedAfterCount >= afterCount)
{
break;
}
}
else
{
targetOffset++;
if (targetFound)
{
listSize++;
}
else if (beforeCount > 0)
{
if (includedBeforeCount > beforeCount)
{
}
else
{
listSize++;
}
}
}
}
if (! targetFound)
{
// No entry was found to be greater than or equal to the sort key, so
// the target offset will be one greater than the content count.
}
for (int i=0; i < listSize; i++)
{
}
}
}
else
{
int i=0;
{
}
}
}
}