/*
 * This software is distributed under following license based on modified BSD
 * style license.
 * ----------------------------------------------------------------------
 * 
 * Copyright 2009 The Nimbus2 Project. All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 * 
 * 1. Redistributions of source code must retain the above copyright notice,
 *    this list of conditions and the following disclaimer. 
 * 2. Redistributions in binary form must reproduce the above copyright notice,
 *    this list of conditions and the following disclaimer in the documentation
 *    and/or other materials provided with the distribution.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE NIMBUS PROJECT ``AS IS'' AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
 * NO EVENT SHALL THE NIMBUS PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 * 
 * The views and conclusions contained in the software and documentation are
 * those of the authors and should not be interpreted as representing official
 * policies, either expressed or implied, of the Nimbus2 Project.
 */
package jp.ossc.nimbus.core;

public interface Service{
    
    /**
     * サービスの状態を表す列挙型定数です。<p>
     */
    public static enum State{
        /** 生成中 */
        CREATING,
        /** 生成完了 */
        CREATED,
        /** 開始中 */
        STARTING,
        /** 開始完了 */
        STARTED,
        /** 停止中 */
        STOPPING,
        /** 停止完了 */
        STOPPED,
        /** 破棄中 */
        DESTROYING,
        /** 破棄完了 */
        DESTROYED,
        /** 失敗 */
        FAILED,
        /** 不明 */
        UNKNOWN;
        
        public String toString(){
            switch(this){
            case CREATING:
                return "Creating";
            case CREATED:
                return "Created";
            case STARTING:
                return "Starting";
            case STARTED:
                return "Started";
            case STOPPING:
                return "Stopping";
            case STOPPED:
                return "Stopped";
            case DESTROYING:
                return "Destroying";
            case DESTROYED:
                return "Destroyed";
            case FAILED:
                return "Failed";
            case UNKNOWN:
            default:
                return "Unknown";
            }
        }
        
        public static State toState(String value){
            
            if(State.CREATING.toString().equals(value)){
                return State.CREATING;
            }else if(State.CREATED.toString().equals(value)){
                return State.CREATED;
            }else if(State.STARTING.toString().equals(value)){
                return State.STARTING;
            }else if(State.STARTED.toString().equals(value)){
                return State.STARTED;
            }else if(State.STOPPING.toString().equals(value)){
                return State.STOPPING;
            }else if(State.STOPPED.toString().equals(value)){
                return State.STOPPED;
            }else if(State.DESTROYING.toString().equals(value)){
                return State.DESTROYING;
            }else if(State.DESTROYED.toString().equals(value)){
                return State.DESTROYED;
            }else if(State.FAILED.toString().equals(value)){
                return State.FAILED;
            }else{
                return State.UNKNOWN;
            }
        }
    };
    
    /**
     * このサービスの登録先となる{@link ServiceManager}のサービス名を取得します。<p>
     *
     * @return ServiceManagerのサービス名
     * @see #setServiceManagerName(String)
     */
    public String getServiceManagerName();
    
    /**
     * このサービスの登録先となる{@link ServiceManager}のサービス名を設定します。<p>
     *
     * @param name ServiceManagerのサービス名
     * @see #getServiceManagerName()
     */
    public void setServiceManagerName(String name);
    
    /**
     * サービス名を設定します。<p>
     *
     * @param name サービス名
     * @see #getServiceName()
     */
    public void setServiceName(String name);
    
    /**
     * サービス名を取得します。<p>
     *
     * @return サービス名
     * @see #setServiceName(String)
     */
    public String getServiceName();
    
    /**
     * このサービスの登録先となる{@link ServiceManager}のサービス名とこのサービスのサービス名を含んだ{@link ServiceName}を取得します。<p>
     *
     * @return サービス名
     */
    public ServiceName getServiceNameObject();
    
    /**
     * 現在のサービス状態を取得します。<p>
     *
     * @return 状態を示す値
     */
    public State getState();
    
    /**
     * サービスを生成します。<p>
     * このサービスに必要なオブジェクトの生成などの初期化処理を行います。<br>
     *
     * @exception Exception サービスの生成処理に失敗した場合
     */
    public void create() throws Exception;
    
    /**
     * サービスを開始します。<p>
     * このサービスを利用可能な状態にします。このメソッドの呼び出し後は、このサービスの機能を利用できる事が保証されます。<br>
     *
     * @exception Exception サービスの開始処理に失敗した場合
     */
    public void start() throws Exception;
    
    /**
     * サービスを停止します。<p>
     * このサービスを利用不可能な状態にします。このメソッドの呼び出し後は、このサービスの機能を利用できる事は保証されません。<br>
     */
    public void stop();
    
    /**
     * サービスを破棄します。<p>
     * このサービスで使用するリソースを開放します。このメソッドの呼び出し後は、このサービスの機能を利用できる事は保証されません。<br>
     */
    public void destroy();
}