001package org.apache.commons.ssl.org.bouncycastle.asn1.cms;
002
003import java.io.IOException;
004
005import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Encodable;
006import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1EncodableVector;
007import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Integer;
008import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1OctetStringParser;
009import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Primitive;
010import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Sequence;
011import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1SequenceParser;
012import org.apache.commons.ssl.org.bouncycastle.asn1.BERSequence;
013import org.apache.commons.ssl.org.bouncycastle.asn1.DERIA5String;
014
015/**
016 * Parser for <a href="http://tools.ietf.org/html/rfc5544">RFC 5544</a>:
017 * {@link TimeStampedData} object.
018 * <p>
019 * <pre>
020 * TimeStampedData ::= SEQUENCE {
021 *   version              INTEGER { v1(1) },
022 *   dataUri              IA5String OPTIONAL,
023 *   metaData             MetaData OPTIONAL,
024 *   content              OCTET STRING OPTIONAL,
025 *   temporalEvidence     Evidence
026 * }
027 * </pre>
028 */
029public class TimeStampedDataParser
030{
031    private ASN1Integer version;
032    private DERIA5String dataUri;
033    private MetaData metaData;
034    private ASN1OctetStringParser content;
035    private Evidence temporalEvidence;
036    private ASN1SequenceParser parser;
037
038    private TimeStampedDataParser(ASN1SequenceParser parser)
039        throws IOException
040    {
041        this.parser = parser;
042        this.version = ASN1Integer.getInstance(parser.readObject());
043
044        ASN1Encodable obj = parser.readObject();
045
046        if (obj instanceof DERIA5String)
047        {
048            this.dataUri = DERIA5String.getInstance(obj);
049            obj = parser.readObject();
050        }
051        if (obj instanceof MetaData || obj instanceof ASN1SequenceParser)
052        {
053            this.metaData = MetaData.getInstance(obj.toASN1Primitive());
054            obj = parser.readObject();
055        }
056        if (obj instanceof ASN1OctetStringParser)
057        {
058            this.content = (ASN1OctetStringParser)obj;
059        }
060    }
061
062    public static TimeStampedDataParser getInstance(Object obj)
063        throws IOException
064    {
065        if (obj instanceof ASN1Sequence)
066        {
067            return new TimeStampedDataParser(((ASN1Sequence)obj).parser());
068        }
069        if (obj instanceof ASN1SequenceParser)
070        {
071            return new TimeStampedDataParser((ASN1SequenceParser)obj);
072        }
073
074        return null;
075    }
076
077    public DERIA5String getDataUri()
078    {
079        return dataUri;
080    }
081
082    public MetaData getMetaData()
083    {
084        return metaData;
085    }
086
087    public ASN1OctetStringParser getContent()
088    {
089        return content;
090    }
091
092    public Evidence getTemporalEvidence()
093        throws IOException
094    {
095        if (temporalEvidence == null)
096        {
097            temporalEvidence = Evidence.getInstance(parser.readObject().toASN1Primitive());
098        }
099
100        return temporalEvidence;
101    }
102
103    /**
104     * <pre>
105     * TimeStampedData ::= SEQUENCE {
106     *   version              INTEGER { v1(1) },
107     *   dataUri              IA5String OPTIONAL,
108     *   metaData             MetaData OPTIONAL,
109     *   content              OCTET STRING OPTIONAL,
110     *   temporalEvidence     Evidence
111     * }
112     * </pre>
113     * @return
114     * @deprecated will be removed
115     */
116    public ASN1Primitive toASN1Primitive()
117    {
118        ASN1EncodableVector v = new ASN1EncodableVector();
119
120        v.add(version);
121
122        if (dataUri != null)
123        {
124            v.add(dataUri);
125        }
126
127        if (metaData != null)
128        {
129            v.add(metaData);
130        }
131
132        if (content != null)
133        {
134            v.add(content);
135        }
136
137        v.add(temporalEvidence);
138
139        return new BERSequence(v);
140    }
141}