package com.alibaba.fastjson.serializer;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.List;
import com.alibaba.fastjson.JSON;
public abstract class SerializeFilterable {
protected List<BeforeFilter> beforeFilters = null;
protected List<AfterFilter> afterFilters = null;
protected List<PropertyFilter> propertyFilters = null;
protected List<ValueFilter> valueFilters = null;
protected List<NameFilter> nameFilters = null;
protected List<PropertyPreFilter> propertyPreFilters = null;
protected List<LabelFilter> labelFilters = null;
protected List<ContextValueFilter> contextValueFilters = null;
protected boolean writeDirect = true;
public List<BeforeFilter> getBeforeFilters() {
if (beforeFilters == null) {
beforeFilters = new ArrayList<BeforeFilter>();
writeDirect = false;
}
return beforeFilters;
}
public List<AfterFilter> getAfterFilters() {
if (afterFilters == null) {
afterFilters = new ArrayList<AfterFilter>();
writeDirect = false;
}
return afterFilters;
}
public List<NameFilter> getNameFilters() {
if (nameFilters == null) {
nameFilters = new ArrayList<NameFilter>();
writeDirect = false;
}
return nameFilters;
}
public List<PropertyPreFilter> getPropertyPreFilters() {
if (propertyPreFilters == null) {
propertyPreFilters = new ArrayList<PropertyPreFilter>();
writeDirect = false;
}
return propertyPreFilters;
}
public List<LabelFilter> getLabelFilters() {
if (labelFilters == null) {
labelFilters = new ArrayList<LabelFilter>();
writeDirect = false;
}
return labelFilters;
}
public List<PropertyFilter> getPropertyFilters() {
if (propertyFilters == null) {
propertyFilters = new ArrayList<PropertyFilter>();
writeDirect = false;
}
return propertyFilters;
}
public List<ContextValueFilter> getContextValueFilters() {
if (contextValueFilters == null) {
contextValueFilters = new ArrayList<ContextValueFilter>();
writeDirect = false;
}
return contextValueFilters;
}
public List<ValueFilter> getValueFilters() {
if (valueFilters == null) {
valueFilters = new ArrayList<ValueFilter>();
writeDirect = false;
}
return valueFilters;
}
public void addFilter(SerializeFilter filter) {
if (filter == null) {
return;
}
if (filter instanceof PropertyPreFilter) {
this.getPropertyPreFilters().add((PropertyPreFilter) filter);
}
if (filter instanceof NameFilter) {
this.getNameFilters().add((NameFilter) filter);
}
if (filter instanceof ValueFilter) {
this.getValueFilters().add((ValueFilter) filter);
}
if (filter instanceof ContextValueFilter) {
this.getContextValueFilters().add((ContextValueFilter) filter);
}
if (filter instanceof PropertyFilter) {
this.getPropertyFilters().add((PropertyFilter) filter);
}
if (filter instanceof BeforeFilter) {
this.getBeforeFilters().add((BeforeFilter) filter);
}
if (filter instanceof AfterFilter) {
this.getAfterFilters().add((AfterFilter) filter);
}
if (filter instanceof LabelFilter) {
this.getLabelFilters().add((LabelFilter) filter);
}
}
public boolean applyName(JSONSerializer jsonBeanDeser, //
Object object, String key) {
if (jsonBeanDeser.propertyPreFilters != null) {
for (PropertyPreFilter filter : jsonBeanDeser.propertyPreFilters) {
if (!filter.apply(jsonBeanDeser, object, key)) {
return false;
}
}
}
if (this.propertyPreFilters != null) {
for (PropertyPreFilter filter : this.propertyPreFilters) {
if (!filter.apply(jsonBeanDeser, object, key)) {
return false;
}
}
}
return true;
}
public boolean apply(JSONSerializer jsonBeanDeser, //
Object object, //
String key, Object propertyValue) {
if (jsonBeanDeser.propertyFilters != null) {
for (PropertyFilter propertyFilter : jsonBeanDeser.propertyFilters) {
if (!propertyFilter.apply(object, key, propertyValue)) {
return false;
}
}
}
if (this.propertyFilters != null) {
for (PropertyFilter propertyFilter : this.propertyFilters) {
if (!propertyFilter.apply(object, key, propertyValue)) {
return false;
}
}
}
return true;
}
protected String processKey(JSONSerializer jsonBeanDeser, //
Object object, //
String key, //
Object propertyValue) {
if (jsonBeanDeser.nameFilters != null) {
for (NameFilter nameFilter : jsonBeanDeser.nameFilters) {
key = nameFilter.process(object, key, propertyValue);
}
}
if (this.nameFilters != null) {
for (NameFilter nameFilter : this.nameFilters) {
key = nameFilter.process(object, key, propertyValue);
}
}
return key;
}
protected Object processValue(JSONSerializer jsonBeanDeser, //
BeanContext beanContext,
Object object, //
String key, //
Object propertyValue) {
if (propertyValue != null) {
if ((jsonBeanDeser.out.writeNonStringValueAsString //
|| (beanContext != null && (beanContext.getFeatures() & SerializerFeature.WriteNonStringValueAsString.mask) != 0))
&& (propertyValue instanceof Number || propertyValue instanceof Boolean)) {
String format = null;
if (propertyValue instanceof Number
&& beanContext != null) {
format = beanContext.getFormat();
}
if (format != null) {
propertyValue = new DecimalFormat(format).format(propertyValue);
} else {
propertyValue = propertyValue.toString();
}
} else if (beanContext != null && beanContext.isJsonDirect()) {
String jsonStr = (String) propertyValue;
propertyValue = JSON.parse(jsonStr);
}
}
if (jsonBeanDeser.valueFilters != null) {
for (ValueFilter valueFilter : jsonBeanDeser.valueFilters) {
propertyValue = valueFilter.process(object, key, propertyValue);
}
}
List<ValueFilter> valueFilters = this.valueFilters;
if (valueFilters != null) {
for (ValueFilter valueFilter : valueFilters) {
propertyValue = valueFilter.process(object, key, propertyValue);
}
}
if (jsonBeanDeser.contextValueFilters != null) {
for (ContextValueFilter valueFilter : jsonBeanDeser.contextValueFilters) {
propertyValue = valueFilter.process(beanContext, object, key, propertyValue);
}
}
if (this.contextValueFilters != null) {
for (ContextValueFilter valueFilter : this.contextValueFilters) {
propertyValue = valueFilter.process(beanContext, object, key, propertyValue);
}
}
return propertyValue;
}
/**
* only invoke by asm byte
*
* @return
*/
protected boolean writeDirect(JSONSerializer jsonBeanDeser) {
return jsonBeanDeser.out.writeDirect //
&& this.writeDirect //
&& jsonBeanDeser.writeDirect;
}
}