public static Class<?> findClass(String name, Collection<String> availableImports, ClassLoader cl) { Class<?> clazz = null; for (String imp : availableImports) { if (imp.endsWith(".*")) { imp = imp.substring(0, imp.length()-2); } String className = imp.endsWith(name) ? imp : imp + "." + name; clazz = findClass(className, cl); if (clazz != null) { break; } } return clazz; }
private String[] splitInClassAndField(String expr, MVELDumperContext context) { String[] split = expr.split("\\."); if (split.length < 2) { return new String[] { expr }; } if (split[0].endsWith("!")) { split[0] = split[0].substring(0, split[0].length()-1); } if (split.length < 3) { return split; } // check non-FQN case first if ( context == null || findClassByName(context.getRuleContext(), split[0]) != null ) { return new String[] { split[0], concatDotSeparated(split, 1, split.length) }; } ClassLoader cl = context.getRuleContext().getPackageBuilder().getRootClassLoader(); for (int i = split.length-1; i > 1; i++) { String className = concatDotSeparated(split, 0, i); if (className.endsWith("!")) { className = className.substring(0, className.length()-1); } if (findClass(className, cl) != null) { return new String[] { className, concatDotSeparated(split, i, split.length) }; } } return null; }
public static Class<?> findClassByName(RuleBuildContext context, String className) { if (className == null) { return null; } String namespace = context.getRuleDescr().getNamespace(); PackageBuilder packageBuilder = context.getPackageBuilder(); Class<?> clazz = null; try { clazz = Class.forName(className.indexOf('.') < 0 ? namespace + "." + className : className, false, packageBuilder.getRootClassLoader()); } catch (ClassNotFoundException e) { } if (clazz != null) { return clazz; } Set<String> imports = new HashSet<String>(); List<PackageDescr> pkgDescrs = packageBuilder.getPackageDescrs(namespace); if (pkgDescrs == null) { return null; } for (PackageDescr pkgDescr : pkgDescrs) { for (ImportDescr importDescr : pkgDescr.getImports()) { imports.add(importDescr.getTarget()); } } return findClass(className, imports, packageBuilder.getRootClassLoader()); }