blob: db1ca92485e74896827002aed6b965daa2828dff [file] [log] [blame]
package org.jetbrains.jps.maven.compiler;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.io.FileUtilRt;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jps.builders.BuildOutputConsumer;
import org.jetbrains.jps.builders.DirtyFilesHolder;
import org.jetbrains.jps.builders.FileProcessor;
import org.jetbrains.jps.builders.storage.BuildDataPaths;
import org.jetbrains.jps.incremental.CompileContext;
import org.jetbrains.jps.incremental.ProjectBuildException;
import org.jetbrains.jps.incremental.TargetBuilder;
import org.jetbrains.jps.incremental.messages.BuildMessage;
import org.jetbrains.jps.incremental.messages.CompilerMessage;
import org.jetbrains.jps.incremental.messages.ProgressMessage;
import org.jetbrains.jps.maven.model.JpsMavenExtensionService;
import org.jetbrains.jps.maven.model.impl.*;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.*;
/**
* @author Eugene Zhuravlev
* Date: 10/6/11
*/
public class MavenResourcesBuilder extends TargetBuilder<MavenResourceRootDescriptor, MavenResourcesTarget> {
public static final String BUILDER_NAME = "Maven Resources Compiler";
public MavenResourcesBuilder() {
super(Arrays.asList(MavenResourcesTargetType.PRODUCTION, MavenResourcesTargetType.TEST));
}
@Override
public void build(@NotNull final MavenResourcesTarget target, @NotNull final DirtyFilesHolder<MavenResourceRootDescriptor, MavenResourcesTarget> holder, @NotNull final BuildOutputConsumer outputConsumer, @NotNull final CompileContext context) throws ProjectBuildException, IOException {
final BuildDataPaths dataPaths = context.getProjectDescriptor().dataManager.getDataPaths();
final MavenProjectConfiguration projectConfig = JpsMavenExtensionService.getInstance().getMavenProjectConfiguration(dataPaths);
final MavenModuleResourceConfiguration config = target.getModuleResourcesConfiguration(dataPaths);
if (config == null) {
return;
}
final Map<MavenResourceRootDescriptor, List<File>> files = new HashMap<MavenResourceRootDescriptor, List<File>>();
holder.processDirtyFiles(new FileProcessor<MavenResourceRootDescriptor, MavenResourcesTarget>() {
@Override
public boolean apply(MavenResourcesTarget t, File file, MavenResourceRootDescriptor rd) throws IOException {
assert target == t;
List<File> fileList = files.get(rd);
if (fileList == null) {
fileList = new ArrayList<File>();
files.put(rd, fileList);
}
fileList.add(file);
return true;
}
});
MavenResourceRootDescriptor[] roots = files.keySet().toArray(new MavenResourceRootDescriptor[files.keySet().size()]);
Arrays.sort(roots, new Comparator<MavenResourceRootDescriptor>() {
@Override
public int compare(MavenResourceRootDescriptor r1, MavenResourceRootDescriptor r2) {
int res = r1.getIndexInPom() - r2.getIndexInPom();
if (r1.isOverwrite()) {
assert r2.isOverwrite(); // 'overwrite' parameters is common for all roots in module.
return res;
}
if (r1.getConfiguration().isFiltered && !r2.getConfiguration().isFiltered) return 1;
if (!r1.getConfiguration().isFiltered && r2.getConfiguration().isFiltered) return -1;
if (!r1.getConfiguration().isFiltered) {
res = -res;
}
return res;
}
});
MavenResourceFileProcessor fileProcessor = new MavenResourceFileProcessor(projectConfig, target.getModule().getProject(), config);
for (MavenResourceRootDescriptor rd : roots) {
for (File file : files.get(rd)) {
String relPath = FileUtil.getRelativePath(rd.getRootFile(), file);
if (relPath == null) {
continue;
}
final File outputDir = MavenResourcesTarget.getOutputDir(target.getModuleOutputDir(), rd.getConfiguration(), config.outputDirectory);
if (outputDir == null) {
continue;
}
File outputFile = new File(outputDir, relPath);
String sourcePath = file.getPath();
try {
context.processMessage(new ProgressMessage("Copying resources... [" + target.getModule().getName() + "]"));
fileProcessor.copyFile(file, outputFile, rd.getConfiguration(), context, FileUtilRt.ALL_FILES);
outputConsumer.registerOutputFile(outputFile, Collections.singleton(sourcePath));
}
catch (UnsupportedEncodingException e) {
context.processMessage(
new CompilerMessage(BUILDER_NAME, BuildMessage.Kind.INFO, "Resource was not copied: " + e.getMessage(), sourcePath));
}
if (context.getCancelStatus().isCanceled()) {
return;
}
}
}
context.checkCanceled();
context.processMessage(new ProgressMessage(""));
}
@NotNull
public String getPresentableName() {
return BUILDER_NAME;
}
}