/*
 * このソースコードは blanco Frameworkによって自動生成されています。
 */
package blanco.sample.service;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;

/**
 * サービス定義ID[Sample]のサーブレットクラス。
 *
 * 説明:サービスのサンプル。このクラスは単にサンプルです。実際の動作には利用されません。<br>
 * このクラスは、Javaで書かれたアプリケーションをアプリケーションサーバ上に常駐させるための仕組みの一部です。<br>
 * このクラスはサーブレットです。アプリケーションサーバの起動時に呼び出されるサーブレットとして登録することによって常駐を実現します。<br>
 * <br>
 * アプリケーションサーバの web.xmlに下記の記述（またはそれに相当する内容）を記載することにより、常駐化することができます。<br>
 * <pre>
 * &lt;servlet&gt;
 *   &lt;servlet-name&gt;Sample&lt;/servlet-name&gt;
 *   &lt;servlet-class&gt;blanco.sample.service.Sample&lt;/servlet-class&gt;
 *   &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;
 * &lt;/servlet&gt;
 * </pre>
 */
public class Sample extends HttpServlet {
    /**
     * 起動したかどうかのフラグを保護するためのミューテックスオブジェクト。
     */
    protected Object fLockObject = new Object();

    /**
     * この常駐が起動したかどうかを記憶するフラグ。
     */
    protected boolean fIsStarted = false;

    /**
     * この常駐の実際の処理クラス。
     */
    protected AbstractSampleProcess fProcess = null;

    /**
     * サービスのエントリポイント。
     *
     * @throws ServletException サーブレットに関する例外が発生した場合。
     */
    public void init() throws ServletException {
        synchronized (fLockObject) {
            // オブジェクトによるロックによって、再入を防止しています。

            System.out.println("Sample: init(): begin.");
            if (fIsStarted) {
                System.out.println("Sample: init(): already started.");
                return;
            }

            // 起動したことを示すフラグをtrueにセットします。
            // このフラグをセットした後で例外が発生して初期化処理が中断されたとしても、もはや起動した状態であるとみなします。
            fIsStarted = true;

            System.out.println("Sample:説明[サービスのサンプル。このクラスは単にサンプルです。実際の動作には利用されません。]");

            // 実際に常駐させるクラスのインスタンスを作成します。
            // ※ポイント
            // 下記の行でコンパイルエラーが出る場合には、まだ SampleProcess を作成していないことが考えられます。
            // AbstractSampleProcess クラスを継承して blanco.sample.service パッケージに SampleProcess クラスを作成することにより解決できることが多いです。
            fProcess = new SampleProcess();
            new Thread(fProcess).start();

            System.out.println("Sample: init(): end.");
        }
    }

    /**
     * サービスの破棄通知。
     */
    public void destroy() {
        synchronized (fLockObject) {
            // オブジェクトによるロックによって、再入を防止しています。

            System.out.println("Sample: destroy(): begin.");
            if (fIsStarted == false) {
                System.out.println("Sample: destroy(): not started.");
                return;
            }

            // 起動したことを示すフラグをfalseにセットします。
            fIsStarted = false;

            // 終了処理を行います。
            fProcess.stop();
            fProcess = null;

            System.out.println("Sample: destroy(): end.");
        }
    }
}
