    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}