/*
* Copyright 2014-2016 CyberVision, 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 org.kaaproject.kaa.server.datamigration;
import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.kaaproject.kaa.server.common.core.algorithms.generation.ConfigurationGenerationException;
import org.kaaproject.kaa.server.datamigration.model.Ctl;
import org.kaaproject.kaa.server.datamigration.model.Schema;
import org.kaaproject.kaa.server.datamigration.utils.BaseSchemaIdCounter;
import org.kaaproject.kaa.server.datamigration.utils.DataSources;
import org.kaaproject.kaa.server.datamigration.utils.Options;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class MigrateData {
private static final Logger LOG = LoggerFactory.getLogger(MigrateData.class);
private static Connection conn;
/**
* The entry point of migrate data application.
*
* @param args the input options
*/
public static void main(String[] args) {
Options options = new Options();
for (int i = 0; i < args.length; i++) {
String arg = args[i];
if (arg.charAt(0) == '-') {
String option = arg.substring(1, arg.length()).trim();
if (i >= args.length - 1) {
throw new IllegalArgumentException("Not found value after option -" + option);
}
switch (option) {
case "u":
options.setUsername(args[i + 1]);
break;
case "p":
options.setPassword(args[i + 1]);
break;
case "h":
options.setHost(args[i + 1]);
break;
case "db":
options.setDbName(args[i + 1]);
break;
case "nosql":
options.setNoSql(args[i + 1]);
break;
case "driver":
options.setDriverClassName(args[i + 1]);
break;
case "url":
options.setJdbcUrl(args[i + 1]);
break;
default:
throw new IllegalArgumentException("No such option: -" + option);
}
}
}
LOG.debug(options.toString());
try {
List<Schema> schemas = new ArrayList<>();
conn = DataSources.getDataSource(options).getConnection();
QueryRunner runner = new QueryRunner();
Long maxId = runner.query(conn, "select max(id) as max_id from base_schems",
rs -> rs.next() ? rs.getLong("max_id") : null);
BaseSchemaIdCounter.setInitValue(maxId);
final UpdateUuidsMigration updateUuidsMigration = new UpdateUuidsMigration(conn, options);
final EndpointProfileMigration endpointProfileMigration =
new EndpointProfileMigration(options);
List<AbstractCtlMigration> migrationList = new ArrayList<>();
migrationList.add(new CtlConfigurationMigration(conn));
migrationList.add(new CtlEventsMigration(conn));
migrationList.add(new CtlNotificationMigration(conn, options));
migrationList.add(new CtlLogMigration(conn));
new EndpointSpecificConfigurationMigration(options.getHost(), options.getDbName(), options.getNoSql()).transform();
final CtlAggregation aggregation = new CtlAggregation(conn);
final BaseSchemaRecordsCreation recordsCreation = new BaseSchemaRecordsCreation(conn);
// convert uuids from latin1 to base64
updateUuidsMigration.transform();
endpointProfileMigration.transform();
//before phase
for (AbstractCtlMigration m : migrationList) {
m.beforeTransform();
}
// transform phase
for (AbstractCtlMigration m : migrationList) {
schemas.addAll(m.transform());
}
//aggregation phase
Map<Ctl, List<Schema>> ctlToSchemas = aggregation.aggregate(schemas);
//base schema records creation phase
recordsCreation.create(ctlToSchemas);
//after phase
for (AbstractCtlMigration m : migrationList) {
m.afterTransform();
}
conn.commit();
} catch (SQLException | IOException | ConfigurationGenerationException ex) {
LOG.error("Error: " + ex.getMessage(), ex);
DbUtils.rollbackAndCloseQuietly(conn);
} finally {
DbUtils.rollbackAndCloseQuietly(conn);
}
}
}