/*
 * Copyright 2004-2012 the Seasar Foundation and the Others.
 *
 * 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.seasar.mayaa.engine;

import java.util.Map;

import org.seasar.mayaa.ParameterAware;
import org.seasar.mayaa.engine.error.ErrorHandler;
import org.seasar.mayaa.engine.specification.Specification;

/**
 * ランタイムエンジン。ホストサーブレットからservice()が呼び出される。
 * リクエストに対して、ステートレスに実装。
 * @author Masataka Kurihara (Gluegent, Inc.)
 */
public interface Engine extends ParameterAware, Specification {

    /**
     * エラーハンドラの設定。
     * @param errorHandler エラーハンドラ。
     */
    void setErrorHandler(ErrorHandler errorHandler);

    /**
     * エラーハンドラの取得。
     * @return エラーハンドラ。
     */
    ErrorHandler getErrorHandler();

    /**
     * ページやテンプレートなどのスペック情報のインスタンスが
     * メモリキャッシュに存在する場合は返却する。
     * @param systemID システムID
     * @return スペック情報インスタンス
     */
    Specification findSpecificationFromCache(String systemID);

    /**
     * Pageオブジェクトのインスタンスを返す。
     * @param pageName ページ名。
     * @return Pageオブジェクト。
     */
    Page getPage(String pageName);

    /**
     * レンダリング可能なページを示すリクエストかどうかを判定する。
     * @return mayaaがレンダリング対象とする場合はtrue
     */
    boolean isPageRequested();

    /**
     * サービスメソッド。
     * @param pageScopeValues PAGEスコープのトップに含めるもの。
     * @param pageFlush テンプレート出力を自動でフラッシュするかどうか。
     */
    void doService(Map pageScopeValues, boolean pageFlush);

    /**
     * エラーハンドルページの表示。
     * @param t 発生した例外。
     * @param pageFlush テンプレート出力を自動でフラッシュするかどうか。
     */
    void handleError(Throwable t, boolean pageFlush);

    /**
     * ページのインスタンスを生成しソースビルドを行ってから返す。
     * @param pageName ページ名
     * @return ページ
     */
    Page createPageInstance(String pageName);

    /**
     * テンプレートのインスタンスを生成しソースビルドを行ってから返す。
     * @param page ページ
     * @param suffix テンプレートの接尾子。
     * @param extension ページの拡張子。
     * @return テンプレート
     */
    Template createTemplateInstance(Page page, String suffix, String extension);

    /**
     * テンプレートの示すシステムIDを返す。
     * @param page 属するページ
     * @param suffix サフィックス
     * @param extension 拡張子
     * @return テンプレートのシステムID
     */
    String getTemplateID(Page page, String suffix, String extension);

    /**
     * Engineを破棄します。
     * destroy()が呼ばれた後のEngineの動作は保証されません。
     */
    void destroy();

}
