uk.ac.ncl.openlab.intake24.client.survey.rules.ShowHomeRecipeServingsPrompt.java Source code

Java tutorial

Introduction

Here is the source code for uk.ac.ncl.openlab.intake24.client.survey.rules.ShowHomeRecipeServingsPrompt.java

Source

/*
This file is part of Intake24.
    
 Crown copyright, 2012, 2013, 2014.
    
This software is licensed under the Open Government Licence 3.0:
    
http://www.nationalarchives.gov.uk/doc/open-government-licence/
*/

package uk.ac.ncl.openlab.intake24.client.survey.rules;

import com.google.gwt.core.client.GWT;
import com.google.gwt.safehtml.shared.SafeHtmlUtils;
import org.pcollections.PSet;
import org.workcraft.gwt.shared.client.*;
import uk.ac.ncl.openlab.intake24.client.BrowserConsole;
import uk.ac.ncl.openlab.intake24.client.survey.*;
import uk.ac.ncl.openlab.intake24.client.survey.prompts.MealOperation;
import uk.ac.ncl.openlab.intake24.client.survey.prompts.messages.PromptMessages;
import uk.ac.ncl.openlab.intake24.client.survey.prompts.simple.FractionalQuantityPrompt;

import static org.workcraft.gwt.shared.client.CollectionUtils.foldl;
import static org.workcraft.gwt.shared.client.CollectionUtils.forall;

public class ShowHomeRecipeServingsPrompt implements PromptRule<Pair<FoodEntry, Meal>, MealOperation> {
    private final PromptMessages messages = GWT.create(PromptMessages.class);

    @Override
    public Option<Prompt<Pair<FoodEntry, Meal>, MealOperation>> apply(final Pair<FoodEntry, Meal> data,
            SelectionMode selectionType, final PSet<String> surveyFlags) {
        return data.left.accept(new FoodEntry.Visitor<Option<Prompt<Pair<FoodEntry, Meal>, MealOperation>>>() {

            private Option<Prompt<Pair<FoodEntry, Meal>, MealOperation>> getPromptIfApplicable(
                    final FoodEntry food) {
                if (forall(Meal.linkedFoods(data.right.foods, data.left), FoodEntry.isPortionSizeComplete)
                        && (!food.customData.containsKey(Recipe.SERVINGS_NUMBER_KEY))) {

                    FractionalQuantityPrompt quantityPrompt = new FractionalQuantityPrompt(
                            SafeHtmlUtils.fromSafeConstant(messages
                                    .homeRecipe_servingsPromptText(SafeHtmlUtils.htmlEscape(food.description()))),
                            messages.homeRecipe_servingsButtonLabel());

                    return Option.some(
                            PromptUtil.asExtendedFoodPrompt(quantityPrompt, new Function1<Double, MealOperation>() {
                                @Override
                                public MealOperation apply(final Double servings) {

                                    return MealOperation.update(new Function1<Meal, Meal>() {
                                        @Override
                                        public Meal apply(Meal meal) {

                                            int compoundIndex = meal.foodIndex(data.left);

                                            Meal withUpdatedCompoundFood = meal.updateFood(compoundIndex,
                                                    data.left.withCustomDataField(Recipe.SERVINGS_NUMBER_KEY,
                                                            Double.toString(servings)));

                                            return foldl(Meal.linkedFoods(meal.foods, data.left),
                                                    withUpdatedCompoundFood,
                                                    new Function2<Meal, FoodEntry, Meal>() {
                                                        @Override
                                                        public Meal apply(Meal meal, FoodEntry food) {

                                                            if (food.isEncoded()) {
                                                                EncodedFood encodedFood = food.asEncoded();
                                                                CompletedPortionSize updatedPs = encodedFood
                                                                        .completedPortionSize()
                                                                        .multiply(1.0 / servings);
                                                                return meal.updateFood(meal.foodIndex(food),
                                                                        encodedFood.withPortionSize(
                                                                                new Either.Right(updatedPs)));
                                                            } else {
                                                                return meal;
                                                            }
                                                        }
                                                    });
                                        }
                                    });
                                }
                            }));
                } else {
                    return Option.none();
                }
            }

            @Override
            public Option<Prompt<Pair<FoodEntry, Meal>, MealOperation>> visitRaw(RawFood food) {
                return Option.none();
            }

            @Override
            public Option<Prompt<Pair<FoodEntry, Meal>, MealOperation>> visitEncoded(EncodedFood food) {
                return Option.none();
            }

            @Override
            public Option<Prompt<Pair<FoodEntry, Meal>, MealOperation>> visitTemplate(final TemplateFood food) {
                if (food.isTemplateComplete())
                    return getPromptIfApplicable(food);
                else
                    return Option.none();
            }

            @Override
            public Option<Prompt<Pair<FoodEntry, Meal>, MealOperation>> visitMissing(MissingFood food) {
                return Option.none();
            }

            @Override
            public Option<Prompt<Pair<FoodEntry, Meal>, MealOperation>> visitCompound(CompoundFood food) {
                return getPromptIfApplicable(food);
            }

        });
    }

    @Override
    public String toString() {
        return "Ask how many people did the homemade dish serve";
    }

    public static WithPriority<PromptRule<Pair<FoodEntry, Meal>, MealOperation>> withPriority(int priority) {
        return new WithPriority<PromptRule<Pair<FoodEntry, Meal>, MealOperation>>(
                new ShowHomeRecipeServingsPrompt(), priority);
    }
}