001    package org.apache.commons.ssl.asn1;
002    
003    import java.io.ByteArrayOutputStream;
004    import java.io.IOException;
005    import java.util.Enumeration;
006    
007    public class DERSequence
008        extends ASN1Sequence {
009        /** create an empty sequence */
010        public DERSequence() {
011        }
012    
013        /** create a sequence containing one object */
014        public DERSequence(
015            DEREncodable obj) {
016            this.addObject(obj);
017        }
018    
019        /** create a sequence containing a vector of objects. */
020        public DERSequence(
021            DEREncodableVector v) {
022            for (int i = 0; i != v.size(); i++) {
023                this.addObject(v.get(i));
024            }
025        }
026    
027        /** create a sequence containing an array of objects. */
028        public DERSequence(
029            ASN1Encodable[] a) {
030            for (int i = 0; i != a.length; i++) {
031                this.addObject(a[i]);
032            }
033        }
034    
035        /*
036        * A note on the implementation:
037        * <p>
038        * As DER requires the constructed, definite-length model to
039        * be used for structured types, this varies slightly from the
040        * ASN.1 descriptions given. Rather than just outputing SEQUENCE,
041        * we also have to specify CONSTRUCTED, and the objects length.
042        */
043        void encode(
044            DEROutputStream out)
045            throws IOException {
046            ByteArrayOutputStream bOut = new ByteArrayOutputStream();
047            DEROutputStream dOut = new DEROutputStream(bOut);
048            Enumeration e = this.getObjects();
049    
050            while (e.hasMoreElements()) {
051                Object obj = e.nextElement();
052    
053                dOut.writeObject(obj);
054            }
055    
056            dOut.close();
057    
058            byte[] bytes = bOut.toByteArray();
059    
060            out.writeEncoded(SEQUENCE | CONSTRUCTED, bytes);
061        }
062    }