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

com.elega9t.commons.entity.DefaultRunnableUniqueEntity Maven / Gradle / Ivy

The newest version!
/*
 * Copyright (c) 2011 - 2012. Elega9t Ltd. All rights reserved.
 * ELEGA9T PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.Copyright (c) 2011 - 2012. Elega9t Ltd. All rights reserved.
 */

package com.elega9t.commons.entity;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicReference;
import java.util.logging.Level;
import java.util.logging.Logger;

public abstract class DefaultRunnableUniqueEntity extends DefaultUniqueEntity implements RunnableUniqueEntity {

    public Logger logger = Logger.getLogger(getClass().getName());

    private AtomicReference status;

    private List lifecycleListeners = new ArrayList();

    public DefaultRunnableUniqueEntity(String id, String name) {
        super(id, name);
        status = new AtomicReference(STATUS.STOPPED);
    }

    @Override
    public STATUS getStatus() {
        return status.get();
    }

    private void updateStatus(STATUS status) throws RunnableEntityException {
        this.status.set(status);
        fireLifecycleEvent(status);
    }

    public void fireLifecycleEvent(STATUS status) throws RunnableEntityException {
        for (LifecycleListener lifecycleListener : lifecycleListeners) {
            lifecycleListener.lifecycleEventOccurred(status, this);
        }
    }

    @Override
    public final void start() throws RunnableEntityException {
        if (status.get() != STATUS.STOPPED) {
            throw new RunnableEntityException(getUniqueName() + " is still running.");
        } else {
            logger.log(Level.FINE, "Starting " + getUniqueName() + "...");
            updateStatus(STATUS.STARTING);
            startEntity();
            logger.log(Level.FINE, getUniqueName() + " started.");
            updateStatus(STATUS.RUNNING);
        }
    }

    protected abstract void startEntity() throws RunnableEntityException;

    @Override
    public void stop() throws RunnableEntityException {
        if (status.get() == STATUS.STOPPING || status.get() == STATUS.STOPPED) {
            throw new RunnableEntityException(getUniqueName() + " already stopping or stopped.");
        } else {
            updateStatus(STATUS.STOPPING);
            stopEntity();
            updateStatus(STATUS.STOPPED);
        }
    }

    protected abstract void stopEntity() throws RunnableEntityException;

    @Override
    public void addLifecycleListener(LifecycleListener lifecycleListener) {
        lifecycleListeners.add(lifecycleListener);
    }

    @Override
    public boolean removeLifecycleListener(LifecycleListener lifecycleListener) {
        return lifecycleListeners.remove(lifecycleListener);
    }

    @Override
    public void removeAllLifecycleListeners() {
        lifecycleListeners.clear();
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy