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}