@Override public Optional<Argument> find(String name, StatementContext ctx) { if (args.containsKey(name)) { final Object argument = args.get(name); final Class<?> argumentClass = argument == null ? Object.class : argument.getClass(); return ctx.findArgumentFor(argumentClass, argument); } return Optional.empty(); }
@Override public final Optional<Argument> find(String name, StatementContext ctx) { if (name.startsWith(prefix)) { final String actualName = name.substring(prefix.length()); int separator = actualName.indexOf('.'); if (separator != -1) { String parentName = actualName.substring(0, separator); String childName = actualName.substring(separator + 1); return childArgumentFinders .computeIfAbsent(parentName.endsWith("?") ? parentName.substring(0, parentName.length() - 1) : parentName, pn -> getValue(pn, ctx).map(typedValue -> getValueNested(typedValue, parentName, childName))) .flatMap(arg -> arg.find(childName, ctx)); } return getValue(actualName, ctx) .map(tv -> ctx.findArgumentFor(tv.type, tv.value) .orElseThrow(() -> new UnableToCreateStatementException( String.format("No argument factory registered for type [%s] for element [%s] on [%s]", tv.type, name, obj), ctx))); } return Optional.empty(); }
@Test public void testWaffleShort() throws Exception { ctx.findArgumentFor(Object.class, (short) 2000).get().apply(2, stmt, null); verify(stmt).setShort(2, (short) 2000); }
@Test public void testWaffleLong() throws Exception { ctx.findArgumentFor(Object.class, 3L).get().apply(1, stmt, null); verify(stmt).setLong(1, 3); }
@Test public void testExplicitWaffleString() throws Exception { ctx.findArgumentFor(String.class, I_AM_A_STRING).get().apply(3, stmt, null); verify(stmt).setString(3, I_AM_A_STRING); }
@Test public void testWaffleString() throws Exception { ctx.findArgumentFor(Object.class, I_AM_A_STRING).get().apply(3, stmt, null); verify(stmt).setString(3, I_AM_A_STRING); }
@Test public void testExplicitWaffleLong() throws Exception { ctx.findArgumentFor(Long.class, 3L).get().apply(1, stmt, null); verify(stmt).setLong(1, 3); }
@Test public void testExplicitWaffleShort() throws Exception { ctx.findArgumentFor(short.class, (short) 2000).get().apply(2, stmt, null); verify(stmt).setShort(2, (short) 2000); }
@Test public void testPull88WeirdClassArgumentFactory() { handle.registerArgument(new WeirdClassArgumentFactory()); assertThat(ctx.findArgumentFor(Weird.class, new Weird())) .hasValueSatisfying(a -> assertThat(a).isInstanceOf(WeirdArgument.class)); assertThat(ctx.findArgumentFor(Weird.class, null)) .hasValueSatisfying(a -> assertThat(a).isInstanceOf(WeirdArgument.class)); assertThat(ctx.findArgumentFor(Object.class, new Weird())) .isEmpty(); assertThat(ctx.findArgumentFor(Object.class, null)) .hasValueSatisfying(a -> assertThat(a).isInstanceOf(NullArgument.class)); }
@Test public void testPull88WeirdValueArgumentFactory() { handle.registerArgument(new WeirdValueArgumentFactory()); assertThat(ctx.findArgumentFor(Weird.class, new Weird())) .hasValueSatisfying(a -> assertThat(a).isInstanceOf(WeirdArgument.class)); assertThat(ctx.findArgumentFor(Object.class, new Weird())) .hasValueSatisfying(a -> assertThat(a).isInstanceOf(WeirdArgument.class)); assertThat(ctx.findArgumentFor(Weird.class, null)) .hasValueSatisfying(a -> assertThat(a).isInstanceOf(NullArgument.class)); assertThat(ctx.findArgumentFor(Object.class, null)) .hasValueSatisfying(a -> assertThat(a).isInstanceOf(NullArgument.class)); }
@Test public void findNVarcharArgument() throws Exception { dbRule.getJdbi().useHandle(handle -> { String value = "foo"; PreparedStatement stmt = mock(PreparedStatement.class); handle.getConfig(Arguments.class) .findFor(NVARCHAR_STRING, value) .orElseThrow(IllegalStateException::new) .apply(1, stmt, null); verify(stmt).setNString(1, value); handle.createQuery("no execute") .getContext() .findArgumentFor(NVARCHAR_STRING, value) .orElseThrow(IllegalStateException::new) .apply(2, stmt, null); verify(stmt).setNString(2, value); }); }
@Override public Optional<Argument> find(String name, StatementContext ctx) { if (args.containsKey(name)) { final Object argument = args.get(name); final Class<?> argumentClass = argument == null ? Object.class : argument.getClass(); return ctx.findArgumentFor(argumentClass, argument); } return Optional.empty(); }
Optional<Argument> argument = ctx.findArgumentFor(propertyType, propertyValue);
@Override public Optional<Argument> build(Type type, Object value, ConfigRegistry config) { if (String.class.equals(type)) { return Optional.empty(); } return Optional.of((pos, stmt, ctx) -> { String json = value == null ? null : ctx.getConfig(JsonConfig.class).getJsonMapper().toJson(type, value, ctx); // look for specialized json support first, revert to simple String binding if absent Argument stringBinder = JdbiOptionals.findFirstPresent( () -> ctx.findArgumentFor(QualifiedType.of(String.class).with(Json.class), json), () -> ctx.findArgumentFor(String.class, json)) .orElseThrow(() -> new UnableToCreateStatementException(JSON_NOT_STORABLE)); stringBinder.apply(pos, stmt, ctx); }); } }