/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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 freemarker.cache;

import java.io.IOException;

import freemarker.core.TemplateConfiguration;
import freemarker.template.Configuration;
import freemarker.template.Template;

/**
 * Creates (or returns) {@link TemplateConfiguration}-s for template sources.
 * 
 * @since 2.3.24
 */
public abstract class TemplateConfigurationFactory {
    
    private Configuration cfg;

    /**
     * Returns (maybe creates) the {@link TemplateConfiguration} for the given template source.
     * 
     * @param sourceName
     *            The name (path) that was used for {@link TemplateLoader#findTemplateSource(String)}. See
     *            {@link Template#getSourceName()} for details.
     * @param templateSource
     *            The object returned by {@link TemplateLoader#findTemplateSource(String)}.
     * 
     * @return The {@link TemplateConfiguration} to apply, or {@code null} if the there's no {@link TemplateConfiguration} for
     *         this template source.
     * 
     * @throws IOException
     *             Typically, if there factory needs further I/O to find out more about the template source, but that
     *             fails.
     * @throws TemplateConfigurationFactoryException
     *             If there's a problem that's specific to the factory logic.
     */
    public abstract TemplateConfiguration get(String sourceName, Object templateSource)
            throws IOException, TemplateConfigurationFactoryException;
    
    /**
     * Binds this {@link TemplateConfigurationFactory} to a {@link Configuration}. Once it's bound, it can't be bound to
     * another {@link Configuration} any more. This is automatically called by
     * {@link Configuration#setTemplateConfigurations(TemplateConfigurationFactory)}.
     */
    public final void setConfiguration(Configuration cfg) {
        if (this.cfg != null) {
            if (cfg != this.cfg) {
                throw new IllegalStateException(
                        "The TemplateConfigurationFactory is already bound to another Configuration");
            }
            return;
        } else {
            this.cfg = cfg;
            setConfigurationOfChildren(cfg);
        }
    }
    
    /**
     * Returns the configuration this object belongs to, or {@code null} if it isn't yet bound to a
     * {@link Configuration}.
     */
    public Configuration getConfiguration() {
        return cfg;
    }
    
    /**
     * Calls {@link TemplateConfiguration#setParentConfiguration(Configuration)} on each enclosed
     * {@link TemplateConfiguration} and {@link TemplateConfigurationFactory#setConfiguration(Configuration)}
     * on each enclosed {@link TemplateConfigurationFactory} objects. It only supposed to call these on the direct
     * "children" of this object, not on the children of the children.
     */
    protected abstract void setConfigurationOfChildren(Configuration cfg);

}
