/**
  * Get the password from SecretManager . here only use SecretManager
  *
  * @param aliasPassword alias password
  * @return if the SecretManager is initiated , then , get the corresponding secret , else return
  *     alias itself
  */
 private String getActualPassword(String aliasPassword) {
   SecretManager secretManager = SecretManager.getInstance();
   if (secretManager.isInitialized()) {
     return secretManager.getSecret(aliasPassword);
   }
   return aliasPassword;
 }
  /**
   * Decrypts the encrypted secret provided by the specified callback handler.
   *
   * @param singleSecretCallback The singleSecretCallback which secret has to be decrypted
   */
  @Override
  protected void handleSingleSecretCallback(SingleSecretCallback singleSecretCallback) {

    if (!secretManager.isInitialized()) {
      if (log.isWarnEnabled()) {
        log.warn("SecretManager has not been initialized.Cannot collect secrets.");
      }
      return;
    }

    String id = singleSecretCallback.getId();
    if (id != null && !"".equals(id)) {
      singleSecretCallback.setSecret(decrypt(secretManager.getEncryptedData(id)));
    }
  }
/**
 * SecretCallbackHandler implementation which is compatible to the default encryption used within
 * the JBoss Application Server to decrypt database passwords.
 */
public class JBossEncryptionSecretCallbackHandler extends AbstractSecretCallbackHandler {

  private static final String ALGORITHM = "Blowfish";
  private static Key key = new SecretKeySpec("jaas is the way".getBytes(), ALGORITHM);
  private final SecretManager secretManager = SecretManager.getInstance();
  /**
   * Decrypts the encrypted secret provided by the specified callback handler.
   *
   * @param singleSecretCallback The singleSecretCallback which secret has to be decrypted
   */
  @Override
  protected void handleSingleSecretCallback(SingleSecretCallback singleSecretCallback) {

    if (!secretManager.isInitialized()) {
      if (log.isWarnEnabled()) {
        log.warn("SecretManager has not been initialized.Cannot collect secrets.");
      }
      return;
    }

    String id = singleSecretCallback.getId();
    if (id != null && !"".equals(id)) {
      singleSecretCallback.setSecret(decrypt(secretManager.getEncryptedData(id)));
    }
  }

  /**
   * Decrypts the encrypted secret using the Blowfish algorithm and the same hard-coded passphrase
   * the JBoss application server uses to decrypt database passwords.
   *
   * @param encryptedSecret the encrypted secret
   * @return the decrypted secret.
   */
  private static String decrypt(String encryptedSecret) {
    CipherInformation cipherInformation = new CipherInformation();
    cipherInformation.setAlgorithm(ALGORITHM);
    cipherInformation.setCipherOperationMode(CipherOperationMode.DECRYPT);
    cipherInformation.setInType(EncodingType.BIGINTEGER16); // TODO
    DecryptionProvider decryptionProvider = CipherFactory.createCipher(cipherInformation, key);
    return new String(decryptionProvider.decrypt(encryptedSecret.getBytes()));
  }
}