From d5daca14eb1ba27c7b1cbba4f274d603dd424c3a Mon Sep 17 00:00:00 2001 From: Simon Kelly Date: Wed, 13 Sep 2023 13:13:47 +0200 Subject: [PATCH] replay actions --- .../services/MenuSessionFactory.java | 41 ++++++++++++------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/src/main/java/org/commcare/formplayer/services/MenuSessionFactory.java b/src/main/java/org/commcare/formplayer/services/MenuSessionFactory.java index bcbd86420b..c8a9576433 100644 --- a/src/main/java/org/commcare/formplayer/services/MenuSessionFactory.java +++ b/src/main/java/org/commcare/formplayer/services/MenuSessionFactory.java @@ -1,7 +1,7 @@ package org.commcare.formplayer.services; import com.google.common.collect.ImmutableMultimap; - +import datadog.trace.api.Trace; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.commcare.core.interfaces.RemoteInstanceFetcher; @@ -9,16 +9,9 @@ import org.commcare.formplayer.objects.SerializableMenuSession; import org.commcare.formplayer.session.MenuSession; import org.commcare.session.CommCareSession; -import org.commcare.suite.model.MenuDisplayable; -import org.commcare.suite.model.RemoteQueryDatum; -import org.commcare.suite.model.SessionDatum; -import org.commcare.suite.model.StackFrameStep; -import org.commcare.util.screen.CommCareSessionException; -import org.commcare.util.screen.EntityScreen; -import org.commcare.util.screen.EntityScreenContext; -import org.commcare.util.screen.MenuScreen; -import org.commcare.util.screen.QueryScreen; -import org.commcare.util.screen.Screen; +import org.commcare.session.SessionFrame; +import org.commcare.suite.model.*; +import org.commcare.util.screen.*; import org.javarosa.core.model.instance.ExternalDataInstance; import org.javarosa.xml.util.InvalidStructureException; import org.javarosa.xml.util.UnfullfilledRequirementsException; @@ -30,11 +23,9 @@ import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; -import java.util.Collection; +import java.util.List; import java.util.Vector; -import datadog.trace.api.Trace; - /** * Class containing logic for accepting a NewSessionRequest and services, * restoring the user, opening the new form, and returning the question list response. @@ -99,13 +90,33 @@ public void rebuildSessionFromFrame(MenuSession menuSession, CaseSearchHelper ca EntityScreen entityScreen = (EntityScreen)screen; entityScreen.initReferences(menuSession.getSessionWrapper()); SessionDatum neededDatum = entityScreen.getSession().getNeededDatum(); + Vector actions = entityScreen.getShortDetail().getCustomActions(entityScreen.getEvalContext()); + outer: for (StackFrameStep step : steps) { - if (step.getId().equals(neededDatum.getDataId())) { + if (step.getType().equals(SessionFrame.STATE_DATUM_VAL) && step.getId().equals(neededDatum.getDataId())) { if (entityScreen.referencesContainStep(step.getValue())) { currentStep = step.getValue(); needsFullInit = ++processedStepsCount == steps.size(); } break; + } else if (step.getType().equals(SessionFrame.STATE_COMMAND_ID) && !actions.isEmpty()) { + for (int i = 0; i < actions.size(); i++) { + Action action = actions.get(i); + if (action.getStackOperations() != null) { + for (StackOperation operation : action.getStackOperations()) { + List commandSteps = operation.getStackFrameSteps().stream() + .filter(s -> s.getType().equals(SessionFrame.STATE_COMMAND_ID)).toList(); + for (StackFrameStep s : commandSteps) { + String value = s.evaluateValue(entityScreen.getEvalContext()); + if (value.equals(step.getId())) { + currentStep = "action " + i; + needsFullInit = ++processedStepsCount == steps.size(); + break outer; + } + } + } + } + } } }