code: public CRL engineGenerateCRL(InputStream is)
          throws CRLException
      {
          if (is == null) {
              // clear the cache (for debugging)
              crlCache.clear();
              throw new CRLException("Missing input stream");
          }
          try {
              byte[] encoding = readOneBlock(is);
              if (encoding != null) {
                  X509CRLImpl crl = (X509CRLImpl)getFromCache(crlCache, encoding);
                  if (crl != null) {
                      return crl;
                  }
                  crl = new X509CRLImpl(encoding);
                  addToCache(crlCache, crl.getEncodedInternal(), crl);
                  return crl;
              } else {
                  throw new IOException("Empty input");
              }
          } catch (IOException ioe) {
              throw new CRLException(ioe.getMessage());
          }
      }
docs: Generates an X.509 certificate revocation list (CRL) object and
  initializes it with the data read from the given input stream
  <code>is</code>.
  
  @param is an input stream with the CRL data.
  
  @return an X.509 CRL object initialized with the data
  from the input stream.
  
  @exception CRLException on parsing errors.