/*
* Copyright 2000-2013 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.idea.maven.compiler;
import com.intellij.openapi.fileTypes.FileTypeManager;
import com.intellij.openapi.fileTypes.FileTypes;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.idea.maven.model.MavenExplicitProfiles;
import java.util.Arrays;
public class ResourceFilteringTest extends MavenCompilingTestCase {
@Override
protected boolean runInWriteAction() {
return false;
}
public void testBasic() throws Exception {
createProjectSubFile("resources/file.properties", "value=${project.version}\n" +
"value2=@project.version@\n" +
"time=${time}");
importProject("test" +
"project" +
"1" +
"" +
" " +
" ---\n" +
"\n" +
"" +
"" +
" " +
" " +
" resources" +
" true" +
" " +
" " +
"");
compileModules("project");
assertResult("target/classes/file.properties", "value=1\n" +
"value2=1\n" +
"time=---");
}
public void testResolveSettingProperty() throws Exception {
createProjectSubFile("resources/file.properties", "value=${settings.localRepository}");
importProject("test" +
"project" +
"1" +
"" +
" " +
" " +
" resources" +
" true" +
" " +
" " +
"");
compileModules("project");
assert !loadResult(myProjectPom, "target/classes/file.properties").contains("settings.localRepository");
}
public void testCustomDelimiter() throws Exception {
createProjectSubFile("resources/file.properties", "value1=${project.version}\n" +
"value2=@project.version@\n" +
"valueX=|\n" +
"value3=|project.version|\n" +
"value4=(project.version]");
importProject("test" +
"project" +
"1" +
"" +
" " +
" " +
" resources" +
" true" +
" " +
" " +
" " +
" " +
" org.apache.maven.plugins" +
" maven-resources-plugin" +
" " +
" " +
" |" +
" (*]" +
" " +
" " +
" " +
" " +
"");
compileModules("project");
assertResult("target/classes/file.properties", "value1=1\n" +
"value2=1\n" +
"valueX=|\n" +
"value3=1\n" +
"value4=1");
}
public void testPomArtifactId() throws Exception {
createProjectSubFile("resources/file.properties", "value=${pom.artifactId}");
importProject("test" +
"project" +
"1" +
"" +
" " +
" " +
" resources" +
" true" +
" " +
" " +
"");
compileModules("project");
assertResult("target/classes/file.properties", "value=project");
}
public void testPomVersionInModules() throws Exception {
createProjectSubFile("m1/resources/file.properties", "value=${pom.version}");
createProjectPom("test" +
"project" +
"1" +
"" +
" m1" +
"");
createModulePom("m1",
"test" +
"m1" +
"2" +
"" +
" " +
" " +
" resources" +
" true" +
" " +
" " +
"");
importProject();
compileModules("project", "m1");
assertResult("m1/target/classes/file.properties", "value=2");
}
public void testDoNotFilterSomeFileByDefault() throws Exception {
createProjectSubFile("resources/file.bmp", "value=${project.version}");
importProject("test" +
"project" +
"1" +
"" +
" " +
" " +
" resources" +
" true" +
" " +
" " +
"");
compileModules("project");
assertResult("target/classes/file.bmp", "value=${project.version}");
}
public void testCustomNonFilteredExtensions() throws Exception {
createProjectSubFile("resources/file.bmp", "value=${project.version}");
createProjectSubFile("resources/file.xxx", "value=${project.version}");
importProject("test" +
"project" +
"1" +
"" +
" " +
" " +
" resources" +
" true" +
" " +
" " +
" " +
" " +
" org.apache.maven.plugins" +
" maven-resources-plugin" +
" " +
" " +
" xxx" +
" " +
" " +
" " +
" " +
"");
compileModules("project");
assertResult("target/classes/file.bmp", "value=${project.version}");
assertResult("target/classes/file.xxx", "value=${project.version}");
}
public void testFilteringTestResources() throws Exception {
createProjectSubFile("resources/file.properties", "value=@project.version@");
importProject("test" +
"project" +
"1" +
"" +
" " +
" " +
" resources" +
" true" +
" " +
" " +
"");
compileModules("project");
assertResult("target/test-classes/file.properties", "value=1");
}
public void testExcludesAndIncludes() throws Exception {
createProjectSubFile("src/main/resources/file1.properties", "value=${project.artifactId}");
createProjectSubFile("src/main/resources/file2.properties", "value=${project.artifactId}");
importProject("test" +
"project" +
"1" +
"" +
" " +
" " +
" src/main/resources" +
" " +
" file1.properties" +
" " +
" true" +
" " +
" " +
" src/main/resources" +
" " +
" file1.properties" +
" " +
" false" +
" " +
" " +
"");
compileModules("project");
assertResult("target/classes/file1.properties", "value=${project.artifactId}");
assertResult("target/classes/file2.properties", "value=project");
compileModules();
assertResult("target/classes/file1.properties", "value=${project.artifactId}");
assertResult("target/classes/file2.properties", "value=project");
compileModules("project");
assertResult("target/classes/file1.properties", "value=${project.artifactId}");
assertResult("target/classes/file2.properties", "value=project");
}
public void testEscapingWindowsChars() throws Exception {
createProjectSubFile("resources/file.txt", "value=${foo}\n" +
"value2=@foo@\n" +
"value3=${bar}");
importProject("test" +
"project" +
"1" +
"" +
" c:\\projects\\foo/bar" +
" a\\b\\c" +
"" +
"" +
" " +
" " +
" resources" +
" true" +
" " +
" " +
"");
compileModules("project");
assertResult("target/classes/file.txt", "value=c:\\\\projects\\\\foo/bar\n" +
"value2=c:\\\\projects\\\\foo/bar\n" +
"value3=a\\b\\c");
}
public void testDontEscapingWindowsChars() throws Exception {
createProjectSubFile("resources/file.txt", "value=${foo}");
importProject("test" +
"project" +
"1" +
"" +
" c:\\projects\\foo/bar" +
"" +
"" +
" " +
" " +
" resources" +
" true" +
" " +
" " +
"" +
" " +
" " +
" maven-resources-plugin" +
" " +
" false" +
" " +
" " +
" " +
"");
compileModules("project");
assertResult("target/classes/file.txt", "value=c:\\projects\\foo/bar");
}
public void testFilteringPropertiesWithEmptyValues() throws Exception {
createProjectSubFile("resources/file.properties", "value1=${foo}\nvalue2=${bar}");
importProject("test" +
"project" +
"1" +
"" +
" " +
"" +
"" +
" " +
" " +
" resources" +
" true" +
" " +
" " +
"");
compileModules("project");
assertResult("target/classes/file.properties", "value1=\nvalue2=${bar}");
}
public void testFilterWithSeveralResourceFolders() throws Exception {
createProjectSubFile("resources1/file1.properties", "value=${project.version}");
createProjectSubFile("resources2/file2.properties", "value=${project.version}");
importProject("test" +
"project" +
"1" +
"" +
" " +
" " +
" resources1" +
" true" +
" " +
" " +
" resources2" +
" true" +
" " +
" " +
"");
compileModules("project");
assertResult("target/classes/file1.properties", "value=1");
assertResult("target/classes/file2.properties", "value=1");
}
public void testFilterWithSeveralModules() throws Exception {
createProjectSubFile("module1/resources/file1.properties", "value=${project.version}");
createProjectSubFile("module2/resources/file2.properties", "value=${project.version}");
VirtualFile m1 = createModulePom("module1",
"test" +
"module1" +
"1" +
"" +
" " +
" " +
" resources" +
" true" +
" " +
" " +
"");
VirtualFile m2 = createModulePom("module2",
"test" +
"module2" +
"2" +
"" +
" " +
" " +
" resources" +
" true" +
" " +
" " +
"");
importProjects(m1, m2);
compileModules("module1", "module2");
assertResult(m1, "target/classes/file1.properties", "value=1");
assertResult(m2, "target/classes/file2.properties", "value=2");
}
public void testDoNotFilterIfNotRequested() throws Exception {
createProjectSubFile("resources1/file1.properties", "value=${project.version}");
createProjectSubFile("resources2/file2.properties", "value=${project.version}");
importProject("test" +
"project" +
"1" +
"" +
" " +
" " +
" resources1" +
" true" +
" " +
" " +
" resources2" +
" false" +
" " +
" " +
"");
compileModules("project");
assertResult("target/classes/file1.properties", "value=1");
assertResult("target/classes/file2.properties", "value=${project.version}");
}
public void testDoNotChangeFileIfPropertyIsNotResolved() throws Exception {
createProjectSubFile("resources/file.properties", "value=${foo.bar}");
importProject("test" +
"project" +
"1" +
"" +
" " +
" " +
" resources" +
" true" +
" " +
" " +
"");
compileModules("project");
assertResult("target/classes/file.properties", "value=${foo.bar}");
}
public void testChangingResolvedPropsBackWhenSettingsIsChange() throws Exception {
createProjectSubFile("resources/file.properties", "value=${project.version}");
importProject("test" +
"project" +
"1" +
"" +
" " +
" " +
" resources" +
" true" +
" " +
" " +
"");
compileModules("project");
assertResult("target/classes/file.properties", "value=1");
createProjectPom("test" +
"project" +
"1" +
"" +
" " +
" " +
" resources" +
" false" +
" " +
" " +
"");
importProject();
compileModules("project");
assertResult("target/classes/file.properties", "value=${project.version}");
}
public void testUpdatingWhenPropertiesInFiltersAreChanged() throws Exception {
VirtualFile filter = createProjectSubFile("filters/filter.properties", "xxx=1");
createProjectSubFile("resources/file.properties", "value=${xxx}");
importProject("test" +
"project" +
"1" +
"" +
" " +
" filters/filter.properties" +
" " +
" " +
" " +
" resources" +
" true" +
" " +
" " +
"");
compileModules("project");
assertResult("target/classes/file.properties", "value=1");
VfsUtil.saveText(filter, "xxx=2");
compileModules("project");
assertResult("target/classes/file.properties", "value=2");
}
public void testUpdatingWhenPropertiesAreChanged() throws Exception {
createProjectSubFile("resources/file.properties", "value=${foo}");
importProject("test" +
"project" +
"1" +
"" +
" val1" +
"" +
"" +
" " +
" " +
" resources" +
" true" +
" " +
" " +
"");
compileModules("project");
assertResult("target/classes/file.properties", "value=val1");
importProject("test" +
"project" +
"1" +
"" +
" val2" +
"" +
"" +
" " +
" " +
" resources" +
" true" +
" " +
" " +
"");
compileModules("project");
assertResult("target/classes/file.properties", "value=val2");
}
public void testUpdatingWhenPropertiesInModelAreChanged() throws Exception {
createProjectSubFile("resources/file.properties", "value=${project.name}");
importProject("test" +
"project" +
"1" +
"val1" +
"" +
" " +
" " +
" resources" +
" true" +
" " +
" " +
"");
compileModules("project");
assertResult("target/classes/file.properties", "value=val1");
importProject("test" +
"project" +
"1" +
"val2" +
"" +
" " +
" " +
" resources" +
" true" +
" " +
" " +
"");
compileModules("project");
assertResult("target/classes/file.properties", "value=val2");
}
public void testUpdatingWhenProfilesAreChanged() throws Exception {
createProjectSubFile("resources/file.properties", "value=${foo}");
createProjectPom("test" +
"project" +
"1" +
"" +
" " +
" one" +
" " +
" val1" +
" " +
" " +
" " +
" two" +
" " +
" val2" +
" " +
" " +
"" +
"" +
" " +
" " +
" resources" +
" true" +
" " +
" " +
"");
importProjectWithProfiles("one");
compileModules("project");
assertResult("target/classes/file.properties", "value=val1");
myProjectsManager.setExplicitProfiles(new MavenExplicitProfiles(Arrays.asList("two")));
scheduleResolveAll();
resolveDependenciesAndImport();
compileModules("project");
assertResult("target/classes/file.properties", "value=val2");
}
public void testSameFileInSourcesAndTestSources() throws Exception {
createProjectSubFile("src/main/resources/file.properties", "foo=${foo.main}");
createProjectSubFile("src/test/resources/file.properties", "foo=${foo.test}");
importProject("test" +
"project" +
"1" +
"" +
" main" +
" test" +
"" +
"" +
" " +
" " +
" src/main/resources" +
" true" +
" " +
" " +
" " +
" " +
" src/test/resources" +
" true" +
" " +
" " +
"");
compileModules("project");
assertResult("target/classes/file.properties", "foo=main");
assertResult("target/test-classes/file.properties", "foo=test");
}
public void testCustomFilters() throws Exception {
createProjectSubFile("filters/filter1.properties",
"xxx=value\n" +
"yyy=${project.version}\n");
createProjectSubFile("filters/filter2.properties", "zzz=value2");
createProjectSubFile("resources/file.properties",
"value1=${xxx}\n" +
"value2=${yyy}\n" +
"value3=${zzz}\n");
importProject("test" +
"project" +
"1" +
"" +
" " +
" filters/filter1.properties" +
" filters/filter2.properties" +
" " +
" " +
" " +
" resources" +
" true" +
" " +
" " +
"");
compileModules("project");
assertResult("target/classes/file.properties", "value1=value\n" +
"value2=1\n" +
"value3=value2\n");
}
public void testCustomFiltersViaPlugin() throws Exception {
createProjectSubFile("filters/filter.properties", "xxx=value");
createProjectSubFile("resources/file.properties", "value1=${xxx}");
importProject("test" +
"project" +
"1" +
"" +
" \n" +
" \n" +
" org.codehaus.mojo\n" +
" properties-maven-plugin\n" +
" \n" +
" \n" +
" common-properties\n" +
" initialize\n" +
" \n" +
" read-project-properties\n" +
" \n" +
" \n" +
" \n" +
" filters/filter.properties\n" +
" \n" +
" \n" +
" \n" +
" \n" +
" " +
" \n" +
" " +
" " +
" resources" +
" true" +
" " +
" " +
"");
compileModules("project");
assertResult("target/classes/file.properties", "value1=value");
}
public void testCustomFilterWithPropertyInThePath() throws Exception {
createProjectSubFile("filters/filter.properties", "xxx=value");
createProjectSubFile("resources/file.properties", "value=${xxx}");
importProject("test" +
"project" +
"1" +
"" +
" " + getProjectPath() + "/filters" +
"" +
"" +
" " +
" ${some.path}/filter.properties" +
" " +
" " +
" " +
" resources" +
" true" +
" " +
" " +
"");
compileModules("project");
assertResult("target/classes/file.properties", "value=value");
}
public void testCustomFiltersFromProfiles() throws Exception {
createProjectSubFile("filters/filter1.properties", "xxx=value1");
createProjectSubFile("filters/filter2.properties", "yyy=value2");
createProjectSubFile("resources/file.properties",
"value1=${xxx}\n" +
"value2=${yyy}\n");
createProjectPom("test" +
"project" +
"1" +
"" +
" " +
" one" +
" " +
" " +
" filters/filter1.properties" +
" " +
" " +
" " +
" " +
" two" +
" " +
" " +
" filters/filter2.properties" +
" " +
" " +
" " +
"" +
"" +
" " +
" " +
" resources" +
" true" +
" " +
" " +
"");
importProjectWithProfiles("one");
compileModules("project");
assertResult("target/classes/file.properties", "value1=value1\n" +
"value2=${yyy}\n");
importProjectWithProfiles("two");
compileModules("project");
assertResult("target/classes/file.properties", "value1=${xxx}\n" +
"value2=value2\n");
}
public void testPluginDirectoriesFiltering() throws Exception {
if (ignore()) return;
createProjectSubFile("filters/filter.properties", "xxx=value");
createProjectSubFile("webdir1/file1.properties", "value=${xxx}");
createProjectSubFile("webdir2/file2.properties", "value=${xxx}");
importProject("test" +
"project" +
"1" +
"war" +
"" +
" " +
" filters/filter.properties" +
" " +
" " +
" " +
" maven-war-plugin\n" +
" " +
" " +
" " +
" webdir1" +
" true" +
" " +
" " +
" webdir2" +
" false" +
" " +
" " +
" " +
" " +
" " +
"");
compileModules("project");
assertResult("target/classes/file1.properties", "value=value");
assertResult("target/classes/file2.properties", "value=${xxx}");
}
public void testEscapingFiltering() throws Exception {
if (!true) return;
createProjectSubFile("filters/filter.properties", "xxx=value");
createProjectSubFile("resources/file.properties",
"value1=\\${xxx}\n" +
"value2=\\\\${xxx}\n" +
"value3=\\\\\\${xxx}\n" +
"value3=\\\\\\\\${xxx}\n" +
"value4=.\\.\\\\.\\\\\\.");
importProject("test" +
"project" +
"1" +
"" +
" " +
" filters/filter.properties" +
" " +
" " +
" " +
" resources" +
" true" +
" " +
" " +
" " +
" " +
" org.apache.maven.plugins" +
" maven-resources-plugin" +
" " +
" \\" +
" " +
" " +
" " +
"");
compileModules("project");
assertResult("target/classes/file.properties",
"value1=${xxx}\n" +
"value2=\\\\value\n" +
"value3=\\\\${xxx}\n" +
"value3=\\\\\\\\value\n" +
"value4=.\\.\\\\.\\\\\\.");
}
public void testPropertyPriority() throws Exception {
createProjectSubFile("filters/filter.properties", "xxx=fromFilterFile\n" +
"yyy=fromFilterFile");
createProjectSubFile("resources/file.properties","value1=${xxx}\n" +
"value2=${yyy}");
importProject("test" +
"project" +
"1" +
"" +
" fromProperties" +
"" +
"" +
" " +
" filters/filter.properties" +
" " +
" " +
" " +
" resources" +
" true" +
" " +
" " +
"");
compileModules("project");
assertResult("target/classes/file.properties",
"value1=fromProperties\n" +
"value2=fromFilterFile");
}
public void testCustomEscapingFiltering() throws Exception {
createProjectSubFile("filters/filter.properties", "xxx=value");
createProjectSubFile("resources/file.properties",
"value1=^${xxx}\n" +
"value2=\\${xxx}\n");
importProject("test" +
"project" +
"1" +
"" +
" " +
" filters/filter.properties" +
" " +
" " +
" " +
" resources" +
" true" +
" " +
" " +
" " +
" " +
" org.apache.maven.plugins" +
" maven-resources-plugin" +
" " +
" ^" +
" " +
" " +
" " +
"");
compileModules("project");
assertResult("target/classes/file.properties",
"value1=${xxx}\n" +
"value2=\\value\n");
}
public void testDoNotFilterButCopyBigFiles() throws Exception {
assertEquals(FileTypeManager.getInstance().getFileTypeByFileName("file.xyz"), FileTypes.UNKNOWN);
createProjectSubFile("resources/file.xyz").setBinaryContent(new byte[1024 * 1024 * 20]);
importProject("test" +
"project" +
"1" +
"" +
" " +
" " +
" resources" +
" true" +
" " +
" " +
"");
compileModules("project");
assertNotNull(myProjectPom.getParent().findFileByRelativePath("target/classes/file.xyz"));
}
public void testResourcesOrdering1() throws Exception {
createProjectSubFile("resources/file.properties", "value=${project.version}\n");
importProject("test" +
"project" +
"1" +
"" +
"" +
" " +
" " +
" resources" +
" false" +
" " +
" " +
" resources" +
" true" +
" " +
" " +
"");
compileModules("project");
assertResult("target/classes/file.properties", "value=1\n"); // Filtered file override non-filtered file
}
public void testResourcesOrdering2() throws Exception {
if (!true) return;
createProjectSubFile("resources/file.properties", "value=${project.version}\n");
importProject("test" +
"project" +
"1" +
"" +
"" +
" " +
" " +
" resources" +
" true" +
" " +
" " +
" resources" +
" false" +
" " +
" " +
"");
compileModules("project");
assertResult("target/classes/file.properties", "value=1\n"); // Filtered file override non-filtered file
}
public void testResourcesOrdering3() throws Exception {
if (!true) return;
createProjectSubFile("resources1/a.txt", "1");
createProjectSubFile("resources2/a.txt", "2");
importProject("test" +
"project" +
"1" +
"" +
"" +
" " +
" " +
" resources1" +
" " +
" " +
" resources2" +
" " +
" " +
"");
compileModules("project");
assertResult("target/classes/a.txt", "1"); // First file was copied, second file was not override first file
}
public void testResourcesOrdering4() throws Exception {
createProjectSubFile("resources1/a.txt", "1");
createProjectSubFile("resources2/a.txt", "2");
importProject("test" +
"project" +
"1" +
"" +
"" +
" " +
" " +
" resources1" +
" true" +
" " +
" " +
" resources2" +
" true" +
" " +
" " +
"");
compileModules("project");
assertResult("target/classes/a.txt", "2"); // For the filtered files last file override other files.
}
public void testOverwriteParameter1() throws Exception {
if (!true) return;
createProjectSubFile("resources1/a.txt", "1");
createProjectSubFile("resources2/a.txt", "2");
importProject("test" +
"project" +
"1" +
"" +
"" +
" " +
" " +
" resources1" +
" " +
" " +
" resources2" +
" " +
" " +
"" +
" " +
" " +
" maven-resources-plugin" +
" " +
" true" +
" " +
" " +
" " +
"");
compileModules("project");
assertResult("target/classes/a.txt", "2");
}
public void testOverwriteParameter2() throws Exception {
if (!true) return;
createProjectSubFile("resources1/a.txt", "1");
createProjectSubFile("resources2/a.txt", "2");
importProject("test" +
"project" +
"1" +
"" +
"" +
" " +
" " +
" resources1" +
" true" +
" " +
" " +
" resources2" +
" " +
" " +
"" +
" " +
" " +
" maven-resources-plugin" +
" " +
" true" +
" " +
" " +
" " +
"");
compileModules("project");
assertResult("target/classes/a.txt", "2");
}
}