package com.intellij.lang.javascript.flex.build; import com.intellij.flex.FlexCommonBundle; import com.intellij.lang.javascript.flex.projectStructure.model.FlexBuildConfiguration; import com.intellij.lang.javascript.flex.projectStructure.options.BCUtils; import com.intellij.openapi.compiler.CompilerMessageCategory; import com.intellij.openapi.module.Module; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.List; public abstract class FlexCompilationTask { protected final Module myModule; private final String myPresentableName; protected final FlexBuildConfiguration myBC; protected final Collection<FlexBuildConfiguration> myDependencies; private List<VirtualFile> myConfigFiles; protected boolean myFinished; protected boolean myCompilationFailed; protected FlexCompilationTask(final Module module, final FlexBuildConfiguration bc, final Collection<FlexBuildConfiguration> dependencies) { myModule = module; myBC = bc; myDependencies = dependencies; myPresentableName = getPresentableName(module, bc); } public static String getPresentableName(final Module module, final FlexBuildConfiguration bc) { String postfix = bc.isTempBCForCompilation() ? " - " + BCUtils.getBCSpecifier(bc) : ""; if (!bc.getName().equals(module.getName())) postfix += " (module " + module.getName() + ")"; return bc.getName() + postfix; } public void start(final FlexCompilationManager compilationManager) { try { myConfigFiles = createConfigFiles(); final String outputFilePath = myBC.getActualOutputFilePath(); if (compilationManager.isRebuild()) { FlexCompilationUtils.deleteCacheForFile(outputFilePath); } FlexCompilationUtils.ensureOutputFileWritable(myModule.getProject(), outputFilePath); doStart(compilationManager); } catch (IOException e) { compilationManager.addMessage(this, CompilerMessageCategory.ERROR, e.getMessage(), null, -1, -1); myCompilationFailed = true; cancel(); } } protected List<VirtualFile> createConfigFiles() throws IOException { final ArrayList<VirtualFile> configFiles = new ArrayList<>(2); configFiles.add(CompilerConfigGenerator.getOrCreateConfigFile(myModule, myBC)); final String additionalConfigFilePath = myBC.getCompilerOptions().getAdditionalConfigFilePath(); if (!myBC.isTempBCForCompilation() && !additionalConfigFilePath.isEmpty()) { final VirtualFile additionalConfigFile = LocalFileSystem.getInstance().findFileByPath(additionalConfigFilePath); if (additionalConfigFile == null) { throw new IOException( FlexCommonBundle.message("additional.config.file.not.found.for.bc.0.of.module.1", additionalConfigFilePath, myBC.getName(), myModule.getName())); } configFiles.add(additionalConfigFile); } return configFiles; } protected abstract void doStart(final FlexCompilationManager compilationManager) throws IOException; public void cancel() { doCancel(); myFinished = true; } protected abstract void doCancel(); public boolean isFinished() { return myFinished; } public boolean isCompilationFailed() { return myCompilationFailed; } public String getPresentableName() { return myPresentableName; } public Module getModule() { return myModule; } public List<VirtualFile> getConfigFiles() { return myConfigFiles; } public FlexBuildConfiguration getBC() { return myBC; } public Collection<FlexBuildConfiguration> getDependencies() { return myDependencies; } }