diff --git a/exist-core/src/main/java/org/exist/xquery/VariableDeclaration.java b/exist-core/src/main/java/org/exist/xquery/VariableDeclaration.java
index 2e3d3f9d71..50411ddbd4 100644
--- a/exist-core/src/main/java/org/exist/xquery/VariableDeclaration.java
+++ b/exist-core/src/main/java/org/exist/xquery/VariableDeclaration.java
@@ -214,25 +214,43 @@ public Sequence eval(final Sequence contextSequence, final Item contextItem) thr
try {
context.prologEnter(this);
if (expression.isPresent()) {
+ @Nullable Variable suppliedVar = null;
+ if (isExternal()){
+ if (myModule != null) {
+ if (myModule.isVarSet(qname)){
+ suppliedVar = myModule.resolveVariable(qname);
+ }
+ } else {
+ suppliedVar = context.resolveGlobalVariable(qname);
+ }
+ }
// normal variable declaration or external var with default value
- final Sequence seq = expression.get().eval(contextSequence, null);
final Variable var;
- if (myModule != null) {
- var = myModule.declareVariable(qname, external, seq);
+ if (suppliedVar != null) {
+ // a value was already supplied externally
+ var = suppliedVar;
var.setSequenceType(sequenceType);
var.checkType();
} else {
- var = new VariableImpl(qname);
- var.setExternal(external);
- var.setValue(seq);
- var.setSequenceType(sequenceType);
- var.checkType();
- context.declareGlobalVariable(var);
+ final Sequence seq = expression.get().eval(contextSequence, null);
+ if (myModule != null) {
+ var = myModule.declareVariable(qname, external, seq);
+ var.setSequenceType(sequenceType);
+ var.checkType();
+ } else{
+ var = new VariableImpl(qname);
+ var.setExternal(external);
+ var.setValue(seq);
+ var.setSequenceType(sequenceType);
+ var.checkType();
+ context.declareGlobalVariable(var);
+ }
+
}
if (context.getProfiler().isEnabled()) {
//Note : that we use seq but we return Sequence.EMPTY_SEQUENCE
- context.getProfiler().end(this, "", seq);
+ context.getProfiler().end(this, "", var.getValue());
}
} else {
// external variable without default, try and get its value from the external environment (should have already been set in the global context)
diff --git a/exist-core/src/test/java/org/exist/xmldb/DeclareVariableTest.java b/exist-core/src/test/java/org/exist/xmldb/DeclareVariableTest.java
index 09eb927658..74bd8e1077 100644
--- a/exist-core/src/test/java/org/exist/xmldb/DeclareVariableTest.java
+++ b/exist-core/src/test/java/org/exist/xmldb/DeclareVariableTest.java
@@ -148,4 +148,23 @@ private EXistResourceSet executeQueryWithExternalVariable(final Object value) th
assertEquals(1, resourceSet.getSize());
return resourceSet;
}
+
+ @Test
+ public void declareExternalVariableWithDefaultUsesSuppliedValue() throws XMLDBException {
+ final XQueryService xqueryService = testCollection.getService(XQueryService.class);
+ xqueryService.declareVariable("x", "supplied");
+
+ final String query =
+ "xquery version \"3.1\";\n" +
+ "declare variable $x external := \"default\";\n" +
+ "$x";
+
+ final CompiledExpression compiled = xqueryService.compile(query);
+ try (final EXistResourceSet result = (EXistResourceSet) xqueryService.execute(compiled)) {
+ assertEquals(1, result.getSize());
+ final Resource resource = result.getResource(0);
+ assertNotNull(resource);
+ assertEquals("supplied", resource.getContent());
+ }
+ }
}
diff --git a/extensions/modules/scheduler/pom.xml b/extensions/modules/scheduler/pom.xml
index 51ab9e8f2f..716536a6f4 100644
--- a/extensions/modules/scheduler/pom.xml
+++ b/extensions/modules/scheduler/pom.xml
@@ -126,6 +126,16 @@
+
+
+ src/test/resources
+ false
+
+
+ src/test/resources-filtered
+ true
+
+
@@ -145,6 +155,12 @@
xml-apis
+
+ junit
+ junit
+ test
+
+
\ No newline at end of file
diff --git a/extensions/modules/scheduler/src/main/java/org/exist/xquery/modules/scheduler/DeleteScheduledJob.java b/extensions/modules/scheduler/src/main/java/org/exist/xquery/modules/scheduler/DeleteScheduledJob.java
index 0114a5b724..f1721acdbb 100644
--- a/extensions/modules/scheduler/src/main/java/org/exist/xquery/modules/scheduler/DeleteScheduledJob.java
+++ b/extensions/modules/scheduler/src/main/java/org/exist/xquery/modules/scheduler/DeleteScheduledJob.java
@@ -61,8 +61,6 @@ public class DeleteScheduledJob extends BasicFunction
new FunctionReturnSequenceType( Type.BOOLEAN, Cardinality.EXACTLY_ONE, "a boolean value indicating success or failure on deleting the named job." )
);
- private Scheduler scheduler = null;
-
/**
* DeleteScheduledJob Constructor.
*
@@ -72,8 +70,6 @@ public class DeleteScheduledJob extends BasicFunction
public DeleteScheduledJob( XQueryContext context, FunctionSignature signature )
{
super( context, signature );
-
- scheduler = context.getBroker().getBrokerPool().getScheduler();
}
/**
@@ -99,6 +95,7 @@ public Sequence eval( Sequence[] args, Sequence contextSequence ) throws XPathEx
return( BooleanValue.FALSE );
}
+ final Scheduler scheduler = context.getBroker().getBrokerPool().getScheduler();
return( BooleanValue.valueOf( scheduler.deleteJob( jobName, UserJob.JOB_GROUP ) ) );
}
}
diff --git a/extensions/modules/scheduler/src/main/java/org/exist/xquery/modules/scheduler/ScheduleFunctions.java b/extensions/modules/scheduler/src/main/java/org/exist/xquery/modules/scheduler/ScheduleFunctions.java
index c7eb29954c..148e227a3d 100644
--- a/extensions/modules/scheduler/src/main/java/org/exist/xquery/modules/scheduler/ScheduleFunctions.java
+++ b/extensions/modules/scheduler/src/main/java/org/exist/xquery/modules/scheduler/ScheduleFunctions.java
@@ -257,8 +257,6 @@ public class ScheduleFunctions extends BasicFunction
public ScheduleFunctions( XQueryContext context, FunctionSignature signature )
{
super( context, signature );
-
- scheduler = context.getBroker().getBrokerPool().getScheduler();
}
/**
@@ -352,6 +350,7 @@ else if( isCalledAs( SCHEDULE_JAVA_CRON_JOB ) || isCalledAs( SCHEDULE_JAVA_PERIO
if( job != null ) {
+ final Scheduler scheduler = context.getBroker().getBrokerPool().getScheduler();
if( isCron ) {
//schedule the job