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