in transform/src/patch/java/org/apache/openjpa/lib/meta/ClassMetaDataIterator.java [65:148]
public ClassMetaDataIterator(Class<?> cls, String suffix,
ClassLoader loader, boolean topDown) {
// skip classes that can't have metadata
if (cls != null && (cls.isPrimitive()
|| cls.getName().startsWith("java.")
|| cls.getName().startsWith("javax.")
|| cls.getName().startsWith("jakarta."))) {
_loader = null;
_locs = Collections.emptyList();
return;
}
if (loader == null) {
MultiClassLoader multi = AccessController
.doPrivileged(J2DoPrivHelper.newMultiClassLoaderAction());
multi.addClassLoader(MultiClassLoader.SYSTEM_LOADER);
multi.addClassLoader(MultiClassLoader.THREAD_LOADER);
multi.addClassLoader(getClass().getClassLoader());
if (cls != null)
{
ClassLoader clsLoader = (ClassLoader)
AccessController.doPrivileged(
J2DoPrivHelper.getClassLoaderAction(cls));
if (clsLoader != null)
multi.addClassLoader(clsLoader);
}
loader = multi;
}
_loader = loader;
// collect the set of all possible metadata locations; start with
// system locations
_locs = new ArrayList<>();
_locs.add("META-INF/package" + suffix);
_locs.add("WEB-INF/package" + suffix);
_locs.add("package" + suffix);
// put this legacy location at the end regardless of whether we're
// going top down or bottom up so we don't have to parse it as often
// during testing
if (!topDown)
_locs.add("system" + suffix);
if (cls != null) {
// also check:
// 1. for each package from the top down to cls' package:
// <path>/package<suffix>
// <path>/<package-name><suffix> (legacy support)
// <path>/../<package-name><suffix> (legacy support)
// 2. <path>/<class-name><suffix>
String pkg = ClassUtil.getPackageName(cls).replace('.', '/');
if (pkg.length() > 0) {
int idx, start = 0;
String pkgName, path, upPath = "";
do {
idx = pkg.indexOf('/', start);
if (idx == -1) {
pkgName = (start == 0) ? pkg : pkg.substring(start);
path = pkg + "/";
} else {
pkgName = pkg.substring(start, idx);
path = pkg.substring(0, idx + 1);
}
_locs.add(path + "package" + suffix);
_locs.add(path + pkgName + suffix); // legacy
_locs.add(upPath + pkgName + suffix); // legacy
if (idx == -1)
_locs.add(path + ClassUtil.getClassName(cls) + suffix);
start = idx + 1;
upPath = path;
}
while (idx != -1);
} else {
// <class-name><suffix> for top-level classes
_locs.add(cls.getName() + suffix);
}
}
if (topDown)
_locs.add("system" + suffix); // legacy
else
Collections.reverse(_locs);
}