/* * © Copyright IBM Corp. 2012 * * Licensed 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 com.ibm.sbt.jslibrary.servlet; import java.util.Map; import com.ibm.commons.util.io.json.JsonObject; /** * Library implementation for libraries which use RequireJS as an AMD loader * * @author mwallace * @author cmanias */ public abstract class RequireJSLibrary extends AbstractLibrary { protected static final String MODULE_BRIDGE = "sbt/_bridge"; //$NON-NLS-1$ protected static final String MODULE_SBTX_WIDGET = "sbtx/widget"; //$NON-NLS-1$ protected static final String MODULE_HAS = "has"; //$NON-NLS-1$ protected static final String MODULE_REQUIRE_I18N = "requirejs/i18n"; //$NON-NLS-1$ protected static final String MODULE_REQUIRE_TEXT = "requirejs/text"; //$NON-NLS-1$ protected static final String PATH_SBTX = "sbtx/js/sdk/sbtx"; //$NON-NLS-1$ protected static final String PATH_HAS = "has"; //$NON-NLS-1$ protected static final String PATH_REQUIRE_I18N = "requirejsPlugins/i18n"; //$NON-NLS-1$ protected static final String PATH_REQUIRE_TEXT = "requirejsPlugins/text"; //$NON-NLS-1$ // TODO Do these need to be dynamic protected static final String[][] REGISTER_MODULES = { { MODULE_SBT, PATH_SBT }, { MODULE_BRIDGE } }; protected static final String[][] LIBRARY_MODULES = { { MODULE_HAS, PATH_HAS }, { MODULE_REQUIRE_I18N, PATH_REQUIRE_I18N }, { MODULE_REQUIRE_TEXT, PATH_REQUIRE_TEXT } }; private static final String[][] REGISTER_EXT_MODULES = { { MODULE_SBTX, PATH_SBTX }, { MODULE_SBTX_WIDGET } }; private static final String[] REQUIRE_MODULES = new String[0]; private static final String DEFINE_MODULE = MODULE_CONFIG; static private final String DEFINE_MODULE_LAYER = MODULE_CONFIG_LAYER; /** * Default constructor */ public RequireJSLibrary(String name) { // TODO remove hardcoded strings super(name, "", ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ } /* * (non-Javadoc) * @see com.ibm.sbt.jslibrary.servlet.AbstractLibrary#enableDefineCheck(java. lang.String) */ @Override public boolean enableDefineCheck(String version) { return false; } /* * (non-Javadoc) * @see com.ibm.sbt.jslibrary.servlet.BaseLibrary#getRegisterModules(LibraryRequest) */ @Override protected String[][] getRegisterModules(LibraryRequest request) { return REGISTER_MODULES; } /* * (non-Javadoc) * @see com.ibm.sbt.jslibrary.servlet.AbstractLibrary#getRegisterModulesAmd(LibraryRequest) */ @Override protected String[][] getRegisterModulesAmd(LibraryRequest request) { return REGISTER_MODULES; } /* * (non-Javadoc) * @see com.ibm.sbt.jslibrary.servlet.BaseLibrary#getDefineModule() */ @Override protected String getDefineModule() { return DEFINE_MODULE; } @Override protected String getDefineModuleLayer() { return DEFINE_MODULE_LAYER; } @Override protected String[] getRequireModules() { return REQUIRE_MODULES; } /* * (non-Javadoc) * @see com.ibm.sbt.jslibrary.servlet.AbstractLibrary#getRegisterExtModules(LibraryRequest) */ @Override protected String[][] getRegisterExtModules(LibraryRequest request) { return REGISTER_EXT_MODULES; } /* * (non-Javadoc) * @see com.ibm.sbt.jslibrary.servlet.AbstractLibrary#getRequireModulesAmd() */ @Override protected String[] getRequireModulesAmd() { return REQUIRE_MODULES; } /* * We redefine the isExtension boolean parameter. The meaning here is that there are extension modules pending to be added (so we need to append a comma) (non-Javadoc) * @see com.ibm.sbt.jslibrary.servlet.AbstractLibrary#generateRegisterModules(java.lang.StringBuilder, int, com.ibm.sbt.jslibrary.servlet.LibraryRequest, java.lang.String[][], boolean) */ @Override protected void generateRegisterModules(StringBuilder sb, int indentationLevel, LibraryRequest request, String[][] registerModules, ModuleType type) { if (registerModules == null) { return; } int numModules = registerModules.length; for (int i = 0; i < numModules; i++) { String[] registerModule = registerModules[i]; String moduleUrl = getModuleUrl(request, registerModule[1], type); indent(sb, indentationLevel).append("'").append(registerModule[0]).append("':'").append(moduleUrl).append("'"); if (i < numModules - 1) { sb.append(",").append(newLine()); } } } /* * (non-Javadoc) * @see com.ibm.sbt.jslibrary.servlet.AbstractLibrary#generateSbtConfigDefine(com.ibm.sbt.jslibrary.servlet.LibraryRequest, java.util.Map, com.ibm.commons.util.io.json.JsonObject, int) */ @Override protected StringBuilder generateSbtConfigDefine(LibraryRequest request, Map<String, JsonObject> endpoints, JsonObject properties, int indentationLevel) throws LibraryException { StringBuilder sb = super.generateSbtConfigDefine(request, endpoints, properties, indentationLevel); indent(sb, indentationLevel).append("require(['sbt/config'], function(){});").append(newLine()); return sb; }; /* * (non-Javadoc) * @see com.ibm.sbt.jslibrary.servlet.AbstractLibrary#generateRegisterModulePath (java.lang.String, java.lang.String) */ @Override protected String generateRegisterModulePath(LibraryRequest request, String moduleName, String moduleUrl) { return ""; } /* * (non-Javadoc) * @see com.ibm.sbt.jslibrary.servlet.AbstractLibrary#generateRequire(java.lang .String) */ @Override protected String generateRequire(String module) { StringBuilder sb = new StringBuilder(); sb.append("require('").append(module).append("')"); return sb.toString(); } /* * (non-Javadoc) * @see com.ibm.sbt.jslibrary.servlet.AbstractLibrary#generateModuleBlock(com.ibm.sbt.jslibrary.servlet.LibraryRequest, java.lang.String[][], java.lang.String[], int) */ @Override protected StringBuilder generateModuleBlock(LibraryRequest request, String[][] registerModules, String[][] registerExtModules, String[] requireModules, int indentationLevel) { StringBuilder sb = new StringBuilder(); indent(sb, indentationLevel).append("requirejs.config({").append(newLine()); // begin requirejs.config indentationLevel += 1; // indent(sb, indentationLevel).append("enforceDefine: '").append(enforceDefine).append("',\n"); // indent(sb, indentationLevel).append("waitSeconds: '").append(waitSeconds).append("',\n"); // indent(sb, indentationLevel).append("baseUrl: '").append(PATH_BASEURL).append("',\n"); indent(sb, indentationLevel).append("paths: {"); // begin paths // register the module paths and required modules indentationLevel++; sb.append(newLine()); generateRegisterModules(sb, indentationLevel, request, registerModules, ModuleType.SBT_MODULE); if (registerExtModules != null) { sb.append(",").append(newLine()); generateRegisterModules(sb, indentationLevel, request, registerExtModules, ModuleType.SBTX_MODULE); } sb.append(",").append(newLine()); generateRegisterModules(sb, indentationLevel, request, LIBRARY_MODULES, ModuleType.JS_LIBRARY); generateRequireModules(sb, indentationLevel, requireModules); indentationLevel -= 1; indent(sb, indentationLevel).append("}").append(newLine()); // end paths indentationLevel -= 1; indent(sb, indentationLevel).append("});").append(newLine()); // end requirejs.config return sb; } }