001    package org.apache.commons.ssl.asn1;
002    
003    import java.io.IOException;
004    import java.math.BigInteger;
005    
006    public 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    }