2022-02-03 17:36:29 +00:00
|
|
|
package com.bugsnag.android.repackaged.dslplatform.json;
|
|
|
|
|
2024-04-29 09:45:03 +00:00
|
|
|
import java.lang.reflect.InvocationTargetException;
|
2022-02-03 17:36:29 +00:00
|
|
|
import java.util.*;
|
|
|
|
|
|
|
|
class ExternalConverterAnalyzer {
|
|
|
|
private final Set<String> lookedUpClasses = new HashSet<String>();
|
|
|
|
private final ClassLoader[] classLoaders;
|
|
|
|
|
|
|
|
ExternalConverterAnalyzer(Collection<ClassLoader> classLoaders) {
|
|
|
|
this.classLoaders = classLoaders.toArray(new ClassLoader[0]);
|
|
|
|
}
|
|
|
|
|
|
|
|
synchronized boolean tryFindConverter(Class<?> manifest, DslJson<?> dslJson) {
|
|
|
|
final String className = manifest.getName();
|
|
|
|
if (!lookedUpClasses.add(className)) return false;
|
|
|
|
String[] converterClassNames = resolveExternalConverterClassNames(className);
|
|
|
|
for (ClassLoader cl : classLoaders) {
|
|
|
|
for (String ccn : converterClassNames) {
|
|
|
|
try {
|
|
|
|
Class<?> converterClass = cl.loadClass(ccn);
|
|
|
|
if (!Configuration.class.isAssignableFrom(converterClass)) continue;
|
2024-04-29 09:45:03 +00:00
|
|
|
Configuration converter = (Configuration) converterClass.getDeclaredConstructor().newInstance();
|
2022-02-03 17:36:29 +00:00
|
|
|
converter.configure(dslJson);
|
|
|
|
return true;
|
|
|
|
} catch (ClassNotFoundException ignored) {
|
|
|
|
} catch (IllegalAccessException ignored) {
|
|
|
|
} catch (InstantiationException ignored) {
|
2024-04-29 09:45:03 +00:00
|
|
|
} catch (InvocationTargetException e) {
|
|
|
|
} catch (NoSuchMethodException e) {
|
|
|
|
}
|
|
|
|
}
|
2022-02-03 17:36:29 +00:00
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
private String[] resolveExternalConverterClassNames(final String fullClassName) {
|
|
|
|
int dotIndex = fullClassName.lastIndexOf('.');
|
|
|
|
if (dotIndex == -1) {
|
|
|
|
return new String[]{String.format("_%s_DslJsonConverter", fullClassName)};
|
|
|
|
}
|
|
|
|
String packageName = fullClassName.substring(0, dotIndex);
|
|
|
|
String className = fullClassName.substring(dotIndex + 1);
|
|
|
|
return new String[]{
|
|
|
|
String.format("%s._%s_DslJsonConverter", packageName, className),
|
|
|
|
String.format("dsl_json.%s._%s_DslJsonConverter", packageName, className),
|
|
|
|
String.format("dsl_json.%s.%sDslJsonConverter", packageName, className)};
|
|
|
|
}
|
|
|
|
}
|