All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.javamoney.moneta.convert.HistoricConversionQueryBuilder Maven / Gradle / Ivy

There is a newer version: 1.4.4
Show newest version
/*
  Copyright (c) 2012, 2015, Credit Suisse (Anatole Tresch), Werner Keil and others by the @author tag.

  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.javamoney.moneta.convert;

import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;
import java.util.function.Predicate;
import java.util.stream.Stream;

import javax.money.CurrencyUnit;
import javax.money.convert.ConversionQuery;
import javax.money.convert.ConversionQueryBuilder;
/**
 * Class builder to find exchange rate from historical.
 * @see HistoricConversionQueryBuilder#of(CurrencyUnit)
 * @author Otavio Santana
 * @deprecated
 */
@Deprecated
public final class HistoricConversionQueryBuilder {

	private final ConversionQueryBuilder conversionQueryBuilder;

	private HistoricConversionQueryBuilder(ConversionQueryBuilder conversionQuery) {
		this.conversionQueryBuilder = conversionQuery;
	}

	/**
	 *Create a {@link HistoricConversionQueryBuilder} from currency
	 * @param currencyUnit to be used in term currency.
	 * @return a HistoricConversionQuery from currency
	 * @throws NullPointerException when currency is null
	 */
	public static HistoricConversionQueryBuilder of(CurrencyUnit currencyUnit) {
		Objects.requireNonNull(currencyUnit, "Currency is required");
		return new HistoricConversionQueryBuilder(ConversionQueryBuilder.of()
                .setTermCurrency(currencyUnit));
	}

	/**
	 * Set a specify day on {@link HistoricConversionQueryBuilder}
	 * @param localDate the target date
	 * @return this
	 * @throws NullPointerException when {@link LocalDate} is null
	 */
	public HistoricConversionQueryWithDayBuilder withDay(LocalDate localDate) {
		Objects.requireNonNull(localDate);
		conversionQueryBuilder.set(LocalDate.class, localDate);

		return new HistoricConversionQueryWithDayBuilder(conversionQueryBuilder);
	}

	/**
	 *Set days on {@link HistoricConversionQueryBuilder} to be used on ExchangeRateProvider,
	 *these parameters will sort to most recent to be more priority than other.
	 * @param localDates the target dates
	 * @return this
	 * @throws IllegalArgumentException when is empty or the parameter has an null value
	 */
	@SafeVarargs
	public final HistoricConversionQueryWithDayBuilder withDays(LocalDate... localDates) {
		Objects.requireNonNull(localDates);
		if(localDates.length == 0) {
			throw new IllegalArgumentException("LocalDates are required");
		}

		if(Stream.of(localDates).anyMatch(Predicate.isEqual(null))) {
			throw new IllegalArgumentException("LocalDates cannot be null");
		}
		Comparator comparator = Comparator.naturalOrder();
		LocalDate[] sortedDates =  Stream.of(localDates).sorted(comparator.reversed()).toArray(LocalDate[]::new);
		conversionQueryBuilder.set(LocalDate[].class, sortedDates);

		return new HistoricConversionQueryWithDayBuilder(conversionQueryBuilder);
	}

	/**
	 *Set days on {@link HistoricConversionQueryBuilder} to be used on ExchangeRateProvider,
	 *these parameters, different of  {@link HistoricConversionQueryBuilder#withDays(LocalDate...)}, consider the order already defined.
	 * @param localDates the target dates
	 * @return this
	 * @throws IllegalArgumentException when is empty or the parameter has an null value
	 */
	@SafeVarargs
	public final HistoricConversionQueryWithDayBuilder withDaysPriorityDefined(LocalDate... localDates) {
		Objects.requireNonNull(localDates);
		if(localDates.length == 0) {
			throw new IllegalArgumentException("LocalDates are required");
		}

		if(Stream.of(localDates).anyMatch(Predicate.isEqual(null))) {
			throw new IllegalArgumentException("LocalDates cannot be null");
		}
		conversionQueryBuilder.set(LocalDate[].class, localDates);

		return new HistoricConversionQueryWithDayBuilder(conversionQueryBuilder);
	}

	/**
	 * Set the period of days on {@link HistoricConversionQueryBuilder}
	 *  to be used on ExchangeRateProvider,
	 * @param begin the start date
	 * @param end the end date
	 * @return this;
	 * 

Example:

*
	 * {@code
	 *LocalDate today = LocalDate.parse("2015-04-03");
	 *LocalDate yesterday = today.minusDays(1);
	 *LocalDate tomorrow = today.plusDays(1);
	 *ConversionQuery query = HistoricConversionQueryBuilder.of(real).onDaysBetween(yesterday, tomorrow).build();//the query with new LocalDate[] {tomorrow, today, yesterday}
	 * }
	 * 
* @throws NullPointerException when either begin or end is null * @throws IllegalArgumentException when the begin is bigger than end */ public final HistoricConversionQueryWithDayBuilder withDaysBetween(LocalDate begin, LocalDate end) { Objects.requireNonNull(begin); Objects.requireNonNull(end); if(end.isBefore(begin)) { throw new IllegalArgumentException("The end period should be bigger than the begin period."); } int days = (int) ChronoUnit.DAYS.between(begin, end); List dates = new ArrayList<>(); for(int index = days; index >= 0; index--) { dates.add(begin.plusDays(index)); } conversionQueryBuilder.set(LocalDate[].class, dates.toArray(new LocalDate[dates.size()])); return new HistoricConversionQueryWithDayBuilder(conversionQueryBuilder); } /** * Create the {@link ConversionQuery} just with {@link CurrencyUnit}, to term currency, already defined. * @return the conversion query */ public ConversionQuery build() { return conversionQueryBuilder.build(); } @Override public String toString() { String sb = HistoricConversionQueryBuilder.class.getName() + '{' + " conversionQueryBuilder: " + conversionQueryBuilder + '}'; return sb; } public class HistoricConversionQueryWithDayBuilder { private final ConversionQueryBuilder conversionQueryBuilder; HistoricConversionQueryWithDayBuilder( ConversionQueryBuilder conversionQueryBuilder) { this.conversionQueryBuilder = conversionQueryBuilder; } /** * Create the {@link ConversionQuery} with {@link LocalDate} and {@link CurrencyUnit} to term currency already defined. * @return the conversion query */ public ConversionQuery build() { return conversionQueryBuilder.build(); } @Override public String toString() { String sb = HistoricConversionQueryWithDayBuilder.class.getName() + '{' + " conversionQueryBuilder: " + conversionQueryBuilder + '}'; return sb; } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy