net.scran24.user.client.survey.flat.rules.ShowHomeRecipeServingsPrompt.java Source code

Java tutorial

Introduction

Here is the source code for net.scran24.user.client.survey.flat.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 net.scran24.user.client.survey.flat.rules;

import static org.workcraft.gwt.shared.client.CollectionUtils.forall;
import net.scran24.user.client.survey.flat.Prompt;
import net.scran24.user.client.survey.flat.PromptRule;
import net.scran24.user.client.survey.flat.PromptUtil;
import net.scran24.user.client.survey.flat.SelectionMode;
import net.scran24.user.client.survey.prompts.MealOperation;
import net.scran24.user.client.survey.prompts.messages.PromptMessages;
import net.scran24.user.client.survey.prompts.simple.FractionalQuantityPrompt;
import net.scran24.user.shared.CompoundFood;
import net.scran24.user.shared.TemplateFood;
import net.scran24.user.shared.EncodedFood;
import net.scran24.user.shared.FoodEntry;
import net.scran24.user.shared.Meal;
import net.scran24.user.shared.MissingFood;
import net.scran24.user.shared.RawFood;
import net.scran24.user.shared.Recipe;
import net.scran24.user.shared.WithPriority;

import org.pcollections.client.PSet;
import org.workcraft.gwt.shared.client.Function1;
import org.workcraft.gwt.shared.client.Option;
import org.workcraft.gwt.shared.client.Pair;

import com.google.gwt.core.client.GWT;
import com.google.gwt.safehtml.shared.SafeHtmlUtils;

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.updateFood(data.right.foodIndex(food),
                                            new Function1<FoodEntry, FoodEntry>() {
                                                @Override
                                                public FoodEntry apply(FoodEntry argument) {
                                                    return argument.withCustomDataField(Recipe.SERVINGS_NUMBER_KEY,
                                                            Double.toString(servings));
                                                }
                                            });

                                }
                            }));
                } 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);
    }
}