/** {@inheritDoc} */
  public SOAPMessage signSoapMessage(SOAPMessage msg, CredentialInfo credentialInfo)
      throws JAXRException {
    try {
      // Check if the server being communicated is a legacy server and property for it is set.
      boolean legacyServer =
          Boolean.valueOf(
                  CommonProperties.getInstance()
                      .getProperty("omar.common.security.legacyServer", "false"))
              .booleanValue();

      // Create XWSProcessor
      XWSSProcessorFactory factory = XWSSProcessorFactory.newInstance();
      XWSSProcessor processor = null;
      if (legacyServer) {
        processor =
            factory.createForSecurityConfiguration(
                getSecurityConfiguration(msg), new SecurityCallbackHandler(credentialInfo));
      } else {

        processor =
            factory.createForSecurityConfiguration(
                getSigningSecurityConfiguration(msg, credentialInfo),
                new SecurityCallbackHandler(credentialInfo));
      }
      ProcessingContext context = new ProcessingContext();

      // msg will be updated in place
      context.setSOAPMessage(msg);
      processor.secureOutboundMessage(context);

      // work around for SOAPMessage.writeTo() inconsistencies
      msg.saveChanges();
    } catch (Exception e) {
      throw new JAXRException(
          CommonResourceBundle.getInstance().getString("message.signSoapMessageFailed"), e);
    }

    return msg;
  }