From 2e395ddc1ab3a178231e97d674656b6aa3430be9 Mon Sep 17 00:00:00 2001 From: Sergey Evdokimov Date: Fri, 17 Jan 2014 19:15:56 +0400 Subject: [PATCH] Bug fix: IDEA incorrect handle escaping. --- .../maven/compiler/MavenResourcesBuilder.java | 40 ++++++++++++------- .../maven/compiler/ResourceFilteringTest.java | 12 +++++- 2 files changed, 35 insertions(+), 17 deletions(-) diff --git a/plugins/maven/jps-plugin/src/org/jetbrains/jps/maven/compiler/MavenResourcesBuilder.java b/plugins/maven/jps-plugin/src/org/jetbrains/jps/maven/compiler/MavenResourcesBuilder.java index 8f9a7b85b9cc..13bf78686482 100644 --- a/plugins/maven/jps-plugin/src/org/jetbrains/jps/maven/compiler/MavenResourcesBuilder.java +++ b/plugins/maven/jps-plugin/src/org/jetbrains/jps/maven/compiler/MavenResourcesBuilder.java @@ -1,6 +1,7 @@ package org.jetbrains.jps.maven.compiler; import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.util.text.StringUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.builders.BuildOutputConsumer; @@ -116,7 +117,13 @@ public class MavenResourcesBuilder extends TargetBuilder resolvedProperties = resolvedPropertiesParam; final Matcher matcher = delimitersPattern.matcher(text); + + boolean hasEscapeString = !StringUtil.isEmpty(moduleConfig.escapeString); + final int groupCount = matcher.groupCount(); - final String escapeString = moduleConfig.escapeString; + int firstPropertyGroupIndex = hasEscapeString ? 3 : 0; + int last = 0; while (matcher.find()) { - if (escapeString != null) { - int escapeStringStartIndex = matcher.start() - escapeString.length(); - if (escapeStringStartIndex >= last) { - if (text.startsWith(escapeString, escapeStringStartIndex)) { - out.append(text, last, escapeStringStartIndex); - out.append(matcher.group()); - last = matcher.end(); - continue; - } - } - } - out.append(text, last, matcher.start()); last = matcher.end(); + if (hasEscapeString) { + if (matcher.group(1) != null) { + out.append(moduleConfig.escapeString).append(moduleConfig.escapeString); // double escape string + continue; + } + else if (matcher.group(2) != null) { + out.append(matcher.group(3)); // escaped value + continue; + } + } + String propertyName = null; - for (int i = 0; i < groupCount; i++) { + for (int i = firstPropertyGroupIndex; i < groupCount; i++) { propertyName = matcher.group(i + 1); if (propertyName != null) { break; diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/compiler/ResourceFilteringTest.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/compiler/ResourceFilteringTest.java index efd72477bf83..80e738fa6a81 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/compiler/ResourceFilteringTest.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/compiler/ResourceFilteringTest.java @@ -868,10 +868,15 @@ public abstract class ResourceFilteringTest extends MavenImportingTestCase { } public void testEscapingFiltering() throws Exception { + if (!useJps()) return; + createProjectSubFile("filters/filter.properties", "xxx=value"); createProjectSubFile("resources/file.properties", "value1=\\${xxx}\n" + - "value2=${xxx}\n"); + "value2=\\\\${xxx}\n" + + "value3=\\\\\\${xxx}\n" + + "value3=\\\\\\\\${xxx}\n" + + "value4=.\\.\\\\.\\\\\\."); importProject("test" + "project" + @@ -901,7 +906,10 @@ public abstract class ResourceFilteringTest extends MavenImportingTestCase { compileModules("project"); assertResult("target/classes/file.properties", "value1=${xxx}\n" + - "value2=value\n"); + "value2=\\\\value\n" + + "value3=\\\\${xxx}\n" + + "value3=\\\\\\\\value\n" + + "value4=.\\.\\\\.\\\\\\."); } public void testPropertyPriority() throws Exception {