package dbfit.util; import dbfit.fixture.StatementExecution; import java.sql.SQLException; import java.util.*; import static dbfit.util.Direction.INPUT; import static dbfit.util.Direction.OUTPUT; import static dbfit.util.Direction.RETURN_VALUE; public class DbParameterAccessors implements Iterable<DbParameterAccessor> { private List<DbParameterAccessor> accessors; public DbParameterAccessors(DbParameterAccessor[] accessors) { this.accessors = new ArrayList<DbParameterAccessor>(Arrays.asList(accessors)); } public DbParameterAccessors() { this(new DbParameterAccessor[]{}); } public void bindParameters(StatementExecution statement) throws SQLException { List<String> accessorNames = getSortedAccessorNames(); for (DbParameterAccessor ac : accessors) { int realindex = accessorNames.indexOf(ac.getName()); ac.bindTo(statement, realindex + 1); // jdbc params are 1-based } } public DbParameterAccessor[] toArray() { return accessors.toArray(new DbParameterAccessor[]{}); } @Override public Iterator<DbParameterAccessor> iterator() { return accessors.iterator(); } public void add(DbParameterAccessor accessor) { accessors.add(accessor); } public <T> Map<DbParameterAccessor, T> zipWith(List<T> items) { Map<DbParameterAccessor, T> map = new HashMap<DbParameterAccessor, T>(); for (int column = 0; column < accessors.size(); column++) { map.put(accessors.get(column), items.get(column)); } return map; } public List<DbParameterAccessor> getOutputAccessors() { List<DbParameterAccessor> filteredAccessors = new ArrayList<DbParameterAccessor>(); for (DbParameterAccessor accessor : accessors) { if (accessor.hasDirection(OUTPUT) || accessor.hasDirection(RETURN_VALUE)) { filteredAccessors.add(accessor); } } return filteredAccessors; } public List<DbParameterAccessor> getInputAccessors() { List<DbParameterAccessor> filteredAccessors = new ArrayList<DbParameterAccessor>(); for (DbParameterAccessor accessor : accessors) { if (accessor.hasDirection(INPUT)) { filteredAccessors.add(accessor); } } return filteredAccessors; } private class PositionComparator implements Comparator<DbParameterAccessor> { public int compare(DbParameterAccessor o1, DbParameterAccessor o2) { return (int) Math.signum(o1.getPosition() - o2.getPosition()); } } public List<String> getSortedAccessorNames() { SortedSet<DbParameterAccessor> nameSet = new TreeSet<>(new PositionComparator()); nameSet.addAll(new ArrayList<>(accessors)); List<String> nameList = new ArrayList<>(); for (DbParameterAccessor p : nameSet) { nameList.add(p.getName()); } return nameList; } // number of distinct parameters (in, out, inout and return value) public int getNumberOfParameters() { return getSortedAccessorNames().size(); } public boolean containsReturnValue() { for (DbParameterAccessor ac : accessors) { if (ac.isReturnValueAccessor()) { return true; } } return false; } }