org.kaaproject.kaa.server.datamigration.CtlNotificationMigration.java Source code

Java tutorial

Introduction

Here is the source code for org.kaaproject.kaa.server.datamigration.CtlNotificationMigration.java

Source

/*
 * 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 static com.datastax.driver.core.querybuilder.QueryBuilder.eq;
import static com.datastax.driver.core.querybuilder.QueryBuilder.select;
import static com.datastax.driver.core.querybuilder.QueryBuilder.set;
import static com.datastax.driver.core.querybuilder.QueryBuilder.update;
import static java.lang.Long.parseLong;

import com.datastax.driver.core.BatchStatement;
import com.datastax.driver.core.Cluster;
import com.datastax.driver.core.ResultSet;
import com.datastax.driver.core.Row;
import com.datastax.driver.core.Session;
import com.datastax.driver.core.utils.Bytes;
import com.mongodb.MongoClient;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Filters;

import org.bson.Document;
import org.kaaproject.kaa.server.datamigration.model.Schema;
import org.kaaproject.kaa.server.datamigration.utils.Options;

import java.nio.ByteBuffer;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Date;
import java.util.List;

public class CtlNotificationMigration extends AbstractCtlMigration {
    private MongoClient client;
    private Cluster cluster;
    private String dbName;
    private String nosql;

    /**
     * Create entity that responsible for data migration from old tables notification to
     * new ctl based ones.
     *
     * @param connection the connection to relational database
     * @param options    the options for configuring NoSQL databases
     */
    public CtlNotificationMigration(Connection connection, Options options) {
        super(connection);
        client = new MongoClient(options.getHost());
        cluster = Cluster.builder().addContactPoint(options.getHost()).build();
        dbName = options.getDbName();
        this.nosql = options.getDbName();
    }

    @Override
    protected List<Schema> transform() throws SQLException {
        List<Schema> res = super.transform();

        if (nosql.equals(Options.DEFAULT_NO_SQL)) {
            MongoDatabase database = client.getDatabase(dbName);
            MongoCollection<Document> notification = database.getCollection("notification");
            MongoCollection<Document> enpNotification = database.getCollection("endpoint_notification");

            FindIterable<Document> cursor = notification.find();
            for (Document document : cursor) {
                Object id = document.get("_id");
                Long schemaId = parseLong((String) document.get("notification_schema_id"));
                notification.updateMany(Filters.eq("_id", id),
                        Filters.eq("$set", Filters.eq("notification_schema_id", schemaId + idShift)));
            }

            cursor = enpNotification.find();
            for (Document document : cursor) {
                Object id = document.get("_id");
                Long schemaId = parseLong((String) document.get("notification.notification_schema_id"));
                notification.updateMany(Filters.eq("_id", id),
                        Filters.eq("$set", Filters.eq("notification.notification_schema_id", schemaId + idShift)));
            }
        } else {
            Session session = cluster.connect(dbName);
            BatchStatement batchStatement = new BatchStatement();

            //notification
            ResultSet results = session.execute(select().from("notification"));
            for (Row row : results) {
                String id = row.getString("nf_id");
                Long schemaId = parseLong(row.getString("schema_id"));
                String[] ids = id.split("::");

                batchStatement.add(update("notification").with(set("schema_id", String.valueOf(schemaId + idShift)))
                        .where(eq("topic_id", ids[0])).and(eq("nf_type", ids[1]))
                        .and(eq("nf_version", Integer.valueOf(ids[2])))
                        .and(eq("seq_num", Integer.valueOf(ids[3]))));
            }

            //endpoint notification
            results = session.execute(select().from("ep_nfs"));
            for (Row row : results) {
                String id = row.getString("nf_id");
                Long schemaId = parseLong(row.getString("schema_id"));
                String[] ids = id.split("::");
                ByteBuffer epKeyHash = Bytes.fromHexString(ids[0]);
                Date lastModTime = new Date(Long.valueOf(ids[1]));

                batchStatement.add(update("ep_nfs").with(set("schema_id", String.valueOf(schemaId + idShift)))
                        .where(eq("ep_key_hash", epKeyHash)).and(eq("last_mod_time", lastModTime)));
            }

            session.execute(batchStatement);
            session.close();
            cluster.close();
        }
        return res;
    }

    @Override
    protected String getPrefixTableName() {
        return "notification";
    }
}