001: package org.bouncycastle.x509;
002:
003: import org.bouncycastle.util.StreamParser;
004: import org.bouncycastle.util.StreamParsingException;
005:
006: import java.io.ByteArrayInputStream;
007: import java.io.InputStream;
008: import java.security.NoSuchAlgorithmException;
009: import java.security.NoSuchProviderException;
010: import java.security.Provider;
011: import java.util.Collection;
012:
013: /**
014: *
015: * This class allows access to different implementations for reading X.509
016: * objects from streams.
017: * <p>
018: * A X509StreamParser is used to read a collection of objects or a single object
019: * of a certain X.509 object structure. E.g. one X509StreamParser can read
020: * certificates, another one CRLs, certification paths, attribute certificates
021: * and so on. The kind of object structure is specified with the
022: * <code>algorithm</code> parameter to the <code>getInstance</code> methods.
023: * <p>
024: * Implementations must implement the
025: * {@link org.bouncycastle.x509.X509StreamParserSpi}.
026: */
027: public class X509StreamParser implements StreamParser {
028: /**
029: * Generates a StreamParser object that implements the specified type. If
030: * the default provider package provides an implementation of the requested
031: * type, an instance of StreamParser containing that implementation is
032: * returned. If the type is not available in the default package, other
033: * packages are searched.
034: *
035: * @param type
036: * The name of the requested X.509 object type.
037: * @return a StreamParser object for the specified type.
038: *
039: * @exception NoSuchParserException
040: * if the requested type is not available in the default
041: * provider package or any of the other provider packages
042: * that were searched.
043: */
044: public static X509StreamParser getInstance(String type)
045: throws NoSuchParserException {
046: try {
047: X509Util.Implementation impl = X509Util.getImplementation(
048: "X509StreamParser", type);
049:
050: return createParser(impl);
051: } catch (NoSuchAlgorithmException e) {
052: throw new NoSuchParserException(e.getMessage());
053: }
054: }
055:
056: /**
057: * Generates a X509StreamParser object for the specified type from the
058: * specified provider.
059: *
060: * @param type
061: * the name of the requested X.509 object type.
062: * @param provider
063: * the name of the provider.
064: *
065: * @return a X509StreamParser object for the specified type.
066: *
067: * @exception NoSuchParserException
068: * if the type is not available from the specified provider.
069: *
070: * @exception NoSuchProviderException
071: * if the provider can not be found.
072: *
073: * @see Provider
074: */
075: public static X509StreamParser getInstance(String type,
076: String provider) throws NoSuchParserException,
077: NoSuchProviderException {
078: return getInstance(type, X509Util.getProvider(provider));
079: }
080:
081: /**
082: * Generates a X509StreamParser object for the specified type from the
083: * specified provider.
084: *
085: * @param type
086: * the name of the requested X.509 object type.
087: * @param provider
088: * the Provider to use.
089: *
090: * @return a X509StreamParser object for the specified type.
091: *
092: * @exception NoSuchParserException
093: * if the type is not available from the specified provider.
094: *
095: * @see Provider
096: */
097: public static X509StreamParser getInstance(String type,
098: Provider provider) throws NoSuchParserException {
099: try {
100: X509Util.Implementation impl = X509Util.getImplementation(
101: "X509StreamParser", type, provider);
102:
103: return createParser(impl);
104: } catch (NoSuchAlgorithmException e) {
105: throw new NoSuchParserException(e.getMessage());
106: }
107: }
108:
109: private static X509StreamParser createParser(
110: X509Util.Implementation impl) {
111: X509StreamParserSpi spi = (X509StreamParserSpi) impl
112: .getEngine();
113:
114: return new X509StreamParser(impl.getProvider(), spi);
115: }
116:
117: private Provider _provider;
118: private X509StreamParserSpi _spi;
119:
120: private X509StreamParser(Provider provider, X509StreamParserSpi spi) {
121: _provider = provider;
122: _spi = spi;
123: }
124:
125: public Provider getProvider() {
126: return _provider;
127: }
128:
129: public void init(InputStream stream) {
130: _spi.engineInit(stream);
131: }
132:
133: public void init(byte[] data) {
134: _spi.engineInit(new ByteArrayInputStream(data));
135: }
136:
137: public Object read() throws StreamParsingException {
138: return _spi.engineRead();
139: }
140:
141: public Collection readAll() throws StreamParsingException {
142: return _spi.engineReadAll();
143: }
144: }
|