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..df82c6888a 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 ) {
+ Scheduler scheduler = context.getBroker().getBrokerPool().getScheduler();
if( isCron ) {
//schedule the job
diff --git a/extensions/modules/scheduler/src/test/java/xquery/modules/scheduler/SchedulerTests.java b/extensions/modules/scheduler/src/test/java/xquery/modules/scheduler/SchedulerTests.java
new file mode 100644
index 0000000000..c7edf00c3a
--- /dev/null
+++ b/extensions/modules/scheduler/src/test/java/xquery/modules/scheduler/SchedulerTests.java
@@ -0,0 +1,11 @@
+package xquery.modules.scheduler;
+
+import org.exist.test.runner.XSuite;
+import org.junit.runner.RunWith;
+
+@RunWith(XSuite.class)
+@XSuite.XSuiteFiles({
+ "src/test/xquery/modules/scheduler"
+})
+public class SchedulerTests {
+}
\ No newline at end of file
diff --git a/extensions/modules/scheduler/src/test/resources-filtered/conf.xml b/extensions/modules/scheduler/src/test/resources-filtered/conf.xml
new file mode 100644
index 0000000000..0b66cbdaae
--- /dev/null
+++ b/extensions/modules/scheduler/src/test/resources-filtered/conf.xml
@@ -0,0 +1,806 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/extensions/modules/scheduler/src/test/resources/log4j2.xml b/extensions/modules/scheduler/src/test/resources/log4j2.xml
new file mode 100644
index 0000000000..20f797787a
--- /dev/null
+++ b/extensions/modules/scheduler/src/test/resources/log4j2.xml
@@ -0,0 +1,259 @@
+
+
+
+
+ ${log4j:configParentLocation}/../../target/test-logs-${date:yyyyMMddHHmmssSSS}
+ 10MB
+ 0 0 0 * * ?
+ 14
+ %d{yyyyMMddHHmmss}
+ %d{yyyy-MM-dd}
+ %d [%t] %-5p (%F [%M]:%L) - %m%n
+ %m%n
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/extensions/modules/scheduler/src/test/xquery/modules/scheduler/scheduler-external-variable-default.xql b/extensions/modules/scheduler/src/test/xquery/modules/scheduler/scheduler-external-variable-default.xql
new file mode 100644
index 0000000000..000a78f1f1
--- /dev/null
+++ b/extensions/modules/scheduler/src/test/xquery/modules/scheduler/scheduler-external-variable-default.xql
@@ -0,0 +1,53 @@
+xquery version "3.1";
+
+module namespace t = "http://exist-db.org/testsuite/scheduler-external-variable-default";
+
+import module namespace test = "http://exist-db.org/xquery/xqsuite" at "resource:org/exist/xquery/lib/xqsuite/xqsuite.xql";
+
+declare namespace scheduler = "http://exist-db.org/xquery/scheduler";
+declare namespace xmldb = "http://exist-db.org/xquery/xmldb";
+declare namespace util = "http://exist-db.org/xquery/util";
+
+declare variable $t:collection := "/db/scheduler-default-test";
+declare variable $t:job-name := "scheduler-default-test-job";
+
+declare variable $t:worker-query :=
+ "xquery version '3.1';
+ declare variable $addressee external := 'default';
+ xmldb:store('" || $t:collection || "', 'result.xml', {$addressee})";
+
+declare
+ %test:setUp
+function t:setup() {
+ xmldb:create-collection("/db", "scheduler-default-test"),
+ xmldb:store($t:collection, "worker.xql", $t:worker-query)
+};
+
+declare
+ %test:tearDown
+function t:cleanup() {
+ scheduler:delete-scheduled-job($t:job-name),
+ xmldb:remove($t:collection)
+};
+
+declare
+ %test:assertTrue
+function t:schedule-job-with-parameter() as xs:boolean {
+ scheduler:schedule-xquery-periodic-job(
+ $t:collection || "/worker.xql",
+ 0,
+ $t:job-name,
+
+
+ ,
+ 0,
+ 0
+ )
+};
+
+declare
+ %test:assertEquals("overridden")
+function t:external-variable-was-overridden() as xs:string {
+ util:wait(1000),
+ doc($t:collection || "/result.xml")/result/string()
+};
\ No newline at end of file