001    /**
002     *
003     *  Licensed to the Apache Software Foundation (ASF) under one or more
004     *  contributor license agreements.  See the NOTICE file distributed with
005     *  this work for additional information regarding copyright ownership.
006     *  The ASF licenses this file to You under the Apache License, Version 2.0
007     *  (the "License"); you may not use this file except in compliance with
008     *  the License.  You may obtain a copy of the License at
009     *
010     *     http://www.apache.org/licenses/LICENSE-2.0
011     *
012     *  Unless required by applicable law or agreed to in writing, software
013     *  distributed under the License is distributed on an "AS IS" BASIS,
014     *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015     *  See the License for the specific language governing permissions and
016     *  limitations under the License.
017     */
018    
019    package org.apache.geronimo.util.asn1;
020    
021    import java.io.IOException;
022    import java.math.BigInteger;
023    
024    public class DEREnumerated
025        extends DERObject
026    {
027        byte[]      bytes;
028    
029        /**
030         * return an integer from the passed in object
031         *
032         * @exception IllegalArgumentException if the object cannot be converted.
033         */
034        public static DEREnumerated getInstance(
035            Object  obj)
036        {
037            if (obj == null || obj instanceof DEREnumerated)
038            {
039                return (DEREnumerated)obj;
040            }
041    
042            if (obj instanceof ASN1OctetString)
043            {
044                return new DEREnumerated(((ASN1OctetString)obj).getOctets());
045            }
046    
047            if (obj instanceof ASN1TaggedObject)
048            {
049                return getInstance(((ASN1TaggedObject)obj).getObject());
050            }
051    
052            throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName());
053        }
054    
055        /**
056         * return an Enumerated from a tagged object.
057         *
058         * @param obj the tagged object holding the object we want
059         * @param explicit true if the object is meant to be explicitly
060         *              tagged false otherwise.
061         * @exception IllegalArgumentException if the tagged object cannot
062         *               be converted.
063         */
064        public static DEREnumerated getInstance(
065            ASN1TaggedObject obj,
066            boolean          explicit)
067        {
068            return getInstance(obj.getObject());
069        }
070    
071        public DEREnumerated(
072            int         value)
073        {
074            bytes = BigInteger.valueOf(value).toByteArray();
075        }
076    
077        public DEREnumerated(
078            BigInteger   value)
079        {
080            bytes = value.toByteArray();
081        }
082    
083        public DEREnumerated(
084            byte[]   bytes)
085        {
086            this.bytes = bytes;
087        }
088    
089        public BigInteger getValue()
090        {
091            return new BigInteger(bytes);
092        }
093    
094        void encode(
095            DEROutputStream out)
096            throws IOException
097        {
098            out.writeEncoded(ENUMERATED, bytes);
099        }
100    
101        public boolean equals(
102            Object  o)
103        {
104            if (o == null || !(o instanceof DEREnumerated))
105            {
106                return false;
107            }
108    
109            DEREnumerated other = (DEREnumerated)o;
110    
111            if (bytes.length != other.bytes.length)
112            {
113                return false;
114            }
115    
116            for (int i = 0; i != bytes.length; i++)
117            {
118                if (bytes[i] != other.bytes[i])
119                {
120                    return false;
121                }
122            }
123    
124            return true;
125        }
126    
127        public int hashCode()
128        {
129            return this.getValue().hashCode();
130        }
131    }