package nl.ipo.cds.admin.ba.controller.beans;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import nl.ipo.cds.attributemapping.operations.OperationInputType;
import nl.ipo.cds.attributemapping.operations.OperationType;
import nl.ipo.cds.attributemapping.operations.PropertyBeanDescription;
import nl.ipo.cds.attributemapping.operations.PropertyBeanFieldDescription;
import org.codehaus.jackson.annotate.JsonIgnore;
import org.codehaus.jackson.annotate.JsonPropertyOrder;
import org.codehaus.jackson.map.annotate.JsonSerialize;
import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;
import org.springframework.beans.BeanUtils;
@JsonSerialize (include = Inclusion.ALWAYS)
@JsonPropertyOrder (value = {
"name",
"description",
"returnType",
"inputs"
})
public class OperationTypeResponse {
@JsonIgnore
private final OperationType operationType;
@JsonIgnore
private final PropertyBeanDescription propertyBeanDescription;
public OperationTypeResponse (final OperationType operationType, final PropertyBeanDescription propertyBeanDescription) {
this.operationType = operationType;
this.propertyBeanDescription = propertyBeanDescription;
}
public String getName () {
return operationType.getName ();
}
public String getDescription () {
return operationType.getDescription (Locale.getDefault ());
}
public String getLabel () {
return operationType.getLabel (Locale.getDefault ());
}
public String getFormatLabel () {
return operationType.getFormatLabel (Locale.getDefault ());
}
public String getReturnType () {
final Type type = operationType.getReturnType ();
if (Void.TYPE.equals (type)) {
return null;
}
return type.toString ();
}
public List<OperationInputTypeResponse> getInputs () {
final List<OperationInputTypeResponse> inputs = new ArrayList<OperationInputTypeResponse> ();
for (final OperationInputType inputType: operationType.getInputs ()) {
inputs.add (new OperationInputTypeResponse (inputType));
}
return inputs;
}
public boolean getHasFields () {
return operationType.getPropertyBeanClass () != null;
}
public List<FieldDescriptionResponse> getFieldDescriptions () {
final List<FieldDescriptionResponse> result = new ArrayList<FieldDescriptionResponse> ();
if (propertyBeanDescription == null) {
return result;
}
// Create a dummy settings bean instance that exposes the default values:
try {
final Class<?> beanClass = propertyBeanDescription.getBeanClass ();
final Object defaultBean = beanClass.newInstance ();
for (final PropertyBeanFieldDescription fd: propertyBeanDescription.getFieldDescriptions ()) {
final PropertyDescriptor desc = BeanUtils.getPropertyDescriptor (beanClass, fd.getName ());
final Object defaultValue = desc.getReadMethod().invoke (defaultBean);
result.add (new FieldDescriptionResponse (fd, defaultValue));
}
} catch (InvocationTargetException e) {
return new ArrayList<FieldDescriptionResponse> ();
} catch (InstantiationException e) {
return new ArrayList<FieldDescriptionResponse> ();
} catch (IllegalAccessException e) {
return new ArrayList<FieldDescriptionResponse> ();
}
return result;
}
@JsonIgnore
OperationType getOperationType () {
return operationType;
}
}