智能工厂.apk(点击下载) / OptionalHandlerFactory.java
package com.fasterxml.jackson.databind.ext;
import com.fasterxml.jackson.databind.BeanDescription;
import com.fasterxml.jackson.databind.DeserializationConfig;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializationConfig;
import com.fasterxml.jackson.databind.deser.Deserializers;
import com.fasterxml.jackson.databind.ser.Serializers;
import java.io.Serializable;
public class OptionalHandlerFactory implements Serializable {
private static final String CLASS_NAME_DOM_DOCUMENT = "org.w3c.dom.Node";
private static final String CLASS_NAME_DOM_NODE = "org.w3c.dom.Node";
private static final String DESERIALIZERS_FOR_JAVAX_XML = "com.fasterxml.jackson.databind.ext.CoreXMLDeserializers";
private static final String DESERIALIZER_FOR_DOM_DOCUMENT = "com.fasterxml.jackson.databind.ext.DOMDeserializer$DocumentDeserializer";
private static final String DESERIALIZER_FOR_DOM_NODE = "com.fasterxml.jackson.databind.ext.DOMDeserializer$NodeDeserializer";
private static final String PACKAGE_PREFIX_JAVAX_XML = "javax.xml.";
private static final String SERIALIZERS_FOR_JAVAX_XML = "com.fasterxml.jackson.databind.ext.CoreXMLSerializers";
private static final String SERIALIZER_FOR_DOM_NODE = "com.fasterxml.jackson.databind.ext.DOMSerializer";
public static final OptionalHandlerFactory instance = new OptionalHandlerFactory();
private static final long serialVersionUID = 1;
protected OptionalHandlerFactory() {
}
public JsonSerializer<?> findSerializer(SerializationConfig serializationConfig, JavaType javaType, BeanDescription beanDescription) {
Class<?> rawClass = javaType.getRawClass();
if (rawClass.getName().startsWith(PACKAGE_PREFIX_JAVAX_XML) || hasSupertypeStartingWith(rawClass, PACKAGE_PREFIX_JAVAX_XML)) {
Object instantiate = instantiate(SERIALIZERS_FOR_JAVAX_XML);
if (instantiate == null) {
return null;
}
return ((Serializers) instantiate).findSerializer(serializationConfig, javaType, beanDescription);
} else if (doesImplement(rawClass, "org.w3c.dom.Node")) {
return (JsonSerializer) instantiate(SERIALIZER_FOR_DOM_NODE);
} else {
return null;
}
}
public JsonDeserializer<?> findDeserializer(JavaType javaType, DeserializationConfig deserializationConfig, BeanDescription beanDescription) throws JsonMappingException {
Class<?> rawClass = javaType.getRawClass();
if (rawClass.getName().startsWith(PACKAGE_PREFIX_JAVAX_XML) || hasSupertypeStartingWith(rawClass, PACKAGE_PREFIX_JAVAX_XML)) {
Object instantiate = instantiate(DESERIALIZERS_FOR_JAVAX_XML);
if (instantiate == null) {
return null;
}
return ((Deserializers) instantiate).findBeanDeserializer(javaType, deserializationConfig, beanDescription);
} else if (doesImplement(rawClass, "org.w3c.dom.Node")) {
return (JsonDeserializer) instantiate(DESERIALIZER_FOR_DOM_DOCUMENT);
} else {
if (doesImplement(rawClass, "org.w3c.dom.Node")) {
return (JsonDeserializer) instantiate(DESERIALIZER_FOR_DOM_NODE);
}
return null;
}
}
private Object instantiate(String str) {
try {
return Class.forName(str).newInstance();
} catch (Exception | LinkageError unused) {
return null;
}
}
private boolean doesImplement(Class<?> cls, String str) {
while (cls != null) {
if (cls.getName().equals(str) || hasInterface(cls, str)) {
return true;
}
cls = cls.getSuperclass();
}
return false;
}
private boolean hasInterface(Class<?> cls, String str) {
Class<?>[] interfaces = cls.getInterfaces();
for (Class<?> cls2 : interfaces) {
if (cls2.getName().equals(str)) {
return true;
}
}
for (Class<?> cls3 : interfaces) {
if (hasInterface(cls3, str)) {
return true;
}
}
return false;
}
private boolean hasSupertypeStartingWith(Class<?> cls, String str) {
for (Class<? super Object> superclass = cls.getSuperclass(); superclass != null; superclass = superclass.getSuperclass()) {
if (superclass.getName().startsWith(str)) {
return true;
}
}
while (cls != null) {
if (hasInterfaceStartingWith(cls, str)) {
return true;
}
cls = cls.getSuperclass();
}
return false;
}
private boolean hasInterfaceStartingWith(Class<?> cls, String str) {
Class<?>[] interfaces = cls.getInterfaces();
for (Class<?> cls2 : interfaces) {
if (cls2.getName().startsWith(str)) {
return true;
}
}
for (Class<?> cls3 : interfaces) {
if (hasInterfaceStartingWith(cls3, str)) {
return true;
}
}
return false;
}
}