Skip to content

Commit

Permalink
0005553: Allowed spaces in values within value map column transform e…
Browse files Browse the repository at this point in the history
…xpression
  • Loading branch information
evan-miller-jumpmind committed Oct 27, 2022
1 parent df14dcc commit 2dba1d9
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 14 deletions.
Expand Up @@ -21,8 +21,9 @@
package org.jumpmind.symmetric.io.data.transform;

import java.util.Map;
import java.util.StringTokenizer;

import org.apache.commons.text.StringTokenizer;
import org.apache.commons.text.matcher.StringMatcherFactory;
import org.jumpmind.db.platform.IDatabasePlatform;
import org.jumpmind.extension.IBuiltInExtensionPoint;
import org.jumpmind.symmetric.io.data.DataContext;
Expand Down Expand Up @@ -50,20 +51,19 @@ private static String getValue(String value, String expression) {
return null;
}
StringTokenizer tokens = new StringTokenizer(expression);
tokens.setQuoteChar('"');
tokens.setDelimiterMatcher(StringMatcherFactory.INSTANCE.charSetMatcher(' ', '='));
String defaultValue = null;
while (tokens.hasMoreElements()) {
String keyValue = (String) tokens.nextElement();
int equalIndex = keyValue.indexOf("=");
if (equalIndex != -1) {
if (keyValue.substring(0, equalIndex).equals(value)) {
return keyValue.substring(equalIndex + 1);
} else if (keyValue.substring(0, equalIndex).equals("*")) {
String targetValue = keyValue.substring(equalIndex + 1);
if (targetValue.equals("*")) {
defaultValue = value;
} else {
defaultValue = targetValue;
}
String[] tokenArray = tokens.getTokenArray();
for (int i = 0; i < tokenArray.length - 1; i += 2) {
if (tokenArray[i].equals(value)) {
return tokenArray[i + 1];
} else if (tokenArray[i].equals("*")) {
String targetValue = tokenArray[i + 1];
if (targetValue.equals("*")) {
defaultValue = value;
} else {
defaultValue = targetValue;
}
}
}
Expand Down
@@ -0,0 +1,44 @@
package org.jumpmind.symmetric.io.data.transform;

import org.junit.Assert;
import org.junit.jupiter.api.Test;

public class ValueMapColumnTransformTest {
@Test
public void test() {
ValueMapColumnTransform transform = new ValueMapColumnTransform();
TransformColumn column = new TransformColumn();
column.setTransformExpression("unquoted_key_0=unquoted_value_0 "
+ "\"quoted key 1\"=unquoted_value_1 "
+ "unquoted_key_2=\"quoted value 2\" "
+ "\"quoted key 3\"=\"quoted value 3\" "
+ "\"\"\"key in escaped quotes 4\"\"\"=\"\"\"value in escaped quotes 4\"\"\" "
+ "\"equals=key 5\"=\"equals=value 5\" "
+ "*=\"default value 6\"");
TransformedData data = new TransformedData(null, null, null, null, null);
NewAndOldValue result = null;
try {
result = transform.transform(null, null, column, data, null, "unquoted_key_0", null);
Assert.assertEquals("Failed to transform unquoted key into unquoted value", "unquoted_value_0", result.getNewValue());
result = transform.transform(null, null, column, data, null, "quoted key 1", null);
Assert.assertEquals("Failed to transform quoted key into unquoted value", "unquoted_value_1", result.getNewValue());
result = transform.transform(null, null, column, data, null, "unquoted_key_2", null);
Assert.assertEquals("Failed to transform unquoted key into quoted value", "quoted value 2", result.getNewValue());
result = transform.transform(null, null, column, data, null, "quoted key 3", null);
Assert.assertEquals("Failed to transform quoted key into quoted value", "quoted value 3", result.getNewValue());
result = transform.transform(null, null, column, data, null, "\"key in escaped quotes 4\"", null);
Assert.assertEquals("Failed to transform key in escaped quotes into value in escaped quotes",
"\"value in escaped quotes 4\"", result.getNewValue());
result = transform.transform(null, null, column, data, null, "equals=key 5", null);
Assert.assertEquals("Failed to transform quoted key with equals sign into quoted value with equals sign",
"equals=value 5", result.getNewValue());
result = transform.transform(null, null, column, data, null, "key 6", null);
Assert.assertEquals("Failed to transform key into default value", "default value 6", result.getNewValue());
column.setTransformExpression("*=*");
result = transform.transform(null, null, column, data, null, "key 7", null);
Assert.assertEquals("Failed to return the original key", "key 7", result.getNewValue());
} catch (Exception e) {
Assert.fail(e.getMessage());
}
}
}

0 comments on commit 2dba1d9

Please sign in to comment.