private void addRslInfo(final Element rootElement, final Map<String, String> libNameToRslInfo) { if (libNameToRslInfo.isEmpty()) return; // RSL order is important! for (final String libName : LIB_ORDER) { final String rslInfo = libNameToRslInfo.remove(libName); if (rslInfo != null) { final CompilerOptionInfo option = StringUtil.split(rslInfo, CompilerOptionInfo.LIST_ENTRY_PARTS_SEPARATOR, true, false) .size() == 3 ? CompilerOptionInfo.RSL_ONE_URL_PATH_INFO : CompilerOptionInfo.RSL_TWO_URLS_PATH_INFO; addOption(rootElement, option, rslInfo); } } // now add other in random order, though up to Flex SDK 4.5.1 the map should be empty at this // stage for (final String rslInfo : libNameToRslInfo.values()) { final CompilerOptionInfo option = StringUtil.split(rslInfo, CompilerOptionInfo.LIST_ENTRY_PARTS_SEPARATOR, true, false) .size() == 3 ? CompilerOptionInfo.RSL_ONE_URL_PATH_INFO : CompilerOptionInfo.RSL_TWO_URLS_PATH_INFO; addOption(rootElement, option, rslInfo); } }
private void addFilesIncludedInSwc(final Element rootElement) { final JpsCompilerExcludes excludes = JpsJavaExtensionService.getInstance() .getOrCreateCompilerConfiguration(myModule.getProject()) .getCompilerExcludes(); final Map<String, String> filePathToPathInSwc = new THashMap<String, String>(); for (String path : myBC.getCompilerOptions().getFilesToIncludeInSWC()) { final File fileOrDir = new File(path); if (excludes.isExcluded(fileOrDir)) continue; if (myProjectDescriptor.getIgnoredFileIndex().isIgnored(fileOrDir.getName())) continue; final String baseRelativePath = StringUtil.notNullize( FlexCommonUtils.getPathRelativeToSourceRoot(myModule, fileOrDir.getPath()), fileOrDir.getName()); if (fileOrDir.isDirectory()) { processFilesRecursively( fileOrDir, new Processor<File>() { public boolean process(final File file) { if (myProjectDescriptor.getIgnoredFileIndex().isIgnored(file.getName())) return false; if (!file.isDirectory() && !FlexCommonUtils.isSourceFile(file.getName()) && !excludes.isExcluded(file)) { final String relativePath = FileUtil.getRelativePath(fileOrDir, file); assert relativePath != null; final String pathInSwc = baseRelativePath.isEmpty() ? relativePath : baseRelativePath + "/" + relativePath; filePathToPathInSwc.put(file.getPath(), pathInSwc); } return true; } }); } else if (fileOrDir.isFile()) { filePathToPathInSwc.put(fileOrDir.getPath(), baseRelativePath); } } for (Map.Entry<String, String> entry : filePathToPathInSwc.entrySet()) { final String value = FileUtil.toSystemIndependentName(entry.getValue()) + CompilerOptionInfo.LIST_ENTRY_PARTS_SEPARATOR + FileUtil.toSystemIndependentName(entry.getKey()); addOption(rootElement, CompilerOptionInfo.INCLUDE_FILE_INFO, value); } }
private void addOtherOptions(final Element rootElement) { final Map<String, String> options = new THashMap<String, String>(myProjectLevelCompilerOptions.getAllOptions()); options.putAll(myModuleLevelCompilerOptions.getAllOptions()); options.putAll(myBC.getCompilerOptions().getAllOptions()); final String addOptions = myProjectLevelCompilerOptions.getAdditionalOptions() + " " + myModuleLevelCompilerOptions.getAdditionalOptions() + " " + myBC.getCompilerOptions().getAdditionalOptions(); final List<String> contextRootInAddOptions = FlexCommonUtils.getOptionValues(addOptions, "context-root", "compiler.context-root"); if (options.get("compiler.context-root") == null && contextRootInAddOptions.isEmpty()) { final List<String> servicesInAddOptions = FlexCommonUtils.getOptionValues(addOptions, "services", "compiler.services"); if (options.get("compiler.services") != null || !servicesInAddOptions.isEmpty()) { options.put("compiler.context-root", ""); } } for (final Map.Entry<String, String> entry : options.entrySet()) { addOption(rootElement, CompilerOptionInfo.getOptionInfo(entry.getKey()), entry.getValue()); } final String namespacesRaw = options.get("compiler.namespaces.namespace"); if (namespacesRaw != null && myBC.getOutputType() == OutputType.Library) { final String namespaces = FlexCommonUtils.replacePathMacros( namespacesRaw, myModule, myFlexmojos ? "" : mySdk.getHomePath()); final StringBuilder buf = new StringBuilder(); for (final String listEntry : StringUtil.split(namespaces, CompilerOptionInfo.LIST_ENTRIES_SEPARATOR)) { final int tabIndex = listEntry.indexOf(CompilerOptionInfo.LIST_ENTRY_PARTS_SEPARATOR); assert tabIndex != -1 : namespaces; final String namespace = listEntry.substring(0, tabIndex); if (buf.length() > 0) buf.append(CompilerOptionInfo.LIST_ENTRIES_SEPARATOR); buf.append(namespace); } if (buf.length() > 0) { addOption(rootElement, CompilerOptionInfo.INCLUDE_NAMESPACES_INFO, buf.toString()); } } }
private void addRootsFromSdk(final Element rootElement) { final CompilerOptionInfo localeInfo = CompilerOptionInfo.getOptionInfo("compiler.locale"); if (!getValueAndSource(localeInfo).first.isEmpty()) { addOption( rootElement, CompilerOptionInfo.LIBRARY_PATH_INFO, mySdk.getHomePath() + "/frameworks/locale/{locale}"); } final Map<String, String> libNameToRslInfo = new THashMap<String, String>(); for (final String swcUrl : mySdk.getParent().getRootUrls(JpsOrderRootType.COMPILED)) { final String swcPath = JpsPathUtil.urlToPath(swcUrl); if (!swcPath.toLowerCase().endsWith(".swc")) { Logger.getInstance(CompilerConfigGeneratorRt.class.getName()) .warn("Unexpected URL in Flex SDK classes: " + swcUrl); continue; } LinkageType linkageType = FlexCommonUtils.getSdkEntryLinkageType(swcPath, myBC); // check applicability if (linkageType == null) continue; // resolve default if (linkageType == LinkageType.Default) linkageType = myBC.getDependencies().getFrameworkLinkage(); if (linkageType == LinkageType.Default) { linkageType = FlexCommonUtils.getDefaultFrameworkLinkage(mySdk.getVersionString(), myBC.getNature()); } if (myCSS && linkageType == LinkageType.Include) linkageType = LinkageType.Merged; final CompilerOptionInfo info = linkageType == LinkageType.Merged ? CompilerOptionInfo.LIBRARY_PATH_INFO : linkageType == LinkageType.RSL ? CompilerOptionInfo.LIBRARY_PATH_INFO : linkageType == LinkageType.External ? CompilerOptionInfo.EXTERNAL_LIBRARY_INFO : linkageType == LinkageType.Include ? CompilerOptionInfo.INCLUDE_LIBRARY_INFO : null; assert info != null : swcPath + ": " + linkageType.getShortText(); addOption(rootElement, info, swcPath); if (linkageType == LinkageType.RSL) { final List<String> rslUrls = RslUtil.getRslUrls(mySdk.getHomePath(), swcPath); if (rslUrls.isEmpty()) continue; final StringBuilder rslBuilder = new StringBuilder(); final String firstUrl = rslUrls.get(0); rslBuilder .append(swcPath) .append(CompilerOptionInfo.LIST_ENTRY_PARTS_SEPARATOR) .append(firstUrl) .append(CompilerOptionInfo.LIST_ENTRY_PARTS_SEPARATOR); if (firstUrl.startsWith("http://")) { rslBuilder.append("http://fpdownload.adobe.com/pub/swz/crossdomain.xml"); } if (rslUrls.size() > 1) { final String secondUrl = rslUrls.get(1); rslBuilder .append(CompilerOptionInfo.LIST_ENTRY_PARTS_SEPARATOR) .append(secondUrl) .append(CompilerOptionInfo.LIST_ENTRY_PARTS_SEPARATOR); if (secondUrl.startsWith("http://")) { rslBuilder.append("http://fpdownload.adobe.com/pub/swz/crossdomain.xml"); } } final String swcName = PathUtilRt.getFileName(swcPath); final String libName = swcName.substring(0, swcName.length() - ".swc".length()); libNameToRslInfo.put(libName, rslBuilder.toString()); } } if (myBC.getNature().isLib()) { final String theme = getValueAndSource(CompilerOptionInfo.getOptionInfo("compiler.theme")).first; if (theme != null && theme.toLowerCase().endsWith(".swc")) { addOption(rootElement, CompilerOptionInfo.LIBRARY_PATH_INFO, theme); } } addRslInfo(rootElement, libNameToRslInfo); }