diff --git a/src/cli/java/org/commcare/util/screen/EntityScreen.java b/src/cli/java/org/commcare/util/screen/EntityScreen.java index 5768fc875d..48991212a7 100755 --- a/src/cli/java/org/commcare/util/screen/EntityScreen.java +++ b/src/cli/java/org/commcare/util/screen/EntityScreen.java @@ -233,8 +233,12 @@ protected void setSession(SessionWrapper session) throws CommCareSessionExceptio if (mShortDetail == null) { throw new CommCareSessionException("Missing detail definition for: " + detailId); } - - evalContext = mSession.getEvaluationContext(); + EntityScreenContext context = getEntityScreenContext(); + String locale = null; + if (context != null) { + locale = context.getLocale(); + } + evalContext = mSession.getEvaluationContextWithLocale(locale); } @Trace diff --git a/src/cli/java/org/commcare/util/screen/EntityScreenContext.java b/src/cli/java/org/commcare/util/screen/EntityScreenContext.java index 4a8f5735d7..562963b7d2 100644 --- a/src/cli/java/org/commcare/util/screen/EntityScreenContext.java +++ b/src/cli/java/org/commcare/util/screen/EntityScreenContext.java @@ -9,6 +9,7 @@ public class EntityScreenContext extends ScreenContext{ private final int mSortIndex; private final int mCasesPerPage; private final String[] mSelectedValues; + private final String mLocale; /** * If requesting a case detail will be a case id, else null. When the case id is given it is used to short @@ -20,13 +21,14 @@ public class EntityScreenContext extends ScreenContext{ private final boolean fuzzySearch; public EntityScreenContext(int offset, String searchText, int sortIndex, int casesPerPage, - String[] selectedValues, String detailSelection, boolean isFuzzySearch) { + String[] selectedValues, String locale, String detailSelection, boolean isFuzzySearch) { super(true); mOffSet = offset; mSearchText = searchText; mSortIndex = sortIndex; mCasesPerPage = casesPerPage == 0 ? DEFAULT_CASES_PER_PAGE : casesPerPage; mSelectedValues = selectedValues; + mLocale = locale; mDetailSelection = detailSelection; fuzzySearch = isFuzzySearch; } @@ -42,6 +44,7 @@ public EntityScreenContext(boolean respectRelevancy) { mSortIndex = 0; mCasesPerPage = DEFAULT_CASES_PER_PAGE; mSelectedValues = null; + mLocale = null; mDetailSelection = null; fuzzySearch = false; } @@ -66,6 +69,10 @@ public String[] getSelectedValues() { return mSelectedValues; } + public String getLocale() { + return mLocale; + } + public String getDetailSelection() { return mDetailSelection; } diff --git a/src/main/java/org/commcare/core/process/CommCareInstanceInitializer.java b/src/main/java/org/commcare/core/process/CommCareInstanceInitializer.java index c810046730..165dbbc4d9 100644 --- a/src/main/java/org/commcare/core/process/CommCareInstanceInitializer.java +++ b/src/main/java/org/commcare/core/process/CommCareInstanceInitializer.java @@ -74,7 +74,7 @@ public ExternalDataInstance getSpecializedExternalDataInstance(ExternalDataInsta @Override @Nonnull - public InstanceRoot generateRoot(ExternalDataInstance instance) { + public InstanceRoot generateRoot(ExternalDataInstance instance, String locale) { String ref = instance.getReference(); if (ref.contains(LedgerInstanceTreeElement.MODEL_NAME)) { return setupLedgerData(instance); @@ -83,7 +83,7 @@ public InstanceRoot generateRoot(ExternalDataInstance instance) { } else if (ref.contains("fixture")) { return setupFixtureData(instance); } else if (instance.getReference().contains("session")) { - return setupSessionData(instance); + return setupSessionData(instance, locale); } else if (ref.startsWith(ExternalDataInstance.JR_REMOTE_REFERENCE)) { return setupExternalDataInstance(instance, ref, SessionFrame.STATE_QUERY_REQUEST); } else if (ref.startsWith(JR_SELECTED_ENTITIES_REFERENCE)) { @@ -236,7 +236,7 @@ protected TreeElement loadFixtureRoot(ExternalDataInstance instance, } } - protected InstanceRoot setupSessionData(ExternalDataInstance instance) { + protected InstanceRoot setupSessionData(ExternalDataInstance instance, String locale) { if (this.mPlatform == null) { throw new RuntimeException("Cannot generate session instance with undeclared platform!"); } @@ -244,7 +244,7 @@ protected InstanceRoot setupSessionData(ExternalDataInstance instance) { TreeElement root = SessionInstanceBuilder.getSessionInstance(sessionWrapper.getFrame(), getDeviceId(), getVersionString(), getCurrentDrift(), u.getUsername(), u.getUniqueId(), - u.getProperties(), getWindowWidth()); + u.getProperties(), getWindowWidth(), locale); root.setParent(instance.getBase()); return new ConcreteInstanceRoot(root); } diff --git a/src/main/java/org/commcare/modern/session/SessionWrapper.java b/src/main/java/org/commcare/modern/session/SessionWrapper.java index 53c205da03..3885a328ef 100644 --- a/src/main/java/org/commcare/modern/session/SessionWrapper.java +++ b/src/main/java/org/commcare/modern/session/SessionWrapper.java @@ -63,10 +63,14 @@ public EvaluationContext getEvaluationContext() { return getEvaluationContext(getIIF()); } + public EvaluationContext getEvaluationContextWithLocale(String locale) { + return getEvaluationContext(getIIF(), locale); + } + @Override public EvaluationContext getRestrictedEvaluationContext(String commandId, Set instancesToInclude) { - return getEvaluationContext(getIIF(), commandId, instancesToInclude); + return getEvaluationContext(getIIF(), commandId, instancesToInclude, null); } @Override @@ -81,7 +85,7 @@ public EvaluationContext getEvaluationContextWithAccumulatedInstances(String com * @return The evaluation context relevant for the provided command id */ public EvaluationContext getEvaluationContext(String commandId) { - return getEvaluationContext(getIIF(), commandId, null); + return getEvaluationContext(getIIF(), commandId, null, null); } public CommCareInstanceInitializer getIIF() { diff --git a/src/main/java/org/commcare/session/CommCareSession.java b/src/main/java/org/commcare/session/CommCareSession.java index 76b5cb7bcd..312881e973 100644 --- a/src/main/java/org/commcare/session/CommCareSession.java +++ b/src/main/java/org/commcare/session/CommCareSession.java @@ -614,7 +614,11 @@ public void clearAllState() { * @return Evaluation context for current session state */ public EvaluationContext getEvaluationContext(InstanceInitializationFactory iif) { - return this.getEvaluationContext(iif, getCommand(), null); + return this.getEvaluationContext(iif, getCommand(), null, null); + } + + public EvaluationContext getEvaluationContext(InstanceInitializationFactory iif, String locale) { + return this.getEvaluationContext(iif, getCommand(), null, locale); } /** @@ -626,7 +630,8 @@ public EvaluationContext getEvaluationContext(InstanceInitializationFactory iif) */ public EvaluationContext getEvaluationContext(InstanceInitializationFactory iif, String command, - Set instancesToInclude) { + Set instancesToInclude, + String locale) { if (command == null) { return new EvaluationContext(null); } @@ -661,7 +666,7 @@ public EvaluationContext getEvaluationContext(InstanceInitializationFactory iif, for (Enumeration en = instancesInScope.keys(); en.hasMoreElements(); ) { String key = (String)en.nextElement(); - instancesInScope.put(key, instancesInScope.get(key).initialize(iif, key)); + instancesInScope.put(key, instancesInScope.get(key).initialize(iif, key, locale)); } addInstancesFromFrame(instancesInScope, iif); diff --git a/src/main/java/org/commcare/session/SessionInstanceBuilder.java b/src/main/java/org/commcare/session/SessionInstanceBuilder.java index 060677d9bd..a638f88114 100644 --- a/src/main/java/org/commcare/session/SessionInstanceBuilder.java +++ b/src/main/java/org/commcare/session/SessionInstanceBuilder.java @@ -17,11 +17,12 @@ public class SessionInstanceBuilder { public static TreeElement getSessionInstance(SessionFrame frame, String deviceId, String appversion, long drift, String username, String userId, - Hashtable userFields, String windowWidth) { + Hashtable userFields, String windowWidth, + String applanguage) { TreeElement sessionRoot = new TreeElement("session", 0); addSessionNavData(sessionRoot, frame); - addMetadata(sessionRoot, deviceId, appversion, username, userId, drift, windowWidth); + addMetadata(sessionRoot, deviceId, appversion, username, userId, drift, windowWidth, applanguage); addUserProperties(sessionRoot, userFields); return sessionRoot; @@ -88,7 +89,8 @@ private static String getCalloutSearchResultCount(StackFrameStep step) { private static void addMetadata(TreeElement sessionRoot, String deviceId, String appversion, String username, - String userId, long drift, String windowWidth) { + String userId, long drift, String windowWidth, + String applanguage) { TreeElement sessionMeta = new TreeElement("context", 0); addData(sessionMeta, "deviceid", deviceId); @@ -97,6 +99,7 @@ private static void addMetadata(TreeElement sessionRoot, String deviceId, addData(sessionMeta, "userid", userId); addData(sessionMeta, "drift", String.valueOf(drift)); addData(sessionMeta, "window_width", windowWidth); + addData(sessionMeta, "applanguage", applanguage); sessionRoot.addChild(sessionMeta); } diff --git a/src/main/java/org/javarosa/core/model/FormDef.java b/src/main/java/org/javarosa/core/model/FormDef.java index 30b86e31b2..167b02ff9c 100755 --- a/src/main/java/org/javarosa/core/model/FormDef.java +++ b/src/main/java/org/javarosa/core/model/FormDef.java @@ -1451,7 +1451,7 @@ public void initialize(boolean newInstance, boolean isCompletedInstance, Instanc for (Enumeration en = formInstances.keys(); en.hasMoreElements(); ) { String instanceId = (String)en.nextElement(); DataInstance instance = formInstances.get(instanceId); - formInstances.put(instanceId, instance.initialize(factory, instanceId)); + formInstances.put(instanceId, instance.initialize(factory, instanceId, null)); } setEvaluationContext(this.exprEvalContext); diff --git a/src/main/java/org/javarosa/core/model/instance/DataInstance.java b/src/main/java/org/javarosa/core/model/instance/DataInstance.java index 724f2e7cd7..b9ab8c9260 100644 --- a/src/main/java/org/javarosa/core/model/instance/DataInstance.java +++ b/src/main/java/org/javarosa/core/model/instance/DataInstance.java @@ -279,7 +279,7 @@ public void setID(int recordid) { this.recordid = recordid; } - public abstract DataInstance initialize(InstanceInitializationFactory initializer, String instanceId); + public abstract DataInstance initialize(InstanceInitializationFactory initializer, String instanceId, String locale); public CacheHost getCacheHost() { return mCacheHost; diff --git a/src/main/java/org/javarosa/core/model/instance/ExternalDataInstance.java b/src/main/java/org/javarosa/core/model/instance/ExternalDataInstance.java index 93a25493fd..e11d7c89ed 100644 --- a/src/main/java/org/javarosa/core/model/instance/ExternalDataInstance.java +++ b/src/main/java/org/javarosa/core/model/instance/ExternalDataInstance.java @@ -137,15 +137,19 @@ public void writeExternal(DataOutputStream out) throws IOException { } @Override - public DataInstance initialize(InstanceInitializationFactory initializer, String instanceId) { + public DataInstance initialize(InstanceInitializationFactory initializer, String instanceId, String locale) { base = new InstanceBase(instanceId); - InstanceRoot instanceRoot = initializer.generateRoot(this); + InstanceRoot instanceRoot = initializer.generateRoot(this, locale); // this indirectly calls `this.copyFromSource` via the InstanceRoot so that we call the // correct method based on the type instanceRoot.setupNewCopy(this); return initializer.getSpecializedExternalDataInstance(this); } + public DataInstance initialize(InstanceInitializationFactory initializer, String instanceId) { + return initialize(initializer, instanceId, null); + } + public void copyFromSource(InstanceRoot instanceRoot) { root = instanceRoot.getRoot(); base.setChild(root); diff --git a/src/main/java/org/javarosa/core/model/instance/FormInstance.java b/src/main/java/org/javarosa/core/model/instance/FormInstance.java index fef23d147d..462a6b098f 100644 --- a/src/main/java/org/javarosa/core/model/instance/FormInstance.java +++ b/src/main/java/org/javarosa/core/model/instance/FormInstance.java @@ -245,13 +245,17 @@ public static boolean isHomogeneous(TreeElement a, TreeElement b) { } @Override - public DataInstance initialize(InstanceInitializationFactory initializer, String instanceId) { + public DataInstance initialize(InstanceInitializationFactory initializer, String instanceId, String locale) { this.instanceid = instanceId; root.setInstanceName(instanceId); return this; } + public DataInstance initialize(InstanceInitializationFactory initializer, String instanceId) { + return initialize(initializer, instanceId, null); + } + @Override public String[] getMetaDataFields() { return new String[]{META_XMLNS, META_ID}; diff --git a/src/main/java/org/javarosa/core/model/instance/InstanceInitializationFactory.java b/src/main/java/org/javarosa/core/model/instance/InstanceInitializationFactory.java index f22c9627a4..47f5bac03f 100644 --- a/src/main/java/org/javarosa/core/model/instance/InstanceInitializationFactory.java +++ b/src/main/java/org/javarosa/core/model/instance/InstanceInitializationFactory.java @@ -17,7 +17,7 @@ public ExternalDataInstance getSpecializedExternalDataInstance(ExternalDataInsta } @Nonnull - public InstanceRoot generateRoot(ExternalDataInstance instance) { + public InstanceRoot generateRoot(ExternalDataInstance instance, String locale) { return ConcreteInstanceRoot.NULL; } } diff --git a/src/test/java/org/commcare/backend/suite/model/test/QueryModelTests.java b/src/test/java/org/commcare/backend/suite/model/test/QueryModelTests.java index a71191b5cf..9daf61d4e0 100644 --- a/src/test/java/org/commcare/backend/suite/model/test/QueryModelTests.java +++ b/src/test/java/org/commcare/backend/suite/model/test/QueryModelTests.java @@ -78,12 +78,12 @@ public void testScreenCreatesVirtualInstance() throws Exception { // test loading instance with new ref ExternalDataInstance instance = new ExternalDataInstance("jr://instance/search-input/registry1", "custom-id"); - Assert.assertNotNull(session.getIIF().generateRoot(instance).getRoot()); + Assert.assertNotNull(session.getIIF().generateRoot(instance, null).getRoot()); // test that we can still load instances using the legacy ref ExternalDataInstance legacyInstance = new ExternalDataInstance("jr://instance/search-input", "search-input:registry1"); - Assert.assertNotNull(session.getIIF().generateRoot(legacyInstance).getRoot()); + Assert.assertNotNull(session.getIIF().generateRoot(legacyInstance, null).getRoot()); } @NotNull diff --git a/src/test/java/org/commcare/test/utilities/TestInstanceInitializer.java b/src/test/java/org/commcare/test/utilities/TestInstanceInitializer.java index 00e83a8997..6ed5c96e99 100644 --- a/src/test/java/org/commcare/test/utilities/TestInstanceInitializer.java +++ b/src/test/java/org/commcare/test/utilities/TestInstanceInitializer.java @@ -31,7 +31,7 @@ public ExternalDataInstance getSpecializedExternalDataInstance(ExternalDataInsta } @Override - public InstanceRoot generateRoot(ExternalDataInstance instance) { + public InstanceRoot generateRoot(ExternalDataInstance instance, String locale) { String ref = instance.getReference(); if (ref.contains(CaseInstanceTreeElement.MODEL_NAME)) { CaseInstanceTreeElement root = new CaseInstanceTreeElement(instance.getBase(), sandbox.getCaseStorage()); diff --git a/src/test/java/org/javarosa/core/model/instance/test/DummyInstanceInitializationFactory.java b/src/test/java/org/javarosa/core/model/instance/test/DummyInstanceInitializationFactory.java index c70ba9b2ab..07eacf0c27 100644 --- a/src/test/java/org/javarosa/core/model/instance/test/DummyInstanceInitializationFactory.java +++ b/src/test/java/org/javarosa/core/model/instance/test/DummyInstanceInitializationFactory.java @@ -18,7 +18,7 @@ public ExternalDataInstance getSpecializedExternalDataInstance(ExternalDataInsta return instance; } @Override - public InstanceRoot generateRoot(ExternalDataInstance instance) { + public InstanceRoot generateRoot(ExternalDataInstance instance, String locale) { throw new RuntimeException("Loading external instances isn't supported " + "using this instance initialization factory."); } diff --git a/src/translate/java/org/javarosa/engine/MockupProviderFactory.java b/src/translate/java/org/javarosa/engine/MockupProviderFactory.java index 4a2eb209c6..5c09a0e33a 100644 --- a/src/translate/java/org/javarosa/engine/MockupProviderFactory.java +++ b/src/translate/java/org/javarosa/engine/MockupProviderFactory.java @@ -29,7 +29,7 @@ public ExternalDataInstance getSpecializedExternalDataInstance(ExternalDataInsta } @Override - public InstanceRoot generateRoot(ExternalDataInstance instance) { + public InstanceRoot generateRoot(ExternalDataInstance instance, String locale) { String ref = instance.getReference(); if(instances.containsKey(ref)) {