package de.zalando.sprocwrapper.proxy; import java.lang.reflect.Method; import java.lang.reflect.ParameterizedType; import java.sql.Connection; import java.util.Collection; import de.zalando.sprocwrapper.util.NameUtils; import de.zalando.typemapper.annotations.DatabaseType; import de.zalando.typemapper.postgres.PgArray; import de.zalando.typemapper.postgres.PgTypeHelper; /** * @author jmussler */ class ArrayStoredProcedureParameter extends StoredProcedureParameter { protected String innerTypeName = null; public ArrayStoredProcedureParameter(final Class<?> clazz, final Method m, final String typeName, final int sqlType, final int javaPosition, final boolean sensitive) { super(clazz, m, typeName, sqlType, javaPosition, sensitive); if (typeName != null && typeName.endsWith("[]")) { innerTypeName = typeName.substring(0, typeName.length() - 2); } else if (typeName != null && !"".equals(typeName)) { throw new IllegalArgumentException("SprocService-Param: [" + clazz.getName() + ", " + m.getName() + "] Provided typename must end with [] in case of list parameters: " + typeName); } else { final java.lang.reflect.Type parameterType = m.getGenericParameterTypes()[javaPosition]; if (!(parameterType instanceof ParameterizedType)) { throw new IllegalArgumentException("SprocService-Param: [" + clazz.getName() + ", " + m.getName() + "] Parameter must be of type Parametrized List<?> but is: " + parameterType.toString()); } else { final ParameterizedType p = (ParameterizedType) parameterType; final Class<?> paramsClass = (Class<?>) p.getActualTypeArguments()[0]; innerTypeName = PgTypeHelper.getSQLNameForClass(paramsClass); if (innerTypeName == null) { final DatabaseType dbType = paramsClass.getAnnotation(DatabaseType.class); if (dbType != null) { innerTypeName = dbType.name(); } if (innerTypeName == null || innerTypeName.isEmpty()) { innerTypeName = NameUtils.camelCaseToUnderscore(paramsClass.getSimpleName()); } } } } } @Override public Object mapParam(final Object value, final Connection connection) { if (value == null) { return null; } Object result = value; result = PgArray.ARRAY((Collection<?>) value); if (innerTypeName != null) { result = ((PgArray<?>) result).asJdbcArray(innerTypeName, connection); } return result; } }