001    package org.apache.commons.ssl.asn1;
002    
003    import java.io.ByteArrayOutputStream;
004    import java.io.IOException;
005    
006    public 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    }