/******************************************************************************* * Copyright (c) 2010 Robert "Unlogic" Olofsson (unlogic@unlogic.se). * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Lesser Public License v3 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/lgpl-3.0-standalone.html ******************************************************************************/ package se.unlogic.standardutils.populators; import se.unlogic.standardutils.dao.BeanResultSetPopulator; import se.unlogic.standardutils.dao.querys.PreparedStatementQuery; import se.unlogic.standardutils.enums.EnumUtils; import se.unlogic.standardutils.reflection.ReflectionUtils; import se.unlogic.standardutils.string.StringUtils; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.sql.ResultSet; import java.sql.SQLException; public class EnumPopulator<EnumType extends Enum<EnumType>> extends BaseStringPopulator<EnumType> implements BeanResultSetPopulator<EnumType>, BeanStringPopulator<EnumType>, QueryParameterPopulator<EnumType> { protected Class<EnumType> classType; protected String fieldName; public EnumPopulator(Class<EnumType> classType) { super(); checkClass(classType); fieldName = classType.getSimpleName(); } public EnumPopulator(Class<EnumType> classType, String fieldName) { checkClass(classType); if (StringUtils.isEmpty(fieldName)) { throw new NullPointerException("fieldName can not be null or empty!"); } else { this.fieldName = fieldName; } } private void checkClass(Class<EnumType> classType) { if (classType == null) { throw new NullPointerException("Classtype can not be null!"); } else { this.classType = classType; } } public EnumType populate(ResultSet rs) throws SQLException { return EnumUtils.toEnum(classType, rs.getString(1)); } public EnumType getValue(String value) { return EnumUtils.toEnum(classType, value); } @Override public boolean validateDefaultFormat(String value) { return EnumUtils.isEnum(classType, value); } public Class<? extends EnumType> getType() { return classType; } public void populate(PreparedStatementQuery query, int paramIndex, Object bean) throws SQLException { if(bean != null){ query.setString(paramIndex, bean.toString()); }else{ query.setString(paramIndex, null); } } public static <Type extends Enum<Type>> EnumPopulator<Type> getGenericInstance(Class<Type> type) { return new EnumPopulator<Type>(type); } @SuppressWarnings({ "unchecked", "rawtypes" }) public static EnumPopulator<?> getInstanceFromField(Field field){ Enum enumInstance = EnumUtils.getInstanceFromField(field); return EnumPopulator.getGenericInstance(enumInstance.getClass()); } @SuppressWarnings({ "unchecked", "rawtypes" }) public static EnumPopulator<?> getInstanceFromListField(Field field){ Object[] enumValues = ((Class<?>)ReflectionUtils.getGenericType(field)).getEnumConstants(); Enum enumInstance = (Enum) enumValues[0]; return EnumPopulator.getGenericInstance(enumInstance.getClass()); } @SuppressWarnings({ "unchecked", "rawtypes" }) public static EnumPopulator<?> getInstanceFromMethod(Method method){ Object[] enumValues = method.getParameterTypes()[0].getEnumConstants(); Enum enumInstance = (Enum) enumValues[0]; return EnumPopulator.getGenericInstance(enumInstance.getClass()); } @SuppressWarnings({ "rawtypes", "unchecked" }) public static BeanStringPopulator<?> getInstanceFromListMethod(Method method) { Object[] enumValues = ((Class<?>)ReflectionUtils.getGenericType(method)).getEnumConstants(); Enum enumInstance = (Enum) enumValues[0]; return EnumPopulator.getGenericInstance(enumInstance.getClass()); } }