/*
 * $Revision: 1.3 $ $Date: 2005/12/25 23:36:16 $
 * (C) 2004 SUGIMOTO Ken-ichi
 */

package feat.v1.config;

import java.util.ArrayList;
import java.util.Iterator;

import feat.v1.FeatException;
import feat.v1.InitializationException;

/**
 * feat-config.xmlのドキュメント要素。
 */
public class FeatConfig implements ConfigElement {

    //private String locale;

    //private List featureConfigList;
    //private Map featureConfigMap;
    private FileLocator appRoot;
    private FileLocator configFileLocation;

    // JiBX
    private ArrayList features;

    public FeatConfig() {
        //setElementType(FEAT_CONFIG);
        //featureConfigList = new ArrayList();
        //featureConfigMap = new HashMap();
    }

    /*public String getLocale() {
        return locale;
    }
    public void setLocale(String locale) {
        this.locale = locale;
    }*/

    /** feature要素 */
    /*public void addFeature(FeatureConfig feature) {
        featureConfigList.add(feature);
    }*/

    public Iterator getFeatureConfigs() {
        return features.iterator();
    }

    /**
     * フィーチャーを返す。
     * @param featureName
     * @return
     */
    public FeatureDeclaration getFeatureDeclaration(String featureName) {
        FeatureConfig fc = (FeatureConfig)ConfigUtil.find(features, featureName);
        if ( fc == null )
            return null;
        else
            return fc.getFeatureDeclaration();
    }


    /*public PageDeclaration getPageDeclaration(PagePointer pointer) {
        if ( pointer != null &&
             pointer.getPageName() != null &&
             pointer.getFeatureName() != null ) {

            FeatureDeclaration feature = getFeatureDeclaration(pointer.getFeatureName());
            if ( feature != null )
                return feature.getPageDeclaration(pointer.getPageName());
        }
        return null;
    }*/

    public FileLocator getAppRoot() {
        return appRoot;
    }

    public void setAppRoot(FileLocator appRoot) {
        this.appRoot = appRoot;
    }

    public FileLocator getConfigLocation() {
        return configFileLocation;
    }
    public void setConfigLocation(FileLocator locator) {
        this.configFileLocation = locator;
    }

    /*
     * 初期化。
     * ここからすべてのfeature設定ファイルをロードする。
     * @param locator FileLocator
     * @throws FeatException
     */
    /*protected void initThis() throws InitializationException {
        if ( appRoot == null )
            throw new InitializationException("アプリケーションのルートディレクトリが設定されていない");

        if ( configFileLocation == null )
            throw new InitializationException("設定ファイル(feat-config.xml)の場所が設定されていない");

        for(int i=0; i<featureConfigList.size(); i++) {
            FeatureConfig fc = (FeatureConfig)featureConfigList.get(i);
            fc.setParent(this);
            fc.init();
            featureConfigMap.put(fc.getFeatureDeclaration().getName(), fc);
        }
    }*/

    /*protected void validThis() throws InitializationException {
        for(int i=0; i<featureConfigList.size(); i++) {
            FeatureConfig feature = (FeatureConfig)featureConfigList.get(i);
            feature.valid();
        }
    }*/


    // ConfigElementの実装

    /* (非 Javadoc)
     * @see feat.v1.config.ConfigElement#init()
     */
    public void init() throws InitializationException {
        if ( features == null )
            throw new InitializationException("フィーチャーのリストがnull");

        if ( appRoot == null )
            throw new InitializationException("アプリケーションのルートディレクトリが設定されていない");

        if ( configFileLocation == null )
            throw new InitializationException("設定ファイル(feat-config.xml)の場所が設定されていない");

        ConfigUtil.init(features);
        /*for(int i=0; i<features.size(); i++) {
            FeatureConfig fc = (FeatureConfig)features.get(i);
            fc.init();
        }*/
    }

    /* (非 Javadoc)
     * @see feat.v1.config.ConfigElement#validate()
     */
    public void validate() throws InitializationException {
        ConfigUtil.validate(features);
    }

    /* (非 Javadoc)
     * @see feat.v1.config.ConfigElement#getName()
     */
    public String getName() {
        return configFileLocation.toString();
    }





}
