package org.opends.sdk.controls;
import static com.sun.opends.sdk.messages.Messages.*;
import static com.sun.opends.sdk.util.StaticUtils.*;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
import org.opends.sdk.ByteString;
import org.opends.sdk.ByteStringBuilder;
import org.opends.sdk.DecodeException;
import org.opends.sdk.LocalizableMessage;
import org.opends.sdk.asn1.ASN1;
import org.opends.sdk.asn1.ASN1Reader;
import org.opends.sdk.asn1.ASN1Writer;
import org.opends.sdk.schema.Schema;
import com.sun.opends.sdk.util.Validator;
/**
* This class implements the server-side sort control as defined in RFC
* 2891.
*/
public class ServerSideSortControl
{
/**
* The OID for the server-side sort request control.
*/
public static final String OID_SERVER_SIDE_SORT_REQUEST_CONTROL = "1.2.840.113556.1.4.473";
/**
* The OID for the server-side sort response control.
*/
public static final String OID_SERVER_SIDE_SORT_RESPONSE_CONTROL = "1.2.840.113556.1.4.474";
/**
* This class implements the server-side sort request control as
* defined in RFC 2891 section 1.1. The ASN.1 description for the
* control value is:
*
*
*
* SortKeyList ::= SEQUENCE OF SEQUENCE {
* attributeType AttributeDescription,
* orderingRule [0] MatchingRuleId OPTIONAL,
* reverseOrder [1] BOOLEAN DEFAULT FALSE }
*
*/
public static class Request extends Control
{
private final List
* SortResult ::= SEQUENCE {
* sortResult ENUMERATED {
* success (0), -- results are sorted
* operationsError (1), -- server internal failure
* timeLimitExceeded (3), -- timelimit reached before
* -- sorting was completed
* strongAuthRequired (8), -- refused to return sorted
* -- results via insecure
* -- protocol
* adminLimitExceeded (11), -- too many matching entries
* -- for the server to sort
* noSuchAttribute (16), -- unrecognized attribute
* -- type in sort key
* inappropriateMatching (18), -- unrecognized or
* -- inappropriate matching
* -- rule in sort key
* insufficientAccessRights (50), -- refused to return sorted
* -- results to this client
* busy (51), -- too busy to process
* unwillingToPerform (53), -- unable to sort
* other (80)
* },
* attributeType [0] AttributeDescription OPTIONAL }
*
*/
public static class Response extends Control
{
private SortResult sortResult;
private String attributeDescription;
public Response(boolean isCritical, SortResult sortResult)
{
this(isCritical, sortResult, null);
}
public Response(boolean isCritical, SortResult sortResult,
String attributeDescription)
{
super(OID_SERVER_SIDE_SORT_RESPONSE_CONTROL, isCritical);
Validator.ensureNotNull(sortResult);
this.sortResult = sortResult;
this.attributeDescription = attributeDescription;
}
public Response(SortResult sortResult)
{
this(false, sortResult, null);
}
public Response(SortResult sortResult, String attributeDescription)
{
this(false, sortResult, attributeDescription);
}
public String getAttributeDescription()
{
return attributeDescription;
}
public SortResult getSortResult()
{
return sortResult;
}
@Override
public ByteString getValue()
{
ByteStringBuilder buffer = new ByteStringBuilder();
ASN1Writer writer = ASN1.getWriter(buffer);
try
{
writer.writeStartSequence();
writer.writeEnumerated(sortResult.intValue());
if (attributeDescription != null)
{
writer.writeOctetString(TYPE_ATTRIBUTE_TYPE,
attributeDescription);
}
writer.writeEndSequence();
return buffer.toByteString();
}
catch (IOException ioe)
{
// This should never happen unless there is a bug somewhere.
throw new RuntimeException(ioe);
}
}
@Override
public boolean hasValue()
{
return true;
}
public Response setAttributeDescription(String attributeDescription)
{
this.attributeDescription = attributeDescription;
return this;
}
public Response setSortResult(SortResult sortResult)
{
Validator.ensureNotNull(sortResult);
this.sortResult = sortResult;
return this;
}
@Override
public void toString(StringBuilder buffer)
{
buffer.append("ServerSideSortResponseControl(oid=");
buffer.append(getOID());
buffer.append(", criticality=");
buffer.append(isCritical());
buffer.append(", sortResult=");
buffer.append(sortResult);
buffer.append(", attributeDescription=");
buffer.append(attributeDescription);
buffer.append(")");
}
}
/**
* ControlDecoder implentation to decode this control from a
* ByteString.
*/
private final static class RequestDecoder implements
ControlDecoder