/*
 * 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.test.mock.resource;


/**
 * Store additional info used by MockResource and MockResourceHandler
 * 
 * @author Leonardo Uribe (latest modification by $Author: jakobk $)
 * @version $Revision: 960906 $ $Date: 2010-07-06 09:45:40 -0500 (Mar, 06 Jul 2010) $
 */
public class MockResourceHandlerSupport
{

    private boolean _extensionMapping;

    private String _mapping;

    private MockResourceLoader[] _resourceLoaders;

    public MockResourceHandlerSupport()
    {
        _extensionMapping = true;
        _mapping = ".jsf";
        _resourceLoaders = new MockResourceLoader[]{ new MockExternalContextResourceLoader("/resources"),
                new MockClassLoaderResourceLoader(MockResourceHandler.getContextClassLoader(), "META-INF/resources")};
    }
    
    public MockResourceHandlerSupport(boolean extensionMapping, String mapping)
    {
        super();
        _extensionMapping = extensionMapping;
        _mapping = mapping;
        _resourceLoaders = new MockResourceLoader[]{ new MockExternalContextResourceLoader("/resources"),
                new MockClassLoaderResourceLoader(MockResourceHandler.getContextClassLoader(), "META-INF/resources")};
    }

    public MockResourceHandlerSupport(boolean extensionMapping, String mapping, ClassLoader classLoader)
    {
        _extensionMapping = extensionMapping;
        _mapping = mapping;
        _resourceLoaders = new MockResourceLoader[]{ new MockExternalContextResourceLoader("/resources"),
                new MockClassLoaderResourceLoader(classLoader, "META-INF/resources")};
    }

    public MockResourceHandlerSupport(boolean extensionMapping, String mapping,
            MockResourceLoader[] resourceLoaders)
    {
        super();
        _extensionMapping = extensionMapping;
        _mapping = mapping;
        _resourceLoaders = resourceLoaders;
    }

    /**
     * Check if the mapping used is done using extensions (.xhtml, .jsf)
     * or if it is not (/faces/*)
     * @return
     */
    public boolean isExtensionMapping()
    {
        return _extensionMapping;
    }
    
    public void setExtensionMapping(boolean extensionMapping)
    {
        _extensionMapping = extensionMapping;
    }

    /**
     * Get the mapping used as prefix(/faces) or sufix(.jsf)
     * 
     * @return
     */
    public String getMapping()
    {
        return _mapping;
    }
    
    public void setMapping(String prefix)
    {
        _mapping = prefix;
    }
    
    /**
     * Return an array of resource loaders used to find resources
     * using the standard. The order of ResourceLoaders define
     * its precedence. 
     * 
     * @return
     */
    public MockResourceLoader[] getResourceLoaders()
    {
        return _resourceLoaders; 
    }

    public void setResourceLoaders(MockResourceLoader[] resourceLoaders)
    {
        _resourceLoaders = resourceLoaders;
    }
}
