001package org.apache.commons.ssl.org.bouncycastle.asn1.cms;
002
003import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Boolean;
004import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1EncodableVector;
005import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Object;
006import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Primitive;
007import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Sequence;
008import org.apache.commons.ssl.org.bouncycastle.asn1.DERIA5String;
009import org.apache.commons.ssl.org.bouncycastle.asn1.DERSequence;
010import org.apache.commons.ssl.org.bouncycastle.asn1.DERUTF8String;
011
012/**
013 * <a href="http://tools.ietf.org/html/rfc5544">RFC 5544</a>:
014 * Binding Documents with Time-Stamps; MetaData object.
015 * <p>
016 * <pre>
017 * MetaData ::= SEQUENCE {
018 *   hashProtected        BOOLEAN,
019 *   fileName             UTF8String OPTIONAL,
020 *   mediaType            IA5String OPTIONAL,
021 *   otherMetaData        Attributes OPTIONAL
022 * }
023 * </pre>
024 */
025public class MetaData
026    extends ASN1Object
027{
028    private ASN1Boolean hashProtected;
029    private DERUTF8String fileName;
030    private DERIA5String  mediaType;
031    private Attributes otherMetaData;
032
033    public MetaData(
034        ASN1Boolean hashProtected,
035        DERUTF8String fileName,
036        DERIA5String mediaType,
037        Attributes otherMetaData)
038    {
039        this.hashProtected = hashProtected;
040        this.fileName = fileName;
041        this.mediaType = mediaType;
042        this.otherMetaData = otherMetaData;
043    }
044
045    private MetaData(ASN1Sequence seq)
046    {
047        this.hashProtected = ASN1Boolean.getInstance(seq.getObjectAt(0));
048
049        int index = 1;
050
051        if (index < seq.size() && seq.getObjectAt(index) instanceof DERUTF8String)
052        {
053            this.fileName = DERUTF8String.getInstance(seq.getObjectAt(index++));
054        }
055        if (index < seq.size() && seq.getObjectAt(index) instanceof DERIA5String)
056        {
057            this.mediaType = DERIA5String.getInstance(seq.getObjectAt(index++));
058        }
059        if (index < seq.size())
060        {
061            this.otherMetaData = Attributes.getInstance(seq.getObjectAt(index++));
062        }
063    }
064
065    /**
066     * Return a MetaData object from the given object.
067     * <p>
068     * Accepted inputs:
069     * <ul>
070     * <li> null &rarr; null
071     * <li> {@link MetaData} object
072     * <li> {@link org.bouncycastle.asn1.ASN1Sequence#getInstance(java.lang.Object) ASN1Sequence} input formats with MetaData structure inside
073     * </ul>
074     *
075     * @param obj the object we want converted.
076     * @exception IllegalArgumentException if the object cannot be converted.
077     */
078    public static MetaData getInstance(Object obj)
079    {
080        if (obj instanceof MetaData)
081        {
082            return (MetaData)obj;
083        }
084        else if (obj != null)
085        {
086            return new MetaData(ASN1Sequence.getInstance(obj));
087        }
088
089        return null;
090    }
091
092    public ASN1Primitive toASN1Primitive()
093    {
094        ASN1EncodableVector v = new ASN1EncodableVector();
095
096        v.add(hashProtected);
097
098        if (fileName != null)
099        {
100            v.add(fileName);
101        }
102
103        if (mediaType != null)
104        {
105            v.add(mediaType);
106        }
107
108        if (otherMetaData != null)
109        {
110            v.add(otherMetaData);
111        }
112        
113        return new DERSequence(v);
114    }
115
116    public boolean isHashProtected()
117    {
118        return hashProtected.isTrue();
119    }
120
121    public DERUTF8String getFileName()
122    {
123        return this.fileName;
124    }
125
126    public DERIA5String getMediaType()
127    {
128        return this.mediaType;
129    }
130
131    public Attributes getOtherMetaData()
132    {
133        return otherMetaData;
134    }
135}