    001// Licensed under the Apache License, Version 2.0 (the "License");
    002// you may not use this file except in compliance with the License.
    003// You may obtain a copy of the License at
    004//
    005// http://www.apache.org/licenses/LICENSE-2.0
    006//
    007// Unless required by applicable law or agreed to in writing, software
    008// distributed under the License is distributed on an "AS IS" BASIS,
    009// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    010// See the License for the specific language governing permissions and
    011// limitations under the License.
    012
    013package org.apache.tapestry5.services.javascript;
    014
    015import org.apache.tapestry5.dom.Element;
    016import org.apache.tapestry5.ioc.Resource;
    017import org.apache.tapestry5.ioc.annotations.UsesMappedConfiguration;
    018
    019import java.util.List;
    020
    021/**
    022 * Responsible for managing access to the JavaScript modules.
    023 *
    024 * The configuration of the service allows overrides of the default search path; the configuration keys
    025 * are module names, and the configuration values are the {@link JavaScriptModuleConfiguration} definitions for those module names.
    026 * This is primarily used to wrap non-AMD compliant libraries for use with RequireJS (via contributed {@link JavaScriptModuleConfiguration}s).
    027 *
    028 * @since 5.4
    029 * @see ModuleConfigurationCallback
    030 * @see AMDWrapper
    031 */
    032@UsesMappedConfiguration(JavaScriptModuleConfiguration.class)
    033public interface ModuleManager
    034{
    035    /**
    036     * Invoked by the internal {@link org.apache.tapestry5.internal.services.DocumentLinker} service to write the configuration
    037     * for the module system into the page.
    038     *
    039     * @param body
    040     *         {@code <body>} element of the page, to which new {@code <script>} element(s) will be added.
    041     * @param moduleConfigurationCallbacks
    042     *         a list of {@link org.apache.tapestry5.services.javascript.ModuleConfigurationCallback}s, which
    043     *         is used to customize the configuration before it is written.
    044     */
    045    void writeConfiguration(Element body,
    046                            List<ModuleConfigurationCallback> moduleConfigurationCallbacks);
    047
    048    /**
    049     * Invoked by the internal {@link org.apache.tapestry5.internal.services.DocumentLinker} service to write the initializations
    050     * (as per {@link JavaScriptSupport#require(String)} into the page; this occurs after the module infrastructure
    051     * has been written into the page, along with the core libraries.
    052     *
    053     * @param body
    054     *         {@code <body>} element of the page, to which new {@code <script>} element(s) will be added.
    055     * @param libraryURLs
    056     *         additional libraries that should be dynamically loaded before evaluating the inits
    057     * @param inits
    058     *         specify initialization on the page, based on loading modules, extacting functions from modules, and invoking those functions
    059     */
    060    void writeInitialization(Element body, List<String> libraryURLs, List<?> inits);
    061
    062    /**
    063     * Given a module name (which may be a path of names separated by slashes), locates the corresponding {@link Resource}.
    064     * First checks for {@linkplain JavaScriptModuleConfiguration contributed shim modules}, then searches for possible matches among the
    065     * {@linkplain org.apache.tapestry5.services.ComponentClassResolver#getLibraryNames() defined library names}.  As a special
    066     * case, the folder name "app" is mapped to the application's package.
    067     *
    068     * @param moduleName
    069     *         name of module to locate
    070     * @return corresponding resource, or null if not found
    071     */
    072    Resource findResourceForModule(String moduleName);
    073
    074}