package com.intellij.javascript.flex.maven;
import com.intellij.lang.javascript.flex.projectStructure.model.impl.FlexProjectConfigurationEditor;
import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProvider;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vcs.changes.ChangeListManager;
import com.intellij.openapi.vcs.changes.IgnoredBeanFactory;
import org.jdom.Element;
import org.jetbrains.annotations.Nullable;
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 java.util.*;
import static com.intellij.javascript.flex.maven.RuntimeModulesGenerateConfigTask.RLMInfo;
public class Flexmojos4Configurator extends Flexmojos3Configurator {
public Flexmojos4Configurator(final Module module,
final IdeModifiableModelsProvider modifiableModelsProvider,
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) {
super(module, modifiableModelsProvider, flexEditor, mavenTree, mavenProjectToModuleName, mavenProject, flexmojosPlugin, compiledLocales,
runtimeLocales, informer);
}
public static String getCompilerConfigsDir(final Project project) {
//noinspection ConstantConditions
return project.getBaseDir().getPath() + "/.idea/flexmojos";
}
@Override
@Nullable
protected String getCompilerConfigFilePath(final 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 getCompilerConfigsDir(myModule.getProject()) + "/" + myMavenProject.getMavenId().getArtifactId() + "-" +
myMavenProject.getMavenId().getGroupId() + suffix + ".xml";
}
protected Collection<RLMInfo> getRLMInfos() {
final Element configurationElement = myFlexmojosPlugin.getConfigurationElement();
final Element modulesElement = configurationElement == null
? null : configurationElement.getChild("modules", configurationElement.getNamespace());
if (modulesElement == null) {
return Collections.emptyList();
}
final List<RLMInfo> result = new ArrayList<>();
//noinspection unchecked
for (final Element moduleElement : (Iterable<Element>)modulesElement.getChildren()) {
if (moduleElement.getChildren().size() > 0) {
final String mainClassRelativePath = moduleElement.getChildTextNormalize("sourceFile", moduleElement.getNamespace());
final String finalName = moduleElement.getChildTextNormalize("finalName", moduleElement.getNamespace());
final String destinationPath = moduleElement.getChildTextNormalize("destinationPath", moduleElement.getNamespace());
final String mainClass = FileUtil.getNameWithoutExtension(mainClassRelativePath.replace('/', '.'));
final String rlmName = StringUtil.notNullize(finalName, StringUtil.getShortName(mainClass));
// indeed, rlmName.toLowerCase() is specific to flexmojos 4
final String outputFileName = finalName != null ? finalName + ".swf"
: myMavenProject.getFinalName() + "-" + rlmName.toLowerCase() + ".swf";
final String outputFolderPath = FileUtil.toSystemIndependentName(myMavenProject.getBuildDirectory() +
(destinationPath == null ? "" : ("/" + destinationPath)));
final String configFilePath = getCompilerConfigFilePath(rlmName);
result.add(new RLMInfo(rlmName, mainClass, mainClassRelativePath, outputFileName, outputFolderPath, configFilePath));
}
else {
final String path = moduleElement.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);
// indeed, rlmName.toLowerCase() is specific to flexmojos 4
final String outputFileName = myMavenProject.getFinalName() + "-" + rlmName.toLowerCase() + ".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;
}
protected void appendGenerateConfigTask(final List<MavenProjectsProcessorTask> postTasks, final String configFilePath) {
final Project project = myModule.getProject();
Flexmojos4GenerateConfigTask existingTask = null;
for (MavenProjectsProcessorTask postTask : postTasks) {
if (postTask.getClass() == Flexmojos4GenerateConfigTask.class) {
existingTask = (Flexmojos4GenerateConfigTask)postTask;
break;
}
}
if (existingTask == null) {
ChangeListManager.getInstance(project).addFilesToIgnore(
IgnoredBeanFactory.ignoreUnderDirectory(getCompilerConfigsDir(project), project));
existingTask = new Flexmojos4GenerateConfigTask(myMavenTree);
postTasks.add(existingTask);
}
existingTask.submit(myMavenProject, myModule, configFilePath);
}
}