001package org.apache.commons.ssl.asn1;
002
003import java.io.ByteArrayOutputStream;
004import java.io.IOException;
005
006public abstract class ASN1Encodable
007    implements DEREncodable {
008    public static final String DER = "DER";
009    public static final String BER = "BER";
010
011    public byte[] getEncoded()
012        throws IOException {
013        ByteArrayOutputStream bOut = new ByteArrayOutputStream();
014        ASN1OutputStream aOut = new ASN1OutputStream(bOut);
015
016        aOut.writeObject(this);
017
018        return bOut.toByteArray();
019    }
020
021    public byte[] getEncoded(
022        String encoding)
023        throws IOException {
024        if (encoding.equals(DER)) {
025            ByteArrayOutputStream bOut = new ByteArrayOutputStream();
026            DEROutputStream dOut = new DEROutputStream(bOut);
027
028            dOut.writeObject(this);
029
030            return bOut.toByteArray();
031        }
032
033        return this.getEncoded();
034    }
035
036    /**
037     * Return the DER encoding of the object, null if the DER encoding can not be made.
038     *
039     * @return a DER byte array, null otherwise.
040     */
041    public byte[] getDEREncoded() {
042        try {
043            return this.getEncoded(DER);
044        }
045        catch (IOException e) {
046            return null;
047        }
048    }
049
050    public int hashCode() {
051        return this.toASN1Object().hashCode();
052    }
053
054    public boolean equals(
055        Object o) {
056        if (this == o) {
057            return true;
058        }
059
060        if (!(o instanceof DEREncodable)) {
061            return false;
062        }
063
064        DEREncodable other = (DEREncodable) o;
065
066        return this.toASN1Object().equals(other.getDERObject());
067    }
068
069    public DERObject getDERObject() {
070        return this.toASN1Object();
071    }
072
073    public abstract DERObject toASN1Object();
074}