package com.mousetech.gourmetj.utils; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.util.List; import org.apache.commons.lang3.StringUtils; import org.primefaces.model.DefaultStreamedContent; import org.primefaces.model.StreamedContent; import org.primefaces.util.SerializableSupplier; import com.mousetech.gourmetj.ShopIngredient; /** * Construct a Primefaces file output content for an ingredient * list in YAML format. * @see ShoppingListBean * * @author timh * @since Jan 15, 2022 */ public class YamlShoppingList { /** * Create "file" to download in YAML format * @param ingredientList Ingredient list to format * @return Http response for file download */ public static StreamedContent createDownload( List ingredientList) { StreamedContent file; ByteArrayOutputStream ary = new ByteArrayOutputStream(); PrintWriter wtr = new PrintWriter(ary); wtr.println("---"); formatContent(wtr, ingredientList); wtr.close(); InputStream airy = new ByteArrayInputStream(ary.toByteArray()); file = DefaultStreamedContent. builder().contentEncoding("text/text") .name("shopping_list.yml") .stream(() -> airy) .build(); return file; } /** * Output line items in the ingredient list with topics for * each Shopping Category. * * @param wtr Output Writer * @param ingredientList Ingredient list to output. */ private static void formatContent(PrintWriter wtr, List ingredientList) { String oldShopcat = null; for (ShopIngredient ing : ingredientList) { String newShopcat = ing.getShopCat(); if (StringUtils.isBlank(newShopcat)) { newShopcat = "Unassigned"; } if ( ing.isInPantry()) { // Don't put pantry items in list. continue; } if (!StringUtils.equals(newShopcat, oldShopcat)) { wtr.println(newShopcat + ":"); oldShopcat = newShopcat; } wtr.print(" - "); String displa = ing.getDisplayAmount(); wtr.print(displa); if (!displa.isBlank()) { wtr.print(' '); } String unit = ing.getUnit(); if (StringUtils.isNotBlank(unit)) { wtr.print(unit); wtr.print(' '); } wtr.println(ing.getItem()); } } }