package com.intellij.javascript.flex.maven; import com.intellij.flex.model.bc.*; import com.intellij.lang.javascript.flex.FlexUtils; import com.intellij.lang.javascript.flex.build.FlexCompilerProjectConfiguration; import com.intellij.lang.javascript.flex.library.FlexLibraryType; import com.intellij.lang.javascript.flex.projectStructure.model.*; import com.intellij.lang.javascript.flex.projectStructure.model.impl.Factory; import com.intellij.lang.javascript.flex.projectStructure.model.impl.FlexProjectConfigurationEditor; import com.intellij.lang.javascript.flex.projectStructure.options.BCUtils; import com.intellij.lang.javascript.flex.sdk.FlexSdkUtils; import com.intellij.lang.javascript.flex.sdk.FlexmojosSdkAdditionalData; import com.intellij.lang.javascript.flex.sdk.FlexmojosSdkType; import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProvider; import com.intellij.openapi.module.Module; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.roots.*; import com.intellij.openapi.roots.impl.libraries.LibraryEx; import com.intellij.openapi.roots.libraries.Library; import com.intellij.openapi.roots.libraries.LibraryKind; import com.intellij.openapi.roots.libraries.LibraryTablesRegistrar; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.ArrayUtil; import com.intellij.util.PathUtil; import com.intellij.util.containers.ContainerUtil; import gnu.trove.THashMap; import org.jdom.Element; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.idea.maven.importing.MavenRootModelAdapter; import org.jetbrains.idea.maven.model.MavenArtifact; import org.jetbrains.idea.maven.model.MavenConstants; import org.jetbrains.idea.maven.model.MavenId; import org.jetbrains.idea.maven.model.MavenPlugin; import org.jetbrains.idea.maven.project.MavenProject; import org.jetbrains.idea.maven.project.MavenProjectsProcessorTask; import org.jetbrains.idea.maven.project.MavenProjectsTree; import org.jetbrains.idea.maven.utils.MavenArtifactUtil; import org.jetbrains.idea.maven.utils.MavenLog; import java.util.*; import java.util.regex.Pattern; import static com.intellij.javascript.flex.maven.RuntimeModulesGenerateConfigTask.RLMInfo; public class Flexmojos3Configurator { private static final String FLEX_COMPILER_ADOBE_GROUP_ID = "com.adobe.flex"; private static final String FLEX_COMPILER_APACHE_GROUP_ID = "org.apache.flex"; private static final String FLEX_COMPILER_ARTIFACT_ID = "compiler"; private static final Pattern[] ADDITIONAL_JAR_NAME_PATTERNS_TO_INCLUDE_IN_FLEXMOJOS_SDK_CLASSPATH = {Pattern.compile("afe"), Pattern.compile("aglj[0-9]+"), Pattern.compile("flex-fontkit"), Pattern.compile("license"), Pattern.compile("rideau")}; protected final Module myModule; private final IdeModifiableModelsProvider myModelsProvider; private final FlexProjectConfigurationEditor myFlexEditor; protected final MavenProjectsTree myMavenTree; protected final MavenProject myMavenProject; protected final MavenPlugin myFlexmojosPlugin; private final Map<MavenProject, String> myMavenProjectToModuleName; private final List<String> myCompiledLocales; private final List<String> myRuntimeLocales; private final FlexConfigInformer myInformer; public Flexmojos3Configurator(final Module module, final IdeModifiableModelsProvider modelsProvider, final FlexProjectConfigurationEditor flexEditor, final MavenProjectsTree mavenTree, final Map<MavenProject, String> mavenProjectToModuleName, final MavenProject mavenProject, final MavenPlugin flexmojosPlugin, final List<String> compiledLocales, final List<String> runtimeLocales, final FlexConfigInformer informer) { myModelsProvider = modelsProvider; myMavenTree = mavenTree; myMavenProjectToModuleName = mavenProjectToModuleName; myCompiledLocales = compiledLocales; myRuntimeLocales = runtimeLocales; myModule = module; myFlexEditor = flexEditor; myMavenProject = mavenProject; myFlexmojosPlugin = flexmojosPlugin; myInformer = informer; } public void configureAndAppendTasks(final List<MavenProjectsProcessorTask> postTasks) { final ModifiableFlexBuildConfiguration[] oldBCs = myFlexEditor.getConfigurations(myModule); if (oldBCs.length == 1 && oldBCs[0].getName().equals(FlexBuildConfiguration.UNNAMED)) { myFlexEditor.configurationRemoved(oldBCs[0]); } final String mainBCName = myModule.getName(); final ModifiableFlexBuildConfiguration existingBC = ContainerUtil.find(oldBCs, bc -> mainBCName.equals(bc.getName())); final ModifiableFlexBuildConfiguration mainBC = setupMainBuildConfiguration(existingBC); final Collection<RLMInfo> rlmInfos = FlexmojosImporter.isFlexApp(myMavenProject) ? getRLMInfos() : Collections.emptyList(); for (final RLMInfo info : rlmInfos) { final ModifiableFlexBuildConfiguration existingRlmBC = ContainerUtil.find(oldBCs, bc -> bc.getName().equals(info.myRLMName)); configureRuntimeLoadedModule(mainBC, info, existingRlmBC); } if (FlexCompilerProjectConfiguration.getInstance(myModule.getProject()).GENERATE_FLEXMOJOS_CONFIGS) { if (StringUtil.compareVersionNumbers(myFlexmojosPlugin.getVersion(), "3.4") >= 0) { appendGenerateConfigTask(postTasks, mainBC.getCompilerOptions().getAdditionalConfigFilePath()); if (!rlmInfos.isEmpty()) { postTasks.add(new RuntimeModulesGenerateConfigTask(myModule, myMavenProject, myMavenTree, mainBC.getCompilerOptions().getAdditionalConfigFilePath(), rlmInfos)); } } else { myInformer.showFlexConfigWarningIfNeeded(myModule.getProject()); } } } private ModifiableFlexBuildConfiguration setupMainBuildConfiguration(final @Nullable ModifiableFlexBuildConfiguration existingBC) { final boolean isNewBC = existingBC == null; final ModifiableFlexBuildConfiguration mainBC = isNewBC ? myFlexEditor.createConfiguration(myModule) : existingBC; mainBC.setName(myModule.getName()); final TargetPlatform guessedTargetPlatform = handleDependencies(mainBC); final boolean producesAirPackage = "air".equals(myMavenProject.getPackaging()) || containsSignAirGoal(myFlexmojosPlugin); if (isNewBC) { final TargetPlatform targetPlatform = producesAirPackage ? TargetPlatform.Desktop : guessedTargetPlatform; mainBC.setTargetPlatform(targetPlatform); mainBC.setPureAs(false); } final OutputType outputType = FlexmojosImporter.isFlexApp(myMavenProject) ? OutputType.Application : OutputType.Library; // keep outputType == RLM set manually if (!(outputType == OutputType.Application && mainBC.getOutputType() == OutputType.RuntimeLoadedModule)) { if (outputType != mainBC.getOutputType()) { mainBC.setOutputType(outputType); FlexProjectConfigurationEditor.resetNonApplicableValuesToDefaults(mainBC); } } final Element configurationElement = myFlexmojosPlugin.getConfigurationElement(); if (FlexmojosImporter.isFlexApp(myMavenProject)) { final String sourceFile = configurationElement == null ? null : configurationElement.getChildTextNormalize("sourceFile"); if (sourceFile != null && (sourceFile.endsWith(".as") || sourceFile.endsWith(".mxml"))) { mainBC.setMainClass(sourceFile.substring(0, sourceFile.lastIndexOf(".")).replace("/", ".").replace("\\", ".")); } if (producesAirPackage) { setupPackagingOptions(mainBC.getAirDesktopPackagingOptions(), configurationElement); } } final String outputFilePath = FlexmojosImporter.getOutputFilePath(myMavenProject); final String fileName = PathUtil.getFileName(outputFilePath); mainBC.setOutputFileName(fileName); mainBC.setOutputFolder(PathUtil.getParentPath(outputFilePath)); final BuildConfigurationNature nature = mainBC.getNature(); if (nature.isApp() && isNewBC) { final String packageFileName = FileUtil.getNameWithoutExtension(fileName); if (nature.isDesktopPlatform()) { mainBC.getAirDesktopPackagingOptions().setPackageFileName(packageFileName); } else if (nature.isMobilePlatform()) { mainBC.getAndroidPackagingOptions().setPackageFileName(packageFileName); mainBC.getIosPackagingOptions().setPackageFileName(packageFileName); } } setupSdk(mainBC); final String locales = StringUtil.join(myCompiledLocales, CompilerOptionInfo.LIST_ENTRIES_SEPARATOR); final Map<String, String> options = new THashMap<>(mainBC.getCompilerOptions().getAllOptions()); options.put("compiler.locale", locales); mainBC.getCompilerOptions().setAllOptions(options); if (BCUtils.canHaveResourceFiles(nature) && isNewBC) { mainBC.getCompilerOptions().setResourceFilesMode(CompilerOptions.ResourceFilesMode.None); } mainBC.getCompilerOptions().setAdditionalConfigFilePath(getCompilerConfigFilePath()); return mainBC; } private static boolean containsSignAirGoal(final MavenPlugin flexmojosPlugin) { for (MavenPlugin.Execution execution : flexmojosPlugin.getExecutions()) { for (String goal : execution.getGoals()) { if ("sign-air".equals(goal)) { return true; } } } return false; } private void setupPackagingOptions(final ModifiableAirDesktopPackagingOptions packagingOptions, final @Nullable Element configurationElement) { final String descriptorPath = StringUtil.notNullize(getPathOption(myMavenProject, configurationElement, "descriptorTemplate"), myMavenProject.getDirectory() + "/src/main/resources/descriptor.xml"); packagingOptions.setUseGeneratedDescriptor(false); packagingOptions.setCustomDescriptorPath(descriptorPath); final String keystorePath = StringUtil.notNullize(getPathOption(myMavenProject, configurationElement, "keystore"), myMavenProject.getDirectory() + "/src/main/resources/sign.p12"); packagingOptions.getSigningOptions().setUseTempCertificate(false); packagingOptions.getSigningOptions().setKeystorePath(keystorePath); final String keystoreType = configurationElement == null ? null : configurationElement.getChildTextNormalize("storetype", configurationElement.getNamespace()); if (keystoreType != null) { packagingOptions.getSigningOptions().setKeystoreType(keystoreType); } } @Nullable private static String getPathOption(final MavenProject mavenProject, final @Nullable Element configurationElement, final String optionName) { final String path = configurationElement == null ? null : configurationElement.getChildTextNormalize(optionName, configurationElement.getNamespace()); if (path != null) { VirtualFile descriptorFile = LocalFileSystem.getInstance().findFileByPath(path); if (descriptorFile == null) { descriptorFile = LocalFileSystem.getInstance().findFileByPath(mavenProject.getDirectory() + "/" + path); } if (descriptorFile != null) return descriptorFile.getPath(); } return path; } private TargetPlatform handleDependencies(final ModifiableFlexBuildConfiguration bc) { bc.getDependencies().getModifiableEntries().clear(); boolean playerglobal = false; boolean airglobal = false; boolean mobilecomponents = false; final ModifiableRootModel rootModel = myModelsProvider.getModifiableRootModel(myModule); for (OrderEntry entry : rootModel.getOrderEntries()) { final DependencyScope scope = entry instanceof ExportableOrderEntry ? ((ExportableOrderEntry)entry).getScope() : DependencyScope.COMPILE; final boolean isExported = entry instanceof ExportableOrderEntry && ((ExportableOrderEntry)entry).isExported(); if (entry instanceof ModuleOrderEntry) { rootModel.removeOrderEntry(entry); final String dependencyModuleName = ((ModuleOrderEntry)entry).getModuleName(); final MavenProject dependencyMavenProject = findMavenProjectByModuleName(dependencyModuleName); if (dependencyMavenProject == null) { MavenLog.LOG.warn("Maven project not found, module dependency skipped: " + myModule.getName() + " on " + dependencyModuleName); continue; } if (!ArrayUtil.contains(dependencyMavenProject.getPackaging(), FlexmojosImporter.SUPPORTED_PACKAGINGS)) { MavenLog.LOG.info("Unexpected packaging (" + dependencyMavenProject.getPackaging() + "), module dependency skipped: " + myModule.getName() + " on " + dependencyModuleName); continue; } final ModifiableDependencyEntry existingEntry = ContainerUtil .find(bc.getDependencies().getModifiableEntries(), entry1 -> (entry1 instanceof BuildConfigurationEntry) && ((BuildConfigurationEntry)entry1).getModuleName().equals(dependencyModuleName) && ((BuildConfigurationEntry)entry1).getBcName().equals(dependencyModuleName)); final LinkageType linkageType = "swc".equals(dependencyMavenProject.getPackaging()) ? FlexUtils.convertLinkageType(scope, isExported) : LinkageType.LoadInRuntime; if (existingEntry != null) { if (existingEntry.getDependencyType().getLinkageType() == LinkageType.Test) { existingEntry.getDependencyType().setLinkageType(linkageType); } continue; } final ModifiableBuildConfigurationEntry bcEntry = myFlexEditor.createBcEntry(bc.getDependencies(), dependencyModuleName, dependencyModuleName); bcEntry.getDependencyType().setLinkageType(linkageType); bc.getDependencies().getModifiableEntries().add(0, bcEntry); continue; } if (entry instanceof JdkOrderEntry) { rootModel.removeOrderEntry(entry); } if (!(entry instanceof LibraryOrderEntry)) continue; rootModel.removeOrderEntry(entry); if (!LibraryTablesRegistrar.PROJECT_LEVEL.equals(((LibraryOrderEntry)entry).getLibraryLevel())) continue; final Library library = ((LibraryOrderEntry)entry).getLibrary(); if (library == null || !MavenRootModelAdapter.isMavenLibrary(library)) continue; final String libraryName = library.getName(); if (libraryName.contains(":rb.swc:") || libraryName.contains(":resource-bundle:")) { // fix rb.swc placeholders to real SWCs according to used locales final Library.ModifiableModel libraryModifiableModel = myModelsProvider.getModifiableLibraryModel(library); for (final String rbSwcPlaceholdersUrl : findRbSwcPlaceholderUrls(libraryModifiableModel)) { final Collection<String> rootsToAdd = getRbSwcUrlsForCompiledLocales(rbSwcPlaceholdersUrl); libraryModifiableModel.removeRoot(rbSwcPlaceholdersUrl, OrderRootType.CLASSES); for (final String rootToAdd : rootsToAdd) { if (!ArrayUtil.contains(rootToAdd, libraryModifiableModel.getUrls(OrderRootType.CLASSES))) { libraryModifiableModel.addRoot(rootToAdd, OrderRootType.CLASSES); } } // sources and docs could be updated as well, but currently they are always senseless, because they do not exist } } if (libraryName.contains(":swc:") || libraryName.contains(":rb.swc:") || libraryName.contains(":resource-bundle:") || libraryName.contains(":ane:")) { playerglobal |= libraryName.contains("playerglobal"); airglobal |= libraryName.contains("airglobal"); mobilecomponents |= libraryName.contains("mobilecomponents"); final boolean ane = libraryName.contains(":ane:") && !libraryName.contains(":swc:"); final LibraryKind kind = ((LibraryEx)library).getKind(); if (kind != FlexLibraryType.FLEX_LIBRARY) { if (kind == null) { final LibraryEx.ModifiableModelEx libraryModel = (LibraryEx.ModifiableModelEx)myModelsProvider.getModifiableLibraryModel(library); libraryModel.setKind(FlexLibraryType.FLEX_LIBRARY); } } final ModifiableDependencyEntry sharedLibraryEntry = myFlexEditor.createSharedLibraryEntry(bc.getDependencies(), ((LibraryOrderEntry)entry).getLibraryName(), ((LibraryOrderEntry)entry).getLibraryLevel()); final LinkageType linkageType = ane ? DependencyType.DEFAULT_LINKAGE : FlexUtils.convertLinkageType(scope, isExported); sharedLibraryEntry.getDependencyType().setLinkageType(linkageType); bc.getDependencies().getModifiableEntries().add(sharedLibraryEntry); } else { MavenLog.LOG.info("Non-swc dependency for flexmojos project '" + myModule.getName() + "': " + libraryName); } } // todo better target platform detection if both airglobal and playerglobal present? return mobilecomponents && airglobal ? TargetPlatform.Mobile : airglobal && !playerglobal ? TargetPlatform.Desktop : TargetPlatform.Web; } @Nullable private MavenProject findMavenProjectByModuleName(final String moduleName) { for (Map.Entry<MavenProject, String> entry : myMavenProjectToModuleName.entrySet()) { if (moduleName.equals(entry.getValue())) return entry.getKey(); } return null; } /** * @return resource bundle placeholder SWCs, i.e. library roots that have no locale classifier (for example framework-3.3.0.4852.rb.swc) */ private static Collection<String> findRbSwcPlaceholderUrls(final Library.ModifiableModel libraryModifiableModel) { final Collection<String> rbSwcPlaceholdersUrls = new ArrayList<>(); final String[] libraryClassesRoots = libraryModifiableModel.getUrls(OrderRootType.CLASSES); final String libName = libraryModifiableModel.getName(); final String version = libName.substring(libName.lastIndexOf(':') + 1); for (final String librarySwcPath : libraryClassesRoots) { if (librarySwcPath.matches(".*" + version + "\\.rb\\.swc!/")) { rbSwcPlaceholdersUrls.add(librarySwcPath); } } return rbSwcPlaceholdersUrls; } private Collection<String> getRbSwcUrlsForCompiledLocales(final String rbSwcPlaceholderUrl) { final String RB_SWC_URL_END = ".rb.swc!/"; assert rbSwcPlaceholderUrl.endsWith(RB_SWC_URL_END); final String rbSwcUrlCommonPart = rbSwcPlaceholderUrl.substring(0, rbSwcPlaceholderUrl.length() - RB_SWC_URL_END.length()); final Collection<String> result = new ArrayList<>(); List<String> compiledLocales = myCompiledLocales; for (final String locale : compiledLocales) { result.add(rbSwcUrlCommonPart + "-" + locale + RB_SWC_URL_END); } return result; } private void setupSdk(final ModifiableFlexBuildConfiguration bc) { final String path = getArtifactFilePath(myMavenProject, getFlexCompilerMavenId(), MavenConstants.TYPE_POM); final Sdk flexSdk = FlexSdkUtils.createOrGetSdk(FlexmojosSdkType.getInstance(), path); if (flexSdk != null) { ensureSdkHasRequiredAdditionalJarPaths(flexSdk); bc.getDependencies().setSdkEntry(Factory.createSdkEntry(flexSdk.getName())); } } private MavenId getFlexCompilerMavenId() { for (final MavenId mavenId : myFlexmojosPlugin.getDependencies()) { if (FLEX_COMPILER_ARTIFACT_ID.equals(mavenId.getArtifactId()) && (FLEX_COMPILER_ADOBE_GROUP_ID.equals(mavenId.getGroupId()) || FLEX_COMPILER_APACHE_GROUP_ID.equals(mavenId.getGroupId()))) { return mavenId; } } for (final MavenArtifact mavenArtifact : myMavenProject.getDependencies()) { if ("com.adobe.flex".equals(mavenArtifact.getGroupId()) && "framework".equals(mavenArtifact.getArtifactId()) || "com.adobe.flex.framework".equals(mavenArtifact.getGroupId()) && ("flex-framework".equals(mavenArtifact.getArtifactId()) || "air-framework".equals(mavenArtifact.getArtifactId()))) { return new MavenId(FLEX_COMPILER_ADOBE_GROUP_ID, FLEX_COMPILER_ARTIFACT_ID, mavenArtifact.getVersion()); } if ("org.apache.flex".equals(mavenArtifact.getGroupId()) && "framework".equals(mavenArtifact.getArtifactId()) || "org.apache.flex.framework".equals(mavenArtifact.getGroupId()) && ("flex-framework".equals(mavenArtifact.getArtifactId()) || "common-framework".equals(mavenArtifact.getArtifactId()))) { return new MavenId(FLEX_COMPILER_APACHE_GROUP_ID, FLEX_COMPILER_ARTIFACT_ID, mavenArtifact.getVersion()); } } // correct flexmojos-maven-plugin resolving and taking version from 'flex.sdk.version' property value is rather expensive, so version is hardcoded final String version; final String pluginVersion = myFlexmojosPlugin.getVersion(); if (StringUtil.compareVersionNumbers(pluginVersion, "5") >= 0) { version = "4.6.0.23201"; } else if (StringUtil.compareVersionNumbers(pluginVersion, "4.1") >= 0 || pluginVersion != null && pluginVersion.startsWith("4.0-RC")) { version = "4.5.1.21328"; } else if (StringUtil.compareVersionNumbers(pluginVersion, "4") >= 0) { version = "4.5.0.18623"; } else { version = "3.2.0.3958"; } return new MavenId(FLEX_COMPILER_ADOBE_GROUP_ID, FLEX_COMPILER_ARTIFACT_ID, version); } private static String getArtifactFilePath(final MavenProject mavenProject, final MavenId mavenId, final String type) { return FileUtil.toSystemIndependentName(MavenArtifactUtil.getArtifactFile(mavenProject.getLocalRepository(), mavenId, type).getPath()); } private void ensureSdkHasRequiredAdditionalJarPaths(final @NotNull Sdk sdk) { assert sdk.getSdkType() instanceof FlexmojosSdkType; final FlexmojosSdkAdditionalData additionalData = ((FlexmojosSdkAdditionalData)sdk.getSdkAdditionalData()); assert additionalData != null; for (MavenId dependency : myFlexmojosPlugin.getDependencies()) { if (StringUtil.isEmpty(dependency.getArtifactId())) continue; for (Pattern jarNamePattern : ADDITIONAL_JAR_NAME_PATTERNS_TO_INCLUDE_IN_FLEXMOJOS_SDK_CLASSPATH) { if (jarNamePattern.matcher(dependency.getArtifactId()).matches()) { final String jarFilePath = getArtifactFilePath(myMavenProject, dependency, MavenConstants.TYPE_JAR); additionalData.addFlexCompilerClasspathEntryIfNotPresentAndRemoveDifferentVersionOfThisJar(jarNamePattern, jarFilePath); break; } } } } protected String getCompilerConfigFilePath() { return getCompilerConfigFilePath(null); } protected String getCompilerConfigFilePath(final @Nullable String rlmName) { final Element configurationElement = myFlexmojosPlugin.getConfigurationElement(); final String classifier = configurationElement == null ? null : configurationElement.getChildTextNormalize("classifier", configurationElement.getNamespace()); String suffix = ""; if (rlmName != null) { suffix = "-" + rlmName; } else if (classifier != null) { suffix = "-" + classifier; } return FileUtil.toSystemIndependentName(myMavenProject.getBuildDirectory()) + "/" + myMavenProject.getFinalName() + suffix + "-config-report.xml"; } protected void appendGenerateConfigTask(final List<MavenProjectsProcessorTask> postTasks, final String configFilePath) { postTasks.add(new Flexmojos3GenerateConfigTask(myModule, myMavenProject, myMavenTree, configFilePath, myInformer)); } private void configureRuntimeLoadedModule(final ModifiableFlexBuildConfiguration mainBC, final RLMInfo info, final @Nullable ModifiableFlexBuildConfiguration existingRlmBC) { final BuildConfigurationNature nature = new BuildConfigurationNature(mainBC.getTargetPlatform(), mainBC.isPureAs(), OutputType.RuntimeLoadedModule); final boolean isNewBC = existingRlmBC == null; final ModifiableFlexBuildConfiguration rlmBC = isNewBC ? myFlexEditor.copyConfiguration(mainBC, nature) : existingRlmBC; rlmBC.setName(info.myRLMName); rlmBC.setMainClass(info.myMainClass); rlmBC.setOutputFileName(info.myOutputFileName); rlmBC.setOutputFolder(info.myOutputFolderPath); rlmBC.getCompilerOptions().setAdditionalConfigFilePath(getCompilerConfigFilePath(info.myRLMName)); } protected Collection<RLMInfo> getRLMInfos() { final Element configurationElement = myFlexmojosPlugin.getConfigurationElement(); final Element moduleFilesElement = configurationElement == null ? null : configurationElement.getChild("moduleFiles", configurationElement.getNamespace()); if (moduleFilesElement == null) { return Collections.emptyList(); } final List<RLMInfo> result = new ArrayList<>(); //noinspection unchecked for (final Element moduleFilePathElement : (Iterable<Element>)moduleFilesElement.getChildren()) { final String path = moduleFilePathElement.getTextNormalize(); if (path.endsWith(".mxml") || path.endsWith(".as")) { final String mainClassRelativePath = FileUtil.toSystemIndependentName(path); final String mainClass = FileUtil.getNameWithoutExtension(mainClassRelativePath.replace('/', '.')); final String rlmName = StringUtil.getShortName(mainClass); final String outputFileName = myMavenProject.getFinalName() + "-" + rlmName + ".swf"; final String outputFolderPath = FileUtil.toSystemIndependentName(myMavenProject.getBuildDirectory()); final String configFilePath = getCompilerConfigFilePath(rlmName); result.add(new RLMInfo(rlmName, mainClass, mainClassRelativePath, outputFileName, outputFolderPath, configFilePath)); } } return result; } /* private void reimportRuntimeLocalesFacets(final MavenProject project, final Module module, final MavenModifiableModelsProvider modelsProvider) { FacetModel model = modelsProvider.getModifiableFacetModel(module); String packaging = project.getPackaging(); String extension = "swc".equals(packaging) ? "rb.swc" : packaging; String runtimeLocaleOutputPathPattern = findConfigValue(project, "runtimeLocaleOutputPath", "/{contextRoot}/locales/{artifactId}-{version}-{locale}.{extension}"); runtimeLocaleOutputPathPattern = getRuntimeLocalesOutputPathPattern(project, runtimeLocaleOutputPathPattern, extension); for (FlexFacet eachFacet : model.getFacetsByType(myFacetType.getId())) { if (!isResourceFacet(eachFacet)) continue; String locale = getResourceFacetLocale(eachFacet); FlexBuildConfiguration config = FlexBuildConfiguration.getInstance(eachFacet); String outputPath = getRuntimeLocaleOutputPath(runtimeLocaleOutputPathPattern, locale); String outputDir = outputPath.substring(0, outputPath.lastIndexOf("/")); String outputName = outputPath.substring(outputDir.length() + 1); config.OUTPUT_TYPE = getOutputType(project); config.OUTPUT_FILE_NAME = outputName; config.USE_FACET_COMPILE_OUTPUT_PATH = true; config.FACET_COMPILE_OUTPUT_PATH = outputDir; config.FACET_COMPILE_OUTPUT_PATH_FOR_TESTS = FileUtil.toSystemIndependentName(project.getTestOutputDirectory()); config.USE_DEFAULT_SDK_CONFIG_FILE = false; config.USE_CUSTOM_CONFIG_FILE = true; config.CUSTOM_CONFIG_FILE = outputPath.replace("." + extension, getCompilerConfigXmlSuffix()); } } private static String getRuntimeLocalesOutputPathPattern(MavenProject project, String runtimeLocaleOuputPathPattern, String extension) { MavenId projectId = project.getMavenId(); String result = runtimeLocaleOuputPathPattern; String buildDirReplacement = Matcher.quoteReplacement(FileUtil.toSystemIndependentName(project.getBuildDirectory())); result = result.replaceFirst("\\A/\\{contextRoot\\}", buildDirReplacement); result = result.replaceAll("\\{contextRoot\\}", buildDirReplacement); result = result.replaceAll("\\{groupId\\}", Matcher.quoteReplacement(projectId.getGroupId())); result = result.replaceAll("\\{artifactId\\}", Matcher.quoteReplacement(projectId.getArtifactId())); result = result.replaceAll("\\{version\\}", Matcher.quoteReplacement(projectId.getVersion())); result = result.replaceAll("\\{extension\\}", Matcher.quoteReplacement(extension)); return result; } private static String getRuntimeLocaleOutputPath(String runtimeLocaleOuputPathPattern, String locale) { return runtimeLocaleOuputPathPattern.replaceAll("\\{locale\\}", Matcher.quoteReplacement(locale)); } */ }