private static Mutater find()

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;
	}