/*
 * Copyright 2007-2009 the original author or authors.
 *
 * 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 net.paoding.rose.web.impl.module;

import java.net.URL;
import java.util.List;

import net.paoding.rose.web.ControllerErrorHandler;
import net.paoding.rose.web.InterceptorDelegate;
import net.paoding.rose.web.ParamValidator;
import net.paoding.rose.web.impl.mapping.Mapping;
import net.paoding.rose.web.paramresolver.ParamResolver;

import org.springframework.web.context.WebApplicationContext;

/**
 * {@link Module}代表了在同一个web程序中的一个模块。不同的模块包含一些特定的控制器对象、控制器拦截器、控制器异常处理器。
 * 不同的模块共享了ServletContext以及整个程序的中间层、资源层。
 * <p>
 * 一个web程序的不同的模块有不同的名字和路径。作为{@link Module}接口本身并没有要求模块的名字和路径有什么关系，
 * 但在实现上模块的路径是由其名字决定的，即path=/name，比如名字为admin的模块，路径将是/admin。
 * 作为一个特例，名字为root的模块路径则只是空串。
 * <p>
 * 一个HTTP请求将根据它的URI，映射到相应的web程序中(由web容器处理)，而后又映射给具体的module模块(由Rose处理)。
 * 映射规则以模块的路径为依据(名字此时不参与这个决策)。
 * <p>
 * 
 * @author 王志亮 [qieqie.wang@gmail.com]
 */
public interface Module {

    /**
     * 该模块相关资源路径(即控制器“类文件”存在本地计算机的什么目录下，包括package名所表示的路径)
     * 
     * 
     */
    public URL getUrl();

    /**
     * 该模块的映射地址定义
     * 
     * @see Mapping#getPath()
     * 
     * 
     */
    public String getMappingPath();

    /**
     * 上级模块，返回null表示为最顶级模块。
     * <p>
     * 模块之间的上下级和URI的分层上下级没有必然联系，虽然大多数应该有一致的表现。
     * 
     * 
     */
    public Module getParent();

    /**
     * 模块地址。
     * <p>
     * 如果是最顶级模块其地址是一个长度为0的串。<br>
     * 下级模块的地址是上级模块的地址 + "/" + 本模块所在package的简单包名(package最后一级)。
     * 
     * 
     */
    public String getRelativePath();

    /**
     * 本模块的ApplicationContext对象。
     * <p>
     * 如果模块具有上级模块，这2个模块的ApplicationContext也会体现这个上下级关系
     * 
     * 
     */
    public WebApplicationContext getApplicationContext();

    /**
     * 本模块使用的有效外设参数解析器对象
     * 
     * 
     */
    public List<ParamResolver> getCustomerResolvers();

    /**
     * 本模块使用的验证器
     * 
     * 
     */
    public List<ParamValidator> getValidators();

    /**
     * 本模块使用的有效拦截器对象
     * 
     * 
     */
    public List<InterceptorDelegate> getInterceptors();

    /**
     * 本模块有效的控制器对象
     * 
     * 
     */
    public List<ControllerRef> getControllers();

    /**
     * 本模块使用的错误处理器
     * 
     * 
     */
    public ControllerErrorHandler getErrorHandler();

}
