/*
 * @(#)BasicControl.java	1.3 03/12/19
 *
 *
 * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
 * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */

package javax.naming.ldap;

/**
 * This class provides a basic implementation of the <tt>Control</tt>
 * interface. It represents an LDAPv3 Control as defined in
 * <a href="http://www.ietf.org/rfc/rfc2251.txt">RFC 2251</a>.
 *
 * @since 1.5
 * @author Vincent Ryan
 */
public class BasicControl implements Control {

    /** 
     * The control's object identifier string.
     *
     * @serial
     */
    protected String id;

    /** 
     * The control's criticality.
     *
     * @serial
     */
    protected boolean criticality = false; // default

    /** 
     * The control's ASN.1 BER encoded value.
     *
     * @serial
     */
    protected byte[] value = null;

    private static final long serialVersionUID = -4233907508771791687L;

    /**
     * Constructs a non-critical control.
     * 
     * @param	id	The control's object identifier string.
     *
     */
    public BasicControl(String id) {
	this.id = id;
    }

    /**
     * Constructs a control using the supplied arguments.
     * 
     * @param	id		The control's object identifier string.
     * @param	criticality	The control's criticality.
     * @param	value		The control's ASN.1 BER encoded value.
     * 				It is not cloned - any changes to value 
     *                          will affect the contents of the control.
     *                          It may be null.
     */
    public BasicControl(String id, boolean criticality, byte[] value) {
	this.id = id;
	this.criticality = criticality;
	this.value = value;
    }

    /**
     * Retrieves the control's object identifier string.
     *
     * @return The non-null object identifier string.
     */
    public String getID() {
	return id;
    }

    /**
     * Determines the control's criticality.
     *
     * @return true if the control is critical; false otherwise.
     */
    public boolean isCritical() {
	return criticality;
    }

    /**
     * Retrieves the control's ASN.1 BER encoded value.
     * The result includes the BER tag and length for the control's value but
     * does not include the control's object identifier and criticality setting.
     *
     * @return A possibly null byte array representing the control's
     *		ASN.1 BER encoded value. It is not cloned - any changes to the 
     *          returned value will affect the contents of the control.
     */
    public byte[] getEncodedValue() {
	return value;
    }
}
