package org.hso.ecommerce.action.cronjob; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Objects; import org.hso.ecommerce.api.SupplierService; import org.hso.ecommerce.api.data.Article; import org.hso.ecommerce.api.data.Supplier; public class ReadSupplierDataAction { private List suppliers; public static class ArticleIdentifier { public final String manufacturer; public final String articleNumber; public ArticleIdentifier(String manufacturer, String articleNumber) { this.manufacturer = manufacturer; this.articleNumber = articleNumber; } @Override public int hashCode() { return Objects.hash(manufacturer, articleNumber); } @Override public boolean equals(Object other) { if (!(other instanceof ArticleIdentifier)) { return false; } ArticleIdentifier otherId = (ArticleIdentifier) other; return this.manufacturer.equals(otherId.manufacturer) && this.articleNumber.equals(otherId.articleNumber); } } public ReadSupplierDataAction(List suppliers) { this.suppliers = suppliers; } public static class Offer { public final org.hso.ecommerce.entities.supplier.Supplier dbSupplier; public final Supplier apiSupplier; public Offer(org.hso.ecommerce.entities.supplier.Supplier dbSupplier, Supplier apiSupplier) { this.dbSupplier = dbSupplier; this.apiSupplier = apiSupplier; } } public static class Result { public final ArrayList supplierData; public final HashMap cheapestOffer; public Result(ArrayList supplierData, HashMap cheapestOffer) { this.supplierData = supplierData; this.cheapestOffer = cheapestOffer; } } public Result finish() { ArrayList suppliers = new ArrayList<>(); HashMap price = new HashMap<>(); HashMap cheapest = new HashMap<>(); for (org.hso.ecommerce.entities.supplier.Supplier supplier : this.suppliers) { SupplierService service = new SupplierService(supplier.apiUrl); Supplier apiSupplier = service.getSupplier(); suppliers.add(apiSupplier); for (Article article : apiSupplier.articles) { ArticleIdentifier identifier = new ArticleIdentifier(article.manufacturer, article.articleNumber); Integer previousPrice = price.get(identifier); if (previousPrice == null || article.pricePerUnitNet < previousPrice) { price.put(identifier, article.pricePerUnitNet); cheapest.put(identifier, new Offer(supplier, apiSupplier)); } } } return new Result(suppliers, cheapest); } }