Polish IndexedElementsBinder
This commit is contained in:
		
							parent
							
								
									69234f8c08
								
							
						
					
					
						commit
						60d525e732
					
				| 
						 | 
				
			
			@ -38,12 +38,12 @@ class ArrayBinder extends IndexedElementsBinder<Object> {
 | 
			
		|||
	@Override
 | 
			
		||||
	protected Object bindAggregate(ConfigurationPropertyName name, Bindable<?> target,
 | 
			
		||||
			AggregateElementBinder elementBinder) {
 | 
			
		||||
		IndexedCollectionSupplier collection = new IndexedCollectionSupplier(
 | 
			
		||||
				ArrayList::new);
 | 
			
		||||
		IndexedCollectionSupplier result = new IndexedCollectionSupplier(ArrayList::new);
 | 
			
		||||
		ResolvableType aggregateType = target.getType();
 | 
			
		||||
		ResolvableType elementType = target.getType().getComponentType();
 | 
			
		||||
		bindIndexed(name, elementBinder, collection, target.getType(), elementType);
 | 
			
		||||
		if (collection.wasSupplied()) {
 | 
			
		||||
			List<Object> list = (List<Object>) collection.get();
 | 
			
		||||
		bindIndexed(name, elementBinder, aggregateType, elementType, result);
 | 
			
		||||
		if (result.wasSupplied()) {
 | 
			
		||||
			List<Object> list = (List<Object>) result.get();
 | 
			
		||||
			Object array = Array.newInstance(elementType.resolve(), list.size());
 | 
			
		||||
			for (int i = 0; i < list.size(); i++) {
 | 
			
		||||
				Array.set(array, i, list.get(i));
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -40,14 +40,14 @@ class CollectionBinder extends IndexedElementsBinder<Collection<Object>> {
 | 
			
		|||
			AggregateElementBinder elementBinder) {
 | 
			
		||||
		Class<?> collectionType = (target.getValue() == null ? target.getType().resolve()
 | 
			
		||||
				: List.class);
 | 
			
		||||
		IndexedCollectionSupplier collection = new IndexedCollectionSupplier(
 | 
			
		||||
				() -> CollectionFactory.createCollection(collectionType, 0));
 | 
			
		||||
		ResolvableType elementType = target.getType().asCollection().getGeneric();
 | 
			
		||||
		ResolvableType aggregateType = ResolvableType.forClassWithGenerics(List.class,
 | 
			
		||||
				target.getType().asCollection().getGenerics());
 | 
			
		||||
		bindIndexed(name, elementBinder, collection, aggregateType, elementType);
 | 
			
		||||
		if (collection.wasSupplied()) {
 | 
			
		||||
			return collection.get();
 | 
			
		||||
		ResolvableType elementType = target.getType().asCollection().getGeneric();
 | 
			
		||||
		IndexedCollectionSupplier result = new IndexedCollectionSupplier(
 | 
			
		||||
				() -> CollectionFactory.createCollection(collectionType, 0));
 | 
			
		||||
		bindIndexed(name, elementBinder, aggregateType, elementType, result);
 | 
			
		||||
		if (result.wasSupplied()) {
 | 
			
		||||
			return result.get();
 | 
			
		||||
		}
 | 
			
		||||
		return null;
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -53,13 +53,20 @@ abstract class IndexedElementsBinder<T> extends AggregateBinder<T> {
 | 
			
		|||
		return source == null || source instanceof IterableConfigurationPropertySource;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Bind indexed elements to the supplied collection.
 | 
			
		||||
	 * @param name The name of the property to bind
 | 
			
		||||
	 * @param elementBinder the binder to use for elements
 | 
			
		||||
	 * @param aggregateType the aggregate type, may be a collection or an array
 | 
			
		||||
	 * @param elementType the element type
 | 
			
		||||
	 * @param result the destination for results
 | 
			
		||||
	 */
 | 
			
		||||
	protected final void bindIndexed(ConfigurationPropertyName name,
 | 
			
		||||
			AggregateElementBinder elementBinder, IndexedCollectionSupplier collection,
 | 
			
		||||
			ResolvableType aggregateType, ResolvableType elementType) {
 | 
			
		||||
			AggregateElementBinder elementBinder, ResolvableType aggregateType,
 | 
			
		||||
			ResolvableType elementType, IndexedCollectionSupplier result) {
 | 
			
		||||
		for (ConfigurationPropertySource source : getContext().getSources()) {
 | 
			
		||||
			bindIndexed(source, name, elementBinder, collection, aggregateType,
 | 
			
		||||
					elementType);
 | 
			
		||||
			if (collection.wasSupplied() && collection.get() != null) {
 | 
			
		||||
			bindIndexed(source, name, elementBinder, result, aggregateType, elementType);
 | 
			
		||||
			if (result.wasSupplied() && result.get() != null) {
 | 
			
		||||
				return;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -134,7 +141,7 @@ abstract class IndexedElementsBinder<T> extends AggregateBinder<T> {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * {@link AggregateBinder.AggregateSupplier AggregateSupplier} for an index
 | 
			
		||||
	 * {@link AggregateBinder.AggregateSupplier AggregateSupplier} for an indexed
 | 
			
		||||
	 * collection.
 | 
			
		||||
	 */
 | 
			
		||||
	protected static class IndexedCollectionSupplier
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue