/**
  * End Element handler
  *
  * @param namespaceURI namespace URI
  * @param lName local name
  * @param qName qualified name
  */
 public void endElement(String namespaceURI, String sName, String qName) throws SAXException {
   String tName = qName;
   if (tName.indexOf(":") != -1) tName = qName.substring(tName.indexOf(":") + 1);
   if (m_logger.isDebugEnabled()) m_logger.debug("End Element: " + tName);
   // remove last tag from stack
   String currTag = (String) m_tags.pop();
   //	<KeyName>
   if (tName.equals("KeyName")) {
     checkEncryptedData();
     EncryptedKey ekey = m_doc.getLastEncryptedKey();
     checkEncryptedKey(ekey);
     ekey.setKeyName(m_sbCollectChars.toString());
     m_sbCollectChars = null; // stop collecting
   }
   //	<CarriedKeyName>
   if (tName.equals("CarriedKeyName")) {
     checkEncryptedData();
     EncryptedKey ekey = m_doc.getLastEncryptedKey();
     checkEncryptedKey(ekey);
     ekey.setCarriedKeyName(m_sbCollectChars.toString());
     m_sbCollectChars = null; // stop collecting
   }
   //	<X509Certificate>
   if (tName.equals("X509Certificate")) {
     checkEncryptedData();
     EncryptedKey ekey = m_doc.getLastEncryptedKey();
     checkEncryptedKey(ekey);
     try {
       X509Certificate cert =
           SignedDoc.readCertificate(Base64Util.decode(m_sbCollectChars.toString().getBytes()));
       ekey.setRecipientsCertificate(cert);
     } catch (DigiDocException ex) {
       SAXDigiDocException.handleException(ex);
     }
     m_sbCollectChars = null; // stop collecting
   }
   //	<CipherValue>
   if (tName.equals("CipherValue")) {
     checkEncryptedData();
     if (m_tags.search("EncryptedKey") != -1) { // child of <EncryptedKey>
       EncryptedKey ekey = m_doc.getLastEncryptedKey();
       checkEncryptedKey(ekey);
       ekey.setTransportKeyData(Base64Util.decode(m_sbCollectChars.toString().getBytes()));
     } else { // child of <EncryptedData>
       m_doc.setData(Base64Util.decode(m_sbCollectChars.toString().getBytes()));
       if (m_doc.getMimeType() != null
           && m_doc.getMimeType().equals(EncryptedData.DENC_ENCDATA_MIME_ZLIB))
         m_doc.setDataStatus(EncryptedData.DENC_DATA_STATUS_ENCRYPTED_AND_COMPRESSED);
       else
         m_doc.setDataStatus(EncryptedData.DENC_DATA_STATUS_ENCRYPTED_AND_NOT_COMPRESSED); // ???		
     }
     m_sbCollectChars = null; // stop collecting
   }
   // <EncryptionProperty>
   if (tName.equals("EncryptionProperty")) {
     checkEncryptedData();
     EncryptionProperty eprop = m_doc.getLastProperty();
     try {
       eprop.setContent(m_sbCollectChars.toString());
     } catch (DigiDocException ex) {
       SAXDigiDocException.handleException(ex);
     }
     m_sbCollectChars = null; // stop collecting
   }
 }
  /**
   * Start Element handler
   *
   * @param namespaceURI namespace URI
   * @param lName local name
   * @param qName qualified name
   * @param attrs attributes
   */
  public void startElement(String namespaceURI, String lName, String qName, Attributes attrs)
      throws SAXDigiDocException {
    String tName = qName;
    if (tName.indexOf(":") != -1) tName = qName.substring(qName.indexOf(":") + 1);
    if (m_logger.isDebugEnabled())
      m_logger.debug(
          "Start Element: "
              + tName
              + " qname: "
              + qName
              + " lname: "
              + lName
              + " uri: "
              + namespaceURI);
    m_tags.push(tName);
    if (tName.equals("KeyName")
        || tName.equals("CarriedKeyName")
        || tName.equals("X509Certificate")
        || tName.equals("CipherValue")
        || tName.equals("EncryptionProperty")) m_sbCollectChars = new StringBuffer();

    // <EncryptedData>
    if (tName.equals("EncryptedData")) {
      String str = findAtributeValue(attrs, "xmlns");
      try {
        m_doc = new EncryptedData(str);
        str = findAtributeValue(attrs, "Id");
        if (str != null) m_doc.setId(str);
        str = findAtributeValue(attrs, "Type");
        if (str != null) m_doc.setType(str);
        str = findAtributeValue(attrs, "MimeType");
        if (str != null) m_doc.setMimeType(str);
      } catch (DigiDocException ex) {
        SAXDigiDocException.handleException(ex);
      }
    }
    // <EncryptionMethod>
    if (tName.equals("EncryptionMethod")) {
      checkEncryptedData();
      if (m_tags.search("EncryptedKey") != -1) { // child of <EncryptedKey>
        EncryptedKey ekey = m_doc.getLastEncryptedKey();
        checkEncryptedKey(ekey);
        try {
          ekey.setEncryptionMethod(findAtributeValue(attrs, "Algorithm"));
        } catch (DigiDocException ex) {
          SAXDigiDocException.handleException(ex);
        }
      } else { // child of <EncryptedData>
        try {
          m_doc.setEncryptionMethod(findAtributeValue(attrs, "Algorithm"));
        } catch (DigiDocException ex) {
          SAXDigiDocException.handleException(ex);
        }
      }
    }
    // <EncryptedKey>
    if (tName.equals("EncryptedKey")) {
      checkEncryptedData();
      EncryptedKey ekey = new EncryptedKey();
      m_doc.addEncryptedKey(ekey);
      String str = findAtributeValue(attrs, "Recipient");
      if (str != null) ekey.setRecipient(str);
      str = findAtributeValue(attrs, "Id");
      if (str != null) ekey.setId(str);
    }
    // <EncryptionProperties>
    if (tName.equals("EncryptionProperties")) {
      checkEncryptedData();
      String str = findAtributeValue(attrs, "Id");
      if (str != null) m_doc.setEncryptionPropertiesId(str);
    }
    // <EncryptionProperty>
    if (tName.equals("EncryptionProperty")) {
      checkEncryptedData();
      EncryptionProperty eprop = new EncryptionProperty();
      m_doc.addProperty(eprop);
      String str = findAtributeValue(attrs, "Id");
      if (str != null) eprop.setId(str);
      str = findAtributeValue(attrs, "Target");
      if (str != null) eprop.setTarget(str);
      str = findAtributeValue(attrs, "Name");
      try {
        if (str != null) eprop.setName(str);
      } catch (DigiDocException ex) {
        SAXDigiDocException.handleException(ex);
      }
    }
  }