package org.ovirt.engine.core.dal.dbbroker; import java.lang.reflect.Method; import java.util.Map; import java.util.Map.Entry; import javax.enterprise.context.Dependent; import javax.inject.Inject; import javax.inject.Named; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.compat.Version; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; /** * Automatically translates incoming complex values as needed */ @Named @Dependent public class CustomMapSqlParameterSource extends MapSqlParameterSource { private final DbEngineDialect dialect; @Inject public CustomMapSqlParameterSource(DbEngineDialect dialect) { this.dialect = dialect; } @Override public MapSqlParameterSource addValue(String paramName, Object value) { Object tmpValue = value; // just to be safe if (tmpValue != null) { // lets check if we need to translate value if (tmpValue.getClass().isEnum()) { tmpValue = extractEnumValue(tmpValue); } else if (tmpValue instanceof Guid) { tmpValue = ((Guid) tmpValue).getUuid(); } else if (tmpValue instanceof Version) { tmpValue = value.toString(); } } return super.addValue(dialect.getParamNamePrefix() + paramName, tmpValue); } @Override public MapSqlParameterSource addValues(Map<String, ?> values) { if (values != null) { for (Entry<String, ?> entry : values.entrySet()) { addValue(entry.getKey(), entry.getValue()); } } return this; } private static Object extractEnumValue(Object value) { Method getValueMethod = findMethodByName(value, "getValue"); if (getValueMethod != null) { return invokeMethod(value, getValueMethod); } Method ordinalMethod = findMethodByName(value, "ordinal"); if (ordinalMethod != null) { return invokeMethod(value, ordinalMethod); } return Integer.valueOf(0); } private static Object invokeMethod(Object object, Method method) { try { return method.invoke(object); } catch (Exception e) { throw new RuntimeException("Unable to invoke method", e); } } private static Method findMethodByName(Object value, String methodName) { try { return value.getClass().getMethod(methodName); } catch (NoSuchMethodException e) { return null; } } }