/*
* 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.jdbi.v3.core.collector;
import java.lang.reflect.Type;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.stream.Collector;
import org.jdbi.v3.core.config.JdbiConfig;
Registry of collector factories.
Contains a set of collector factories, registered by the application.
/**
* Registry of collector factories.
* Contains a set of collector factories, registered by the application.
*/
public class JdbiCollectors implements JdbiConfig<JdbiCollectors> {
private final List<CollectorFactory> factories = new CopyOnWriteArrayList<>();
public JdbiCollectors() {
// TODO move to BuiltInSupportPlugin
register(new MapCollectorFactory());
register(new OptionalCollectorFactory());
register(new ListCollectorFactory());
register(new SetCollectorFactory());
register(new OptionalPrimitiveCollectorFactory());
register(new ArrayCollectorFactory());
register(new EnumSetCollectorFactory());
}
private JdbiCollectors(JdbiCollectors that) {
factories.addAll(that.factories);
}
public JdbiCollectors register(CollectorFactory factory) {
factories.add(0, factory);
return this;
}
Obtain a collector for the given type.
Params: - containerType – the container type.
Returns: a Collector for the given container type, or empty null if no collector is registered for the given type.
/**
* Obtain a collector for the given type.
*
* @param containerType the container type.
* @return a Collector for the given container type, or empty null if no collector is registered for the given type.
*/
public Optional<Collector<?, ?, ?>> findFor(Type containerType) {
return findFactoryFor(containerType)
.map(f -> f.build(containerType));
}
Returns the element type for the given container type.
Params: - containerType – the container type.
Returns: the element type for the given container type, if available.
/**
* Returns the element type for the given container type.
*
* @param containerType the container type.
* @return the element type for the given container type, if available.
*/
public Optional<Type> findElementTypeFor(Type containerType) {
return findFactoryFor(containerType)
.flatMap(f -> f.elementType(containerType));
}
private Optional<CollectorFactory> findFactoryFor(Type containerType) {
return factories.stream()
.filter(f -> f.accepts(containerType))
.findFirst();
}
@Override
public JdbiCollectors createCopy() {
return new JdbiCollectors(this);
}
}