All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.redhat.lightblue.migrator.AbstractController Maven / Gradle / Ivy

There is a newer version: 2.56.1
Show newest version
package com.redhat.lightblue.migrator;

import java.util.Date;
import java.util.HashSet;
import java.util.Random;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.redhat.lightblue.client.LightblueClient;
import com.redhat.lightblue.client.Locking;

public abstract class AbstractController extends Thread {

    public enum JobType {
        GENERATED, NONGENERATED, ANY;
    }

    public static final Random random = new Random(new Date().getTime());

    private static final Logger LOGGER = LoggerFactory.getLogger(AbstractController.class);

    protected MigrationConfiguration migrationConfiguration;
    protected final Controller controller;
    protected final LightblueClient lbClient;
    protected final Locking locking;
    protected final Class migratorClass;
    protected final ThreadGroup migratorThreads;
    protected final HashSet myLocks=new HashSet<>();
    protected boolean stopped=false;

    public AbstractController(Controller controller,MigrationConfiguration migrationConfiguration,String threadGroupName) {
        this.migrationConfiguration=migrationConfiguration;
        this.controller=controller;
        lbClient=controller.getLightblueClient();
        locking=lbClient.getLocking("migration");
        if(migrationConfiguration.getMigratorClass()==null)
            migratorClass=DefaultMigrator.class;
        else {
            try {
                migratorClass = Class.forName(migrationConfiguration.getMigratorClass());
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }

        migratorThreads = new ThreadGroup(threadGroupName);
    }

    public void setStopped() {
        stopped=true;
        interrupt();
    }

    public ThreadGroup getMigratorThreads() {
        return migratorThreads;
    }

    public Controller getController() {
        return controller;
    }

    public MigrationConfiguration getMigrationConfiguration() {
        return migrationConfiguration;
    }

    public MigrationConfiguration reloadMigrationConfiguration() throws Exception {
        try {
            LOGGER.debug("Reloading migration configuration {}", migrationConfiguration.get_id());
            return controller.loadMigrationConfiguration(migrationConfiguration.get_id());
        } catch (Exception e) {
            LOGGER.error("Cannot reload migration configuration:" + e);
            throw e;
        }
    }

    /**
     * Attempts to lock a migration job. If successful, return the migration job
     * and the active execution
     */
    public ActiveExecution lock(String id)
            throws Exception {
        LOGGER.debug("locking {}", id);
        if (!myLocks.contains(id)) {
            if (locking.acquire(id, null)) {
                myLocks.add(id);
                ActiveExecution ae = new ActiveExecution();
                ae.setMigrationJobId(id);
                ae.set_id(id);
                ae.setStartTime(new Date());
                return ae;
            }
        }
        return null;
    }

    public void unlock(String id) {
        LOGGER.debug("Unlocking {}", id);
        try {
            locking.release(id);
        } catch (Exception e) {
            LOGGER.error("Error unlocking {}", id, e);
        }
        myLocks.remove(id);
        Breakpoint.checkpoint("MigratorController:unlock");
    }

    public Migrator createMigrator(MigrationJob mj, ActiveExecution ae)
            throws Exception {
        Migrator migrator = (Migrator) migratorClass.getConstructor(ThreadGroup.class).newInstance(migratorThreads);
        migrator.setController(this);
        migrator.setMigrationJob(mj);
        migrator.setActiveExecution(ae);
        return migrator;
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy