/*
 * Copyright 2004-2010 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.specification;

import java.util.Iterator;

/**
 * @author Masataka Kurihara (Gluegent, Inc.)
 */
public interface Namespace extends NodeObject {

    /**
     * 親名前空間スコープの設定。
     * @param parent 親の名前空間スコープ。
     */
    void setParentSpace(Namespace parent);

    /**
     * 親名前空間スコープの取得。
     * @return 親の名前空間スコープ。
     */
    Namespace getParentSpace();

    /**
     * 名前空間モデルの追加。
     * @param prefix 名前空間プレフィックス。
     * @param namespaceURI 名前空間URI。
     */
    void addPrefixMapping(String prefix, URI namespaceURI);

    /**
     * このスコープにて、名前空間モデルを追加したかどうか。
     * @return このスコープに追加モデルがあるとtrue。
     */
    boolean addedMapping();

    /**
     * 現在のスコープでPrefixが無指定の場合に選択される
     * デフォルト名前空間URIを設定する。
     * 予め addPrefixMappingで追加されていなければならない。
     * nullを指定すると prefixMappingで prefixを "" として
     * 登録したものがデフォルトになる。
     * @param namespaceURI 名前空間URI。
     */
    void setDefaultNamespaceURI(URI namespaceURI);

    /**
     * 現在のスコープでPrefixが無指定の場合に選択される
     * デフォルト名前空間を返す。
     *
     * @return デフォルト名前空間。デフォルト名前空間がない場合にはnull
     */
    URI getDefaultNamespaceURI();

    /**
     * 名前空間モデルの取得。
     * @param prefix 取得したい名前空間のプレフィックス。
     * @param all 親スコープも検索する。
     * @return 名前空間モデル。
     */
    PrefixMapping getMappingFromPrefix(String prefix, boolean all);

    /**
     * 名前空間モデルの取得。
     * @param namespaceURI 取得したい名前空間のURI。
     * @param all 親スコープも検索する。
     * @return 名前空間モデル。
     */
    PrefixMapping getMappingFromURI(URI namespaceURI, boolean all);

    /**
     * 適用される名前空間のイテレート。
     * @param all 親スコープも検索する。
     * @return プレフィックスマッピング（<code>PrefixMapping</code>）のイテレータ。
     */
    Iterator iteratePrefixMapping(boolean all);

}
