in core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/jexl/JexlUtils.java [153:230]
public static void addFieldsToContext(final Object object, final JexlContext jexlContext) {
if (object == null) {
return;
}
Set<Pair<PropertyDescriptor, Field>> cached = FIELD_CACHE.get(object.getClass());
if (cached == null) {
FIELD_CACHE.put(object.getClass(), Collections.synchronizedSet(new HashSet<>()));
List<Class<?>> classes = ClassUtils.getAllSuperclasses(object.getClass());
classes.add(object.getClass());
classes.forEach(clazz -> {
try {
for (PropertyDescriptor desc : Introspector.getBeanInfo(clazz).getPropertyDescriptors()) {
if (!desc.getName().startsWith("pc")
&& !ArrayUtils.contains(IGNORE_FIELDS, desc.getName())
&& !Collection.class.isAssignableFrom(desc.getPropertyType())
&& !Map.class.isAssignableFrom(desc.getPropertyType())
&& !desc.getPropertyType().isArray()) {
Field field = null;
try {
field = clazz.getDeclaredField(desc.getName());
} catch (NoSuchFieldException | SecurityException e) {
LOG.debug("Could not get field {} from {}", desc.getName(), clazz.getName(), e);
}
FIELD_CACHE.get(object.getClass()).add(Pair.of(desc, field));
}
}
} catch (IntrospectionException e) {
LOG.warn("Could not introspect {}", clazz.getName(), e);
}
});
cached = FIELD_CACHE.get(object.getClass());
}
cached.forEach(fd -> {
String fieldName = fd.getLeft().getName();
Class<?> fieldType = fd.getLeft().getPropertyType();
try {
Object fieldValue = null;
if (fd.getLeft().getReadMethod() == null) {
if (fd.getRight() != null) {
ReflectionUtils.makeAccessible(fd.getRight());
fieldValue = fd.getRight().get(object);
}
} else {
fieldValue = fd.getLeft().getReadMethod().invoke(object);
}
if (fieldValue == null) {
fieldValue = StringUtils.EMPTY;
} else {
fieldValue = TemporalAccessor.class.isAssignableFrom(fieldType)
? FormatUtils.format((TemporalAccessor) fieldValue)
: fieldValue;
}
jexlContext.set(fieldName, fieldValue);
LOG.debug("Add field {} with value {}", fieldName, fieldValue);
} catch (Exception iae) {
LOG.error("Reading '{}' value error", fieldName, iae);
}
});
if (object instanceof final Any any && any.getRealm() != null) {
jexlContext.set("realm", any.getRealm().getFullPath());
} else if (object instanceof final AnyTO anyTO && anyTO.getRealm() != null) {
jexlContext.set("realm", anyTO.getRealm());
} else if (object instanceof Realm realm) {
jexlContext.set("fullPath", realm.getFullPath());
} else if (object instanceof RealmTO realmTO) {
jexlContext.set("fullPath", realmTO.getFullPath());
}
}