提交snakeyaml增加init方法

pull/136/head
瞿佐鹏 2024-08-28 11:37:44 +08:00
parent 92afe23a42
commit c5e2713020
1 changed files with 206 additions and 0 deletions

View File

@ -0,0 +1,206 @@
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package org.yaml.snakeyaml.representer;
import org.yaml.snakeyaml.DumperOptions;
import org.yaml.snakeyaml.DumperOptions.FlowStyle;
import org.yaml.snakeyaml.TypeDescription;
import org.yaml.snakeyaml.introspector.Property;
import org.yaml.snakeyaml.introspector.PropertyUtils;
import org.yaml.snakeyaml.nodes.*;
import java.util.*;
public class Representer extends SafeRepresenter {
protected Map<Class<? extends Object>, TypeDescription> typeDefinitions = Collections.emptyMap();
public Representer() {
super(new DumperOptions());
this.representers.put(null, new RepresentJavaBean());
}
public Representer(DumperOptions options) {
super(options);
this.representers.put(null, new RepresentJavaBean());
}
public TypeDescription addTypeDescription(TypeDescription td) {
if (Collections.EMPTY_MAP == this.typeDefinitions) {
this.typeDefinitions = new HashMap();
}
if (td.getTag() != null) {
this.addClassTag(td.getType(), td.getTag());
}
td.setPropertyUtils(this.getPropertyUtils());
return (TypeDescription)this.typeDefinitions.put(td.getType(), td);
}
public void setPropertyUtils(PropertyUtils propertyUtils) {
super.setPropertyUtils(propertyUtils);
Collection<TypeDescription> tds = this.typeDefinitions.values();
Iterator var3 = tds.iterator();
while(var3.hasNext()) {
TypeDescription typeDescription = (TypeDescription)var3.next();
typeDescription.setPropertyUtils(propertyUtils);
}
}
protected MappingNode representJavaBean(Set<Property> properties, Object javaBean) {
List<NodeTuple> value = new ArrayList(properties.size());
Tag customTag = (Tag)this.classTags.get(javaBean.getClass());
Tag tag = customTag != null ? customTag : new Tag(javaBean.getClass());
MappingNode node = new MappingNode(tag, value, FlowStyle.AUTO);
this.representedObjects.put(javaBean, node);
FlowStyle bestStyle = FlowStyle.FLOW;
Iterator var8 = properties.iterator();
while(true) {
NodeTuple tuple;
do {
if (!var8.hasNext()) {
if (this.defaultFlowStyle != FlowStyle.AUTO) {
node.setFlowStyle(this.defaultFlowStyle);
} else {
node.setFlowStyle(bestStyle);
}
return node;
}
Property property = (Property)var8.next();
Object memberValue = property.get(javaBean);
Tag customPropertyTag = memberValue == null ? null : (Tag)this.classTags.get(memberValue.getClass());
tuple = this.representJavaBeanProperty(javaBean, property, memberValue, customPropertyTag);
} while(tuple == null);
if (!((ScalarNode)tuple.getKeyNode()).isPlain()) {
bestStyle = FlowStyle.BLOCK;
}
Node nodeValue = tuple.getValueNode();
if (!(nodeValue instanceof ScalarNode) || !((ScalarNode)nodeValue).isPlain()) {
bestStyle = FlowStyle.BLOCK;
}
value.add(tuple);
}
}
protected NodeTuple representJavaBeanProperty(Object javaBean, Property property, Object propertyValue, Tag customTag) {
ScalarNode nodeKey = (ScalarNode)this.representData(property.getName());
boolean hasAlias = this.representedObjects.containsKey(propertyValue);
Node nodeValue = this.representData(propertyValue);
if (propertyValue != null && !hasAlias) {
NodeId nodeId = nodeValue.getNodeId();
if (customTag == null) {
if (nodeId == NodeId.scalar) {
if (property.getType() != Enum.class && propertyValue instanceof Enum) {
nodeValue.setTag(Tag.STR);
}
} else {
if (nodeId == NodeId.mapping && property.getType() == propertyValue.getClass() && !(propertyValue instanceof Map) && !nodeValue.getTag().equals(Tag.SET)) {
nodeValue.setTag(Tag.MAP);
}
this.checkGlobalTag(property, nodeValue, propertyValue);
}
}
}
return new NodeTuple(nodeKey, nodeValue);
}
protected void checkGlobalTag(Property property, Node node, Object object) {
if (!object.getClass().isArray() || !object.getClass().getComponentType().isPrimitive()) {
Class<?>[] arguments = property.getActualTypeArguments();
if (arguments != null) {
Class t;
Iterator iter;
Iterator var9;
if (node.getNodeId() == NodeId.sequence) {
t = arguments[0];
SequenceNode snode = (SequenceNode)node;
Iterable<Object> memberList = Collections.emptyList();
if (object.getClass().isArray()) {
memberList = Arrays.asList((Object[])object);
} else if (object instanceof Iterable) {
memberList = (Iterable)object;
}
iter = ((Iterable)memberList).iterator();
if (iter.hasNext()) {
var9 = snode.getValue().iterator();
while(var9.hasNext()) {
Node childNode = (Node)var9.next();
Object member = iter.next();
if (member != null && t.equals(member.getClass()) && childNode.getNodeId() == NodeId.mapping) {
childNode.setTag(Tag.MAP);
}
}
}
} else if (object instanceof Set) {
t = arguments[0];
MappingNode mnode = (MappingNode)node;
iter = mnode.getValue().iterator();
Set<?> set = (Set)object;
var9 = set.iterator();
while(var9.hasNext()) {
Object member = var9.next();
NodeTuple tuple = (NodeTuple)iter.next();
Node keyNode = tuple.getKeyNode();
if (t.equals(member.getClass()) && keyNode.getNodeId() == NodeId.mapping) {
keyNode.setTag(Tag.MAP);
}
}
} else if (object instanceof Map) {
t = arguments[0];
Class<?> valueType = arguments[1];
MappingNode mnode = (MappingNode)node;
iter = mnode.getValue().iterator();
while(iter.hasNext()) {
NodeTuple tuple = (NodeTuple)iter.next();
this.resetTag(t, tuple.getKeyNode());
this.resetTag(valueType, tuple.getValueNode());
}
}
}
}
}
private void resetTag(Class<? extends Object> type, Node node) {
Tag tag = node.getTag();
if (tag.matches(type)) {
if (Enum.class.isAssignableFrom(type)) {
node.setTag(Tag.STR);
} else {
node.setTag(Tag.MAP);
}
}
}
protected Set<Property> getProperties(Class<? extends Object> type) {
return this.typeDefinitions.containsKey(type) ? ((TypeDescription)this.typeDefinitions.get(type)).getProperties() : this.getPropertyUtils().getProperties(type);
}
protected class RepresentJavaBean implements Represent {
protected RepresentJavaBean() {
}
public Node representData(Object data) {
return Representer.this.representJavaBean(Representer.this.getProperties(data.getClass()), data);
}
}
}