package com.hwlcn.ldap.ldap.sdk.controls; import java.io.Serializable; import java.util.ArrayList; import com.hwlcn.ldap.asn1.ASN1Boolean; import com.hwlcn.ldap.asn1.ASN1Element; import com.hwlcn.ldap.asn1.ASN1OctetString; import com.hwlcn.ldap.asn1.ASN1Sequence; import com.hwlcn.ldap.ldap.sdk.LDAPException; import com.hwlcn.ldap.ldap.sdk.ResultCode; import com.hwlcn.core.annotation.NotMutable; import com.hwlcn.core.annotation.ThreadSafety; import com.hwlcn.ldap.util.ThreadSafetyLevel; import static com.hwlcn.ldap.ldap.sdk.controls.ControlMessages.*; import static com.hwlcn.ldap.util.Debug.*; import static com.hwlcn.ldap.util.StaticUtils.*; import static com.hwlcn.ldap.util.Validator.*; @NotMutable() @ThreadSafety(level=ThreadSafetyLevel.COMPLETELY_THREADSAFE) public final class SortKey implements Serializable { private static final byte TYPE_MATCHING_RULE_ID = (byte) 0x80; private static final byte TYPE_REVERSE_ORDER = (byte) 0x81; private static final long serialVersionUID = -8631224188301402858L; private final boolean reverseOrder; private final String attributeName; private final String matchingRuleID; public SortKey(final String attributeName) { this(attributeName, null, false); } public SortKey(final String attributeName, final boolean reverseOrder) { this(attributeName, null, reverseOrder); } public SortKey(final String attributeName, final String matchingRuleID, final boolean reverseOrder) { ensureNotNull(attributeName); this.attributeName = attributeName; this.matchingRuleID = matchingRuleID; this.reverseOrder = reverseOrder; } public String getAttributeName() { return attributeName; } public String getMatchingRuleID() { return matchingRuleID; } public boolean reverseOrder() { return reverseOrder; } ASN1Sequence encode() { final ArrayList<ASN1Element> elements = new ArrayList<ASN1Element>(3); elements.add(new ASN1OctetString(attributeName)); if (matchingRuleID != null) { elements.add(new ASN1OctetString(TYPE_MATCHING_RULE_ID, matchingRuleID)); } if (reverseOrder) { elements.add(new ASN1Boolean(TYPE_REVERSE_ORDER, reverseOrder)); } return new ASN1Sequence(elements); } public static SortKey decode(final ASN1Element element) throws LDAPException { final ASN1Element[] elements; try { elements = ASN1Sequence.decodeAsSequence(element).elements(); } catch (Exception e) { debugException(e); throw new LDAPException(ResultCode.DECODING_ERROR, ERR_SORT_KEY_NOT_SEQUENCE.get(e), e); } if ((elements.length < 1) || (elements.length > 3)) { throw new LDAPException(ResultCode.DECODING_ERROR, ERR_SORT_KEY_INVALID_ELEMENT_COUNT.get( elements.length)); } boolean reverseOrder = false; String matchingRuleID = null; final String attributeName = ASN1OctetString.decodeAsOctetString(elements[0]).stringValue(); for (int i=1; i < elements.length; i++) { switch (elements[i].getType()) { case TYPE_MATCHING_RULE_ID: matchingRuleID = ASN1OctetString.decodeAsOctetString(elements[i]).stringValue(); break; case TYPE_REVERSE_ORDER: try { reverseOrder = ASN1Boolean.decodeAsBoolean(elements[i]).booleanValue(); } catch (Exception e) { debugException(e); throw new LDAPException(ResultCode.DECODING_ERROR, ERR_SORT_KEY_REVERSE_NOT_BOOLEAN.get(e), e); } break; default: throw new LDAPException(ResultCode.DECODING_ERROR, ERR_SORT_KEY_ELEMENT_INVALID_TYPE.get( toHex(elements[i].getType()))); } } return new SortKey(attributeName, matchingRuleID, reverseOrder); } @Override() public String toString() { final StringBuilder buffer = new StringBuilder(); toString(buffer); return buffer.toString(); } public void toString(final StringBuilder buffer) { buffer.append("SortKey(attributeName="); buffer.append(attributeName); if (matchingRuleID != null) { buffer.append(", matchingRuleID="); buffer.append(matchingRuleID); } buffer.append(", reverseOrder="); buffer.append(reverseOrder); buffer.append(')'); } }