package org.skywalking.apm.agent.core.boot;

/**
 * The <code>StatusBootService</code> is an abstract implementations of {@link BootService}, it extends {@link
 * BootService}'s ability like this:
 * <p>
 * If an implementation extends <code>StatusBootService</code>, it can know whether this service starts up successfully
 * or not. It's based on {@link #bootUp()} function finished with or without an exception. if no exception, means start
 * up successfully.
 *
 * @author wusheng
 */
public abstract class StatusBootService implements BootService {
    private volatile boolean started = false;

    protected boolean isStarted() {
        return this.started;
    }

    @Override
    public final void bootUp() throws Throwable {
        try {
            bootUpWithStatus();
            started = true;
        } catch (Throwable e) {
            started = false;
            throw e;
        }
    }

    protected abstract void bootUpWithStatus() throws Exception;
}
