Skip to content

Commit

Permalink
创建 DeepFieldFilter 使 FieldFilter 的处理更加灵活 (#23)
Browse files Browse the repository at this point in the history
  • Loading branch information
scx567888 committed Aug 26, 2024
1 parent 3d2cfb6 commit 4f655b1
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 8 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package cool.scx.common.jackson;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.PropertyWriter;
import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter;
import cool.scx.common.field_filter.FieldFilter;
import cool.scx.common.util.StringUtils;

import java.util.Arrays;
import java.util.stream.Collectors;

import static cool.scx.common.field_filter.FilterMode.INCLUDED;

public class DeepFieldFilter extends SimpleBeanPropertyFilter {

private final FieldFilter fieldFilter;

public DeepFieldFilter(FieldFilter fieldFilter) {
this.fieldFilter = fieldFilter;
}

public static boolean match(String[] e1, String[] e2) {
if (e1.length != e2.length) {
return false;
}
for (int i = 0; i < e1.length; i++) {
var b = match(e1[i], e2[i]);
if (!b) {
return false;
}
}
return true;
}

public static boolean match(String e1, String e2) {
return e1.equals(e2) || e1.equals("*");
}

private String[] getFullPath(PropertyWriter writer, JsonGenerator jsonGenerator) {
var name = writer.getName();
var context = jsonGenerator.getOutputContext();
var jsonPointer = context.getParent().pathAsPointer(false);
var string = jsonPointer.toString();
var split = Arrays.stream(string.split("/")).filter(StringUtils::notBlank).collect(Collectors.toList());
split.add(name);
return split.toArray(String[]::new);
}

public boolean matchAny(String[] fullPath) {
for (var fieldName : fieldFilter.getFieldNames()) {
if (match(fieldName.split("\\."), fullPath)) {
return true;
}
}
return false;
}

@Override
public void serializeAsField(Object pojo, JsonGenerator jgen, SerializerProvider provider, PropertyWriter writer) throws Exception {
var fullPath = getFullPath(writer, jgen);
var matched = matchAny(fullPath);
boolean f = (fieldFilter.getFilterMode() == INCLUDED) == matched;
if (f) {
writer.serializeAsField(pojo, jgen, provider);
} else {
writer.serializeAsOmittedField(pojo, jgen, provider);
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,6 @@
import cool.scx.common.field_filter.FieldFilter;
import cool.scx.common.util.ScxDateTimeFormatter;

import static com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter.filterOutAllExcept;
import static com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter.serializeAllExcept;
import static cool.scx.common.jackson.IgnoreJsonIgnore.IGNORE_JSON_IGNORE;
import static cool.scx.common.jackson.NullKeySerializer.NULL_KEY_SERIALIZER;
import static cool.scx.common.jackson.PropertyFilterMixIn.PROPERTY_FILTER_MIX_IN;
Expand Down Expand Up @@ -77,12 +75,7 @@ public static <M extends ObjectMapper, B extends MapperBuilder<M, B>> M createOb

public static FilterProvider getFilterProvider(FieldFilter fieldFilter) {
var filterProvider = new SimpleFilterProvider();
switch (fieldFilter.getFilterMode()) {
case EXCLUDED ->
filterProvider.addFilter(PROPERTY_FILTER_MIX_IN, serializeAllExcept(fieldFilter.getFieldNames()));
case INCLUDED ->
filterProvider.addFilter(PROPERTY_FILTER_MIX_IN, filterOutAllExcept(fieldFilter.getFieldNames()));
}
filterProvider.addFilter(PROPERTY_FILTER_MIX_IN, new DeepFieldFilter(fieldFilter));
return filterProvider;
}

Expand Down

0 comments on commit 4f655b1

Please sign in to comment.