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