/**
 *
 * Copyright 2005 the original author or authors.
 *
 *  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.gbean.kernel;

import java.io.Serializable;

/**
 * The state of services within the Kernel.  The state model is directly adapted from the J2EE Management Specification
 * (JSR 77) with the removal of the FAILED state.
 *
 * @author Dain Sundstrom
 * @version $Id$
 * @since 1.0
 */
public final class ServiceState implements Serializable {
    private static final long serialVersionUID = -2629672602273580572L;

    /**
     * This state indicates that the service is attempting to start but has not fully started yet.  Normally, a service
     * in this state is waiting for a required service to enter the RUNNING state.
     */
    public static final ServiceState STARTING = new ServiceState((byte) 0, "STARTING");

    /**
     * This state indicates that the service is in the normal operational state.
     */
    public static final ServiceState RUNNING = new ServiceState((byte) 1, "RUNNING");

    /**
     * This state indicates that the service is attempting to stop but has not fully stopped yet.  Normally, a service
     * in this state because another service is still usind this service.
     */
    public static final ServiceState STOPPING = new ServiceState((byte) 2, "STOPPING");

    /**
     * This state indicates that the service is stopped and not operational.
     */
    public static final ServiceState STOPPED = new ServiceState((byte) 3, "STOPPED");

    /**
     * A quick index for looking up service states.
     */
    private static final ServiceState[] serviceStateIndex = new ServiceState[]{STARTING, RUNNING, STOPPING, STOPPED};

    static {
        for (int i = 0; i < serviceStateIndex.length; i++) {
            ServiceState serviceState = serviceStateIndex[i];
            assert serviceState.getIndex() != i : serviceState + " state index is " + serviceState.getIndex() +
                    ", but is located at index " + i + " in the serviceStateIndex";
        }
    }

    /**
     * Converts the state index into corresponding state name.
     *
     * @param state the state index
     * @return the name of the state
     * @throws IllegalArgumentException if the state index is not 0, 1, 2 or 3
     */
    public static ServiceState getServiceState(int state) throws IllegalArgumentException {
        if (state < 0 || state >= serviceStateIndex.length) {
            throw new IllegalArgumentException("Unknown state " + state);
        }
        return serviceStateIndex[state];
    }

    /**
     * Converts the state name in the corresponding state index.  This method performs a case insensitive comparison.
     *
     * @param state the state name
     * @return the state index
     * @throws IllegalArgumentException if the state index is not STARTING, RUNNING, STOPPING or FAILED
     */
    public static ServiceState parseServiceState(String state) {
        if (STARTING.toString().equalsIgnoreCase(state)) {
            return STARTING;
        } else if (RUNNING.toString().equalsIgnoreCase(state)) {
            return RUNNING;
        } else if (STOPPING.toString().equalsIgnoreCase(state)) {
            return STOPPING;
        } else if (STOPPED.toString().equalsIgnoreCase(state)) {
            return STOPPED;
        } else {
            throw new IllegalArgumentException("Unknown state " + state);
        }
    }

    private final byte index;
    private final transient String name;

    private ServiceState(byte index, String name) {
        this.index = index;
        this.name = name;
    }

    /**
     * Gets the unique index of this state.  This index can be be used to retrieve this state instance using the
     * getServiceState(int) method.
     *
     * @return the unique index of this state
     */
    public int getIndex() {
        return index;
    }

    /**
     * The unique name of this state.  This uppercase name can be used to retrieve this state instance using the
     * parseServiceState(String).
     *
     * @return the unique name of this state
     */
    public String getName() {
        return name;
    }

    /**
     * Returns the name of this state.
     *
     * @return the unique name of this state
     */
    public String toString() {
        return name;
    }

    private Object readResolve() {
        return serviceStateIndex[index];
    }
}
