in src/main/java/com/univocity/parsers/conversions/EnumConversion.java [96:184]
public EnumConversion(Class<T> enumType, T valueIfStringIsNull, String valueIfEnumIsNull, String customEnumElement, EnumSelector... selectors) {
super(valueIfStringIsNull, valueIfEnumIsNull);
this.enumType = enumType;
if (customEnumElement != null) {
customEnumElement = customEnumElement.trim();
if (customEnumElement.isEmpty()) {
customEnumElement = null;
}
}
LinkedHashSet<EnumSelector> selectorSet = new LinkedHashSet<EnumSelector>();
Collections.addAll(selectorSet, selectors);
if ((selectorSet.contains(EnumSelector.CUSTOM_FIELD) || selectorSet.contains(EnumSelector.CUSTOM_METHOD)) && customEnumElement == null) {
throw new IllegalArgumentException("Cannot create custom enum conversion without a field name to use");
}
Field field = null;
Method method = null;
if (customEnumElement != null) {
IllegalStateException fieldError = null;
IllegalStateException methodError = null;
try {
field = enumType.getDeclaredField(customEnumElement);
if (!field.isAccessible()) {
field.setAccessible(true);
}
} catch (Throwable e) {
fieldError = new IllegalStateException("Unable to access custom field '" + customEnumElement + "' in enumeration type " + enumType.getName(), e);
}
if (field == null) {
try {
try {
method = enumType.getDeclaredMethod(customEnumElement);
} catch (NoSuchMethodException e) {
method = enumType.getDeclaredMethod(customEnumElement, String.class);
if (!Modifier.isStatic(method.getModifiers())) {
throw new IllegalArgumentException("Custom method '" + customEnumElement + "' in enumeration type " + enumType.getName() + " must be static");
}
if(method.getReturnType() != enumType){
throw new IllegalArgumentException("Custom method '" + customEnumElement + "' in enumeration type " + enumType.getName() + " must return " + enumType.getName());
}
}
if (!method.isAccessible()) {
method.setAccessible(true);
}
} catch (Throwable e) {
methodError = new IllegalStateException("Unable to access custom method '" + customEnumElement + "' in enumeration type " + enumType.getName(), e);
}
if (method != null) {
if (method.getReturnType() == void.class) {
throw new IllegalArgumentException("Custom method '" + customEnumElement + "' in enumeration type " + enumType.getName() + " must return a value");
}
if (!selectorSet.contains(EnumSelector.CUSTOM_METHOD)) {
selectorSet.add(EnumSelector.CUSTOM_METHOD);
}
}
} else if (!selectorSet.contains(EnumSelector.CUSTOM_FIELD)) {
selectorSet.add(EnumSelector.CUSTOM_FIELD);
}
if (selectorSet.contains(EnumSelector.CUSTOM_FIELD) && fieldError != null) {
throw fieldError;
}
if (selectorSet.contains(EnumSelector.CUSTOM_METHOD) && methodError != null) {
throw methodError;
}
if (field == null && method == null) {
throw new IllegalStateException("No method/field named '" + customEnumElement + "' found in enumeration type " + enumType.getName());
}
}
if (selectorSet.contains(EnumSelector.CUSTOM_FIELD) && selectorSet.contains(EnumSelector.CUSTOM_METHOD)) {
throw new IllegalArgumentException("Cannot create custom enum conversion using both method and field values");
}
if (selectorSet.isEmpty()) {
throw new IllegalArgumentException("Selection of enum conversion types cannot be empty.");
}
this.customEnumField = field;
this.customEnumMethod = method;
this.selectors = selectorSet.toArray(new EnumSelector[selectorSet.size()]);
this.conversions = new Map[selectorSet.size()];
initializeMappings(selectorSet);
}