in uimafit-core/src/main/java/org/apache/uima/fit/component/initialize/ConfigurationParameterInitializer.java [96:191]
public static void initialize(final Object component, final UimaContext context)
throws ResourceInitializationException {
MutablePropertyValues values = new MutablePropertyValues();
List<String> mandatoryValues = new ArrayList<>();
for (Field field : getFields(component)) { // component.getClass().getDeclaredFields())
if (isConfigurationParameterField(field)) {
org.apache.uima.fit.descriptor.ConfigurationParameter annotation = getAnnotation(field,
org.apache.uima.fit.descriptor.ConfigurationParameter.class);
Object parameterValue;
String parameterName = getConfigurationParameterName(field);
// Obtain either from the context - or - if the context does not provide the
// parameter, check if there is a default value. Note there are three possibilities:
// 1) Parameter present and set
// 2) Parameter present and set to null (null value)
// 3) Parameter not present (also provided as null value by UIMA)
// Unfortunately we cannot make a difference between case 2 and 3 since UIMA does
// not allow us to actually get a list of the parameters set in the context. We can
// only get a list of the declared parameters. Thus we have to rely on the null
// value.
parameterValue = context.getConfigParameterValue(parameterName);
if (parameterValue == null) {
parameterValue = getDefaultValue(field);
}
if (parameterValue != null) {
values.addPropertyValue(field.getName(), parameterValue);
}
// TODO does this check really belong here? It seems that
// this check is already performed by UIMA
if (annotation.mandatory()) {
mandatoryValues.add(field.getName());
}
}
}
DataBinder binder = new DataBinder(component) {
@Override
protected void checkRequiredFields(MutablePropertyValues mpvs) {
String[] requiredFields = getRequiredFields();
if (!isEmpty(requiredFields)) {
Map<String, PropertyValue> propertyValues = new HashMap<>();
PropertyValue[] pvs = mpvs.getPropertyValues();
for (PropertyValue pv : pvs) {
propertyValues.put(canonicalPropertyName(pv.getName()), pv);
}
for (String field : requiredFields) {
PropertyValue pv = propertyValues.get(field);
boolean empty = (pv == null || pv.getValue() == null);
// For our purposes, empty Strings or empty String arrays do not count as
// empty. Empty is only "null".
// if (!empty) {
// if (pv.getValue() instanceof String) {
// empty = !StringUtils.hasText((String) pv.getValue());
// }
// else if (pv.getValue() instanceof String[]) {
// String[] values = (String[]) pv.getValue();
// empty = (values.length == 0 || !StringUtils.hasText(values[0]));
// }
// }
if (empty) {
// Use bind error processor to create FieldError.
getBindingErrorProcessor().processMissingFieldError(field,
getInternalBindingResult());
// Remove property from property values to bind:
// It has already caused a field error with a rejected value.
if (pv != null) {
mpvs.removePropertyValue(pv);
propertyValues.remove(field);
}
}
}
}
}
};
binder.initDirectFieldAccess();
registerUimaFITEditors(binder);
binder.setRequiredFields(mandatoryValues.toArray(new String[mandatoryValues.size()]));
binder.bind(values);
if (binder.getBindingResult().hasErrors()) {
StringBuilder sb = new StringBuilder();
sb.append("Errors initializing [" + component.getClass() + "]");
for (ObjectError error : binder.getBindingResult().getAllErrors()) {
if (sb.length() > 0) {
sb.append("\n");
}
sb.append(error.getDefaultMessage());
}
throw new IllegalArgumentException(sb.toString());
}
}