001package org.apache.commons.ssl.asn1;
002
003import java.io.IOException;
004import java.math.BigInteger;
005
006public class DEREnumerated
007    extends ASN1Object {
008    byte[] bytes;
009
010    /**
011     * return an integer from the passed in object
012     *
013     * @throws IllegalArgumentException if the object cannot be converted.
014     */
015    public static DEREnumerated getInstance(
016        Object obj) {
017        if (obj == null || obj instanceof DEREnumerated) {
018            return (DEREnumerated) obj;
019        }
020
021        if (obj instanceof ASN1OctetString) {
022            return new DEREnumerated(((ASN1OctetString) obj).getOctets());
023        }
024
025        if (obj instanceof ASN1TaggedObject) {
026            return getInstance(((ASN1TaggedObject) obj).getObject());
027        }
028
029        throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName());
030    }
031
032    /**
033     * return an Enumerated from a tagged object.
034     *
035     * @param obj      the tagged object holding the object we want
036     * @param explicit true if the object is meant to be explicitly
037     *                 tagged false otherwise.
038     * @throws IllegalArgumentException if the tagged object cannot
039     *                                  be converted.
040     */
041    public static DEREnumerated getInstance(
042        ASN1TaggedObject obj,
043        boolean explicit) {
044        return getInstance(obj.getObject());
045    }
046
047    public DEREnumerated(
048        int value) {
049        bytes = BigInteger.valueOf(value).toByteArray();
050    }
051
052    public DEREnumerated(
053        BigInteger value) {
054        bytes = value.toByteArray();
055    }
056
057    public DEREnumerated(
058        byte[] bytes) {
059        this.bytes = bytes;
060    }
061
062    public BigInteger getValue() {
063        return new BigInteger(bytes);
064    }
065
066    void encode(
067        DEROutputStream out)
068        throws IOException {
069        out.writeEncoded(ENUMERATED, bytes);
070    }
071
072    boolean asn1Equals(
073        DERObject o) {
074        if (!(o instanceof DEREnumerated)) {
075            return false;
076        }
077
078        DEREnumerated other = (DEREnumerated) o;
079
080        if (bytes.length != other.bytes.length) {
081            return false;
082        }
083
084        for (int i = 0; i != bytes.length; i++) {
085            if (bytes[i] != other.bytes[i]) {
086                return false;
087            }
088        }
089
090        return true;
091    }
092
093    public int hashCode() {
094        return this.getValue().hashCode();
095    }
096}