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