package com.hwlcn.ldap.ldap.sdk.controls; import com.hwlcn.ldap.asn1.ASN1Element; import com.hwlcn.ldap.asn1.ASN1Enumerated; import com.hwlcn.ldap.asn1.ASN1Exception; import com.hwlcn.ldap.asn1.ASN1Integer; import com.hwlcn.ldap.asn1.ASN1OctetString; import com.hwlcn.ldap.asn1.ASN1Sequence; import com.hwlcn.ldap.ldap.sdk.Control; import com.hwlcn.ldap.ldap.sdk.DecodeableControl; import com.hwlcn.ldap.ldap.sdk.LDAPException; import com.hwlcn.ldap.ldap.sdk.ResultCode; import com.hwlcn.ldap.ldap.sdk.SearchResult; 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.*; @NotMutable() @ThreadSafety(level=ThreadSafetyLevel.COMPLETELY_THREADSAFE) public final class VirtualListViewResponseControl extends Control implements DecodeableControl { public static final String VIRTUAL_LIST_VIEW_RESPONSE_OID = "2.16.840.1.113730.3.4.10"; private static final long serialVersionUID = -534656674756287217L; private final ASN1OctetString contextID; private final int contentCount; private final ResultCode resultCode; private final int targetPosition; VirtualListViewResponseControl() { targetPosition = -1; contentCount = -1; resultCode = null; contextID = null; } public VirtualListViewResponseControl(final int targetPosition, final int contentCount, final ResultCode resultCode, final ASN1OctetString contextID) { super(VIRTUAL_LIST_VIEW_RESPONSE_OID, false, encodeValue(targetPosition, contentCount, resultCode, contextID)); this.targetPosition = targetPosition; this.contentCount = contentCount; this.resultCode = resultCode; this.contextID = contextID; } public VirtualListViewResponseControl(final String oid, final boolean isCritical, final ASN1OctetString value) throws LDAPException { super(oid, isCritical, value); if (value == null) { throw new LDAPException(ResultCode.DECODING_ERROR, ERR_VLV_RESPONSE_NO_VALUE.get()); } final ASN1Sequence valueSequence; try { final ASN1Element valueElement = ASN1Element.decode(value.getValue()); valueSequence = ASN1Sequence.decodeAsSequence(valueElement); } catch (final ASN1Exception ae) { debugException(ae); throw new LDAPException(ResultCode.DECODING_ERROR, ERR_VLV_RESPONSE_VALUE_NOT_SEQUENCE.get(ae), ae); } final ASN1Element[] valueElements = valueSequence.elements(); if ((valueElements.length < 3) || (valueElements.length > 4)) { throw new LDAPException(ResultCode.DECODING_ERROR, ERR_VLV_RESPONSE_INVALID_ELEMENT_COUNT.get( valueElements.length)); } try { targetPosition = ASN1Integer.decodeAsInteger(valueElements[0]).intValue(); } catch (final ASN1Exception ae) { debugException(ae); throw new LDAPException(ResultCode.DECODING_ERROR, ERR_VLV_RESPONSE_FIRST_NOT_INTEGER.get(ae), ae); } try { contentCount = ASN1Integer.decodeAsInteger(valueElements[1]).intValue(); } catch (final ASN1Exception ae) { debugException(ae); throw new LDAPException(ResultCode.DECODING_ERROR, ERR_VLV_RESPONSE_SECOND_NOT_INTEGER.get(ae), ae); } try { final int rc = ASN1Enumerated.decodeAsEnumerated(valueElements[2]).intValue(); resultCode = ResultCode.valueOf(rc); } catch (final ASN1Exception ae) { debugException(ae); throw new LDAPException(ResultCode.DECODING_ERROR, ERR_VLV_RESPONSE_THIRD_NOT_ENUM.get(ae), ae); } if (valueElements.length == 4) { contextID = ASN1OctetString.decodeAsOctetString(valueElements[3]); } else { contextID = null; } } public VirtualListViewResponseControl decodeControl(final String oid, final boolean isCritical, final ASN1OctetString value) throws LDAPException { return new VirtualListViewResponseControl(oid, isCritical, value); } public static VirtualListViewResponseControl get(final SearchResult result) throws LDAPException { final Control c = result.getResponseControl(VIRTUAL_LIST_VIEW_RESPONSE_OID); if (c == null) { return null; } if (c instanceof VirtualListViewResponseControl) { return (VirtualListViewResponseControl) c; } else { return new VirtualListViewResponseControl(c.getOID(), c.isCritical(), c.getValue()); } } private static ASN1OctetString encodeValue(final int targetPosition, final int contentCount, final ResultCode resultCode, final ASN1OctetString contextID) { final ASN1Element[] vlvElements; if (contextID == null) { vlvElements = new ASN1Element[] { new ASN1Integer(targetPosition), new ASN1Integer(contentCount), new ASN1Enumerated(resultCode.intValue()) }; } else { vlvElements = new ASN1Element[] { new ASN1Integer(targetPosition), new ASN1Integer(contentCount), new ASN1Enumerated(resultCode.intValue()), contextID }; } return new ASN1OctetString(new ASN1Sequence(vlvElements).encode()); } public int getTargetPosition() { return targetPosition; } public int getContentCount() { return contentCount; } public ResultCode getResultCode() { return resultCode; } public ASN1OctetString getContextID() { return contextID; } @Override() public String getControlName() { return INFO_CONTROL_NAME_VLV_RESPONSE.get(); } @Override() public void toString(final StringBuilder buffer) { buffer.append("VirtualListViewResponseControl(targetPosition="); buffer.append(targetPosition); buffer.append(", contentCount="); buffer.append(contentCount); buffer.append(", resultCode="); buffer.append(resultCode); buffer.append(')'); } }