content: package local.org.bouncycastle.asn1;
  
  import java.io.IOException;
  import java.util.Enumeration;
  
  /**
   * Note: this class is for processing DER/DL encoded sequences only.
   */
  class LazyEncodedSequence
      extends ASN1Sequence
  {
      private byte[] encoded;
  
      LazyEncodedSequence(
          byte[] encoded)
          throws IOException
      {
          this.encoded = encoded;
      }
  
      private void parse()
      {
          Enumeration en = new LazyConstructionEnumeration(encoded);
  
          while (en.hasMoreElements())
          {
              seq.addElement(en.nextElement());
          }
  
          encoded = null;
      }
  
      public synchronized ASN1Encodable getObjectAt(int index)
      {
          if (encoded != null)
          {
              parse();
          }
  
          return super.getObjectAt(index);
      }
  
      public synchronized Enumeration getObjects()
      {
          if (encoded == null)
          {
              return super.getObjects();
          }
  
          return new LazyConstructionEnumeration(encoded);
      }
  
      public synchronized int size()
      {
          if (encoded != null)
          {
              parse();
          }
  
          return super.size();
      }
  
      ASN1Primitive toDERObject()
      {
          if (encoded != null)
          {
              parse();
          }
  
          return super.toDERObject();
      }
  
      ASN1Primitive toDLObject()
      {
          if (encoded != null)
          {
              parse();
          }
  
          return super.toDLObject();
      }
  
      int encodedLength()
          throws IOException
      {
          if (encoded != null)
          {
              return 1 + StreamUtil.calculateBodyLength(encoded.length) + encoded.length;
          }
          else
          {
              return super.toDLObject().encodedLength();
          }
      }
  
      void encode(
          ASN1OutputStream out)
          throws IOException
      {
          if (encoded != null)
          {
              out.writeEncoded(BERTags.SEQUENCE | BERTags.CONSTRUCTED, encoded);
          }
          else
          {
              super.toDLObject().encode(out);
          }
      }
  }
  