001    package org.apache.commons.ssl.asn1;
002    
003    import java.io.IOException;
004    
005    /** DER BMPString object. */
006    public class DERBMPString
007        extends ASN1Object
008        implements DERString {
009        String string;
010    
011        /**
012         * return a BMP String from the given object.
013         *
014         * @param obj the object we want converted.
015         * @throws IllegalArgumentException if the object cannot be converted.
016         */
017        public static DERBMPString getInstance(
018            Object obj) {
019            if (obj == null || obj instanceof DERBMPString) {
020                return (DERBMPString) obj;
021            }
022    
023            if (obj instanceof ASN1OctetString) {
024                return new DERBMPString(((ASN1OctetString) obj).getOctets());
025            }
026    
027            if (obj instanceof ASN1TaggedObject) {
028                return getInstance(((ASN1TaggedObject) obj).getObject());
029            }
030    
031            throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName());
032        }
033    
034        /**
035         * return a BMP String from a tagged object.
036         *
037         * @param obj      the tagged object holding the object we want
038         * @param explicit true if the object is meant to be explicitly
039         *                 tagged false otherwise.
040         * @throws IllegalArgumentException if the tagged object cannot
041         *                                  be converted.
042         */
043        public static DERBMPString getInstance(
044            ASN1TaggedObject obj,
045            boolean explicit) {
046            return getInstance(obj.getObject());
047        }
048    
049    
050        /** basic constructor - byte encoded string. */
051        public DERBMPString(
052            byte[] string) {
053            char[] cs = new char[string.length / 2];
054    
055            for (int i = 0; i != cs.length; i++) {
056                cs[i] = (char) ((string[2 * i] << 8) | (string[2 * i + 1] & 0xff));
057            }
058    
059            this.string = new String(cs);
060        }
061    
062        /** basic constructor */
063        public DERBMPString(
064            String string) {
065            this.string = string;
066        }
067    
068        public String getString() {
069            return string;
070        }
071    
072        public String toString() {
073            return string;
074        }
075    
076        public int hashCode() {
077            return this.getString().hashCode();
078        }
079    
080        protected boolean asn1Equals(
081            DERObject o) {
082            if (!(o instanceof DERBMPString)) {
083                return false;
084            }
085    
086            DERBMPString s = (DERBMPString) o;
087    
088            return this.getString().equals(s.getString());
089        }
090    
091        void encode(
092            DEROutputStream out)
093            throws IOException {
094            char[] c = string.toCharArray();
095            byte[] b = new byte[c.length * 2];
096    
097            for (int i = 0; i != c.length; i++) {
098                b[2 * i] = (byte) (c[i] >> 8);
099                b[2 * i + 1] = (byte) c[i];
100            }
101    
102            out.writeEncoded(BMP_STRING, b);
103        }
104    }