/* See LICENSE for licensing and NOTICE for copyright. */
package org.ldaptive.control;
import org.ldaptive.LdapUtils;
import org.ldaptive.asn1.BooleanType;
import org.ldaptive.asn1.ConstructedDEREncoder;
import org.ldaptive.asn1.IntegerType;
import org.ldaptive.asn1.OctetStringType;
import org.ldaptive.asn1.UniversalDERTag;
/**
* Request control for ldap content synchronization. See RFC 4533. Control is defined as:
*
* <pre>
syncRequestValue ::= SEQUENCE {
mode ENUMERATED {
-- 0 unused
refreshOnly (1),
-- 2 reserved
refreshAndPersist (3)
},
cookie syncCookie OPTIONAL,
reloadHint BOOLEAN DEFAULT FALSE
}
* </pre>
*
* @author Middleware Services
*/
public class SyncRequestControl extends AbstractControl implements RequestControl
{
/** OID of this control. */
public static final String OID = "1.3.6.1.4.1.4203.1.9.1.1";
/** hash value seed. */
private static final int HASH_CODE_SEED = 743;
/** Types of request modes. */
public enum Mode {
/** refresh only. */
REFRESH_ONLY(1),
/** refresh and persist. */
REFRESH_AND_PERSIST(3);
/** underlying value. */
private final int value;
/**
* Creates a new mode.
*
* @param i value
*/
Mode(final int i)
{
value = i;
}
/**
* Returns the value.
*
* @return enum value
*/
public int value()
{
return value;
}
/**
* Returns the mode for the supplied integer constant.
*
* @param i to find mode for
*
* @return mode
*/
public static Mode valueOf(final int i)
{
for (Mode m : Mode.values()) {
if (m.value() == i) {
return m;
}
}
return null;
}
}
/** request mode. */
private Mode requestMode = Mode.REFRESH_ONLY;
/** server generated cookie. */
private byte[] cookie;
/** reload hint. */
private boolean reloadHint;
/** Default constructor. */
public SyncRequestControl()
{
super(OID);
}
/**
* Creates a new sync request control.
*
* @param mode request mode
*/
public SyncRequestControl(final Mode mode)
{
super(OID);
setRequestMode(mode);
}
/**
* Creates a new sync request control.
*
* @param mode request mode
* @param critical whether this control is critical
*/
public SyncRequestControl(final Mode mode, final boolean critical)
{
super(OID, critical);
setRequestMode(mode);
}
/**
* Creates a new sync request control.
*
* @param mode request mode
* @param value sync request cookie
* @param critical whether this control is critical
*/
public SyncRequestControl(final Mode mode, final byte[] value, final boolean critical)
{
super(OID, critical);
setRequestMode(mode);
setCookie(value);
}
/**
* Creates a new sync request control.
*
* @param mode request mode
* @param value sync request cookie
* @param hint reload hint
* @param critical whether this control is critical
*/
public SyncRequestControl(final Mode mode, final byte[] value, final boolean hint, final boolean critical)
{
super(OID, critical);
setRequestMode(mode);
setCookie(value);
setReloadHint(hint);
}
/**
* Returns the request mode.
*
* @return request mode
*/
public Mode getRequestMode()
{
return requestMode;
}
/**
* Sets the request mode.
*
* @param mode request mode
*/
public void setRequestMode(final Mode mode)
{
requestMode = mode;
}
/**
* Returns the sync request cookie.
*
* @return sync request cookie
*/
public byte[] getCookie()
{
return cookie;
}
/**
* Sets the sync request cookie.
*
* @param value sync request cookie
*/
public void setCookie(final byte[] value)
{
cookie = value;
}
/**
* Returns the reload hint.
*
* @return reload hint
*/
public boolean getReloadHint()
{
return reloadHint;
}
/**
* Sets the reload hint.
*
* @param b reload hint
*/
public void setReloadHint(final boolean b)
{
reloadHint = b;
}
@Override
public boolean equals(final Object o)
{
if (o == this) {
return true;
}
if (o instanceof SyncRequestControl && super.equals(o)) {
final SyncRequestControl v = (SyncRequestControl) o;
return LdapUtils.areEqual(requestMode, v.requestMode) &&
LdapUtils.areEqual(cookie, v.cookie) &&
LdapUtils.areEqual(reloadHint, v.reloadHint);
}
return false;
}
@Override
public int hashCode()
{
return LdapUtils.computeHashCode(HASH_CODE_SEED, getOID(), getCriticality(), requestMode, cookie, reloadHint);
}
@Override
public String toString()
{
return
String.format(
"[%s@%d::criticality=%s, requestMode=%s, cookie=%s, reloadHint=%s]",
getClass().getName(),
hashCode(),
getCriticality(),
requestMode,
LdapUtils.base64Encode(cookie),
reloadHint);
}
@Override
public byte[] encode()
{
ConstructedDEREncoder se;
if (getCookie() != null) {
se = new ConstructedDEREncoder(
UniversalDERTag.SEQ,
new IntegerType(getRequestMode().value()),
new OctetStringType(getCookie()),
new BooleanType(getReloadHint()));
} else {
se = new ConstructedDEREncoder(
UniversalDERTag.SEQ,
new IntegerType(getRequestMode().value()),
new BooleanType(getReloadHint()));
}
return se.encode();
}
}