Skip to content

Commit b58fc1b

Browse files
committed
[bugfix] fn:available-environment-variables and fn:environment-variable should be deterministic within the execution scope
1 parent 6f7157b commit b58fc1b

File tree

2 files changed

+12
-10
lines changed

2 files changed

+12
-10
lines changed

exist-core/src/main/java/org/exist/xquery/XQueryContext.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@
5151
import com.evolvedbinary.j8fu.function.QuadFunctionE;
5252
import com.evolvedbinary.j8fu.tuple.Tuple2;
5353
import com.ibm.icu.text.Collator;
54+
import io.lacuna.bifurcan.IMap;
55+
import io.lacuna.bifurcan.LinearMap;
5456
import it.unimi.dsi.fastutil.Hash;
5557
import it.unimi.dsi.fastutil.objects.*;
5658
import net.jcip.annotations.Immutable;
@@ -372,7 +374,7 @@ public class XQueryContext implements BinaryValueManager, Context {
372374
protected Profiler profiler;
373375

374376
//For holding the environment variables
375-
private Map<String, String> envs;
377+
private IMap<String, String> envs;
376378

377379
private ContextUpdateListener updateListener = null;
378380

@@ -2733,9 +2735,9 @@ public void resolveForwardReferences() throws XPathException {
27332735
*
27342736
* @return Map of environment variables
27352737
*/
2736-
public Map<String, String> getEnvironmentVariables() {
2738+
public io.lacuna.bifurcan.IMap<String, String> getEnvironmentVariables() {
27372739
if (envs == null) {
2738-
envs = System.getenv();
2740+
envs = io.lacuna.bifurcan.Map.from(System.getenv());
27392741
}
27402742
return envs;
27412743
}

exist-core/src/main/java/org/exist/xquery/functions/fn/FunEnvironment.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@
2121
*/
2222
package org.exist.xquery.functions.fn;
2323

24-
import java.util.Map;
25-
24+
import io.lacuna.bifurcan.IMap;
25+
import io.lacuna.bifurcan.ISet;
2626
import org.apache.logging.log4j.LogManager;
2727
import org.apache.logging.log4j.Logger;
2828
import org.exist.dom.QName;
@@ -69,7 +69,7 @@ public FunEnvironment(final XQueryContext context, final FunctionSignature signa
6969
}
7070

7171
@Override
72-
public Sequence eval(Sequence[] args, Sequence contextSequence) throws XPathException {
72+
public Sequence eval(final Sequence[] args, final Sequence contextSequence) throws XPathException {
7373

7474
if (!context.getSubject().hasDbaRole()) {
7575
final String txt = "Permission denied, calling user '" + context.getSubject().getName() + "' must be a DBA to call this function.";
@@ -81,9 +81,9 @@ public Sequence eval(Sequence[] args, Sequence contextSequence) throws XPathExce
8181

8282
final Sequence result = new ValueSequence();
8383

84-
final Map<String, String> env = context.getEnvironmentVariables();
85-
for (final String key : env.keySet()) {
86-
result.add(new StringValue(key));
84+
final IMap<String, String> environmentVariables = context.getEnvironmentVariables();
85+
for (final String environmentVariableName : environmentVariables.keys()) {
86+
result.add(new StringValue(environmentVariableName));
8787
}
8888

8989
return result;
@@ -96,7 +96,7 @@ public Sequence eval(Sequence[] args, Sequence contextSequence) throws XPathExce
9696

9797
final String parameter = args[0].itemAt(0).getStringValue();
9898

99-
final String value = context.getEnvironmentVariables().get(parameter);
99+
final String value = context.getEnvironmentVariables().get(parameter, null);
100100
if (value == null) {
101101
return Sequence.EMPTY_SEQUENCE;
102102
}

0 commit comments

Comments
 (0)