package com.intellij.flex.maven; import com.intellij.flex.model.bc.BuildConfigurationNature; import com.intellij.lang.javascript.flex.FlexModuleType; import com.intellij.lang.javascript.flex.library.FlexLibraryType; import com.intellij.lang.javascript.flex.projectStructure.model.FlexBuildConfiguration; import com.intellij.lang.javascript.flex.projectStructure.model.FlexBuildConfigurationManager; import com.intellij.lang.javascript.flex.projectStructure.model.SharedLibraryEntry; import com.intellij.lang.javascript.flex.projectStructure.options.FlexProjectRootsUtil; import com.intellij.lang.javascript.flex.sdk.FlexmojosSdkType; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.module.ModuleType; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.roots.LibraryOrderEntry; import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.roots.impl.libraries.LibraryEx; import com.intellij.openapi.roots.libraries.Library; import com.intellij.openapi.roots.libraries.LibraryTablesRegistrar; import com.intellij.util.PathUtil; import com.intellij.util.StringBuilderSpinAllocator; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.FilteringIterator; import org.jetbrains.annotations.Nullable; import org.jetbrains.idea.maven.MavenImportingTestCase; import java.util.List; public abstract class FlexmojosImporterTestBase extends MavenImportingTestCase { protected static final String TEST_GROUP_ID = "com.intellij.flex.maven.test"; protected static final String TEST_VERSION = "1.0"; protected static final String SOURCE_DIR = "src"; protected abstract String getFlexmojosVersion(); protected void checkBCCount(final String moduleName, int bcCount) { final Module module = ModuleManager.getInstance(myProject).findModuleByName(moduleName); assertNotNull("Module '" + moduleName + "' not found", module); assertTrue(ModuleType.get(module) == FlexModuleType.getInstance()); assertEquals(bcCount, FlexBuildConfigurationManager.getInstance(module).getBuildConfigurations().length); } protected FlexBuildConfiguration checkBC(final String moduleName, final String bcName, final BuildConfigurationNature nature, final String mainClass, final String outputFileName, final String outputFolderRelPath, final String sdkVersion, final String locales, final String configFileRelPath) { final Module module = ModuleManager.getInstance(myProject).findModuleByName(moduleName); assertNotNull("Module '" + moduleName + "' not found", module); final FlexBuildConfiguration bc = FlexBuildConfigurationManager.getInstance(module).findConfigurationByName(bcName); assertNotNull("Build configuration '" + bcName + "' not found", bc); checkLibrariesOfFlexType(module, bc); assertEquals(nature, bc.getNature()); assertEquals(mainClass, bc.getMainClass()); assertEquals(outputFileName, bc.getOutputFileName()); assertEquals(PathUtil.getParentPath(module.getModuleFilePath()) + (outputFolderRelPath.isEmpty() ? "" : "/") + outputFolderRelPath, bc.getOutputFolder()); assertFalse(bc.isUseHtmlWrapper()); assertFalse(bc.isSkipCompile()); assertEquals(locales, bc.getCompilerOptions().getOption("compiler.locale")); assertEquals(getConfigFilesBasePath(module) + "/" + configFileRelPath, bc.getCompilerOptions().getAdditionalConfigFilePath()); final Sdk sdk = bc.getSdk(); assertNotNull(sdk); assertInstanceOf(sdk.getSdkType(), FlexmojosSdkType.class); assertEquals(sdk.getName(), "Flexmojos SDK " + sdkVersion); assertEquals(sdk.getVersionString(), sdkVersion); return bc; } protected abstract String getConfigFilesBasePath(final Module module); private static void checkLibrariesOfFlexType(final Module module, final FlexBuildConfiguration bc) { final List<LibraryOrderEntry> moduleLibEntries = ContainerUtil.filter(ModuleRootManager.getInstance(module).getOrderEntries(), new FilteringIterator.InstanceOf(LibraryOrderEntry.class)); final List<SharedLibraryEntry> bcLibEntries = ContainerUtil.filter(bc.getDependencies().getEntries(), new FilteringIterator.InstanceOf(SharedLibraryEntry.class)); assertTrue(bcLibEntries.size() > 0); assertEquals(moduleLibEntries.size(), bcLibEntries.size()); for (SharedLibraryEntry entry : bcLibEntries) { assertTrue(entry.getLibraryName().contains(":swc:") || entry.getLibraryName().contains(":rb.swc:") || entry.getLibraryName().contains(":resource-bundle:")); assertEquals(LibraryTablesRegistrar.PROJECT_LEVEL, entry.getLibraryLevel()); final Library library = FlexProjectRootsUtil.findOrderEntry(module.getProject(), entry); assertNotNull(library); assertTrue(((LibraryEx)library).getKind() == FlexLibraryType.FLEX_LIBRARY); checkContainsLibrary(moduleLibEntries, library); } } private static void checkContainsLibrary(final List<LibraryOrderEntry> entries, final Library library) { for (LibraryOrderEntry entry : entries) { if (library.equals(entry.getLibrary())) return; } fail("Module entries do not contain library " + library.getName()); } protected static String mavenProjectDescription(final String projectName, final String packaging) { return "<groupId>" + TEST_GROUP_ID + "</groupId>" + "<artifactId>" + projectName + "</artifactId>" + "<version>1.0</version>" + "<packaging>" + packaging + "</packaging>"; } protected String flexmojosPlugin() { return "<groupId>org.sonatype.flexmojos</groupId>" + "<artifactId>flexmojos-maven-plugin</artifactId>" + "<version>" + getFlexmojosVersion() + "</version>" + "<extensions>true</extensions>"; } protected String plugins() { return plugins(null, null); } protected String plugins(@Nullable String configuration, @Nullable String otherPlugins) { StringBuilder stringBuilder = StringBuilderSpinAllocator.alloc(); try { stringBuilder.append("<build><sourceDirectory>").append(SOURCE_DIR).append("</sourceDirectory><plugins><plugin>") .append(flexmojosPlugin()); if (configuration != null) { stringBuilder.append("<configuration>").append(configuration).append("</configuration>"); } stringBuilder.append("</plugin>"); if (otherPlugins != null) { stringBuilder.append(otherPlugins); } return stringBuilder.append("</plugins></build>").toString(); } finally { StringBuilderSpinAllocator.dispose(stringBuilder); } } protected static String parent() { return " <parent>\n" + " <groupId>" + TEST_GROUP_ID + "</groupId>\n" + " <artifactId>aggregator</artifactId>\n" + " <version>1.0</version>\n" + " </parent>\n"; } protected static String dependencies(String artifactId) { return dependencies(artifactId, "swc"); } protected static String dependencies(String artifactId, String type) { return " <dependencies>\n" + " <dependency>\n" + " <groupId>" + TEST_GROUP_ID + "</groupId>\n" + " <artifactId>" + artifactId + "</artifactId>\n" + " <version>1.0</version>\n" + " <type>" + type + "</type>\n" + " </dependency>\n" + " </dependencies>"; } protected static String flexFrameworkDependency(final String version) { return " <dependencies>\n" + " <dependency>\n" + " <groupId>com.adobe.flex.framework</groupId>" + " <artifactId>flex-framework</artifactId>" + " <version>" + version + "</version>" + " <type>pom</type>" + " </dependency>\n" + " </dependencies>" + repository(); } protected static String repository() { return " <repositories>\n" + " <repository>\n" + " <id>flex-repository</id>\n" + " <url>http://maven.labs.intellij.net/flex</url>\n" + " <releases>\n" + " <enabled>true</enabled>\n" + " </releases>\n" + " </repository>\n" + " </repositories>\n" + " <pluginRepositories>\n" + " <pluginRepository>\n" + " <id>flex-repository</id>\n" + " <url>http://maven.labs.intellij.net/flex</url>\n" + " <releases>\n" + " <enabled>true</enabled>\n" + " </releases>\n" + " </pluginRepository>\n" + " </pluginRepositories>\n"; } }