in juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/Mutaters.java [146:251]
private static Mutater find(Class<?> ic, Class<?> oc, Map<Class<?>,Mutater<?,?>> m) {
if (ic == oc) {
return new Mutater() {
@Override public Object mutate(Object outer, Object in) {
return in;
}
};
}
ClassInfo ici = ClassInfo.of(ic), oci = ClassInfo.of(oc);
ClassInfo pic = ici.getAnyParent(x -> m.get(x.inner()) != null);
if (pic != null)
return m.get(pic.inner());
if (ic == String.class) {
Class<?> oc2 = oci.hasPrimitiveWrapper() ? oci.getPrimitiveWrapper() : oc;
ClassInfo oc2i = ClassInfo.of(oc2);
final MethodInfo createMethod = oc2i.getPublicMethod(
x -> x.isStatic()
&& x.isNotDeprecated()
&& x.hasReturnType(oc2)
&& x.hasParamTypes(ic)
&& (x.hasName("forName") || isStaticCreateMethodName(x, ic))
);
if (oc2.isEnum() && createMethod == null) {
return new Mutater<String,Object>() {
@Override
public Object mutate(Object outer, String in) {
return Enum.valueOf((Class<? extends Enum>)oc2, in);
}
};
}
if (createMethod != null) {
return new Mutater<String,Object>() {
@Override
public Object mutate(Object outer, String in) {
try {
return createMethod.invoke(null, in);
} catch (Exception e) {
throw asRuntimeException(e);
}
}
};
}
} else {
MethodInfo createMethod = oci.getPublicMethod(
x -> x.isStatic()
&& x.isNotDeprecated()
&& x.hasReturnType(oc)
&& x.hasParamTypes(ic)
&& isStaticCreateMethodName(x, ic)
);
if (createMethod != null) {
Method cm = createMethod.inner();
return new Mutater() {
@Override
public Object mutate(Object context, Object in) {
try {
return cm.invoke(null, in);
} catch (Exception e) {
throw asRuntimeException(e);
}
}
};
}
}
ConstructorInfo c = oci.getPublicConstructor(x -> x.hasParamTypes(ic));
if (c != null && c.isNotDeprecated()) {
boolean isMemberClass = oci.isNonStaticMemberClass();
return new Mutater() {
@Override
public Object mutate(Object outer, Object in) {
try {
if (isMemberClass)
return c.invoke(outer, in);
return c.invoke(in);
} catch (Exception e) {
throw asRuntimeException(e);
}
}
};
}
MethodInfo toXMethod = findToXMethod(ici, oci);
if (toXMethod != null) {
return new Mutater() {
@Override
public Object mutate(Object outer, Object in) {
try {
return toXMethod.invoke(in);
} catch (Exception e) {
throw asRuntimeException(e);
}
}
};
}
return NULL;
}