//  Copyright 2004 The Apache Software Foundation
//
// 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.apache.tapestry.engine;

import org.apache.tapestry.IComponent;
import org.apache.tapestry.IRequestCycle;
import org.apache.tapestry.parse.ComponentTemplate;

/**
 * A source of localized HTML templates for components.  
 * The cache is the means of access for components to load thier templates,
 * which they need not do until just before rendering.
 *
 * <p>The template cache must be able to locate and parse templates as needed.
 * It may maintain templates in memory.
 *
 * @author Howard Ship
 * @version $Id: ITemplateSource.java 243791 2004-02-19 17:38:13Z hlship $
 * 
 **/

public interface ITemplateSource
{
    /**
     *  Name of an {@link org.apache.tapestry.IAsset} of a component that provides the template
     *  for the asset.  This overrides the default (that the template is in
     *  the same directory as the specification).  This allows
     *  pages or component templates to be located properly, relative to static
     *  assets (such as images and stylesheets).
     * 
     *  @since 2.2
     * 
     **/
    
    public static final String TEMPLATE_ASSET_NAME = "$template";

    /**
     *  Name of the component parameter that will be automatically bound to
     *  the HTML tag that is used to insert the component in the parent template.
     *  If the parent component does not have a template (i.e. it extends 
     *  AbstractComponent, not BaseComponent), then this parameter is bound to null.
     * 
     *  @since 3.0
     * 
     **/
    
    public static final String TEMPLATE_TAG_PARAMETER_NAME = "templateTag";
    
    /**
     *  Locates the template for the component.
     * 
     *  @param cycle The request cycle loading the template; this is required
     *  in some cases when the template is loaded from an {@link org.apache.tapestry.IAsset}.
     *  @param component The component for which a template should be loaded.
     *
     *  @throws org.apache.tapestry.ApplicationRuntimeException if the resource cannot be located or loaded.
     * 
     **/

    public ComponentTemplate getTemplate(IRequestCycle cycle, IComponent component);

    /**
     *  Invoked to have the source clear any internal cache.  This is most often
     *  used when debugging an application.
     *
     **/

    public void reset();
}