/**
   * Method that verifies an incoming signature and returns the response as application/xml.
   *
   * @param signatureVerificationRequest the request which is converted to a {@link
   *     SignatureVerificationRequest} from xml
   * @return the {@link SignatureVerificationResponse} as application/xml
   */
  @POST
  @Path("/verifySignature")
  @Consumes("application/xml")
  @Produces("application/xml")
  public SignatureVerificationResponse verifySignature(
      SignatureVerificationRequest signatureVerificationRequest) {

    SignatureVerificationResponse response = new SignatureVerificationResponse();
    response.setCertificateInfos(new CertificateInfos());

    boolean verified = false;
    String message = null;

    try {

      SignatureFormat format = signatureVerificationRequest.getSignatureFormat();
      if (SignatureFormat.XMLDIGSIG.equals(format)) {
        try {
          SignatureData signatureData =
              getFromXmlDigSigSignature(signatureVerificationRequest, response);

          verified = super.verifySignature(signatureData);
        } catch (SignatureException e) {
          e.printStackTrace();
          message = e.getMessage();
        }
      } else if (SignatureFormat.CMS.equals(format)) {
        SignatureData signData = getFromCmsSignature(signatureVerificationRequest, response);

        try {
          // Verify
          verified = super.verifySignature(signData);
        } catch (SignatureException e) {
          e.printStackTrace();
          message = e.getMessage();
        }
      }

      response.setStatus(verified ? SignatureStatus.SUCCESS : SignatureStatus.FAILURE);
      if (message != null) {
        response.setMessage(message);
      }

    } catch (IOException ex) {
      throw new WebApplicationException(ex, Response.Status.INTERNAL_SERVER_ERROR);
    } catch (MarshalException ex) {
      throw new WebApplicationException(ex, Response.Status.INTERNAL_SERVER_ERROR);
    } catch (ParserConfigurationException ex) {
      throw new WebApplicationException(ex, Response.Status.INTERNAL_SERVER_ERROR);
    } catch (SAXException ex) {
      throw new WebApplicationException(ex, Response.Status.INTERNAL_SERVER_ERROR);
    } catch (CMSException ex) {
      throw new WebApplicationException(ex, Response.Status.INTERNAL_SERVER_ERROR);
    }

    return response;
  }