package at.gv.egovernment.moa.spss.server.invoke;

import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.List;

import iaik.server.modules.cmsverify.CMSSignatureVerificationResult;
import iaik.server.modules.cmsverify.CertificateValidationResult;

import at.gv.egovernment.moa.spss.MOAApplicationException;
import at.gv.egovernment.moa.spss.api.SPSSFactory;
import at.gv.egovernment.moa.spss.api.cmsverify.VerifyCMSSignatureResponse;
import at.gv.egovernment.moa.spss.api.cmsverify.VerifyCMSSignatureResponseElement;
import at.gv.egovernment.moa.spss.api.common.CheckResult;
import at.gv.egovernment.moa.spss.api.common.SignerInfo;

/**
 * A class to build a <code>VerifyCMSSignatureResponse</code> object.
 * 
 * <p>Via subsequent calls to <code>addResult()</code> a number of results from
 * a CMS signature verification can be added to the response.</p>
 * 
 * <p>The <code>getResponseElement()</code> method then returns the
 * <code>VerifyCMSSignatureResponse</code> built so far.</p>
 * 
 * @author Patrick Peck
 * @version $Id$
 */
public class VerifyCMSSignatureResponseBuilder {
  /** The <code>SPSSFactory</code> for creating API objects. */
  private SPSSFactory factory = SPSSFactory.getInstance();
  /** The elements making up the response. */
  private List responseElements = new ArrayList();

  /**
   * Get the <code>VerifyCMSSignatureResponse</code> built so far.
   * 
   * @return The <code>VerifyCMSSignatureResponse</code> built so far.
   */
  public VerifyCMSSignatureResponse getResponse() {
    return factory.createVerifyCMSSignatureResponse(responseElements);
  }

  /**
   * Add a verification result to the response.
   * 
   * @param result The result to add.
   * @throws MOAApplicationException An error occurred adding the result.
   */
  public void addResult(CMSSignatureVerificationResult result)
    throws MOAApplicationException {

    CertificateValidationResult certResult =
      result.getCertificateValidationResult();
    int signatureCheckCode =
      result.getSignatureValueVerificationCode().intValue();
    int certificateCheckCode = certResult.getValidationResultCode().intValue();
    VerifyCMSSignatureResponseElement responseElement;
    SignerInfo signerInfo;
    CheckResult signatureCheck;
    CheckResult certificateCheck;

    // add SignerInfo element
    signerInfo =
      factory.createSignerInfo(
        (X509Certificate) certResult.getCertificateChain().get(0),
        certResult.isQualifiedCertificate(),
        certResult.isPublicAuthorityCertificate(),
        certResult.getPublicAuthorityID());

    // add SignatureCheck element
    signatureCheck = factory.createCheckResult(signatureCheckCode, null);

    // add CertificateCheck element
    certificateCheck = factory.createCheckResult(certificateCheckCode, null);

    // build the response element
    responseElement =
      factory.createVerifyCMSSignatureResponseElement(
        signerInfo,
        signatureCheck,
        certificateCheck);
    responseElements.add(responseElement);
  }

}