blob: b7015992d3e13b999ce408338fa3376c3fd13e50 [file] [log] [blame]
/*
* Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.jps.maven.compiler;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.io.FileUtilRt;
import com.intellij.openapi.util.text.StringUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jps.builders.storage.BuildDataPaths;
import org.jetbrains.jps.incremental.CompileContext;
import org.jetbrains.jps.incremental.artifacts.instructions.ArtifactRootCopyingHandlerProvider;
import org.jetbrains.jps.incremental.artifacts.instructions.FileCopyingHandler;
import org.jetbrains.jps.maven.model.JpsMavenExtensionService;
import org.jetbrains.jps.maven.model.impl.*;
import org.jetbrains.jps.model.JpsModel;
import org.jetbrains.jps.model.artifact.JpsArtifact;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.io.PrintWriter;
/**
* @author nik
*/
public class MavenWebArtifactRootCopyingHandlerProvider extends ArtifactRootCopyingHandlerProvider {
private static final Logger LOG = Logger.getInstance(MavenWebArtifactRootCopyingHandlerProvider.class);
@Nullable
@Override
public FileCopyingHandler createCustomHandler(@NotNull JpsArtifact artifact, @NotNull File root, @NotNull JpsModel model,
@NotNull BuildDataPaths buildDataPaths) {
JpsMavenExtensionService mavenExtensionService = JpsMavenExtensionService.getInstance();
if (!mavenExtensionService.hasMavenProjectConfiguration(buildDataPaths)) return null;
MavenProjectConfiguration projectConfiguration = mavenExtensionService.getMavenProjectConfiguration(buildDataPaths);
MavenWebArtifactConfiguration artifactResourceConfiguration = projectConfiguration.webArtifactConfigs.get(artifact.getName());
if (artifactResourceConfiguration == null) return null;
ResourceRootConfiguration rootConfiguration = artifactResourceConfiguration.getRootConfiguration(root);
if (rootConfiguration == null) return null;
MavenModuleResourceConfiguration moduleResourceConfiguration = projectConfiguration.moduleConfigurations.get(artifactResourceConfiguration.moduleName);
if (moduleResourceConfiguration == null) {
LOG.debug("Maven resource configuration not found for module " + artifactResourceConfiguration.moduleName);
return null;
}
MavenResourceFileProcessor fileProcessor = new MavenResourceFileProcessor(projectConfiguration, model.getProject(), moduleResourceConfiguration);
return new MavenWebRootCopyingHandler(fileProcessor, rootConfiguration, moduleResourceConfiguration, root);
}
private static class MavenWebRootCopyingHandler extends FileCopyingHandler {
private final MavenResourceFileProcessor myFileProcessor;
@NotNull private final ResourceRootConfiguration myRootConfiguration;
@NotNull private final MavenModuleResourceConfiguration myModuleResourceConfiguration;
@NotNull private final File myRoot;
private FileFilter myFileFilter;
private boolean myMainWebAppRoot;
private MavenWebRootCopyingHandler(@NotNull MavenResourceFileProcessor fileProcessor,
@NotNull ResourceRootConfiguration rootConfiguration,
@NotNull MavenModuleResourceConfiguration moduleResourceConfiguration,
@NotNull File root) {
myFileProcessor = fileProcessor;
myRootConfiguration = rootConfiguration;
myModuleResourceConfiguration = moduleResourceConfiguration;
myRoot = root;
myFileFilter = new MavenResourceFileFilter(myRoot, myRootConfiguration);
//for additional resource directory 'exclude' means 'exclude from copying' but for the default webapp resource it mean 'exclude from filtering'
String relativePath = FileUtil.getRelativePath(FileUtil.toSystemIndependentName(moduleResourceConfiguration.directory),
FileUtil.toSystemIndependentName(rootConfiguration.directory), '/');
myMainWebAppRoot = relativePath != null && "src/main/webapp".equals(StringUtil.trimEnd(relativePath, "/"));
}
@Override
public void copyFile(@NotNull File from, @NotNull File to, @NotNull CompileContext context) throws IOException {
myFileProcessor.copyFile(from, to, myRootConfiguration, context, myMainWebAppRoot ? myFileFilter : FileUtilRt.ALL_FILES);
}
@Override
public void writeConfiguration(@NotNull PrintWriter out) {
out.print("maven hash:");
out.println(myModuleResourceConfiguration.computeModuleConfigurationHash() + 31*myRootConfiguration.computeConfigurationHash());
}
@NotNull
@Override
public FileFilter createFileFilter() {
return myMainWebAppRoot ? FileUtilRt.ALL_FILES : myFileFilter;
}
}
}