/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

package org.mozilla.javascript.commonjs.module.provider;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.mozilla.javascript.commonjs.module.ModuleScript;

/**
 * A module script provider that uses a module source provider to load modules and caches the loaded
 * modules. It strongly references the loaded modules, thus a module once loaded will not be
 * eligible for garbage collection before the module provider itself becomes eligible.
 *
 * @author Attila Szegedi
 * @version $Id: StrongCachingModuleScriptProvider.java,v 1.3 2011/04/07 20:26:12 hannes%helma.at
 *     Exp $
 */
public class StrongCachingModuleScriptProvider extends CachingModuleScriptProviderBase {

    private static final long serialVersionUID = 1L;
    private final Map<String, CachedModuleScript> modules =
            new ConcurrentHashMap<>(16, .75f, getConcurrencyLevel());

    /**
     * Creates a new module provider with the specified module source provider.
     *
     * @param moduleSourceProvider provider for modules' source code
     */
    public StrongCachingModuleScriptProvider(ModuleSourceProvider moduleSourceProvider) {
        super(moduleSourceProvider);
    }

    @Override
    protected CachedModuleScript getLoadedModule(String moduleId) {
        return modules.get(moduleId);
    }

    @Override
    protected void putLoadedModule(String moduleId, ModuleScript moduleScript, Object validator) {
        modules.put(moduleId, new CachedModuleScript(moduleScript, validator));
    }
}
