/*
 * $Revision: 1.6 $ $Date: 2005/04/17 03:31:46 $
 * Copyright (C) 2004-2005 SUGIMOTO Ken-ichi
 */

package feat.v1.config;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jibx.runtime.IUnmarshallingContext;

import feat.v1.InitializationException;
import feat.v1.StringUtil;
import feat.v1.Util;

/**
 * HTMLを表示するビューの設定。
 */
public class PageDeclaration implements ResponseDeclaration {

    private static Log log = LogFactory.getLog(PageDeclaration.class);

    private FeatureDeclaration featureDeclaration;

    // init()で初期化されるプロパティ
    //private HTMLTemplate template;
    private ViewDeclaration[] viewList;
    private Function[] viewParams;

    // JiBX
    private String name;
    private String templateFileName;
    private String view;


    public PageDeclaration() {
    }

    public String getName() {
        return name;
    }

    public String getTemplateName() {
        return templateFileName;
    }

    public ViewDeclaration[] getViewList() {
        return viewList;
    }

    public Function[] getViewParams() {
        return viewParams;
    }



    public FeatureDeclaration getFeatureDeclaration() {
        return featureDeclaration;
    }
    /*public void setFeatureDeclaration(FeatureDeclaration f) {
        featureDeclaration = f;
    }*/

    public void postset(IUnmarshallingContext uctx) {
        featureDeclaration = (FeatureDeclaration)uctx.getStackObject(1);
    }

    public void init() throws InitializationException {
        FeatConfig conf = getFeatureDeclaration().getFeatureConfig().getFeatConfig();

        if ( templateFileName == null )
            throw new InitializationException("テンプレートが指定されていない");
        if ( view == null )
            view = "";

        //template = TemplateLoader.load(((FeatureConfig)getAncestorElement(FEATURE_CONFIG)).
        //                        getTemplateLocation().newLocation(templateFileName));

        // viewのリスト
        if ( view.length() > 0 ) {
            viewParams = Util.parseFunctionList(view);
            viewList = new ViewDeclaration[viewParams.length];

            for(int i=0; i<viewParams.length; i++) {
                FeatureDeclaration featureDec;
                String viewName = viewParams[i].getName();

                // ほかのフィーチャーのビュー?
                if ( viewName.indexOf("::") > -1 ) {

                    // フィーチャーとビューの名前に分割
                    String[] pathElem = StringUtil.split(viewName, "::");
                    if ( pathElem.length < 2 )
                        throw new InitializationException("ビューの指定が不完全 \""+viewName+"\"");
                    String featureName = pathElem[0];

                    // フィーチャーの定義を取得
                    featureDec = conf.getFeatureDeclaration(featureName);
                    viewName = pathElem[1];
                    if ( featureDec == null )
                        throw new InitializationException(
                                "指定されたビュー"+viewParams[i].getName()+
                                "のフィーチャー "+featureName+"が見つからない");

                }
                // 現在のフィーチャーのビューの場合
                else {
                    featureDec = getFeatureDeclaration();
                }

                // ビューの定義を取得
                viewList[i] = featureDec.getView(viewName);
                if ( viewList[i] == null )
                    throw new InitializationException(
                            "指定されたビュー "+viewParams[i].getName()+" が見つからない");
            }
        }
        // ビューのリストが空のとき
        else {
            viewList = new ViewDeclaration[0];
            viewParams = new Function[0];
        }

    }

    public void validate() {}
}
