HADOOP-18003. Add a method appendIfAbsent for CallerContext (#3644)
This commit is contained in:
parent
60acf8434d
commit
573b358fce
|
@ -228,6 +228,26 @@ public final class CallerContext {
|
|||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Append new field which contains key and value to the context
|
||||
* if the key("key:") is absent.
|
||||
* @param key the key of field.
|
||||
* @param value the value of field.
|
||||
* @return the builder.
|
||||
*/
|
||||
public Builder appendIfAbsent(String key, String value) {
|
||||
if (sb.toString().contains(key + KEY_VALUE_SEPARATOR)) {
|
||||
return this;
|
||||
}
|
||||
if (isValid(key) && isValid(value)) {
|
||||
if (sb.length() > 0) {
|
||||
sb.append(fieldSeparator);
|
||||
}
|
||||
sb.append(key).append(KEY_VALUE_SEPARATOR).append(value);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
public CallerContext build() {
|
||||
return new CallerContext(this);
|
||||
}
|
||||
|
|
|
@ -42,6 +42,37 @@ public class TestCallerContext {
|
|||
builder.build().getContext());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testBuilderAppendIfAbsent() {
|
||||
Configuration conf = new Configuration();
|
||||
conf.set(HADOOP_CALLER_CONTEXT_SEPARATOR_KEY, "$");
|
||||
CallerContext.Builder builder = new CallerContext.Builder(null, conf);
|
||||
builder.append("key1", "value1");
|
||||
Assert.assertEquals("key1:value1",
|
||||
builder.build().getContext());
|
||||
|
||||
// Append an existed key with different value.
|
||||
builder.appendIfAbsent("key1", "value2");
|
||||
String[] items = builder.build().getContext().split("\\$");
|
||||
Assert.assertEquals(1, items.length);
|
||||
Assert.assertEquals("key1:value1",
|
||||
builder.build().getContext());
|
||||
|
||||
// Append an absent key.
|
||||
builder.appendIfAbsent("key2", "value2");
|
||||
String[] items2 = builder.build().getContext().split("\\$");
|
||||
Assert.assertEquals(2, items2.length);
|
||||
Assert.assertEquals("key1:value1$key2:value2",
|
||||
builder.build().getContext());
|
||||
|
||||
// Append a key that is a substring of an existing key.
|
||||
builder.appendIfAbsent("key", "value");
|
||||
String[] items3 = builder.build().getContext().split("\\$");
|
||||
Assert.assertEquals(3, items3.length);
|
||||
Assert.assertEquals("key1:value1$key2:value2$key:value",
|
||||
builder.build().getContext());
|
||||
}
|
||||
|
||||
@Test(expected = IllegalArgumentException.class)
|
||||
public void testNewBuilder() {
|
||||
Configuration conf = new Configuration();
|
||||
|
|
Loading…
Reference in New Issue