/*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.skife.jdbi.v2;
import org.skife.jdbi.v2.tweak.Argument;
import org.skife.jdbi.v2.tweak.ArgumentFactory;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
Foreman will select best ArgumentFactory to use from all the registered
ArgumentFactory instances and return an Argument created from that
ArgumentFactory.
/**
* Foreman will select best ArgumentFactory to use from all the registered
* ArgumentFactory instances and return an Argument created from that
* ArgumentFactory.
*/
public class Foreman
{
private final List<ArgumentFactory> factories = new CopyOnWriteArrayList<ArgumentFactory>();
Foreman()
{
factories.add(BUILT_INS);
}
Foreman(List<ArgumentFactory> factories)
{
this.factories.addAll(factories);
}
Params: - expectedType – The type to use for matching against bound ArgumentFactory instances
- boundValue – The value to be bound by the created Argument
- ctx – the relevant StatementContext
Returns:
/**
*
* @param expectedType The type to use for matching against bound ArgumentFactory instances
* @param boundValue The value to be bound by the created Argument
* @param ctx the relevant StatementContext
* @return
*/
public Argument createArgument(Class<?> expectedType, Object boundValue, StatementContext ctx)
{
ArgumentFactory candidate = null;
for (int i = factories.size() - 1; i >= 0; i--) {
ArgumentFactory factory = factories.get(i);
if (factory.accepts(expectedType, boundValue, ctx)) {
return factory.build(expectedType, boundValue, ctx);
}
// Fall back to any factory accepting Object if necessary but
// prefer any more specific factory first.
if (candidate == null && factory.accepts(Object.class, boundValue, ctx)) {
candidate = factory;
}
}
if (candidate != null) {
return candidate.build(Object.class, boundValue, ctx);
}
throw new IllegalStateException("Unbindable argument passed: " + String.valueOf(boundValue));
}
private static final ArgumentFactory BUILT_INS = new BuiltInArgumentFactory();
void register(ArgumentFactory<?> argumentFactory)
{
factories.add(argumentFactory);
}
Foreman createChild()
{
return new Foreman(factories);
}
}