/* * 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"); } }