/*
 * Copyright 2018 ThoughtWorks, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.thoughtworks.go.server.datamigration;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.time.Duration;
import java.time.Instant;

import static java.lang.String.format;

public class DataMigrationRunner {
    private DataMigrationRunner() {
    }

    public static void run(DataSource ds) throws SQLException {
        info("Running data migrations...");

        try (Connection cxn = ds.getConnection()) {
            exec(cxn, M001.convertPipelineSelectionsToFilters());
            exec(cxn, M002.ensureFilterStateIsNotNull());
        }

        info("Data migrations completed.");
    }

    private static void exec(Connection cxn, Migration migration) throws SQLException {
        cxn.setAutoCommit(false);

        try {
            Instant start = Instant.now();
            migration.run(cxn);
            cxn.commit();
            info("Data migration took %d ms", Duration.between(start, Instant.now()).toMillis());
        } catch (SQLException e) {
            err("Data migration failed: %s", e.getMessage());
            cxn.rollback();
            throw e;
        }
    }

    private static void info(String message, Object... tokens) {
        System.out.println(format(message, tokens));
    }

    private static void err(String message, Object... tokens) {
        System.err.println(format(message, tokens));
    }
}

@@ -647,16 +647,74 @@
 ation;%0A%0A
+import org.slf4j.Logger;%0Aimport org.slf4j.LoggerFactory;%0A%0A
 import j
@@ -850,61 +850,109 @@
 t;%0A%0A
-import static java.lang.String.format;%0A%0Apublic class 
+public class DataMigrationRunner %7B%0A%0A    private static final Logger LOGGER = LoggerFactory.getLogger(
 Data
@@ -966,18 +966,25 @@
 onRunner
- %7B
+.class);%0A
 %0A    pri
@@ -1087,24 +1087,31 @@
 n %7B%0A        
+LOGGER.
 info(%22Runnin
@@ -1322,32 +1322,39 @@
      %7D%0A%0A        
+LOGGER.
 info(%22Data migra
@@ -1630,16 +1630,23 @@
         
+LOGGER.
 info(%22Da
@@ -1667,10 +1667,10 @@
 ook 
-%25d
+%7B%7D
  ms%22
@@ -1770,19 +1770,28 @@
         
+LOGGER.
 err
+or
 (%22Data m
@@ -1811,10 +1811,10 @@
 ed: 
-%25s
+%7B%7D
 %22, e
@@ -1826,16 +1826,19 @@
 essage()
+, e
 );%0A     
@@ -1902,254 +1902,6 @@
  %7D%0A%0A
-    private static void info(String message, Object... tokens) %7B%0A        System.out.println(format(message, tokens));%0A    %7D%0A%0A    private static void err(String message, Object... tokens) %7B%0A        System.err.println(format(message, tokens));%0A    %7D%0A
 %7D%0A

Use logger instead of stdout