package at.gv.egovernment.moa.spss.api;

import org.apache.commons.discovery.tools.DiscoverClass;

import at.gv.egovernment.moa.spss.MOAException;
import at.gv.egovernment.moa.spss.api.cmsverify.VerifyCMSSignatureRequest;
import at.gv.egovernment.moa.spss.api.cmsverify.VerifyCMSSignatureResponse;
import at.gv.egovernment.moa.spss.api.xmlverify.VerifyXMLSignatureRequest;
import at.gv.egovernment.moa.spss.api.xmlverify.VerifyXMLSignatureResponse;

/**
 * Interface providing functions for verifying signatures.
 * 
 * @author Patrick Peck
 * @version $Id$
 */
public abstract class SignatureVerificationService {

  /** The default implementation class. */
  private static final String DEFAULT_IMPLEMENTATION =
    "at.gv.egovernment.moa.spss.server.invoke.SignatureVerificationServiceImpl";

  /** The single instance of this class. */
  private static SignatureVerificationService instance = null;

  /**
   * Get an instance of the <code>SignatureVerificationService</code>.
   * 
   * @return A concrete instance of the 
   * <code>SignatureVerificationService</code>.
   */
  public static synchronized SignatureVerificationService getInstance() {
    if (instance == null) {
      try {
        DiscoverClass discover = new DiscoverClass();
        instance =
          (SignatureVerificationService) discover.newInstance(
            SignatureVerificationService.class,
            DEFAULT_IMPLEMENTATION);
      } catch (Exception e) {
        // this can not happen since we provide a valid default 
        // implementation
      }
    }
    return instance;
  }

  /**
   * Verify a CMS signature.
   * 
   * @param request Detailed information on the verification that should be
   * performed.
   * @return A <code>VerifyCMSSignatureResponse</code> object that contains
   * information about the performed verification.
   * @throws MOAException Error in server side MOA module.
   */
  public abstract VerifyCMSSignatureResponse verifyCMSSignature(VerifyCMSSignatureRequest request)
    throws MOAException;
  /**
   * Verfiy an XML Signature.
   * 
   * @param request  information on the verification that should be performed.
   * @return A <code>VerifyXMLSignatureResponse</code> object that contains
   * information about the performed verification.
   * @throws MOAException Error in server side MOA module.
   */
  public abstract VerifyXMLSignatureResponse verifyXMLSignature(VerifyXMLSignatureRequest request)
    throws MOAException;
}