Skip to content

Commit

Permalink
Add feature in JsonBodyFilters to replace value by custom function.
Browse files Browse the repository at this point in the history
  • Loading branch information
dnandola-wyze committed Oct 12, 2020
1 parent 279bed1 commit e582f8b
Show file tree
Hide file tree
Showing 5 changed files with 77 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,14 @@
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import java.util.function.BiFunction;
import java.util.function.Predicate;

import static org.apiguardian.api.API.Status.EXPERIMENTAL;
import static org.apiguardian.api.API.Status.MAINTAINED;
import static org.zalando.logbook.json.PrimitiveJsonPropertyBodyFilter.replaceNumber;
import static org.zalando.logbook.json.PrimitiveJsonPropertyBodyFilter.replacePrimitive;
import static org.zalando.logbook.json.PrimitiveJsonPropertyBodyFilter.replacePrimitiveFunction;
import static org.zalando.logbook.json.PrimitiveJsonPropertyBodyFilter.replaceString;

public final class JsonBodyFilters {
Expand Down Expand Up @@ -78,4 +80,10 @@ public static BodyFilter replacePrimitiveJsonProperty(
return replacePrimitive(predicate, replacement);
}

@API(status = API.Status.EXPERIMENTAL)
public static BodyFilter replacePrimitiveJsonProperty(
final Predicate<String> predicate,
final BiFunction<String, String, String> replacement) {
return replacePrimitiveFunction(predicate, replacement);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
import org.zalando.logbook.BodyFilter;

import javax.annotation.Nullable;
import java.util.function.BiFunction;
import java.util.function.BinaryOperator;
import java.util.function.Predicate;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
Expand Down Expand Up @@ -63,25 +65,31 @@ final class PrimitiveJsonPropertyBodyFilter implements BodyFilter {
@With(PRIVATE)
private final Predicate<String> predicate;

private final String replacement;
private final BinaryOperator<String> replacement;

private static Pattern pattern(final String value) {
return compile("(?<key>\"(?<property>" + STRING_VALUE_PATTERN + ")\"\\s*:\\s*)(" + value + "|null)");
return compile("(?<key>\"(?<property>" + STRING_VALUE_PATTERN + ")\"\\s*:\\s*)(?<propertyValue>" + value + "|null)");
}

static BodyFilter replaceString(
final Predicate<String> predicate, final String replacement) {
return create(STRING, predicate, quote(replacement));
return create(STRING, predicate, new StaticParameterReplacementOperator<>(replacement, true));
}

static BodyFilter replaceNumber(
final Predicate<String> predicate, final Number replacement) {
return create(NUMBER, predicate, String.valueOf(replacement));
return create(NUMBER, predicate, new StaticParameterReplacementOperator<>(replacement, false));
}

static BodyFilter replacePrimitive(
final Predicate<String> predicate, final String replacement) {
return create(PRIMITIVE, predicate, quote(replacement));
return create(PRIMITIVE, predicate, new StaticParameterReplacementOperator<>(replacement, true));
}

static BodyFilter replacePrimitiveFunction(
final Predicate<String> predicate,
final BiFunction<String, String, String> replacement) {
return create(PRIMITIVE, predicate, new StringFunctionReplacementOperator(replacement));
}

public static String quote(final String s) {
Expand All @@ -98,7 +106,8 @@ public String filter(@Nullable final String contentType, final String body) {
if (predicate.test(matcher.group("property"))) {
// this preserves whitespaces around properties
matcher.appendReplacement(result, "${key}");
result.append(replacement);
result.append(this.replacement.apply(matcher.group("property"),
matcher.group("propertyValue")));
} else {
matcher.appendReplacement(result, "$0");
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package org.zalando.logbook.json;

import lombok.AllArgsConstructor;
import lombok.EqualsAndHashCode;

import java.util.function.BinaryOperator;

import static org.zalando.logbook.json.PrimitiveJsonPropertyBodyFilter.quote;

@AllArgsConstructor
@EqualsAndHashCode
public class StaticParameterReplacementOperator<T> implements BinaryOperator<String> {
private final T replacement;

private final boolean addQuotation;

@Override
public String apply(String s, String s2) {
return addQuotation ? quote(replacement.toString()) : replacement.toString();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package org.zalando.logbook.json;

import lombok.AllArgsConstructor;
import lombok.EqualsAndHashCode;

import java.util.function.BiFunction;
import java.util.function.BinaryOperator;

import static org.zalando.logbook.json.PrimitiveJsonPropertyBodyFilter.quote;

@AllArgsConstructor
@EqualsAndHashCode
public class StringFunctionReplacementOperator implements BinaryOperator<String> {
private BiFunction<String, String, String> stringReplacementFunction;

@Override
public String apply(String s, String s2) {
return quote(stringReplacementFunction.apply(s, s2));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -227,4 +227,17 @@ void supportsVeryLargeEmbeddedJsonValues() throws IOException {
assertThat(actual, is(original));
}

@Test
void shouldFilterPrimitivesWithFunction() {
final BodyFilter unit = replacePrimitiveJsonProperty(
asList("foo", "bar", "baz")::contains, (s, s2) -> s + "XXX" + s2);

final String actual = unit.filter(
contentType,
"{\"foo\":1.0,\"bar\":false,\"baz\":\"secret\"}");

assertThat(actual,
is("{\"foo\":\"fooXXX1.0\",\"bar\":\"barXXXfalse\",\"baz\":\"bazXXX\"secret\"\"}"));
}

}

0 comments on commit e582f8b

Please sign in to comment.