content: package org.jboss.aerogear.unifiedpush.migrator;
  
  
  import liquibase.change.custom.CustomTaskChange;
  import liquibase.database.Database;
  import liquibase.database.jvm.JdbcConnection;
  import liquibase.exception.CustomChangeException;
  import liquibase.exception.SetupException;
  import liquibase.exception.ValidationErrors;
  import liquibase.resource.ResourceAccessor;
  
  import java.sql.Connection;
  import java.sql.PreparedStatement;
  import java.sql.ResultSet;
  import java.sql.SQLException;
  import java.util.ArrayList;
  import java.util.List;
  
  public class GetRidOfApiKeysMigration implements CustomTaskChange {
      private static class InstallationData {
          private String installationId;
          private String variantId;
  
          private InstallationData(String installationId, String variantId) {
              this.installationId = installationId;
              this.variantId = variantId;
          }
      }
  
      @Override
      public void execute(Database database) throws CustomChangeException {
          Connection conn = ((JdbcConnection) (database.getConnection())).getWrappedConnection();
          try {
              conn.setAutoCommit(false);
              List<InstallationData> list = new ArrayList<>();
              String query = "select installation.id as installation_id," +
                      " installation.variant_id as installation_variant_id," +
                      " variant.id as variant_id," +
                      " variant.api_key as variant_api_key" +
                      " from installation join variant on installation.variant_id = variant.api_key";
              PreparedStatement statement = conn.prepareStatement(query);
              ResultSet rs = statement.executeQuery();
              while (rs.next()) {
                  String installationId = rs.getString("installation_id");
                  String installationVariantId = rs.getString("installation_variant_id");
                  String variantId = rs.getString("variant_id");
                  String variantApiKey = rs.getString("variant_api_key");
                  list.add(new InstallationData(installationId,variantId));
              }
              String update = "update installation" +
                      " set variant_id = ?" +
                      " where id = ?";
              PreparedStatement updateInstallationsStatement = conn.prepareStatement(update);
              for (InstallationData data: list) {
                  updateInstallationsStatement.setString(1, data.variantId);
                  updateInstallationsStatement.setString(2, data.installationId);
                  updateInstallationsStatement.executeUpdate();
              }
  
              conn.commit();
          } catch (SQLException e) {
              e.printStackTrace();
          }
      }
  
      @Override
      public String getConfirmationMessage() {
          return null;
      }
  
      @Override
      public void setUp() throws SetupException {
  
      }
  
      @Override
      public void setFileOpener(ResourceAccessor resourceAccessor) {
  
      }
  
      @Override
      public ValidationErrors validate(Database database) {
          return null;
      }
  }
  