/*
 * 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 org.apache.myfaces.extensions.scripting.jsf.resources.deprecated;

import javax.faces.context.FacesContext;

/**
 * impl specific handler support which attaches
 * the source resource loader upfront before
 * checking the other ones
 * <p></p>
 * a delegate is used to limit the binding between
 * the "parent" class and the child class
 * in this case it simply makes sense to avoid any internal sideeffects
 * between getResourceLoaders and the other methods
 * @deprecated
 */
public class SourceResourceHandlerSupport extends ResourceHandlerSupport {

    private ResourceLoader[] _supportResourceLoaders;
    private BaseResourceHandlerSupport _defaultSupport = new BaseResourceHandlerSupport();

    @Override
    /**
     * Delivers a list of resource loaders in a binding order
     * of the resource lookup algorithms
     *
     * @return a list of resource loaders with following order,
     *              <ul>
     *                  <li>source lookup paths if present</li>
     *                  <li>/resources directory</li>
     *                  <li>META-INF/resources directory</li>
     *              </ul>
     */
    public ResourceLoader[] getResourceLoaders() {
        if (_supportResourceLoaders == null) {
            //The ExternalContextResourceLoader has precedence over
            //ClassLoaderResourceLoader, so it goes first.
            _supportResourceLoaders = new ResourceLoader[]{
                    new SourceResourceLoader("/resources"),
                    new ExternalContextResourceLoader("/resources"),
                    new ClassLoaderResourceLoader("META-INF/resources")
            };
        }
        return _supportResourceLoaders;
    }

    public String calculateResourceBasePath(FacesContext facesContext) {
        return _defaultSupport.calculateResourceBasePath(facesContext);
    }

    public boolean isExtensionMapping() {
        return _defaultSupport.isExtensionMapping();
    }

    public String getMapping() {
        return _defaultSupport.getMapping();
    }

    public long getStartupTime() {
        return _defaultSupport.getStartupTime();
    }

    public long getMaxTimeExpires() {
        return _defaultSupport.getMaxTimeExpires();
    }
}
