in src/main/java/org/apache/commons/jexl3/parser/JexlParser.java [412:455]
protected void declarePragma(final String key, final Object value) {
final JexlFeatures features = getFeatures();
if (!features.supportsPragma()) {
throwFeatureException(JexlFeatures.PRAGMA, getToken(0));
}
if (PRAGMA_IMPORT.equals(key) && !features.supportsImportPragma()) {
throwFeatureException(JexlFeatures.IMPORT_PRAGMA, getToken(0));
}
if (pragmas == null) {
pragmas = new TreeMap<>();
}
// declaring a namespace or module
final String[] nsprefixes = { PRAGMA_JEXLNS, PRAGMA_MODULE };
for(final String nsprefix : nsprefixes) {
if (key.startsWith(nsprefix)) {
if (!features.supportsNamespacePragma()) {
throwFeatureException(JexlFeatures.NS_PRAGMA, getToken(0));
}
final String nsname = key.substring(nsprefix.length());
if (!nsname.isEmpty()) {
if (namespaces == null) {
namespaces = new HashSet<>();
}
namespaces.add(nsname);
}
break;
}
}
// merge new value into a set created on the fly if key is already mapped
if (value == null) {
pragmas.putIfAbsent(key, null);
} else {
pragmas.merge(key, value, (previous, newValue) -> {
if (previous instanceof Set<?>) {
((Set<Object>) previous).add(newValue);
return previous;
}
final Set<Object> values = new LinkedHashSet<>();
values.add(previous);
values.add(newValue);
return values;
});
}
}