// find catch-all methods
Set<Method> catchAllMethods = new LinkedHashSet<Method>();
if (annotatedMethods != null) {
for (Method method : annotatedMethods) {
DataFlowOpParameter anno = (DataFlowOpParameter) JavaClassHelper.getAnnotations(DataFlowOpParameter.class, method.getDeclaredAnnotations()).get(0);
if (anno.all()) {
if (method.getParameterTypes().length == 2 && method.getParameterTypes()[0] == String.class && method.getParameterTypes()[1] == Object.class) {
catchAllMethods.add(method);
continue;
}
throw new ExprValidationException("Invalid annotation for catch-call");
}
}
}
// map provided values
for (Map.Entry<String, Object> property : objectProperties.entrySet()) {
boolean found = false;
String propertyName = property.getKey();
// invoke catch-all setters
for (Method method : catchAllMethods) {
try {
method.invoke(top, new Object[] {propertyName, property.getValue()});
}
catch (IllegalAccessException e) {
throw new ExprValidationException("Illegal access invoking method for property '" + propertyName + "' for class " + applicableClass.getName() + " method " + method.getName(), e);
}
catch (InvocationTargetException e) {
throw new ExprValidationException("Exception invoking method for property '" + propertyName + "' for class " + applicableClass.getName() + " method " + method.getName() + ": " + e.getTargetException().getMessage(), e);
}
found = true;
}
if (propertyName.toLowerCase().equals(CLASS_PROPERTY_NAME)) {
continue;
}
// use the writeable property descriptor (appropriate setter method) from writing the property
WriteablePropertyDescriptor descriptor = findDescriptor(applicableClass, propertyName, writables);
if (descriptor != null) {
Object coerceProperty = coerceProperty(propertyName, applicableClass, property.getValue(), descriptor.getType(), engineImportService, false);
try {
descriptor.getWriteMethod().invoke(top, new Object[] {coerceProperty});
}
catch (IllegalArgumentException e) {
throw new ExprValidationException("Illegal argument invoking setter method for property '" + propertyName + "' for class " + applicableClass.getName() + " method " + descriptor.getWriteMethod().getName() + " provided value " + coerceProperty, e);
}
catch (IllegalAccessException e) {
throw new ExprValidationException("Illegal access invoking setter method for property '" + propertyName + "' for class " + applicableClass.getName() + " method " + descriptor.getWriteMethod().getName(), e);
}
catch (InvocationTargetException e) {
throw new ExprValidationException("Exception invoking setter method for property '" + propertyName + "' for class " + applicableClass.getName() + " method " + descriptor.getWriteMethod().getName() + ": " + e.getTargetException().getMessage(), e);
}
continue;
}
// find the field annotated with {@link @GraphOpProperty}
for (Field annotatedField : annotatedFields) {
DataFlowOpParameter anno = (DataFlowOpParameter) JavaClassHelper.getAnnotations(DataFlowOpParameter.class, annotatedField.getDeclaredAnnotations()).get(0);
if (anno.name().equals(propertyName) || annotatedField.getName().equals(propertyName)) {
Object coerceProperty = coerceProperty(propertyName, applicableClass, property.getValue(), annotatedField.getType(), engineImportService, true);
try {
annotatedField.setAccessible(true);
annotatedField.set(top, coerceProperty);
}
catch (Exception e) {
throw new ExprValidationException("Failed to set field '" + annotatedField.getName() + "': " + e.getMessage(), e);
}
found = true;
break;
}
}
if (found) {
continue;
}
throw new ExprValidationException("Failed to find writable property '" + propertyName + "' for class " + applicableClass.getName());
}
// second pass: if a parameter URI - value pairs were provided, check that
if (optionalParameterURIs != null) {
for (Field annotatedField : annotatedFields) {
try {
annotatedField.setAccessible(true);
String uri = operatorName + "/" + annotatedField.getName();
if (optionalParameterURIs.containsKey(uri)) {
Object value = optionalParameterURIs.get(uri);
annotatedField.set(top, value);
if (log.isDebugEnabled()) {
log.debug("Found parameter '" + uri + "' for data flow " + dataFlowName + " setting " + value);
}
}
else {
if (log.isDebugEnabled()) {
log.debug("Not found parameter '" + uri + "' for data flow " + dataFlowName);
}
}
}
catch (Exception e) {
throw new ExprValidationException("Failed to set field '" + annotatedField.getName() + "': " + e.getMessage(), e);
}
}
for (Method method : annotatedMethods) {
DataFlowOpParameter anno = (DataFlowOpParameter) JavaClassHelper.getAnnotations(DataFlowOpParameter.class, method.getDeclaredAnnotations()).get(0);
if (anno.all()) {
if (method.getParameterTypes().length == 2 && method.getParameterTypes()[0] == String.class && method.getParameterTypes()[1] == Object.class) {
for (Map.Entry<String, Object> entry : optionalParameterURIs.entrySet()) {
String[] elements = URIUtil.parsePathElements(URI.create(entry.getKey()));
if (elements.length < 2) {
throw new ExprValidationException("Failed to parse URI '" + entry.getKey() + "', expected " +