Skip to content

Commit 070b36e

Browse files
yoshito-umaokayumaoka
authored andcommitted
Properly handle multiple white space characters after property key
gp-res-filter Java properties filter had a problem processing two or more white space characters after key string. When two or more white space characters appeared after key string, the first non-white space character after them are interpreted as the first character of property value, even the character is `=` or `:`. The fix handles both `key1 val1` and `key1 = val1` properly. Fixes #131.
1 parent 49d608b commit 070b36e

9 files changed

Lines changed: 34 additions & 12 deletions

File tree

gp-res-filter/.settings/org.eclipse.jdt.core.prefs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@ org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line
6666
org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
6767
org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
6868
org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
69+
org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=false
70+
org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false
6971
org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
7072
org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
7173
org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=false
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
eclipse.preferences.version=1
22
formatter_profile=_gp
3-
formatter_settings_version=13
3+
formatter_settings_version=14
44
org.eclipse.jdt.ui.javadoc=true
55
org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="false" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/* \n * Copyright IBM Corp. ${year}\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http\://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Javadoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>

gp-res-filter/src/main/java/com/ibm/g11n/pipeline/resfilter/impl/JavaPropertiesResource.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -286,22 +286,28 @@ public static PropDef parseLine(String line) {
286286
PropSeparator sep = null;
287287
int sepIdx = -1;
288288

289-
boolean sawSpace = false;
289+
boolean sawWhiteSpace = false;
290290
for (int i = 0; i < line.length(); i++) {
291291
char iChar = line.charAt(i);
292292

293-
if (sawSpace) {
293+
if (sawWhiteSpace) {
294294
if (iChar == PropSeparator.EQUAL.getCharacter()) {
295295
sep = PropSeparator.EQUAL;
296296
} else if (iChar == PropSeparator.COLON.getCharacter()) {
297297
sep = PropSeparator.COLON;
298-
} else {
298+
} else if (!isPropsWhiteSpaceChar(iChar)){
299+
// One or more white space characters are used as a delimiter,
300+
// and we have reached to the first character of the value string.
299301
sep = PropSeparator.SPACE;
302+
303+
assert i > 0; // sawWhiteSpace is true, so we looked at least one non white space character
304+
sepIdx = i - 1;
305+
break;
300306
}
301307
} else {
302308
if (i > 0 && line.charAt(i - 1) != '\\') {
303-
if (iChar == ' ') {
304-
sawSpace = true;
309+
if (isPropsWhiteSpaceChar(iChar)) {
310+
sawWhiteSpace = true;
305311
} else if (iChar == PropSeparator.EQUAL.getCharacter()) {
306312
sep = PropSeparator.EQUAL;
307313
} else if (iChar == PropSeparator.COLON.getCharacter()) {
@@ -325,7 +331,7 @@ public static PropDef parseLine(String line) {
325331

326332
PropDef pl = new PropDef(key, value, sep, null);
327333
return pl;
328-
}
334+
}
329335

330336
public String getKey() {
331337
return key;

gp-res-filter/src/test/java/com/ibm/g11n/pipeline/resfilter/impl/JavaPropertiesResourceTest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,9 @@ public class JavaPropertiesResourceTest {
102102
lst.add(ResourceString.with("backslashes", "a\\b\\c")
103103
.sequenceNumber(12).notes(Arrays.asList(" A comment with backslashes - a\\b\\c あい \\t\\n")).build());
104104

105+
lst.add(ResourceString.with("extraSpaces", "extra spaces before/after key/value ")
106+
.sequenceNumber(13).notes(Arrays.asList(" extra spaces")).build());
107+
105108
Collections.sort(lst, new ResourceStringComparator());
106109
EXPECTED_INPUT_RES_LIST = lst;
107110
}
@@ -134,6 +137,8 @@ public class JavaPropertiesResourceTest {
134137
Arrays.asList(" Not a Java MessageFormat param"));
135138
bundleBuilder.addResourceString("backslashes", "a\\b\\c", 12,
136139
Arrays.asList(" A comment with backslashes - a\\b\\c あい \\t\\n"));
140+
bundleBuilder.addResourceString("extraSpaces", "extra spaces before/after key/value ", 13,
141+
Arrays.asList(" extra spaces"));
137142
bundleBuilder.addNotes(Arrays.asList(
138143
" You are reading the \".properties\" entry.",
139144
" The exclamation mark can also mark text as comments.",
@@ -160,6 +165,7 @@ public class JavaPropertiesResourceTest {
160165
EXPECTED_PROP_DEF_LIST.add(new PropDef("withQuote", "You''re about to delete '{1}' rows in Mike''s file {0}.", PropSeparator.EQUAL));
161166
EXPECTED_PROP_DEF_LIST.add(new PropDef("non-param", "This {} is not a parameter.", PropSeparator.EQUAL));
162167
EXPECTED_PROP_DEF_LIST.add(new PropDef("backslashes", "a\\b\\c", PropSeparator.EQUAL));
168+
EXPECTED_PROP_DEF_LIST.add(new PropDef("extraSpaces", "extra spaces before/after key/value ", PropSeparator.EQUAL));
163169
}
164170

165171
private static final JavaPropertiesResource res = new JavaPropertiesResource();

gp-res-filter/src/test/resource/resfilter/properties/input.properties

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,6 @@ withQuote = You''re about to delete '{0}' rows in Mike''s file {0}.
2626
# Not a Java MessageFormat param
2727
non-param = This {} is not a parameter.
2828
# A comment with backslashes - a\b\c \u3042\u3044 \t\n
29-
backslashes = a\\b\\c
29+
backslashes = a\\b\\c
30+
# extra spaces
31+
extraSpaces = extra spaces before/after key/value

gp-res-filter/src/test/resource/resfilter/properties/merge-output.properties

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,6 @@ withQuote = You''re about to delete '{1}' rows in Mike''s file {0}.
2626
# Not a Java MessageFormat param
2727
non-param = This {} is not a parameter.
2828
# A comment with backslashes - a\b\c \u3042\u3044 \t\n
29-
backslashes = a\\b\\c
29+
backslashes = a\\b\\c
30+
# extra spaces
31+
extraSpaces = extra spaces before/after key/value

gp-res-filter/src/test/resource/resfilter/properties/parse-test-input.properties

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@ trailSPs = trailing SPs
99
withTabs = Tab1\tTab2\tTab3\t
1010
withQuote = You''re about to delete '{1}' rows in Mike''s file {0}.
1111
non-param = This {} is not a parameter.
12-
backslashes = a\\b\\c
12+
backslashes = a\\b\\c
13+
extraSpaces = extra spaces before/after key/value

gp-res-filter/src/test/resource/resfilter/properties/parseline-test-input.properties

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@ trailSPs = trailing SPs
99
withTabs = Tab1\tTab2\tTab3\t
1010
withQuote = You''re about to delete '{1}' rows in Mike''s file {0}.
1111
non-param = This {} is not a parameter.
12-
backslashes = a\\b\\c
12+
backslashes = a\\b\\c
13+
extraSpaces = extra spaces before/after key/value

gp-res-filter/src/test/resource/resfilter/properties/write-output.properties

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,6 @@ withQuote = You''re about to delete '{1}' rows in Mike''s file {0}.
2727
# Not a Java MessageFormat param
2828
non-param = This {} is not a parameter.
2929
# A comment with backslashes - a\b\c \u3042\u3044 \t\n
30-
backslashes = a\\b\\c
30+
backslashes = a\\b\\c
31+
# extra spaces
32+
extraSpaces = extra spaces before/after key/value

0 commit comments

Comments
 (0)